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.ArrayList;
019 import java.util.Arrays;
020 import java.util.Collection;
021 import java.util.HashMap;
022 import java.util.List;
023 import java.util.Map;
024 import java.util.Set;
025
026 import org.apache.commons.lang.StringUtils;
027 import org.kuali.kfs.coa.businessobject.ObjectCode;
028 import org.kuali.kfs.integration.ld.LaborLedgerBalance;
029 import org.kuali.kfs.integration.ld.LaborLedgerExpenseTransferAccountingLine;
030 import org.kuali.kfs.integration.ld.LaborLedgerObject;
031 import org.kuali.kfs.integration.ld.LaborLedgerPositionObjectBenefit;
032 import org.kuali.kfs.integration.ld.LaborLedgerPositionObjectGroup;
033 import org.kuali.kfs.integration.ld.LaborModuleService;
034 import org.kuali.kfs.module.ld.LaborPropertyConstants;
035 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry;
036 import org.kuali.kfs.module.ld.businessobject.LedgerBalance;
037 import org.kuali.kfs.module.ld.document.SalaryExpenseTransferDocument;
038 import org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService;
039 import org.kuali.kfs.module.ld.service.LaborLedgerBalanceService;
040 import org.kuali.kfs.module.ld.service.LaborLedgerEntryService;
041 import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService;
042 import org.kuali.kfs.module.ld.service.LaborOriginEntryService;
043 import org.kuali.kfs.sys.KFSConstants;
044 import org.kuali.kfs.sys.KFSPropertyConstants;
045 import org.kuali.kfs.sys.context.SpringContext;
046 import org.kuali.kfs.sys.service.UniversityDateService;
047 import org.kuali.rice.kew.exception.WorkflowException;
048 import org.kuali.rice.kns.bo.DocumentHeader;
049 import org.kuali.rice.kns.rule.event.SaveDocumentEvent;
050 import org.kuali.rice.kns.service.BusinessObjectService;
051 import org.kuali.rice.kns.service.DataDictionaryService;
052 import org.kuali.rice.kns.service.DocumentService;
053 import org.kuali.rice.kns.service.KualiModuleService;
054 import org.kuali.rice.kns.util.GlobalVariables;
055 import org.kuali.rice.kns.util.KualiDecimal;
056 import org.kuali.rice.kns.workflow.service.WorkflowDocumentService;
057 import org.springframework.transaction.annotation.Transactional;
058
059 /**
060 * This implements the service methods that may be used by outside of labor module
061 */
062 @Transactional
063 public class LaborModuleServiceImpl implements LaborModuleService {
064 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborModuleServiceImpl.class);
065
066 /**
067 * @see org.kuali.kfs.integration.ld.LaborModuleService#calculateFringeBenefitFromLaborObject(org.kuali.kfs.integration.ld.LaborLedgerObject,
068 * org.kuali.rice.kns.util.KualiDecimal)
069 */
070 public KualiDecimal calculateFringeBenefitFromLaborObject(LaborLedgerObject laborLedgerObject, KualiDecimal salaryAmount) {
071 return getLaborBenefitsCalculationService().calculateFringeBenefit(laborLedgerObject, salaryAmount);
072 }
073
074 /**
075 * @see org.kuali.kfs.integration.ld.LaborModuleService#calculateFringeBenefit(java.lang.Integer, java.lang.String,
076 * java.lang.String, org.kuali.rice.kns.util.KualiDecimal)
077 */
078 public KualiDecimal calculateFringeBenefit(Integer fiscalYear, String chartCode, String objectCode, KualiDecimal salaryAmount) {
079 return getLaborBenefitsCalculationService().calculateFringeBenefit(fiscalYear, chartCode, objectCode, salaryAmount);
080 }
081
082 /**
083 * @see org.kuali.kfs.integration.ld.LaborModuleService#createAndBlankApproveSalaryExpenseTransferDocument(java.lang.String,
084 * java.lang.String, java.lang.String, java.util.List, java.util.List, java.util.List)
085 */
086 public void createAndBlankApproveSalaryExpenseTransferDocument(String documentDescription, String explanation, String annotation, List<String> adHocRecipients, List<LaborLedgerExpenseTransferAccountingLine> sourceAccountingLines, List<LaborLedgerExpenseTransferAccountingLine> targetAccountingLines) throws WorkflowException {
087 LOG.info("createSalaryExpenseTransferDocument() start");
088
089 if (sourceAccountingLines == null || sourceAccountingLines.isEmpty()) {
090 LOG.info("Cannot create a salary expense document when the given source accounting line is empty.");
091 return;
092 }
093
094 if (targetAccountingLines == null || targetAccountingLines.isEmpty()) {
095 LOG.info("Cannot create a salary expense document when the given target accounting line is empty.");
096 return;
097 }
098
099 WorkflowDocumentService workflowDocumentService = SpringContext.getBean(WorkflowDocumentService.class);
100 SalaryExpenseTransferDocument document = (SalaryExpenseTransferDocument) getDocumentService().getNewDocument(SalaryExpenseTransferDocument.class);
101
102 document.setEmplid(sourceAccountingLines.get(0).getEmplid());
103 document.setSourceAccountingLines(sourceAccountingLines);
104 document.setTargetAccountingLines(targetAccountingLines);
105
106 DocumentHeader documentHeader = document.getDocumentHeader();
107 documentHeader.setDocumentDescription(documentDescription);
108 documentHeader.setExplanation(explanation);
109
110 document.prepareForSave(new SaveDocumentEvent(document));
111 document.populateDocumentForRouting();
112
113 String documentTitle = document.getDocumentTitle();
114 if (StringUtils.isNotBlank(documentTitle)) {
115 document.getDocumentHeader().getWorkflowDocument().setTitle(documentTitle);
116 }
117
118 String organizationDocumentNumber = document.getDocumentHeader().getOrganizationDocumentNumber();
119 if (StringUtils.isNotBlank(organizationDocumentNumber)) {
120 document.getDocumentHeader().getWorkflowDocument().setAppDocId(organizationDocumentNumber);
121 }
122
123 this.getBusinessObjectService().save(document);
124
125 workflowDocumentService.blanketApprove(document.getDocumentHeader().getWorkflowDocument(), annotation, adHocRecipients);
126 GlobalVariables.getUserSession().setWorkflowDocument(document.getDocumentHeader().getWorkflowDocument());
127 }
128
129 /**
130 * @see org.kuali.kfs.integration.ld.LaborModuleService#countPendingSalaryExpenseTransfer(java.lang.String)
131 */
132 public int countPendingSalaryExpenseTransfer(String emplid) {
133 Map<String, Object> positiveFieldValues = new HashMap<String, Object>();
134 positiveFieldValues.put(KFSPropertyConstants.EMPLID, emplid);
135 positiveFieldValues.put(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, KFSConstants.FinancialDocumentTypeCodes.SALARY_EXPENSE_TRANSFER);
136
137 List<String> approvedCodes = Arrays.asList(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED, KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED);
138 Map<String, Object> negativeFieldValues = new HashMap<String, Object>();
139 negativeFieldValues.put(KFSPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE, approvedCodes);
140
141 return getBusinessObjectService().countMatching(LaborLedgerPendingEntry.class, positiveFieldValues, negativeFieldValues);
142 }
143
144 /**
145 * @see org.kuali.kfs.integration.ld.LaborModuleService#findEmployeesWithPayType(java.util.Map, java.util.List, java.util.Map)
146 */
147 public List<String> findEmployeesWithPayType(Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) {
148 return getLaborLedgerEntryService().findEmployeesWithPayType(payPeriods, balanceTypes, earnCodePayGroupMap);
149 }
150
151 /**
152 * @see org.kuali.kfs.integration.ld.LaborModuleService#isEmployeeWithPayType(java.lang.String, java.util.Map, java.util.List,
153 * java.util.Map)
154 */
155 public boolean isEmployeeWithPayType(String emplid, Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) {
156 return getLaborLedgerEntryService().isEmployeeWithPayType(emplid, payPeriods, balanceTypes, earnCodePayGroupMap);
157 }
158
159 /**
160 * @see org.kuali.kfs.integration.ld.LaborModuleService#findLedgerBalances(java.util.Map, java.util.Map, java.util.Set,
161 * java.util.List, java.util.List)
162 */
163 public Collection<LaborLedgerBalance> findLedgerBalances(Map<String, List<String>> fieldValues, Map<String, List<String>> excludedFieldValues, Set<Integer> fiscalYears, List<String> balanceTypes, List<String> positionObjectGroupCodes) {
164 Collection<LaborLedgerBalance> LaborLedgerBalances = new ArrayList<LaborLedgerBalance>();
165
166 Collection<LedgerBalance> ledgerBalances = getLaborLedgerBalanceService().findLedgerBalances(fieldValues, excludedFieldValues, fiscalYears, balanceTypes, positionObjectGroupCodes);
167 for (LedgerBalance balance : ledgerBalances) {
168 LaborLedgerBalances.add(balance);
169 }
170 return LaborLedgerBalances;
171 }
172
173 public LaborLedgerPositionObjectGroup getLaborLedgerPositionObjectGroup(String positionObjectGroupCode) {
174 Map<String, Object> primaryKeys = new HashMap<String, Object>();
175 primaryKeys.put(LaborPropertyConstants.POSITION_OBJECT_GROUP_CODE, positionObjectGroupCode);
176
177 return getKualiModuleService().getResponsibleModuleService(LaborLedgerPositionObjectGroup.class).getExternalizableBusinessObject(LaborLedgerPositionObjectGroup.class, primaryKeys);
178 }
179
180 /**
181 * @see org.kuali.kfs.integration.service.LaborModuleService#doesLaborLedgerPositionObjectGroupExist(java.lang.String)
182 */
183 public boolean doesLaborLedgerPositionObjectGroupExist(String positionObjectGroupCode) {
184 return this.getLaborLedgerPositionObjectGroup(positionObjectGroupCode) != null;
185 }
186
187 /**
188 * @see org.kuali.kfs.integration.ld.LaborModuleService#retrieveLaborLedgerObject(java.lang.Integer, java.lang.String,
189 * java.lang.String)
190 */
191 public LaborLedgerObject retrieveLaborLedgerObject(Integer fiscalYear, String chartOfAccountsCode, String objectCode) {
192 Map<String, Object> searchCriteria = new HashMap<String, Object>();
193 searchCriteria.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear);
194 searchCriteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
195 searchCriteria.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode);
196
197 return getKualiModuleService().getResponsibleModuleService(LaborLedgerObject.class).getExternalizableBusinessObject(LaborLedgerObject.class, searchCriteria);
198 }
199
200 /**
201 * @see org.kuali.kfs.integration.ld.LaborModuleService#retrieveLaborLedgerObject(org.kuali.kfs.coa.businessobject.ObjectCode)
202 */
203 public LaborLedgerObject retrieveLaborLedgerObject(ObjectCode financialObject) {
204 if (financialObject == null) {
205 throw new IllegalArgumentException("The given financial object cannot be null.");
206 }
207
208 Integer fiscalYear = financialObject.getUniversityFiscalYear();
209 String chartOfAccountsCode = financialObject.getChartOfAccountsCode();
210 String financialObjectCode = financialObject.getFinancialObjectCode();
211
212 return this.retrieveLaborLedgerObject(fiscalYear, chartOfAccountsCode, financialObjectCode);
213 }
214
215 /**
216 * @see org.kuali.kfs.integration.ld.LaborModuleService#hasPendingLaborLedgerEntry(java.lang.String, java.lang.String)
217 */
218 public boolean hasPendingLaborLedgerEntry(String chartOfAccountsCode, String accountNumber) {
219 return getLaborLedgerPendingEntryService().hasPendingLaborLedgerEntry(chartOfAccountsCode, accountNumber);
220 }
221
222 /**
223 * @see org.kuali.kfs.integration.ld.LaborModuleService#retrieveLaborPositionObjectBenefits(java.lang.Integer, java.lang.String,
224 * java.lang.String)
225 */
226 public List<LaborLedgerPositionObjectBenefit> retrieveLaborPositionObjectBenefits(Integer fiscalYear, String chartOfAccountsCode, String objectCode) {
227 Map<String, Object> searchCriteria = new HashMap<String, Object>();
228
229 searchCriteria.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear);
230 searchCriteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
231 searchCriteria.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode);
232
233 return getKualiModuleService().getResponsibleModuleService(LaborLedgerPositionObjectBenefit.class).getExternalizableBusinessObjectsList(LaborLedgerPositionObjectBenefit.class, searchCriteria);
234 }
235
236 /**
237 * @see org.kuali.kfs.integration.ld.LaborModuleService#hasFringeBenefitProducingObjectCodes(java.lang.Integer,
238 * java.lang.String, java.lang.String)
239 */
240 public boolean hasFringeBenefitProducingObjectCodes(Integer fiscalYear, String chartOfAccountsCode, String financialObjectCode) {
241 List<LaborLedgerPositionObjectBenefit> objectBenefits = this.retrieveLaborPositionObjectBenefits(fiscalYear, chartOfAccountsCode, financialObjectCode);
242 return (objectBenefits != null && !objectBenefits.isEmpty());
243 }
244
245 /**
246 * @see org.kuali.kfs.integration.ld.LaborModuleService#getLaborOriginEntryGroupCount(java.lang.Integer)
247 */
248 // public Integer getLaborOriginEntryGroupCount(Integer groupId) {
249 // return getLaborOriginEntryService().getGroupCount(groupId);
250 // }
251
252 /**
253 * Gets the laborBenefitsCalculationService attribute.
254 *
255 * @return an implementation of the laborBenefitsCalculationService.
256 */
257 public LaborBenefitsCalculationService getLaborBenefitsCalculationService() {
258 return SpringContext.getBean(LaborBenefitsCalculationService.class);
259 }
260
261 /**
262 * Gets the laborLedgerEntryService attribute.
263 *
264 * @return an implementation of the laborLedgerEntryService.
265 */
266 public LaborLedgerEntryService getLaborLedgerEntryService() {
267 return SpringContext.getBean(LaborLedgerEntryService.class);
268 }
269
270 /**
271 * Gets the laborLedgerBalanceService attribute.
272 *
273 * @return an implementation of the laborLedgerBalanceService.
274 */
275 public LaborLedgerBalanceService getLaborLedgerBalanceService() {
276 return SpringContext.getBean(LaborLedgerBalanceService.class);
277 }
278
279 /**
280 * Gets the documentService attribute.
281 *
282 * @return an implementation of the documentService.
283 */
284 public DocumentService getDocumentService() {
285 return SpringContext.getBean(DocumentService.class);
286 }
287
288 /**
289 * Gets the dataDictionaryService attribute.
290 *
291 * @return an implementation of the dataDictionaryService.
292 */
293 public DataDictionaryService getDataDictionaryService() {
294 return SpringContext.getBean(DataDictionaryService.class);
295 }
296
297 /**
298 * Gets the universityDateService attribute.
299 *
300 * @return an implementation of the universityDateService.
301 */
302 public UniversityDateService getUniversityDateService() {
303 return SpringContext.getBean(UniversityDateService.class);
304 }
305
306 /**
307 * Gets the businessObjectService attribute.
308 *
309 * @return an implementation of the businessObjectService.
310 */
311 public BusinessObjectService getBusinessObjectService() {
312 return SpringContext.getBean(BusinessObjectService.class);
313 }
314
315 /**
316 * Gets the laborLedgerPendingEntryService
317 *
318 * @return an implementation of the LaborLedgerPendingEntryService
319 */
320 public LaborLedgerPendingEntryService getLaborLedgerPendingEntryService() {
321 return SpringContext.getBean(LaborLedgerPendingEntryService.class);
322 }
323
324 /**
325 * Returns an instance of the LaborOriginEntryService, for use by services in the module
326 *
327 * @return an instance of an implementation of the LaborOriginEntryService
328 */
329 public LaborOriginEntryService getLaborOriginEntryService() {
330 return SpringContext.getBean(LaborOriginEntryService.class);
331 }
332
333 /**
334 * Gets the KualiModuleService attribute value.
335 *
336 * @return an implementation of the KualiModuleService.
337 */
338 public KualiModuleService getKualiModuleService() {
339 return SpringContext.getBean(KualiModuleService.class);
340 }
341 }