1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.coa.service.impl;
20
21 import java.text.MessageFormat;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.commons.lang.StringUtils;
29 import org.apache.log4j.Logger;
30 import org.kuali.kfs.coa.businessobject.OrganizationReversion;
31 import org.kuali.kfs.coa.businessobject.OrganizationReversionCategory;
32 import org.kuali.kfs.coa.businessobject.OrganizationReversionDetail;
33 import org.kuali.kfs.coa.service.OrganizationReversionDetailTrickleDownInactivationService;
34 import org.kuali.kfs.sys.KFSKeyConstants;
35 import org.kuali.rice.core.api.config.property.ConfigurationService;
36 import org.kuali.rice.krad.bo.DocumentHeader;
37 import org.kuali.rice.krad.bo.Note;
38 import org.kuali.rice.krad.bo.PersistableBusinessObject;
39 import org.kuali.rice.krad.service.BusinessObjectService;
40 import org.kuali.rice.krad.service.DocumentHeaderService;
41 import org.kuali.rice.krad.service.NoteService;
42 import org.kuali.rice.krad.util.GlobalVariables;
43 import org.kuali.rice.krad.util.ObjectUtils;
44
45
46
47
48 public class OrganizationReversionDetailTrickleDownInactivationServiceImpl implements OrganizationReversionDetailTrickleDownInactivationService {
49 private static final Logger LOG = Logger.getLogger(OrganizationReversionDetailTrickleDownInactivationServiceImpl.class);
50 protected NoteService noteService;
51 protected ConfigurationService kualiConfigurationService;
52 protected BusinessObjectService businessObjectService;
53 protected DocumentHeaderService documentHeaderService;
54
55
56
57
58 public void trickleDownInactiveOrganizationReversionDetails(OrganizationReversion organizationReversion, String documentNumber) {
59 organizationReversion.refreshReferenceObject("organizationReversionDetail");
60 trickleDownInactivations(organizationReversion.getOrganizationReversionDetail(), documentNumber);
61 }
62
63
64
65
66 public void trickleDownInactiveOrganizationReversionDetails(OrganizationReversionCategory organizationReversionCategory, String documentNumber) {
67 Map<String, Object> fieldValues = new HashMap<String, Object>();
68 fieldValues.put("organizationReversionCategoryCode", organizationReversionCategory.getOrganizationReversionCategoryCode());
69 Collection orgReversionDetails = businessObjectService.findMatching(OrganizationReversionDetail.class, fieldValues);
70
71 List<OrganizationReversionDetail> organizationReversionDetailList = new ArrayList<OrganizationReversionDetail>();
72 for (Object orgRevDetailAsObject : orgReversionDetails) {
73 organizationReversionDetailList.add((OrganizationReversionDetail)orgRevDetailAsObject);
74 }
75 trickleDownInactivations(organizationReversionDetailList, documentNumber);
76 }
77
78
79
80
81 public void trickleDownActiveOrganizationReversionDetails(OrganizationReversion organizationReversion, String documentNumber) {
82 organizationReversion.refreshReferenceObject("organizationReversionDetail");
83 trickleDownActivations(organizationReversion.getOrganizationReversionDetail(), documentNumber);
84 }
85
86
87
88
89 public void trickleDownActiveOrganizationReversionDetails(OrganizationReversionCategory organizationReversionCategory, String documentNumber) {
90 Map<String, Object> fieldValues = new HashMap<String, Object>();
91 fieldValues.put("organizationReversionCategoryCode", organizationReversionCategory.getOrganizationReversionCategoryCode());
92 Collection orgReversionDetails = businessObjectService.findMatching(OrganizationReversionDetail.class, fieldValues);
93
94 List<OrganizationReversionDetail> organizationReversionDetailList = new ArrayList<OrganizationReversionDetail>();
95 for (Object orgRevDetailAsObject : orgReversionDetails) {
96 organizationReversionDetailList.add((OrganizationReversionDetail)orgRevDetailAsObject);
97 }
98 trickleDownActivations(organizationReversionDetailList, documentNumber);
99 }
100
101
102
103
104
105
106
107 protected void trickleDownInactivations(List<OrganizationReversionDetail> organizationReversionDetails, String documentNumber) {
108 TrickleDownStatus status = new TrickleDownStatus(KFSKeyConstants.ORGANIZATION_REVERSION_DETAIL_TRICKLE_DOWN_INACTIVATION, KFSKeyConstants.ORGANIZATION_REVERSION_DETAIL_TRICKLE_DOWN_INACTIVATION_ERROR_DURING_PERSISTENCE);
109
110 if (!ObjectUtils.isNull(organizationReversionDetails) && !organizationReversionDetails.isEmpty()) {
111 for (OrganizationReversionDetail detail : organizationReversionDetails) {
112 if (detail.isActive()) {
113 detail.setActive(false);
114 try {
115 businessObjectService.save(detail);
116 status.addOrganizationReversionDetail(detail);
117 }
118 catch (RuntimeException re) {
119 LOG.error("Unable to trickle-down inactivate sub-account " + detail.toString(), re);
120 status.addErrorPersistingOrganizationReversionDetail(detail);
121 }
122 }
123 }
124 }
125
126 status.saveSuccesfullyChangedNotes(documentNumber);
127 status.saveErrorNotes(documentNumber);
128 }
129
130
131
132
133
134
135
136 protected void trickleDownActivations(List<OrganizationReversionDetail> organizationReversionDetails, String documentNumber) {
137 TrickleDownStatus status = new TrickleDownStatus(KFSKeyConstants.ORGANIZATION_REVERSION_DETAIL_TRICKLE_DOWN_ACTIVATION, KFSKeyConstants.ORGANIZATION_REVERSION_DETAIL_TRICKLE_DOWN_ACTIVATION_ERROR_DURING_PERSISTENCE);
138
139 if (!ObjectUtils.isNull(organizationReversionDetails) && !organizationReversionDetails.isEmpty()) {
140 for (OrganizationReversionDetail detail : organizationReversionDetails) {
141 if (!detail.isActive() && allowActivation(detail)) {
142 detail.setActive(true);
143 try {
144 businessObjectService.save(detail);
145 status.addOrganizationReversionDetail(detail);
146 }
147 catch (RuntimeException re) {
148 LOG.error("Unable to trickle-down inactivate sub-account " + detail.toString(), re);
149 status.addErrorPersistingOrganizationReversionDetail(detail);
150 }
151 }
152 }
153 }
154
155 status.saveSuccesfullyChangedNotes(documentNumber);
156 status.saveErrorNotes(documentNumber);
157 }
158
159
160
161
162
163
164
165 protected boolean allowActivation(OrganizationReversionDetail detail) {
166 boolean result = true;
167 if (!ObjectUtils.isNull(detail.getOrganizationReversion())) {
168 result &= detail.getOrganizationReversion().isActive();
169 }
170 if (!ObjectUtils.isNull(detail.getOrganizationReversionCategory())) {
171 result &= detail.getOrganizationReversionCategory().isActive();
172 }
173 return result;
174 }
175
176
177
178
179
180 protected class TrickleDownStatus {
181 private List<OrganizationReversionDetail> organizationReversionDetails;
182 private List<OrganizationReversionDetail> errorPersistingOrganizationReversionDetails;
183 private String successfullyChangedOrganizationReversionDetailsMessageKey;
184 private String erroredOutOrganizationReversionDetailsMessageKey;
185
186
187
188
189 public TrickleDownStatus(String successfullyChangedOrganizationReversionDetailsMessageKey, String erroredOutOrganizationReversionDetailsMessageKey) {
190 organizationReversionDetails = new ArrayList<OrganizationReversionDetail>();
191 errorPersistingOrganizationReversionDetails = new ArrayList<OrganizationReversionDetail>();
192 this.successfullyChangedOrganizationReversionDetailsMessageKey = successfullyChangedOrganizationReversionDetailsMessageKey;
193 this.erroredOutOrganizationReversionDetailsMessageKey = erroredOutOrganizationReversionDetailsMessageKey;
194 }
195
196
197
198
199
200 public void addOrganizationReversionDetail(OrganizationReversionDetail organizationReversionDetail) {
201 organizationReversionDetails.add(organizationReversionDetail);
202 }
203
204
205
206
207
208 public void addErrorPersistingOrganizationReversionDetail(OrganizationReversionDetail organizationReversionDetail) {
209 errorPersistingOrganizationReversionDetails.add(organizationReversionDetail);
210 }
211
212
213
214
215 protected int getDetailsPerNote() {
216 return 20;
217 }
218
219
220
221
222
223
224
225
226 protected List<Note> generateNotes(String messageKey, PersistableBusinessObject noteParent, List<OrganizationReversionDetail> organizationReversionDetails) {
227 List<Note> notes = new ArrayList<Note>();
228 List<String> organizationReversionDetailsDescriptions = generateOrganizationReversionDetailsForNotes(organizationReversionDetails);
229 Note noteTemplate = new Note();
230 for (String description : organizationReversionDetailsDescriptions) {
231 if (!StringUtils.isBlank(description)) {
232 notes.add(buildNote(description, messageKey, noteTemplate, noteParent));
233 }
234 }
235 return notes;
236 }
237
238
239
240
241
242
243
244
245
246 protected Note buildNote(String description, String messageKey, Note noteTemplate, PersistableBusinessObject noteParent) {
247 Note note = null;
248 try {
249 final String noteTextTemplate = kualiConfigurationService.getPropertyValueAsString(messageKey);
250 final String noteText = MessageFormat.format(noteTextTemplate, description);
251 note = noteService.createNote(noteTemplate, noteParent, GlobalVariables.getUserSession().getPrincipalId());
252 note.setNoteText(noteText);
253 }
254 catch (Exception e) {
255
256
257 throw new RuntimeException("Cannot create note", e);
258 }
259 return note;
260 }
261
262
263
264
265
266
267 protected List<String> generateOrganizationReversionDetailsForNotes(List<OrganizationReversionDetail> organizationReversionDetails) {
268 List<String> orgRevDetailDescriptions = new ArrayList<String>();
269
270 if (organizationReversionDetails.size() > 0) {
271 StringBuilder description = new StringBuilder();
272 description.append(getOrganizationReversionDetailDescription(organizationReversionDetails.get(0)));
273
274 int count = 1;
275 while (count < organizationReversionDetails.size()) {
276 if (count % getDetailsPerNote() == 0) {
277 orgRevDetailDescriptions.add(description.toString());
278 description = new StringBuilder();
279 } else {
280 description.append(", ");
281 }
282 description.append(getOrganizationReversionDetailDescription(organizationReversionDetails.get(count)));
283 count += 1;
284 }
285
286
287 orgRevDetailDescriptions.add(description.toString());
288 }
289
290 return orgRevDetailDescriptions;
291 }
292
293
294
295
296
297
298 protected String getOrganizationReversionDetailDescription(OrganizationReversionDetail organizationReversionDetail) {
299 return organizationReversionDetail.getChartOfAccountsCode() + " - " + organizationReversionDetail.getOrganizationCode() + " Category: " + organizationReversionDetail.getOrganizationReversionCategoryCode();
300 }
301
302
303
304
305
306
307
308 protected void saveAllNotes(List<OrganizationReversionDetail> organizationReversionDetails, String messageKey, String documentNumber) {
309 DocumentHeader noteParent = documentHeaderService.getDocumentHeaderById(documentNumber);
310 List<Note> notes = generateNotes(messageKey, noteParent, organizationReversionDetails);
311 noteService.saveNoteList(notes);
312 }
313
314
315
316
317
318 public void saveSuccesfullyChangedNotes(String documentNumber) {
319 saveAllNotes(organizationReversionDetails, successfullyChangedOrganizationReversionDetailsMessageKey, documentNumber);
320 }
321
322
323
324
325
326 public void saveErrorNotes(String documentNumber) {
327 saveAllNotes(errorPersistingOrganizationReversionDetails, erroredOutOrganizationReversionDetailsMessageKey, documentNumber);
328 }
329
330
331
332
333
334 public void setErroredOutOrganizationReversionDetailsMessageKey(String erroredOutOrganizationReversionDetailsMessageKey) {
335 this.erroredOutOrganizationReversionDetailsMessageKey = erroredOutOrganizationReversionDetailsMessageKey;
336 }
337
338
339
340
341
342 public void setSuccessfullyChangedOrganizationReversionDetailsMessageKey(String successfullyChangedOrganizationReversionDetailsMessageKey) {
343 this.successfullyChangedOrganizationReversionDetailsMessageKey = successfullyChangedOrganizationReversionDetailsMessageKey;
344 }
345 }
346
347
348
349
350
351 public ConfigurationService getConfigurationService() {
352 return kualiConfigurationService;
353 }
354
355
356
357
358
359 public void setConfigurationService(ConfigurationService kualiConfigurationService) {
360 this.kualiConfigurationService = kualiConfigurationService;
361 }
362
363
364
365
366
367 public NoteService getNoteService() {
368 return noteService;
369 }
370
371
372
373
374
375 public void setNoteService(NoteService noteService) {
376 this.noteService = noteService;
377 }
378
379
380
381
382
383 public BusinessObjectService getBusinessObjectService() {
384 return businessObjectService;
385 }
386
387
388
389
390
391 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
392 this.businessObjectService = businessObjectService;
393 }
394
395
396
397
398
399 public DocumentHeaderService getDocumentHeaderService() {
400 return documentHeaderService;
401 }
402
403
404
405
406
407 public void setDocumentHeaderService(DocumentHeaderService documentHeaderService) {
408 this.documentHeaderService = documentHeaderService;
409 }
410 }