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.service.impl; 017 018 import java.util.List; 019 import java.util.Map; 020 import java.util.Set; 021 022 import org.kuali.kfs.coa.businessobject.A21SubAccount; 023 import org.kuali.kfs.integration.ld.LaborLedgerBalance; 024 import org.kuali.kfs.module.ec.EffortConstants; 025 import org.kuali.kfs.module.ec.EffortConstants.SystemParameters; 026 import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetailBuild; 027 import org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition; 028 import org.kuali.kfs.module.ec.service.EffortCertificationDetailBuildService; 029 import org.kuali.kfs.module.ec.util.LedgerBalanceConsolidationHelper; 030 import org.kuali.kfs.sys.KFSConstants; 031 import org.kuali.rice.kns.util.KualiDecimal; 032 import org.kuali.rice.kns.util.ObjectUtils; 033 import org.springframework.transaction.annotation.Transactional; 034 035 /** 036 * This class provides the facilities that can generate detail line (build) for effort certification from the given labor ledger 037 * balance record 038 */ 039 @Transactional 040 public class EffortCertificationDetailBuildServiceImpl implements EffortCertificationDetailBuildService { 041 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EffortCertificationDetailBuildServiceImpl.class); 042 043 /** 044 * @see org.kuali.kfs.module.ec.service.EffortCertificationDetailBuildService#generateDetailBuild(java.lang.Integer, 045 * org.kuali.kfs.module.ld.businessobject.LedgerBalance, org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition) 046 */ 047 public EffortCertificationDetailBuild generateDetailBuild(Integer postingYear, LaborLedgerBalance ledgerBalance, EffortCertificationReportDefinition reportDefinition) { 048 EffortCertificationDetailBuild detailLine = new EffortCertificationDetailBuild(); 049 050 detailLine.setUniversityFiscalYear(postingYear); 051 detailLine.setAccountNumber(ledgerBalance.getAccountNumber()); 052 detailLine.setChartOfAccountsCode(ledgerBalance.getChartOfAccountsCode()); 053 054 detailLine.setPositionNumber(ledgerBalance.getPositionNumber()); 055 detailLine.setFinancialObjectCode(ledgerBalance.getFinancialObjectCode()); 056 057 Map<Integer, Set<String>> reportPeriods = reportDefinition.getReportPeriods(); 058 KualiDecimal payrollAmount = LedgerBalanceConsolidationHelper.calculateTotalAmountWithinReportPeriod(ledgerBalance, reportPeriods); 059 060 detailLine.setEffortCertificationPayrollAmount(payrollAmount); 061 detailLine.setEffortCertificationOriginalPayrollAmount(payrollAmount); 062 063 detailLine.setEffortCertificationCalculatedOverallPercent(0); 064 detailLine.setEffortCertificationUpdatedOverallPercent(0); 065 066 populateCostShareRelatedFields(detailLine, ledgerBalance); 067 068 return detailLine; 069 } 070 071 /** 072 * populate the cost share related fields in the given detail line 073 * 074 * @param detailLine the given detail line 075 * @param ledgerBalance the given ledger balance 076 * @param parameters the given parameters setup in the calling client 077 */ 078 protected void populateCostShareRelatedFields(EffortCertificationDetailBuild detailLine, LaborLedgerBalance ledgerBalance) { 079 List<String> expenseSubAccountTypeCodes = EffortConstants.ELIGIBLE_EXPENSE_SUB_ACCOUNT_TYPE_CODES; 080 List<String> costShareSubAccountTypeCodes = EffortConstants.ELIGIBLE_COST_SHARE_SUB_ACCOUNT_TYPE_CODES; 081 082 A21SubAccount A21SubAccount = this.getA21SubAccount(ledgerBalance); 083 String subAccountTypeCode = ObjectUtils.isNull(A21SubAccount) ? null : A21SubAccount.getSubAccountTypeCode(); 084 085 if (ObjectUtils.isNull(subAccountTypeCode) || expenseSubAccountTypeCodes.contains(subAccountTypeCode)) { 086 detailLine.setSubAccountNumber(KFSConstants.getDashSubAccountNumber()); 087 detailLine.setSourceChartOfAccountsCode(EffortConstants.DASH_CHART_OF_ACCOUNTS_CODE); 088 detailLine.setSourceAccountNumber(EffortConstants.DASH_ACCOUNT_NUMBER); 089 detailLine.setCostShareSourceSubAccountNumber(null); 090 } 091 else if (costShareSubAccountTypeCodes.contains(subAccountTypeCode)) { 092 detailLine.setSubAccountNumber(ledgerBalance.getSubAccountNumber()); 093 detailLine.setSourceChartOfAccountsCode(A21SubAccount.getCostShareChartOfAccountCode()); 094 detailLine.setSourceAccountNumber(A21SubAccount.getCostShareSourceAccountNumber()); 095 detailLine.setCostShareSourceSubAccountNumber(A21SubAccount.getCostShareSourceSubAccountNumber()); 096 } 097 else { 098 detailLine.setSubAccountNumber(ledgerBalance.getSubAccountNumber()); 099 detailLine.setSourceChartOfAccountsCode(EffortConstants.DASH_CHART_OF_ACCOUNTS_CODE); 100 detailLine.setSourceAccountNumber(EffortConstants.DASH_ACCOUNT_NUMBER); 101 detailLine.setCostShareSourceSubAccountNumber(null); 102 } 103 } 104 105 /** 106 * get the A21 sub account associated with the given ledger balance 107 * 108 * @param ledgerBalance the given ledger balance 109 * @return the A21 sub account associated with the given ledger balance; return null if not found 110 */ 111 protected A21SubAccount getA21SubAccount(LaborLedgerBalance ledgerBalance) { 112 A21SubAccount a21SubAccount = null; 113 try { 114 if (ObjectUtils.isNotNull(ledgerBalance.getSubAccount())) { 115 a21SubAccount = ledgerBalance.getSubAccount().getA21SubAccount(); 116 } 117 } 118 catch (NullPointerException npe) { 119 LOG.debug(npe); 120 } 121 return a21SubAccount; 122 } 123 }