/* * 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.ld.service.impl; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry; import org.kuali.kfs.module.ld.dataaccess.LaborLedgerPendingEntryDao; import org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument; import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper; import org.kuali.kfs.sys.businessobject.UniversityDate; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.service.GeneralLedgerPendingEntryService; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.LookupService; import org.springframework.transaction.annotation.Transactional; /** * Service implementation of LaborLedgerPendingEntryService. */ @Transactional public class LaborLedgerPendingEntryServiceImpl implements LaborLedgerPendingEntryService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborLedgerPendingEntryServiceImpl.class); private LaborLedgerPendingEntryDao laborLedgerPendingEntryDao; private BusinessObjectService businessObjectService; protected UniversityDateService universityDateService; protected GeneralLedgerPendingEntryService generalLedgerPendingEntryService; /** * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#hasPendingLaborLedgerEntry(org.kuali.kfs.coa.businessobject.Account) */ public boolean hasPendingLaborLedgerEntry(String chartOfAccountsCode, String accountNumber) { Map fieldValues = new HashMap(); fieldValues.put("chartOfAccountsCode", chartOfAccountsCode); fieldValues.put("accountNumber", accountNumber); return businessObjectService.countMatching(LaborLedgerPendingEntry.class, fieldValues) > 0; } /** * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#hasPendingLaborLedgerEntry(java.util.Map) */ public boolean hasPendingLaborLedgerEntry(Map fieldValues) { LOG.debug("hasPendingLaborLedgerEntry(Map fieldValues) started"); Collection<LaborLedgerPendingEntry> pendingEntries = SpringContext.getBean(LookupService.class).findCollectionBySearch(LaborLedgerPendingEntry.class, fieldValues); // exclude the pending labor ledger transaction has been processed for (LaborLedgerPendingEntry pendingLedgerEntry : pendingEntries) { String approvedCode = pendingLedgerEntry.getFinancialDocumentApprovedCode(); if (!KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED.equals(approvedCode)) { return true; } } return false; } /** * Invokes generateEntries method on the salary expense transfer document. * * @param document - document whose pending entries need generated * @return whether the business rules succeeded */ public boolean generateLaborLedgerPendingEntries(LaborLedgerPostingDocument document) { LOG.debug("generateLaborLedgerPendingEntries() started"); boolean success = true; // we must clear them first before creating new ones document.getLaborLedgerPendingEntries().clear(); LOG.info("deleting existing labor ledger pending ledger entries for document " + document.getDocumentNumber()); delete(document.getDocumentNumber()); LOG.info("generating labor ledger pending ledger entries for document " + document.getDocumentNumber()); GeneralLedgerPendingEntrySequenceHelper sequenceHelper = new GeneralLedgerPendingEntrySequenceHelper(); // process accounting lines, generate labor ledger pending entries List<AccountingLine> sourceAccountingLines = document.getSourceAccountingLines(); for (AccountingLine accountingLine : sourceAccountingLines) { success &= document.generateLaborLedgerPendingEntries(accountingLine, sequenceHelper); } List<AccountingLine> targetAccountingLines = document.getTargetAccountingLines(); for (AccountingLine accountingLine : targetAccountingLines) { success &= document.generateLaborLedgerPendingEntries(accountingLine, sequenceHelper); } // compare source and target accounting lines, and generate benefit clearing lines as needed success &= document.generateLaborLedgerBenefitClearingPendingEntries(sequenceHelper); return success; } public void delete(String documentHeaderId) { LOG.debug("delete() started"); laborLedgerPendingEntryDao.delete(documentHeaderId); } public Collection findPendingEntries(Map fieldValues, boolean isApproved) { LOG.debug("findPendingEntries() started"); UniversityDate currentUniversityDate = universityDateService.getCurrentUniversityDate(); String currentFiscalPeriodCode = currentUniversityDate.getUniversityFiscalAccountingPeriod(); Integer currentFiscalYear = currentUniversityDate.getUniversityFiscalYear(); List<String> encumbranceBalanceTypes = generalLedgerPendingEntryService.getEncumbranceBalanceTypes(fieldValues, currentFiscalYear); return laborLedgerPendingEntryDao.findPendingEntries(fieldValues, isApproved, currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); } /** * @see org.kuali.module.gl.service.GeneralLedgerPendingEntryService#findPendingLedgerEntriesForAccountBalance(java.util.Map, * boolean, boolean) */ public Iterator findPendingLedgerEntriesForLedgerBalance(Map fieldValues, boolean isApproved) { LOG.debug("findPendingLedgerEntriesForAccountBalance() started"); UniversityDate currentUniversityDate = universityDateService.getCurrentUniversityDate(); String currentFiscalPeriodCode = currentUniversityDate.getUniversityFiscalAccountingPeriod(); Integer currentFiscalYear = currentUniversityDate.getUniversityFiscalYear(); List<String> encumbranceBalanceTypes = generalLedgerPendingEntryService.getEncumbranceBalanceTypes(fieldValues, currentFiscalYear); return laborLedgerPendingEntryDao.findPendingLedgerEntriesForLedgerBalance(fieldValues, isApproved, currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); } /** * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#findApprovedPendingLedgerEntries() */ public Iterator<LaborLedgerPendingEntry> findApprovedPendingLedgerEntries() { return laborLedgerPendingEntryDao.findApprovedPendingLedgerEntries(); } /** * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#deleteByFinancialDocumentApprovedCode(java.lang.String) */ public void deleteByFinancialDocumentApprovedCode(String financialDocumentApprovedCode) { laborLedgerPendingEntryDao.deleteByFinancialDocumentApprovedCode(financialDocumentApprovedCode); } /** * Sets the laborLedgerPendingEntryDao attribute value. * * @param laborLedgerPendingEntryDao The laborLedgerPendingEntryDao to set. */ public void setLaborLedgerPendingEntryDao(LaborLedgerPendingEntryDao laborLedgerPendingEntryDao) { this.laborLedgerPendingEntryDao = laborLedgerPendingEntryDao; } /** * Sets the businessObjectService attribute value. * * @param businessObjectService The businessObjectService to set. */ public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * Sets the universityDateService. * * @param universityDateService */ public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } /** * Sets the generalLedgerPendingEntryService. * * @param generalLedgerPendingEntryService */ public void setGeneralLedgerPendingEntryService(GeneralLedgerPendingEntryService generalLedgerPendingEntryService) { this.generalLedgerPendingEntryService = generalLedgerPendingEntryService; } }