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.ld.service.impl;
017
018 import java.util.Collection;
019 import java.util.HashMap;
020 import java.util.Iterator;
021 import java.util.List;
022 import java.util.Map;
023
024 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry;
025 import org.kuali.kfs.module.ld.dataaccess.LaborLedgerPendingEntryDao;
026 import org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument;
027 import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService;
028 import org.kuali.kfs.sys.KFSConstants;
029 import org.kuali.kfs.sys.businessobject.AccountingLine;
030 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
031 import org.kuali.kfs.sys.context.SpringContext;
032 import org.kuali.rice.kns.service.BusinessObjectService;
033 import org.kuali.rice.kns.service.KualiRuleService;
034 import org.kuali.rice.kns.service.LookupService;
035 import org.springframework.transaction.annotation.Transactional;
036
037 /**
038 * Service implementation of LaborLedgerPendingEntryService.
039 */
040 @Transactional
041 public class LaborLedgerPendingEntryServiceImpl implements LaborLedgerPendingEntryService {
042 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborLedgerPendingEntryServiceImpl.class);
043
044 private LaborLedgerPendingEntryDao laborLedgerPendingEntryDao;
045 private BusinessObjectService businessObjectService;
046
047 /**
048 * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#hasPendingLaborLedgerEntry(org.kuali.kfs.coa.businessobject.Account)
049 */
050 public boolean hasPendingLaborLedgerEntry(String chartOfAccountsCode, String accountNumber) {
051 Map fieldValues = new HashMap();
052 fieldValues.put("chartOfAccountsCode", chartOfAccountsCode);
053 fieldValues.put("accountNumber", accountNumber);
054
055 return businessObjectService.countMatching(LaborLedgerPendingEntry.class, fieldValues) > 0;
056 }
057
058 /**
059 * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#hasPendingLaborLedgerEntry(java.util.Map)
060 */
061 public boolean hasPendingLaborLedgerEntry(Map fieldValues) {
062 LOG.info("hasPendingLaborLedgerEntry(Map fieldValues) started");
063
064 Collection<LaborLedgerPendingEntry> pendingEntries = SpringContext.getBean(LookupService.class).findCollectionBySearch(LaborLedgerPendingEntry.class, fieldValues);
065
066 // exclude the pending labor ledger transaction has been processed
067 for (LaborLedgerPendingEntry pendingLedgerEntry : pendingEntries) {
068 String approvedCode = pendingLedgerEntry.getFinancialDocumentApprovedCode();
069 if (!KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED.equals(approvedCode)) {
070 return true;
071 }
072 }
073 return false;
074 }
075
076 /**
077 * Invokes generateEntries method on the salary expense transfer document.
078 *
079 * @param document - document whose pending entries need generated
080 * @return whether the business rules succeeded
081 */
082 public boolean generateLaborLedgerPendingEntries(LaborLedgerPostingDocument document) {
083 LOG.info("generateLaborLedgerPendingEntries() started");
084 boolean success = true;
085
086 // we must clear them first before creating new ones
087 document.getLaborLedgerPendingEntries().clear();
088
089 LOG.info("deleting existing labor ledger pending ledger entries for document " + document.getDocumentNumber());
090 delete(document.getDocumentNumber());
091
092 LOG.info("generating labor ledger pending ledger entries for document " + document.getDocumentNumber());
093 GeneralLedgerPendingEntrySequenceHelper sequenceHelper = new GeneralLedgerPendingEntrySequenceHelper();
094
095 // process accounting lines, generate labor ledger pending entries
096 List<AccountingLine> sourceAccountingLines = document.getSourceAccountingLines();
097 for (AccountingLine accountingLine : sourceAccountingLines) {
098 success &= document.generateLaborLedgerPendingEntries(accountingLine, sequenceHelper);
099 }
100
101 List<AccountingLine> targetAccountingLines = document.getTargetAccountingLines();
102 for (AccountingLine accountingLine : targetAccountingLines) {
103 success &= document.generateLaborLedgerPendingEntries(accountingLine, sequenceHelper);
104 }
105
106 // compare source and target accounting lines, and generate benefit clearing lines as needed
107 success &= document.generateLaborLedgerBenefitClearingPendingEntries(sequenceHelper);
108
109 return success;
110 }
111
112 public void delete(String documentHeaderId) {
113 LOG.debug("delete() started");
114
115 laborLedgerPendingEntryDao.delete(documentHeaderId);
116 }
117
118 public Collection findPendingEntries(Map fieldValues, boolean isApproved) {
119 LOG.debug("findPendingEntries() started");
120
121 return laborLedgerPendingEntryDao.findPendingEntries(fieldValues, isApproved);
122 }
123
124 /**
125 * @see org.kuali.module.gl.service.GeneralLedgerPendingEntryService#findPendingLedgerEntriesForAccountBalance(java.util.Map,
126 * boolean, boolean)
127 */
128 public Iterator findPendingLedgerEntriesForLedgerBalance(Map fieldValues, boolean isApproved) {
129 LOG.debug("findPendingLedgerEntriesForAccountBalance() started");
130 return laborLedgerPendingEntryDao.findPendingLedgerEntriesForLedgerBalance(fieldValues, isApproved);
131 }
132
133 /**
134 * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#findApprovedPendingLedgerEntries()
135 */
136 public Iterator<LaborLedgerPendingEntry> findApprovedPendingLedgerEntries() {
137 return laborLedgerPendingEntryDao.findApprovedPendingLedgerEntries();
138 }
139
140 /**
141 * @see org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService#deleteByFinancialDocumentApprovedCode(java.lang.String)
142 */
143 public void deleteByFinancialDocumentApprovedCode(String financialDocumentApprovedCode) {
144 laborLedgerPendingEntryDao.deleteByFinancialDocumentApprovedCode(financialDocumentApprovedCode);
145 }
146
147 /**
148 * Sets the laborLedgerPendingEntryDao attribute value.
149 * @param laborLedgerPendingEntryDao The laborLedgerPendingEntryDao to set.
150 */
151 public void setLaborLedgerPendingEntryDao(LaborLedgerPendingEntryDao laborLedgerPendingEntryDao) {
152 this.laborLedgerPendingEntryDao = laborLedgerPendingEntryDao;
153 }
154
155 /**
156 * Sets the businessObjectService attribute value.
157 * @param businessObjectService The businessObjectService to set.
158 */
159 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
160 this.businessObjectService = businessObjectService;
161 }
162 }