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.Map;
021
022 import org.kuali.kfs.integration.ld.LaborLedgerObject;
023 import org.kuali.kfs.module.ld.LaborConstants;
024 import org.kuali.kfs.module.ld.LaborPropertyConstants;
025 import org.kuali.kfs.module.ld.businessobject.BenefitsCalculation;
026 import org.kuali.kfs.module.ld.businessobject.LaborObject;
027 import org.kuali.kfs.module.ld.businessobject.PositionObjectBenefit;
028 import org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService;
029 import org.kuali.kfs.module.ld.service.LaborPositionObjectBenefitService;
030 import org.kuali.kfs.sys.KFSConstants;
031 import org.kuali.kfs.sys.KFSPropertyConstants;
032 import org.kuali.rice.kns.service.BusinessObjectService;
033 import org.kuali.rice.kns.util.KualiDecimal;
034 import org.kuali.rice.kns.util.ObjectUtils;
035 import org.springframework.transaction.annotation.Transactional;
036
037 /**
038 * To provide its clients with access to the benefit calculation.
039 */
040 @Transactional
041 public class LaborBenefitsCalculationServiceImpl implements LaborBenefitsCalculationService {
042 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborBenefitsCalculationServiceImpl.class);
043
044 private BusinessObjectService businessObjectService;
045 private LaborPositionObjectBenefitService laborPositionObjectBenefitService;
046
047 /**
048 * @see org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService#getBenefitsCalculation(java.lang.Integer,
049 * java.lang.String, java.lang.String)
050 */
051 public BenefitsCalculation getBenefitsCalculation(Integer universityFiscalYear, String chartOfAccountsCode, String benefitTypeCode) {
052 Map<String, Object> fieldValues = new HashMap<String, Object>();
053 fieldValues.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, universityFiscalYear);
054 fieldValues.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
055 fieldValues.put(LaborPropertyConstants.POSITION_BENEFIT_TYPE_CODE, benefitTypeCode);
056
057 return (BenefitsCalculation) businessObjectService.findByPrimaryKey(BenefitsCalculation.class, fieldValues);
058 }
059
060 /**
061 * @see org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService#calculateFringeBenefit(java.lang.Integer,
062 * java.lang.String, java.lang.String, org.kuali.rice.kns.util.KualiDecimal)
063 */
064 public KualiDecimal calculateFringeBenefit(Integer fiscalYear, String chartCode, String objectCode, KualiDecimal salaryAmount) {
065 LaborObject laborObject = new LaborObject();
066
067 laborObject.setUniversityFiscalYear(fiscalYear);
068 laborObject.setChartOfAccountsCode(chartCode);
069 laborObject.setFinancialObjectCode(objectCode);
070
071 laborObject = (LaborObject) businessObjectService.retrieve(laborObject);
072
073 return calculateFringeBenefit(laborObject, salaryAmount);
074 }
075
076 /**
077 * @see org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService#calculateFringeBenefit(org.kuali.kfs.module.ld.businessobject.LaborObject,
078 * org.kuali.rice.kns.util.KualiDecimal)
079 */
080 public KualiDecimal calculateFringeBenefit(LaborLedgerObject laborLedgerObject, KualiDecimal salaryAmount) {
081 KualiDecimal fringeBenefit = KualiDecimal.ZERO;
082
083 if (salaryAmount == null || salaryAmount.isZero() || ObjectUtils.isNull(laborLedgerObject)) {
084 return fringeBenefit;
085 }
086
087 String FringeOrSalaryCode = laborLedgerObject.getFinancialObjectFringeOrSalaryCode();
088 if (!LaborConstants.SalaryExpenseTransfer.LABOR_LEDGER_SALARY_CODE.equals(FringeOrSalaryCode)) {
089 return fringeBenefit;
090 }
091
092 Integer fiscalYear = laborLedgerObject.getUniversityFiscalYear();
093 String chartOfAccountsCode = laborLedgerObject.getChartOfAccountsCode();
094 String objectCode = laborLedgerObject.getFinancialObjectCode();
095
096 Collection<PositionObjectBenefit> positionObjectBenefits = laborPositionObjectBenefitService.getPositionObjectBenefits(fiscalYear, chartOfAccountsCode, objectCode);
097 for (PositionObjectBenefit positionObjectBenefit : positionObjectBenefits) {
098 KualiDecimal benefitAmount = this.calculateFringeBenefit(positionObjectBenefit, salaryAmount);
099 fringeBenefit = fringeBenefit.add(benefitAmount);
100 }
101
102 return fringeBenefit;
103 }
104
105 /**
106 * @see org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService#calculateFringeBenefit(org.kuali.kfs.module.ld.businessobject.PositionObjectBenefit,
107 * org.kuali.rice.kns.util.KualiDecimal)
108 */
109 public KualiDecimal calculateFringeBenefit(PositionObjectBenefit positionObjectBenefit, KualiDecimal salaryAmount) {
110 if (salaryAmount == null || salaryAmount.isZero() || ObjectUtils.isNull(positionObjectBenefit)) {
111 return KualiDecimal.ZERO;
112 }
113
114 // calculate the benefit amount (ledger amt * (benfit pct/100) )
115 KualiDecimal fringeBenefitPercent = positionObjectBenefit.getBenefitsCalculation().getPositionFringeBenefitPercent();
116 return fringeBenefitPercent.multiply(salaryAmount).divide(KFSConstants.ONE_HUNDRED.kualiDecimalValue());
117 }
118
119 /**
120 * Sets the laborPositionObjectBenefitService attribute value.
121 *
122 * @param laborPositionObjectBenefitService The laborPositionObjectBenefitService to set.
123 */
124 public void setLaborPositionObjectBenefitService(LaborPositionObjectBenefitService laborPositionObjectBenefitService) {
125 this.laborPositionObjectBenefitService = laborPositionObjectBenefitService;
126 }
127
128 /**
129 * Sets the businessObjectService attribute value.
130 *
131 * @param businessObjectService The businessObjectService to set.
132 */
133 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
134 this.businessObjectService = businessObjectService;
135 }
136 }