001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.ec.document.web.struts; 017 018 import java.math.BigDecimal; 019 import java.util.ArrayList; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import javax.servlet.http.HttpServletRequest; 025 import javax.servlet.http.HttpServletResponse; 026 027 import org.apache.commons.lang.StringUtils; 028 import org.apache.struts.action.ActionForm; 029 import org.apache.struts.action.ActionForward; 030 import org.apache.struts.action.ActionMapping; 031 import org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService; 032 import org.kuali.kfs.module.ec.EffortConstants; 033 import org.kuali.kfs.module.ec.EffortConstants.EffortCertificationEditMode; 034 import org.kuali.kfs.module.ec.EffortPropertyConstants; 035 import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetail; 036 import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetailLineOverride; 037 import org.kuali.kfs.module.ec.document.EffortCertificationDocument; 038 import org.kuali.kfs.module.ec.document.authorization.EffortCertificationDocumentAuthorizer; 039 import org.kuali.kfs.module.ec.document.validation.event.AddDetailLineEvent; 040 import org.kuali.kfs.module.ec.document.validation.event.CheckDetailLineAmountEvent; 041 import org.kuali.kfs.module.ec.document.validation.impl.EffortCertificationDocumentRuleUtil; 042 import org.kuali.kfs.module.ec.service.EffortCertificationDocumentService; 043 import org.kuali.kfs.module.ec.util.DetailLineGroup; 044 import org.kuali.kfs.sys.DynamicCollectionComparator; 045 import org.kuali.kfs.sys.DynamicCollectionComparator.SortOrder; 046 import org.kuali.kfs.sys.KFSConstants; 047 import org.kuali.kfs.sys.KFSPropertyConstants; 048 import org.kuali.kfs.sys.ObjectUtil; 049 import org.kuali.kfs.sys.context.SpringContext; 050 import org.kuali.rice.kew.exception.WorkflowException; 051 import org.kuali.rice.kim.bo.impl.KimAttributes; 052 import org.kuali.rice.kim.util.KimConstants; 053 import org.kuali.rice.kns.service.BusinessObjectService; 054 import org.kuali.rice.kns.service.DocumentHelperService; 055 import org.kuali.rice.kns.util.GlobalVariables; 056 import org.kuali.rice.kns.util.KNSConstants; 057 import org.kuali.rice.kns.util.KualiDecimal; 058 import org.kuali.rice.kns.util.ObjectUtils; 059 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; 060 061 /** 062 * This class handles Actions for EffortCertification document approval. 063 */ 064 public class CertificationReportAction extends EffortCertificationAction { 065 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CertificationReportAction.class); 066 067 /** 068 * recalculate the detail line 069 */ 070 public ActionForward recalculate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 071 int lineToRecalculateIndex = getLineToDelete(request); 072 073 EffortCertificationForm effortForm = (EffortCertificationForm) form; 074 EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument(); 075 List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines(); 076 EffortCertificationDetail lineToRecalculate = detailLines.get(lineToRecalculateIndex); 077 EffortCertificationDocumentRuleUtil.applyDefaultValues(lineToRecalculate); 078 079 String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "." + EffortPropertyConstants.EFFORT_CERTIFICATION_DETAIL_LINES; 080 boolean isValid = this.invokeRules(new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, lineToRecalculate)); 081 if (isValid) { 082 KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount(); 083 lineToRecalculate.recalculatePayrollAmount(totalPayrollAmount); 084 } 085 086 return mapping.findForward(KFSConstants.MAPPING_BASIC); 087 } 088 089 /** 090 * add New Effort Certification Detail Lines 091 */ 092 public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 093 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 094 EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm.getDocument(); 095 List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines(); 096 EffortCertificationDetail newDetailLine = certificationReportForm.getNewDetailLine(); 097 098 // KFSMI-798 - refreshNonUpdatableReferences() used instead of refresh(), 099 // EffortCertificationDetail does not have any updatable references 100 newDetailLine.refreshNonUpdateableReferences(); 101 newDetailLine.setPositionNumber(effortDocument.getDefaultPositionNumber()); 102 newDetailLine.setFinancialObjectCode(effortDocument.getDefaultObjectCode()); 103 newDetailLine.setNewLineIndicator(true); 104 105 EffortCertificationDetail workingDetailLine = new EffortCertificationDetail(); 106 ObjectUtil.buildObject(workingDetailLine, newDetailLine); 107 108 EffortCertificationDocumentRuleUtil.applyDefaultValues(workingDetailLine); 109 110 if (newDetailLine.isAccountExpiredOverride()) { 111 this.updateDetailLineOverrideCode(workingDetailLine); 112 this.updateDetailLineOverrideCode(newDetailLine); 113 } 114 115 // check business rules 116 boolean isValid = this.invokeRules(new AddDetailLineEvent("", EffortPropertyConstants.EFFORT_CERTIFICATION_DOCUMENT_NEW_LINE, effortDocument, workingDetailLine)); 117 if (isValid) { 118 if (EffortCertificationDocumentRuleUtil.hasA21SubAccount(workingDetailLine)) { 119 EffortCertificationDocumentRuleUtil.updateSourceAccountInformation(workingDetailLine); 120 } 121 122 this.resetPersistedFields(workingDetailLine); 123 detailLines.add(workingDetailLine); 124 certificationReportForm.setNewDetailLine(certificationReportForm.createNewDetailLine()); 125 } 126 else { 127 EffortCertificationDetailLineOverride.processForOutput(newDetailLine); 128 } 129 130 this.processDetailLineOverrides(detailLines); 131 132 return mapping.findForward(KFSConstants.MAPPING_BASIC); 133 } 134 135 /** 136 * delete detail line 137 */ 138 public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 139 int lineToDeleteIndex = getLineToDelete(request); 140 141 EffortCertificationForm effortForm = (EffortCertificationForm) form; 142 EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument(); 143 List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines(); 144 145 detailLines.remove(lineToDeleteIndex); 146 147 return mapping.findForward(KFSConstants.MAPPING_BASIC); 148 } 149 150 /** 151 * revert the detail line to the original values 152 */ 153 public ActionForward revert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 154 int lineToRevertIndex = getLineToDelete(request); 155 156 EffortCertificationForm effortForm = (EffortCertificationForm) form; 157 EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument(); 158 List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines(); 159 160 this.revertDetaiLine(detailLines, lineToRevertIndex); 161 162 return mapping.findForward(KFSConstants.MAPPING_BASIC); 163 } 164 165 /** 166 * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#loadDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase) 167 */ 168 @Override 169 protected void loadDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { 170 super.loadDocument(kualiDocumentFormBase); 171 172 CertificationReportForm certificationReportForm = (CertificationReportForm) kualiDocumentFormBase; 173 if (this.isSummarizeDetailLinesRendered(certificationReportForm)) { 174 this.refreshDetailLineGroupMap(certificationReportForm); 175 } 176 } 177 178 /** 179 * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping, 180 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 181 */ 182 @Override 183 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 184 ActionForward actionForward = super.refresh(mapping, form, request, response); 185 186 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 187 for (EffortCertificationDetail detailLine : certificationReportForm.getDetailLines()) { 188 detailLine.refreshNonUpdateableReferences(); 189 190 EffortCertificationDocumentRuleUtil.applyDefaultValues(detailLine); 191 } 192 193 return actionForward; 194 } 195 196 /** 197 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, 198 * javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 199 */ 200 @Override 201 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 202 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 203 if (this.isSummarizeDetailLinesRendered(certificationReportForm)) { 204 this.updateDetailLinesFromSummaryLines(certificationReportForm); 205 } 206 207 ActionForward actionForward = super.execute(mapping, form, request, response); 208 this.refresh(mapping, form, request, response); 209 210 return actionForward; 211 } 212 213 /** 214 * sort the detail lines by column 215 */ 216 public ActionForward sortDetailLineByColumn(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 217 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 218 219 String methodToCallAttribute = (String) request.getAttribute(KNSConstants.METHOD_TO_CALL_ATTRIBUTE); 220 String sortMethodName = EffortConstants.SORT_DETAIL_LINE_BY_COLUMN_METHOD_NAME + "."; 221 String sortColumn = StringUtils.substringBetween(methodToCallAttribute, sortMethodName, "."); 222 223 this.toggleSortOrder(certificationReportForm); 224 this.sortDetailLine(certificationReportForm, certificationReportForm.getDetailLines(), sortColumn); 225 226 if (this.isSummarizeDetailLinesRendered(certificationReportForm)) { 227 this.sortDetailLine(certificationReportForm, certificationReportForm.getSummarizedDetailLines(), sortColumn); 228 } 229 230 return mapping.findForward(KFSConstants.MAPPING_BASIC); 231 } 232 233 /** 234 * recalculate a detail line in summarized detail lines and make a corresponding update on the underlying detail lines 235 */ 236 public ActionForward recalculateSummarizedDetailLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 237 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 238 EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm.getDocument(); 239 KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount(); 240 241 // recalculate the selected summary line 242 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 243 int lineToRecalculateIndex = this.getSelectedLine(request); 244 EffortCertificationDetail lineToRecalculate = summarizedDetailLines.get(lineToRecalculateIndex); 245 EffortCertificationDocumentRuleUtil.applyDefaultValues(lineToRecalculate); 246 247 String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "." + EffortPropertyConstants.SUMMARIZED_DETAIL_LINES + "[" + lineToRecalculateIndex + "]"; 248 boolean isValid = this.invokeRules(new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, lineToRecalculate)); 249 if (isValid) { 250 lineToRecalculate.recalculatePayrollAmount(totalPayrollAmount); 251 252 String groupId = lineToRecalculate.getGroupId(); 253 List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines(); 254 List<EffortCertificationDetail> detailLinesToRecalculate = this.findDetailLinesInGroup(detailLines, groupId); 255 for (EffortCertificationDetail line : detailLinesToRecalculate) { 256 ObjectUtil.buildObject(line, lineToRecalculate, EffortConstants.DETAIL_LINES_GROUPING_FILEDS); 257 } 258 259 // rebuild the detail line groups from the detail lines of the current document 260 Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(certificationReportForm.getDetailLines()); 261 DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(lineToRecalculate)); 262 this.updateDetailLineGroup(detailLineGroup, lineToRecalculate, totalPayrollAmount); 263 } 264 265 return mapping.findForward(KFSConstants.MAPPING_BASIC); 266 } 267 268 /** 269 * add a new detail line and make a corresponding update on the underlying detail lines 270 */ 271 public ActionForward addSummarizedDetailLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 272 ActionForward actionForward = this.add(mapping, form, request, response); 273 274 if (GlobalVariables.getMessageMap().getErrorCount() >= 0) { 275 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 276 this.refreshDetailLineGroupMap(certificationReportForm); 277 } 278 279 return actionForward; 280 } 281 282 /** 283 * delete a detail line from summarized detail lines and make a corresponding update on the underlying detail lines 284 */ 285 public ActionForward deleteSummarizedDetailLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 286 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 287 288 // remove the selected summary line 289 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 290 int lineToRecalculateIndex = this.getSelectedLine(request); 291 EffortCertificationDetail lineToDelete = summarizedDetailLines.get(lineToRecalculateIndex); 292 summarizedDetailLines.remove(lineToDelete); 293 294 String groupId = lineToDelete.getGroupId(); 295 List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines(); 296 List<EffortCertificationDetail> detailLinesToDelete = this.findDetailLinesInGroup(detailLines, groupId); 297 detailLines.removeAll(detailLinesToDelete); 298 299 return mapping.findForward(KFSConstants.MAPPING_BASIC); 300 } 301 302 /** 303 * revert a detail line in summarized detail lines and make a corresponding update on the underlying detail lines 304 */ 305 public ActionForward revertSummarizedDetailLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 306 CertificationReportForm certificationReportForm = (CertificationReportForm) form; 307 308 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 309 int lineToRevertIndex = this.getSelectedLine(request); 310 EffortCertificationDetail lineToRevert = summarizedDetailLines.get(lineToRevertIndex); 311 312 Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(certificationReportForm.getDetailLines()); 313 DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(lineToRevert)); 314 List<EffortCertificationDetail> detailLinesInGroup = detailLineGroup.getDetailLines(); 315 316 List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines(); 317 for (EffortCertificationDetail detailLine : detailLinesInGroup) { 318 this.revertDetaiLine(detailLines, detailLine); 319 } 320 321 this.refreshDetailLineGroupMap(certificationReportForm); 322 323 return mapping.findForward(KFSConstants.MAPPING_BASIC); 324 } 325 326 /** 327 * find the detail lines belonging to the given group from the given detail lines 328 * 329 * @param detailLines the given detail lines 330 * @param groupId the given group id 331 * @return the detail lines belonging to the given group 332 */ 333 protected List<EffortCertificationDetail> findDetailLinesInGroup(List<EffortCertificationDetail> detailLines, String groupId) { 334 List<EffortCertificationDetail> detailLinesInGroup = new ArrayList<EffortCertificationDetail>(); 335 336 for (EffortCertificationDetail line : detailLines) { 337 if (StringUtils.equals(groupId, line.getGroupId())) { 338 detailLinesInGroup.add(line); 339 } 340 } 341 342 return detailLinesInGroup; 343 } 344 345 /** 346 * determine whether the summarized detail lines need to be rendered 347 * 348 * @param certificationReportForm the action form 349 * @return true if the summarized detail lines need to be rendered; otherwise, false 350 */ 351 protected boolean isSummarizeDetailLinesRendered(CertificationReportForm certificationReportForm) { 352 populateAuthorizationFields(certificationReportForm); 353 //super.populateAuthorizationFields(certificationReportForm); 354 355 return certificationReportForm.getEditingMode().containsKey(EffortCertificationEditMode.SUMMARY_TAB_ENTRY); 356 } 357 358 /** 359 * recalculate all detail lines with the information in summarized detail lines 360 * 361 * @param certificationReportForm the given action form 362 */ 363 protected void recalculateAllDetailLines(CertificationReportForm certificationReportForm) { 364 Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(certificationReportForm.getDetailLines()); 365 366 EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm.getDocument(); 367 KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount(); 368 369 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 370 for (EffortCertificationDetail detailLine : summarizedDetailLines) { 371 // recalculate the selected summary line 372 detailLine.recalculatePayrollAmount(totalPayrollAmount); 373 374 // rebuild the detail line groups from the detail lines of the current document 375 DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(detailLine)); 376 this.updateDetailLineGroup(detailLineGroup, detailLine, totalPayrollAmount); 377 } 378 } 379 380 /** 381 * recalculate all detail lines with the information in summarized detail lines 382 * 383 * @param certificationReportForm the given action form 384 */ 385 protected void updateDetailLinesFromSummaryLines(CertificationReportForm certificationReportForm) { 386 EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm.getDocument(); 387 List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines(); 388 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 389 390 boolean isValid = true; 391 int index = 0; 392 for (EffortCertificationDetail detailLine : summarizedDetailLines) { 393 EffortCertificationDocumentRuleUtil.applyDefaultValues(detailLine); 394 395 String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "." + EffortPropertyConstants.SUMMARIZED_DETAIL_LINES + "[" + index + "]"; 396 isValid &= this.invokeRules(new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, detailLine)); 397 398 ++index; 399 } 400 401 if (!isValid) { 402 return; 403 } 404 405 for (EffortCertificationDetail detailLine : summarizedDetailLines) { 406 if (!detailLine.isNewLineIndicator()) { 407 continue; 408 } 409 410 if (detailLine.isAccountExpiredOverride()) { 411 detailLine.refreshReferenceObject(KFSPropertyConstants.ACCOUNT); 412 this.updateDetailLineOverrideCode(detailLine); 413 } 414 415 List<EffortCertificationDetail> detailLinesToUpdate = this.findDetailLinesInGroup(detailLines, detailLine.getGroupId()); 416 for (EffortCertificationDetail line : detailLinesToUpdate) { 417 ObjectUtil.buildObject(line, detailLine, EffortConstants.DETAIL_LINES_GROUPING_FILEDS); 418 419 line.setAccountExpiredOverride(detailLine.isAccountExpiredOverride()); 420 line.setAccountExpiredOverrideNeeded(detailLine.isAccountExpiredOverrideNeeded()); 421 line.setOverrideCode(detailLine.getOverrideCode()); 422 } 423 } 424 425 Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(detailLines); 426 KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount(); 427 for (EffortCertificationDetail detailLine : summarizedDetailLines) { 428 // rebuild the detail line groups from the detail lines of the current document 429 detailLine.setGroupId(DetailLineGroup.getKeysAsString(detailLine)); 430 DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(detailLine)); 431 this.updateDetailLineGroup(detailLineGroup, detailLine, totalPayrollAmount); 432 } 433 434 this.processDetailLineOverrides(detailLines); 435 this.processDetailLineOverrides(summarizedDetailLines); 436 } 437 438 /** 439 * update detail line group with the the information in the given detail line 440 * 441 * @param detailLineGroup the given detail line group 442 * @param detailLine the given detail line 443 * @param totalPayrollAmount the total payroll amount of the document associating with the detail line group 444 */ 445 protected void updateDetailLineGroup(DetailLineGroup detailLineGroup, EffortCertificationDetail detailLine, KualiDecimal totalPayrollAmount) { 446 EffortCertificationDetail summaryLine = detailLineGroup.getSummaryDetailLine(); 447 summaryLine.setEffortCertificationUpdatedOverallPercent(detailLine.getEffortCertificationUpdatedOverallPercent()); 448 summaryLine.setEffortCertificationPayrollAmount(detailLine.getEffortCertificationPayrollAmount()); 449 450 detailLineGroup.updateDetailLineEffortPercent(); 451 detailLineGroup.updateDetailLinePayrollAmount(); 452 } 453 454 /** 455 * Toggles the sort order between ascending and descending. If the current order is ascending, then the sort order will be set 456 * to descending, and vice versa. 457 */ 458 protected void toggleSortOrder(CertificationReportForm certificationReportForm) { 459 if (SortOrder.ASC.name().equals(certificationReportForm.getSortOrder())) { 460 certificationReportForm.setSortOrder(SortOrder.DESC.name()); 461 } 462 else { 463 certificationReportForm.setSortOrder(SortOrder.ASC.name()); 464 } 465 } 466 467 /** 468 * sort the detail lines based on the values of the sort order and sort column 469 */ 470 protected void sortDetailLine(CertificationReportForm certificationReportForm, List<EffortCertificationDetail> detailLines, String... sortColumn) { 471 String sortOrder = certificationReportForm.getSortOrder(); 472 DynamicCollectionComparator.sort(detailLines, SortOrder.valueOf(sortOrder), sortColumn); 473 } 474 475 /** 476 * rebuild the detail line group map from the detail lines of the current document 477 */ 478 protected Map<String, DetailLineGroup> refreshDetailLineGroupMap(CertificationReportForm certificationReportForm) { 479 LOG.info("refreshDetailLineGroupMap() started"); 480 481 List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 482 if (summarizedDetailLines == null) { 483 EffortCertificationDocument effortCertificationDocument = (EffortCertificationDocument) certificationReportForm.getDocument(); 484 effortCertificationDocument.setSummarizedDetailLines(new ArrayList<EffortCertificationDetail>()); 485 } 486 summarizedDetailLines.clear(); 487 488 Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(certificationReportForm.getDetailLines()); 489 490 for (String key : detailLineGroupMap.keySet()) { 491 EffortCertificationDetail sumaryline = detailLineGroupMap.get(key).getSummaryDetailLine(); 492 493 summarizedDetailLines.add(sumaryline); 494 } 495 496 return detailLineGroupMap; 497 } 498 499 /** 500 * find the given detail line from the given collection of detail lines and revert it 501 */ 502 protected void revertDetaiLine(List<EffortCertificationDetail> detailLines, EffortCertificationDetail lineToRevert) { 503 int lineToRevertIndex = detailLines.lastIndexOf(lineToRevert); 504 505 this.revertDetaiLine(detailLines, lineToRevertIndex); 506 } 507 508 /** 509 * revert the detail line in the specified position 510 */ 511 protected void revertDetaiLine(List<EffortCertificationDetail> detailLines, int lineToRevertIndex) { 512 EffortCertificationDetail lineToRevert = detailLines.get(lineToRevertIndex); 513 514 BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class); 515 EffortCertificationDetail revertedLine = (EffortCertificationDetail) businessObjectService.retrieve(lineToRevert); 516 this.resetPersistedFields(revertedLine); 517 518 detailLines.remove(lineToRevertIndex); 519 detailLines.add(lineToRevertIndex, revertedLine); 520 } 521 522 /** 523 * reset the persisted fields of the given detail line 524 */ 525 protected void resetPersistedFields(EffortCertificationDetail detailLine) { 526 int persistedEffortPercent = detailLine.getEffortCertificationUpdatedOverallPercent(); 527 detailLine.setPersistedEffortPercent(new Integer(persistedEffortPercent)); 528 529 BigDecimal persistedPayrollAmount = detailLine.getEffortCertificationPayrollAmount().bigDecimalValue(); 530 detailLine.setPersistedPayrollAmount(new KualiDecimal(persistedPayrollAmount)); 531 } 532 533 /** 534 * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#approve(org.apache.struts.action.ActionMapping, 535 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 536 */ 537 @Override 538 public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 539 KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form; 540 EffortCertificationDocument effortDocument = (EffortCertificationDocument) kualiDocumentFormBase.getDocument(); 541 542 EffortCertificationDocumentService effortCertificationDocumentService = SpringContext.getBean(EffortCertificationDocumentService.class); 543 effortCertificationDocumentService.addRouteLooping(effortDocument); 544 545 ActionForward actionForward = super.approve(mapping, kualiDocumentFormBase, request, response); 546 547 return actionForward; 548 } 549 550 /** 551 * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#insertBONote(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 552 */ 553 @Override 554 public ActionForward insertBONote(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 555 KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form; 556 kualiDocumentFormBase.getNewNote().setNewCollectionRecord(true); 557 558 return super.insertBONote(mapping, form, request, response); 559 } 560 561 /** 562 * Do one additional check on Use Transactional for Summary Tab 563 * @see org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase#populateAuthorizationFields(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase) 564 */ 565 @Override 566 protected void populateAuthorizationFields(KualiDocumentFormBase formBase) { 567 568 //call super for authorization fields 569 super.populateAuthorizationFields(formBase); 570 571 CertificationReportForm certificationReportForm = (CertificationReportForm) formBase; 572 573 //get document authorizer 574 EffortCertificationDocumentAuthorizer certReportDocAuthorizer = (EffortCertificationDocumentAuthorizer)SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(EffortConstants.EffortDocumentTypes.EFFORT_CERTIFICATION_DOCUMENT); 575 576 //grab document 577 KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) formBase; 578 EffortCertificationDocument effortDocument = (EffortCertificationDocument) kualiDocumentFormBase.getDocument(); 579 580 //get principal id 581 String currentPrincipalId = GlobalVariables.getUserSession().getPrincipalId(); 582 583 //set additional details for summary tab 584 Map<String, String> additionalPermissionDetails = new HashMap<String, String>(); 585 additionalPermissionDetails.put(KimAttributes.EDIT_MODE, EffortCertificationEditMode.SUMMARY_TAB_ENTRY); 586 587 //get list of chart/account numbers 588 List<EffortCertificationDetail> summarizedDetailLines = createSummarizedDetailLines(certificationReportForm); 589 590 //set additional role qualifiers 591 Map<String, String> additionalRoleQualifiers = new HashMap<String, String>(); 592 String proposalNumber = getPropsalNumberForProjectDirector(currentPrincipalId, summarizedDetailLines); 593 594 //set proposal number if found 595 if (StringUtils.isNotBlank(proposalNumber)){ 596 additionalRoleQualifiers.put(KFSPropertyConstants.PROPOSAL, proposalNumber); 597 598 //re-check summary permission 599 if (certReportDocAuthorizer.doPermissionExistsByTemplate( 600 effortDocument, 601 KNSConstants.KNS_NAMESPACE, 602 KimConstants.PermissionTemplateNames.USE_TRANSACTIONAL_DOCUMENT, 603 additionalPermissionDetails) 604 && !certReportDocAuthorizer.isAuthorizedByTemplate( 605 effortDocument, 606 KNSConstants.KNS_NAMESPACE, 607 KimConstants.PermissionTemplateNames.USE_TRANSACTIONAL_DOCUMENT, 608 currentPrincipalId, 609 additionalPermissionDetails, 610 additionalRoleQualifiers)) { 611 612 formBase.getEditingMode().put(EffortCertificationEditMode.SUMMARY_TAB_ENTRY, KNSConstants.KUALI_DEFAULT_TRUE_VALUE); 613 } 614 } 615 } 616 617 /** 618 * Retrieves a proposal number for a project director from a list of awards pulled by chart/account number. 619 * 620 * @param projectDirectorId 621 * @return 622 */ 623 protected String getPropsalNumberForProjectDirector(String projectDirectorId, List<EffortCertificationDetail> summarizedDetailLines){ 624 625 String proposalNumber = null; 626 String chartOfAccountsCode = null; 627 String accountNumber = null; 628 629 for (EffortCertificationDetail line : summarizedDetailLines) { 630 proposalNumber = SpringContext.getBean(ContractsAndGrantsModuleService.class).getProposalNumberForAccountAndProjectDirector(line.getChartOfAccountsCode(), line.getAccountNumber(), projectDirectorId); 631 632 //if found a proposal number, break and return 633 if( StringUtils.isNotEmpty(proposalNumber)) break; 634 } 635 636 return proposalNumber; 637 } 638 639 protected List<EffortCertificationDetail> createSummarizedDetailLines(CertificationReportForm certificationReportForm){ 640 641 List<EffortCertificationDetail> summarizedDetailLines = new ArrayList<EffortCertificationDetail>(); 642 Map<String, DetailLineGroup> detailLineGroupMap = null; 643 644 summarizedDetailLines = certificationReportForm.getSummarizedDetailLines(); 645 646 if(ObjectUtils.isNull(summarizedDetailLines) || summarizedDetailLines.isEmpty()){ 647 if(ObjectUtils.isNotNull(certificationReportForm.getDetailLines()) && !certificationReportForm.getDetailLines().isEmpty()){ 648 summarizedDetailLines = certificationReportForm.getDetailLines(); 649 } 650 } 651 652 return summarizedDetailLines; 653 654 } 655 656 /** 657 * Transforms the summarized effort detail lines into a chart/account number map 658 * 659 * @param summaryDetail 660 * @return 661 */ 662 protected Map<String,String> convertSummarizedDetailToChartAccountMap(List<EffortCertificationDetail> summaryDetail){ 663 664 Map<String,String> chartAccountMap = new HashMap<String,String>(); 665 666 for(EffortCertificationDetail line: summaryDetail){ 667 chartAccountMap.put(line.getChartOfAccountsCode(), line.getAccountNumber()); 668 } 669 670 return chartAccountMap; 671 } 672 }