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.bc.businessobject.lookup;
017    
018    import java.math.BigDecimal;
019    import java.math.RoundingMode;
020    import java.util.ArrayList;
021    import java.util.Collection;
022    import java.util.Iterator;
023    import java.util.List;
024    import java.util.Map;
025    
026    import org.apache.commons.lang.StringUtils;
027    import org.kuali.kfs.integration.ld.LaborLedgerPositionObjectBenefit;
028    import org.kuali.kfs.integration.ld.LaborModuleService;
029    import org.kuali.kfs.module.bc.businessobject.RequestBenefits;
030    import org.kuali.kfs.sys.KFSConstants;
031    import org.kuali.kfs.sys.KFSPropertyConstants;
032    import org.kuali.rice.kns.bo.BusinessObject;
033    import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
034    import org.kuali.rice.kns.util.KualiDecimal;
035    import org.kuali.rice.kns.util.KualiInteger;
036    import org.kuali.rice.kns.util.KualiPercent;
037    
038    /**
039     * Implements custom search for showing single request line benefits impact
040     */
041    public class RequestBenefitsLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
042        private LaborModuleService laborModuleService;
043    
044        /**
045         * Creates <code>RequestBenefits</code> objects based on a BC expenditure line chart, object code and request amount.
046         * 
047         * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map)
048         */
049        @Override
050        public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
051    
052            List<RequestBenefits> requestBenefits = new ArrayList<RequestBenefits>();
053    
054            Integer fiscalYear = Integer.valueOf(fieldValues.get(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR));
055            String chartOfAccountsCode = fieldValues.get(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
056            String objectCode = fieldValues.get(KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME);
057            List<LaborLedgerPositionObjectBenefit> positionObjectBenefits = laborModuleService.retrieveLaborPositionObjectBenefits(fiscalYear, chartOfAccountsCode, objectCode);
058            for (Iterator<LaborLedgerPositionObjectBenefit> iterator = positionObjectBenefits.iterator(); iterator.hasNext();) {
059                LaborLedgerPositionObjectBenefit positionObjectBenefit = (LaborLedgerPositionObjectBenefit) iterator.next();
060    
061                KualiPercent fringePct = positionObjectBenefit.getLaborLedgerBenefitsCalculation().getPositionFringeBenefitPercent();
062                RequestBenefits requestBenefit = new RequestBenefits();
063                requestBenefit.setFinancialObjectBenefitsTypeCode(positionObjectBenefit.getFinancialObjectBenefitsTypeCode());
064                requestBenefit.setFinancialObjectBenefitsTypeDescription(positionObjectBenefit.getLaborLedgerBenefitsCalculation().getLaborLedgerBenefitsType().getPositionBenefitTypeDescription());
065                requestBenefit.setPositionFringeBenefitObjectCode(positionObjectBenefit.getLaborLedgerBenefitsCalculation().getPositionFringeBenefitObjectCode());
066                requestBenefit.setPositionFringeBenefitObjectCodeName(positionObjectBenefit.getLaborLedgerBenefitsCalculation().getPositionFringeBenefitObject().getFinancialObjectCodeName());
067                requestBenefit.setPositionFringeBenefitPercent(positionObjectBenefit.getLaborLedgerBenefitsCalculation().getPositionFringeBenefitPercent());
068                
069                BigDecimal requestAmount = new BigDecimal(Integer.valueOf(fieldValues.get(KFSPropertyConstants.ACCOUNT_LINE_ANNUAL_BALANCE_AMOUNT)));
070                BigDecimal fringePctDecimal = fringePct.bigDecimalValue().divide(new BigDecimal(100));
071                BigDecimal result = requestAmount.multiply(fringePctDecimal).setScale(0, RoundingMode.HALF_UP);
072                KualiInteger detAmount = new KualiInteger(result.toBigInteger());
073                requestBenefit.setFringeDetailAmount(detAmount);
074                requestBenefits.add(requestBenefit);
075            }
076    
077            return requestBenefits;
078        }
079    
080        /**
081         * Sets the laborModuleService attribute value.
082         * 
083         * @param laborModuleService The laborModuleService to set.
084         */
085        public void setLaborModuleService(LaborModuleService laborModuleService) {
086            this.laborModuleService = laborModuleService;
087        }
088    
089    }