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.fp.document.service.impl; 017 018 import java.util.ArrayList; 019 import java.util.Collection; 020 import java.util.Iterator; 021 import java.util.List; 022 023 import org.kuali.kfs.fp.businessobject.BudgetAdjustmentAccountingLine; 024 import org.kuali.kfs.fp.document.BudgetAdjustmentDocument; 025 import org.kuali.kfs.fp.document.service.BudgetAdjustmentLaborBenefitsService; 026 import org.kuali.kfs.integration.ld.LaborLedgerBenefitsCalculation; 027 import org.kuali.kfs.integration.ld.LaborLedgerPositionObjectBenefit; 028 import org.kuali.kfs.integration.ld.LaborModuleService; 029 import org.kuali.kfs.sys.businessobject.AccountingLine; 030 import org.kuali.kfs.sys.businessobject.SourceAccountingLine; 031 import org.kuali.kfs.sys.businessobject.TargetAccountingLine; 032 import org.kuali.kfs.sys.context.SpringContext; 033 import org.kuali.rice.kns.service.BusinessObjectService; 034 import org.kuali.rice.kns.util.KualiDecimal; 035 import org.kuali.rice.kns.util.KualiInteger; 036 037 /** 038 * This is the default implementation of the methods defined by the BudgetAdjustmentLaborBenefitsService. These service performs 039 * methods related to the generation of labor benefit accounting lines for the budget adjustment document. 040 */ 041 public class BudgetAdjustmentLaborBenefitsServiceImpl implements BudgetAdjustmentLaborBenefitsService { 042 private BusinessObjectService businessObjectService; 043 044 /** 045 * This method generated labor benefit accounting lines to be added to the BudgetDocument provided. 046 * 047 * @param budgetDocument The BudgetDocument to have the new labor benefit accounting lines added to. 048 * @see org.kuali.kfs.fp.document.service.BudgetAdjustmentLaborBenefitsService#generateLaborBenefitsAccountingLines(org.kuali.kfs.fp.document.BudgetAdjustmentDocument) 049 */ 050 public void generateLaborBenefitsAccountingLines(BudgetAdjustmentDocument budgetDocument) { 051 Integer fiscalYear = budgetDocument.getPostingYear(); 052 053 List accountingLines = new ArrayList(); 054 accountingLines.addAll(budgetDocument.getSourceAccountingLines()); 055 accountingLines.addAll(budgetDocument.getTargetAccountingLines()); 056 057 /* 058 * find lines that have labor object codes, then retrieve the benefit calculation records for the object code. Finally, for 059 * each benefit record, create an accounting line with properties set from the original line, but substituted with the 060 * benefit object code and calculated current and base amount. 061 */ 062 for (Iterator iter = accountingLines.iterator(); iter.hasNext();) { 063 BudgetAdjustmentAccountingLine line = (BudgetAdjustmentAccountingLine) iter.next(); 064 065 // check if the line was previousely generated benefit line, if so delete and skip 066 if (line.isFringeBenefitIndicator()) { 067 if (line.isSourceAccountingLine()) { 068 budgetDocument.getSourceAccountingLines().remove(line); 069 } 070 else { 071 budgetDocument.getTargetAccountingLines().remove(line); 072 } 073 continue; 074 } 075 076 List<BudgetAdjustmentAccountingLine> benefitLines = generateBenefitLines(fiscalYear, line, budgetDocument); 077 078 for (BudgetAdjustmentAccountingLine benefitLine : benefitLines) { 079 if (benefitLine.isSourceAccountingLine()) { 080 budgetDocument.addSourceAccountingLine((SourceAccountingLine) benefitLine); 081 } 082 else { 083 budgetDocument.addTargetAccountingLine((TargetAccountingLine) benefitLine); 084 } 085 } 086 } 087 } 088 089 /** 090 * Given a budget adjustment accounting line, generates appropriate fringe benefit lines for the line 091 * 092 * @param line a line to generate fringe benefit lines for 093 * @return a List of BudgetAdjustmentAccountingLines to add to the document as fringe benefit lines 094 */ 095 protected List<BudgetAdjustmentAccountingLine> generateBenefitLines(Integer fiscalYear, BudgetAdjustmentAccountingLine line, BudgetAdjustmentDocument document) { 096 List<BudgetAdjustmentAccountingLine> fringeLines = new ArrayList<BudgetAdjustmentAccountingLine>(); 097 098 try { 099 Collection<LaborLedgerPositionObjectBenefit> objectBenefits = SpringContext.getBean(LaborModuleService.class).retrieveLaborPositionObjectBenefits(fiscalYear, line.getChartOfAccountsCode(), line.getFinancialObjectCode()); 100 if (objectBenefits != null) { 101 for (LaborLedgerPositionObjectBenefit fringeBenefitInformation : objectBenefits) { 102 // now create and set properties for the benefit line 103 BudgetAdjustmentAccountingLine benefitLine = null; 104 if (line.isSourceAccountingLine()) { 105 benefitLine = (BudgetAdjustmentAccountingLine) document.getSourceAccountingLineClass().newInstance(); 106 } 107 else { 108 benefitLine = (BudgetAdjustmentAccountingLine) document.getTargetAccountingLineClass().newInstance(); 109 } 110 111 LaborLedgerBenefitsCalculation benefitsCalculation = fringeBenefitInformation.getLaborLedgerBenefitsCalculation(); 112 113 benefitLine.copyFrom(line); 114 benefitLine.setFinancialObjectCode(benefitsCalculation.getPositionFringeBenefitObjectCode()); 115 benefitLine.refreshNonUpdateableReferences(); 116 117 //convert whole percentage to decimal value (5% to .05) 118 KualiDecimal fringeBenefitPercent = formatPercentageForMultiplication(benefitsCalculation.getPositionFringeBenefitPercent()); 119 120 KualiDecimal benefitCurrentAmount = line.getCurrentBudgetAdjustmentAmount().multiply(fringeBenefitPercent); 121 benefitLine.setCurrentBudgetAdjustmentAmount(benefitCurrentAmount); 122 123 KualiInteger benefitBaseAmount = line.getBaseBudgetAdjustmentAmount().multiply(fringeBenefitPercent); 124 benefitLine.setBaseBudgetAdjustmentAmount(benefitBaseAmount); 125 126 // clear monthly lines per KULEDOCS-1606 127 benefitLine.clearFinancialDocumentMonthLineAmounts(); 128 129 // set flag on line so we know it was a generated benefit line and can clear it out later if needed 130 benefitLine.setFringeBenefitIndicator(true); 131 132 fringeLines.add(benefitLine); 133 } 134 } 135 } 136 catch (InstantiationException ie) { 137 // it's doubtful this catch block or the catch block below are ever accessible, as accounting lines should already have 138 // been generated 139 // for the document. But we can still make it somebody else's problem 140 throw new RuntimeException(ie); 141 } 142 catch (IllegalAccessException iae) { 143 // with some luck we'll pass the buck now sez some other dev "This sucks!" Get your Runtime on! 144 // but really...we'll never make it this far. I promise. 145 throw new RuntimeException(iae); 146 } 147 148 return fringeLines; 149 } 150 151 152 /** 153 * @param budgetDocument 154 * @return 155 * @see org.kuali.kfs.fp.document.service.BudgetAdjustmentLaborBenefitsService#hasLaborObjectCodes(org.kuali.kfs.fp.document.BudgetAdjustmentDocument) 156 */ 157 public boolean hasLaborObjectCodes(BudgetAdjustmentDocument budgetDocument) { 158 boolean hasLaborObjectCodes = false; 159 160 List<AccountingLine> accountingLines = new ArrayList<AccountingLine>(); 161 accountingLines.addAll(budgetDocument.getSourceAccountingLines()); 162 accountingLines.addAll(budgetDocument.getTargetAccountingLines()); 163 164 Integer fiscalYear = budgetDocument.getPostingYear(); 165 LaborModuleService laborModuleService = SpringContext.getBean(LaborModuleService.class); 166 167 for (AccountingLine line : accountingLines) { 168 if (laborModuleService.hasFringeBenefitProducingObjectCodes(fiscalYear, line.getChartOfAccountsCode(), line.getFinancialObjectCode())) { 169 hasLaborObjectCodes = true; 170 break; 171 } 172 } 173 174 return hasLaborObjectCodes; 175 } 176 177 178 protected KualiDecimal formatPercentageForMultiplication(KualiDecimal percent) { 179 return percent.divide(new KualiDecimal(100)); 180 } 181 182 /** 183 * Gets the businessObjectService attribute. 184 * 185 * @return Returns the businessObjectService. 186 */ 187 public BusinessObjectService getBusinessObjectService() { 188 return businessObjectService; 189 } 190 191 /** 192 * Sets the businessObjectService attribute value. 193 * 194 * @param businessObjectService The businessObjectService to set. 195 */ 196 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 197 this.businessObjectService = businessObjectService; 198 } 199 200 201 }