/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.ec.service.impl; import java.util.List; import java.util.Map; import java.util.Set; import org.kuali.kfs.coa.businessobject.A21SubAccount; import org.kuali.kfs.integration.ld.LaborLedgerBalance; import org.kuali.kfs.module.ec.EffortConstants; import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetailBuild; import org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition; import org.kuali.kfs.module.ec.service.EffortCertificationDetailBuildService; import org.kuali.kfs.module.ec.util.LedgerBalanceConsolidationHelper; import org.kuali.kfs.sys.KFSConstants; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.krad.util.ObjectUtils; import org.springframework.transaction.annotation.Transactional; /** * This class provides the facilities that can generate detail line (build) for effort certification from the given labor ledger * balance record */ @Transactional public class EffortCertificationDetailBuildServiceImpl implements EffortCertificationDetailBuildService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EffortCertificationDetailBuildServiceImpl.class); /** * @see org.kuali.kfs.module.ec.service.EffortCertificationDetailBuildService#generateDetailBuild(java.lang.Integer, * org.kuali.kfs.module.ld.businessobject.LedgerBalance, org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition) */ public EffortCertificationDetailBuild generateDetailBuild(Integer postingYear, LaborLedgerBalance ledgerBalance, EffortCertificationReportDefinition reportDefinition) { EffortCertificationDetailBuild detailLine = new EffortCertificationDetailBuild(); detailLine.setUniversityFiscalYear(postingYear); detailLine.setAccountNumber(ledgerBalance.getAccountNumber()); detailLine.setChartOfAccountsCode(ledgerBalance.getChartOfAccountsCode()); detailLine.setPositionNumber(ledgerBalance.getPositionNumber()); detailLine.setFinancialObjectCode(ledgerBalance.getFinancialObjectCode()); Map<Integer, Set<String>> reportPeriods = reportDefinition.getReportPeriods(); KualiDecimal payrollAmount = LedgerBalanceConsolidationHelper.calculateTotalAmountWithinReportPeriod(ledgerBalance, reportPeriods); detailLine.setEffortCertificationPayrollAmount(payrollAmount); detailLine.setEffortCertificationOriginalPayrollAmount(payrollAmount); detailLine.setEffortCertificationCalculatedOverallPercent(0); detailLine.setEffortCertificationUpdatedOverallPercent(0); populateCostShareRelatedFields(detailLine, ledgerBalance); return detailLine; } /** * populate the cost share related fields in the given detail line * * @param detailLine the given detail line * @param ledgerBalance the given ledger balance * @param parameters the given parameters setup in the calling client */ protected void populateCostShareRelatedFields(EffortCertificationDetailBuild detailLine, LaborLedgerBalance ledgerBalance) { List<String> expenseSubAccountTypeCodes = EffortConstants.ELIGIBLE_EXPENSE_SUB_ACCOUNT_TYPE_CODES; List<String> costShareSubAccountTypeCodes = EffortConstants.ELIGIBLE_COST_SHARE_SUB_ACCOUNT_TYPE_CODES; A21SubAccount A21SubAccount = this.getA21SubAccount(ledgerBalance); String subAccountTypeCode = ObjectUtils.isNull(A21SubAccount) ? null : A21SubAccount.getSubAccountTypeCode(); if (ObjectUtils.isNull(subAccountTypeCode) || expenseSubAccountTypeCodes.contains(subAccountTypeCode)) { detailLine.setSubAccountNumber(KFSConstants.getDashSubAccountNumber()); detailLine.setSourceChartOfAccountsCode(EffortConstants.DASH_CHART_OF_ACCOUNTS_CODE); detailLine.setSourceAccountNumber(EffortConstants.DASH_ACCOUNT_NUMBER); detailLine.setCostShareSourceSubAccountNumber(null); } else if (costShareSubAccountTypeCodes.contains(subAccountTypeCode)) { detailLine.setSubAccountNumber(ledgerBalance.getSubAccountNumber()); detailLine.setSourceChartOfAccountsCode(A21SubAccount.getCostShareChartOfAccountCode()); detailLine.setSourceAccountNumber(A21SubAccount.getCostShareSourceAccountNumber()); detailLine.setCostShareSourceSubAccountNumber(A21SubAccount.getCostShareSourceSubAccountNumber()); } else { detailLine.setSubAccountNumber(ledgerBalance.getSubAccountNumber()); detailLine.setSourceChartOfAccountsCode(EffortConstants.DASH_CHART_OF_ACCOUNTS_CODE); detailLine.setSourceAccountNumber(EffortConstants.DASH_ACCOUNT_NUMBER); detailLine.setCostShareSourceSubAccountNumber(null); } } /** * get the A21 sub account associated with the given ledger balance * * @param ledgerBalance the given ledger balance * @return the A21 sub account associated with the given ledger balance; return null if not found */ protected A21SubAccount getA21SubAccount(LaborLedgerBalance ledgerBalance) { A21SubAccount a21SubAccount = null; try { if (ObjectUtils.isNotNull(ledgerBalance.getSubAccount())) { a21SubAccount = ledgerBalance.getSubAccount().getA21SubAccount(); } } catch (NullPointerException npe) { LOG.debug(npe); } return a21SubAccount; } }