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.Iterator;
020 import java.util.List;
021 import java.util.Map;
022 import java.util.Set;
023
024 import org.apache.commons.collections.IteratorUtils;
025 import org.kuali.kfs.gl.OJBUtility;
026 import org.kuali.kfs.module.ld.businessobject.EmployeeFunding;
027 import org.kuali.kfs.module.ld.businessobject.LaborBalanceSummary;
028 import org.kuali.kfs.module.ld.businessobject.LaborTransaction;
029 import org.kuali.kfs.module.ld.businessobject.LedgerBalance;
030 import org.kuali.kfs.module.ld.businessobject.LedgerBalanceForYearEndBalanceForward;
031 import org.kuali.kfs.module.ld.dataaccess.LaborLedgerBalanceDao;
032 import org.kuali.kfs.module.ld.service.LaborCalculatedSalaryFoundationTrackerService;
033 import org.kuali.kfs.module.ld.service.LaborLedgerBalanceService;
034 import org.kuali.kfs.module.ld.util.DebitCreditUtil;
035 import org.kuali.kfs.sys.ObjectUtil;
036 import org.kuali.kfs.sys.service.NonTransactional;
037 import org.kuali.rice.kns.util.KualiDecimal;
038 import org.springframework.transaction.annotation.Transactional;
039
040 public class LaborLedgerBalanceServiceImpl implements LaborLedgerBalanceService {
041 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborLedgerBalanceServiceImpl.class);
042
043 private LaborLedgerBalanceDao laborLedgerBalanceDao;
044 private LaborCalculatedSalaryFoundationTrackerService laborCalculatedSalaryFoundationTrackerService;
045
046 /**
047 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findBalancesForFiscalYear(java.lang.Integer)
048 */
049 @NonTransactional
050 public Iterator<LedgerBalance> findBalancesForFiscalYear(Integer fiscalYear) {
051 return laborLedgerBalanceDao.findBalancesForFiscalYear(fiscalYear);
052 }
053
054 /**
055 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findBalancesForFiscalYear(java.lang.Integer, java.util.Map)
056 */
057 @NonTransactional
058 public Iterator<LedgerBalance> findBalancesForFiscalYear(Integer fiscalYear, Map<String, String> fieldValues) {
059 return laborLedgerBalanceDao.findBalancesForFiscalYear(fiscalYear, fieldValues);
060 }
061
062 /**
063 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findBalance(java.util.Map, boolean)
064 */
065 @NonTransactional
066 public Iterator findBalance(Map fieldValues, boolean isConsolidated) {
067 LOG.debug("findBalance() started");
068 return laborLedgerBalanceDao.findBalance(fieldValues, isConsolidated);
069 }
070
071 /**
072 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#getBalanceRecordCount(java.util.Map, boolean)
073 */
074 @NonTransactional
075 public Integer getBalanceRecordCount(Map fieldValues, boolean isConsolidated) {
076 LOG.debug("getBalanceRecordCount() started");
077
078 Integer recordCount = null;
079 if (!isConsolidated) {
080 recordCount = OJBUtility.getResultSizeFromMap(fieldValues, new LedgerBalance()).intValue();
081 }
082 else {
083 Iterator recordCountIterator = laborLedgerBalanceDao.getConsolidatedBalanceRecordCount(fieldValues);
084 List recordCountList = IteratorUtils.toList(recordCountIterator);
085 recordCount = recordCountList.size();
086 }
087 return recordCount;
088 }
089
090 /**
091 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findLedgerBalance(java.util.Collection,
092 * org.kuali.kfs.module.ld.businessobject.LaborTransaction)
093 */
094 @NonTransactional
095 public <T extends LedgerBalance> T findLedgerBalance(Collection<T> ledgerBalanceCollection, LaborTransaction transaction, List<String> keyList) {
096 for (T ledgerBalance : ledgerBalanceCollection) {
097 boolean found = ObjectUtil.equals(ledgerBalance, transaction, keyList);
098 if (found) {
099 return ledgerBalance;
100 }
101 }
102 return null;
103 }
104
105 /**
106 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findLedgerBalance(java.util.Collection,
107 * org.kuali.kfs.module.ld.businessobject.LaborTransaction)
108 */
109 @NonTransactional
110 public <T extends LedgerBalance> T findLedgerBalance(Collection<T> ledgerBalanceCollection, LaborTransaction transaction) {
111 for (T ledgerBalance : ledgerBalanceCollection) {
112 boolean found = ObjectUtil.equals(ledgerBalance, transaction, ledgerBalance.getPrimaryKeyList());
113 if (found) {
114 return ledgerBalance;
115 }
116 }
117 return null;
118 }
119
120 /**
121 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#updateLedgerBalance(org.kuali.kfs.module.ld.businessobject.LedgerBalance,
122 * org.kuali.kfs.module.ld.businessobject.LaborTransaction)
123 */
124 @Transactional
125 public <T extends LedgerBalance> void updateLedgerBalance(T ledgerBalance, LaborTransaction transaction) {
126 String debitCreditCode = transaction.getTransactionDebitCreditCode();
127 KualiDecimal amount = transaction.getTransactionLedgerEntryAmount();
128 amount = DebitCreditUtil.getNumericAmount(amount, debitCreditCode);
129 ledgerBalance.addAmount(transaction.getUniversityFiscalPeriodCode(), amount);
130 }
131
132 /**
133 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#addLedgerBalance(java.util.Collection,
134 * org.kuali.kfs.module.ld.businessobject.LaborTransaction)
135 */
136 @Transactional
137 public LedgerBalance addLedgerBalance(Collection<LedgerBalance> ledgerBalanceCollection, LaborTransaction transaction) {
138 LedgerBalance ledgerBalance = this.findLedgerBalance(ledgerBalanceCollection, transaction);
139
140 if (ledgerBalance == null) {
141 LedgerBalance newLedgerBalance = new LedgerBalance();
142 ObjectUtil.buildObject(newLedgerBalance, transaction);
143 updateLedgerBalance(newLedgerBalance, transaction);
144
145 ledgerBalanceCollection.add(newLedgerBalance);
146 return newLedgerBalance;
147 }
148 return null;
149 }
150
151 /**
152 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findEmployeeFunding(java.util.Map)
153 */
154 @NonTransactional
155 public List<EmployeeFunding> findEmployeeFunding(Map fieldValues, boolean isConsolidated) {
156 List<EmployeeFunding> currentFundsCollection = laborLedgerBalanceDao.findCurrentEmployeeFunds(fieldValues);
157 List<EmployeeFunding> encumbranceFundsCollection = laborLedgerBalanceDao.findEncumbranceEmployeeFunds(fieldValues);
158
159 // merge encumberance with the current funds
160 for (EmployeeFunding encumbranceFunding : encumbranceFundsCollection) {
161 KualiDecimal encumbrance = encumbranceFunding.getAccountLineAnnualBalanceAmount().add(encumbranceFunding.getContractsGrantsBeginningBalanceAmount());
162 encumbranceFunding.setOutstandingEncumbrance(encumbrance);
163
164 if (currentFundsCollection.contains(encumbranceFunding)) {
165 int index = currentFundsCollection.indexOf(encumbranceFunding);
166 currentFundsCollection.get(index).setOutstandingEncumbrance(encumbrance);
167 }
168 else if(encumbrance != null && encumbrance.isNonZero()){
169 currentFundsCollection.add(encumbranceFunding);
170 }
171 }
172
173 // update the employee fundings
174 for (EmployeeFunding employeeFunding : currentFundsCollection) {
175 employeeFunding.setCurrentAmount(employeeFunding.getAccountLineAnnualBalanceAmount());
176 }
177 return currentFundsCollection;
178 }
179
180 /**
181 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findEmployeeFundingWithCSFTracker(java.util.Map)
182 */
183 @NonTransactional
184 public List<EmployeeFunding> findEmployeeFundingWithCSFTracker(Map fieldValues, boolean isConsolidated) {
185 List<EmployeeFunding> currentFundsCollection = this.findEmployeeFunding(fieldValues, isConsolidated);
186 List<EmployeeFunding> CSFTrackersCollection = laborCalculatedSalaryFoundationTrackerService.findCSFTrackersAsEmployeeFunding(fieldValues, isConsolidated);
187
188 for (EmployeeFunding CSFTrackerAsEmployeeFunding : CSFTrackersCollection) {
189 if (currentFundsCollection.contains(CSFTrackerAsEmployeeFunding)) {
190 int index = currentFundsCollection.indexOf(CSFTrackerAsEmployeeFunding);
191 EmployeeFunding currentFunds = currentFundsCollection.get(index);
192
193 currentFunds.setCsfDeleteCode(CSFTrackerAsEmployeeFunding.getCsfDeleteCode());
194 currentFunds.setCsfTimePercent(CSFTrackerAsEmployeeFunding.getCsfTimePercent());
195 currentFunds.setCsfFundingStatusCode(CSFTrackerAsEmployeeFunding.getCsfFundingStatusCode());
196 currentFunds.setCsfAmount(CSFTrackerAsEmployeeFunding.getCsfAmount());
197 currentFunds.setCsfFullTimeEmploymentQuantity(CSFTrackerAsEmployeeFunding.getCsfFullTimeEmploymentQuantity());
198 }
199 }
200
201 return currentFundsCollection;
202 }
203
204 /**
205 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findBalanceSummary(java.lang.Integer, java.util.Collection)
206 */
207 @NonTransactional
208 public List<LaborBalanceSummary> findBalanceSummary(Integer fiscalYear, Collection<String> balanceTypes) {
209 return laborLedgerBalanceDao.findBalanceSummary(fiscalYear, balanceTypes);
210 }
211
212 /**
213 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#save(org.kuali.kfs.module.ld.businessobject.LedgerBalance)
214 */
215 @Transactional
216 public void save(LedgerBalance ledgerBalance) {
217 laborLedgerBalanceDao.save(ledgerBalance);
218 }
219
220 /**
221 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findBalancesForFiscalYear(java.lang.Integer, java.util.Map,
222 * java.util.List, java.util.List)
223 */
224 @NonTransactional
225 public Iterator<LedgerBalanceForYearEndBalanceForward> findBalancesForFiscalYear(Integer fiscalYear, Map<String, String> fieldValues, List<String> subFundGroupCodes, List<String> fundGroupCodes) {
226 return laborLedgerBalanceDao.findBalancesForFiscalYear(fiscalYear, fieldValues, subFundGroupCodes, fundGroupCodes);
227 }
228
229 /**
230 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findAccountsInFundGroups(java.lang.Integer, java.util.Map,
231 * java.util.List, java.util.List)
232 */
233 @NonTransactional
234 public List<List<String>> findAccountsInFundGroups(Integer fiscalYear, Map<String, String> fieldValues, List<String> subFundGroupCodes, List<String> fundGroupCodes) {
235 return laborLedgerBalanceDao.findAccountsInFundGroups(fiscalYear, fieldValues, subFundGroupCodes, fundGroupCodes);
236 }
237
238 /**
239 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#findLedgerBalances(java.util.Map, java.util.Map, java.util.Set,
240 * java.util.List, java.util.List)
241 */
242 @NonTransactional
243 public Collection<LedgerBalance> findLedgerBalances(Map<String, List<String>> fieldValues, Map<String, List<String>> excludedFieldValues, Set<Integer> fiscalYears, List<String> balanceTypeList, List<String> positionObjectGroupCodes) {
244 return laborLedgerBalanceDao.findLedgerBalances(fieldValues, excludedFieldValues, fiscalYears, balanceTypeList, positionObjectGroupCodes);
245 }
246
247 /**
248 * @see org.kuali.kfs.module.ld.service.LaborLedgerBalanceService#deleteLedgerBalancesPriorToYear(java.lang.Integer, java.lang.String)
249 */
250 @Transactional
251 public void deleteLedgerBalancesPriorToYear(Integer fiscalYear, String chartOfAccountsCode) {
252 laborLedgerBalanceDao.deleteLedgerBalancesPriorToYear(fiscalYear, chartOfAccountsCode);
253 }
254
255 /**
256 * Sets the laborLedgerBalanceDao attribute value.
257 *
258 * @param laborLedgerBalanceDao The laborLedgerBalanceDao to set.
259 */
260 @NonTransactional
261 public void setLaborLedgerBalanceDao(LaborLedgerBalanceDao laborLedgerBalanceDao) {
262 this.laborLedgerBalanceDao = laborLedgerBalanceDao;
263 }
264
265 /**
266 * Sets the laborCalculatedSalaryFoundationTrackerService attribute value.
267 *
268 * @param laborCalculatedSalaryFoundationTrackerService The laborCalculatedSalaryFoundationTrackerService to set.
269 */
270 @NonTransactional
271 public void setLaborCalculatedSalaryFoundationTrackerService(LaborCalculatedSalaryFoundationTrackerService laborCalculatedSalaryFoundationTrackerService) {
272 this.laborCalculatedSalaryFoundationTrackerService = laborCalculatedSalaryFoundationTrackerService;
273 }
274 }
275