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.document.service.impl;
017    
018    import java.math.BigDecimal;
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.HashMap;
022    import java.util.List;
023    import java.util.Map;
024    
025    import org.kuali.kfs.coa.businessobject.Chart;
026    import org.kuali.kfs.module.bc.BCKeyConstants;
027    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionObjectPick;
028    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgSalaryStatisticsReport;
029    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionSalaryTotal;
030    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionSalaryStatisticsReportDao;
031    import org.kuali.kfs.module.bc.document.service.BudgetConstructionOrganizationReportsService;
032    import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper;
033    import org.kuali.kfs.module.bc.document.service.BudgetConstructionSalaryStatisticsReportService;
034    import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper;
035    import org.kuali.kfs.sys.KFSPropertyConstants;
036    import org.kuali.rice.kns.service.BusinessObjectService;
037    import org.kuali.rice.kns.service.KualiConfigurationService;
038    import org.springframework.transaction.annotation.Transactional;
039    
040    /**
041     * Service implementation of BudgetConstructionAccountSummaryReportService.
042     */
043    @Transactional
044    public class BudgetConstructionSalaryStatisticsReportServiceImpl implements BudgetConstructionSalaryStatisticsReportService {
045    
046        BudgetConstructionSalaryStatisticsReportDao budgetConstructionSalaryStatisticsReportDao;
047        BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService;
048        private BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper;
049        KualiConfigurationService kualiConfigurationService;
050        BusinessObjectService businessObjectService;
051    
052        public void updateSalaryStatisticsReport(String principalName, Integer universityFiscalYear) {
053            budgetConstructionSalaryStatisticsReportDao.updateReportsSalaryStatisticsTable(principalName, universityFiscalYear-1);
054        }
055    
056        public Collection<BudgetConstructionOrgSalaryStatisticsReport> buildReports(Integer universityFiscalYear, String principalName) {
057            Collection<BudgetConstructionOrgSalaryStatisticsReport> reportSet = new ArrayList();
058    
059            // build searchCriteria
060            Map<String, Object> searchCriteria = new HashMap<String, Object>();
061            searchCriteria.put(KFSPropertyConstants.KUALI_USER_PERSON_UNIVERSAL_IDENTIFIER, principalName);
062    
063            // build order list
064            List<String> orderList = buildOrderByList();
065            Collection<BudgetConstructionSalaryTotal> salaryStatisticsList = budgetConstructionOrganizationReportsService.getBySearchCriteriaOrderByList(BudgetConstructionSalaryTotal.class, searchCriteria, orderList);
066            
067            // get object codes
068            searchCriteria.clear();
069            searchCriteria.put(KFSPropertyConstants.PERSON_UNIVERSAL_IDENTIFIER, principalName);
070            Collection<BudgetConstructionObjectPick> objectPickList = businessObjectService.findMatching(BudgetConstructionObjectPick.class, searchCriteria);
071            
072            String objectCodes = budgetConstructionReportsServiceHelper.getSelectedObjectCodes(principalName);
073            
074            // build reports
075            for (BudgetConstructionSalaryTotal salaryStatisticsEntry : salaryStatisticsList) {
076                BudgetConstructionOrgSalaryStatisticsReport orgSalaryStatisticsReportEntry = new BudgetConstructionOrgSalaryStatisticsReport();
077                buildReportsHeader(universityFiscalYear, objectCodes, orgSalaryStatisticsReportEntry, salaryStatisticsEntry);
078                buildReportsBody(orgSalaryStatisticsReportEntry, salaryStatisticsEntry);
079                reportSet.add(orgSalaryStatisticsReportEntry);
080            }
081            
082            return reportSet;
083        }
084    
085    
086        /**
087         * builds report Header
088         * 
089         * @param BudgetConstructionObjectDump bcod
090         */
091        public void buildReportsHeader(Integer universityFiscalYear, String objectCodes, BudgetConstructionOrgSalaryStatisticsReport orgSalaryStatisticsReportEntry, BudgetConstructionSalaryTotal salaryTotalEntry) {
092    
093            // set fiscal year
094            Integer prevFiscalyear = universityFiscalYear - 1;
095            orgSalaryStatisticsReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
096            // get Chart with orgChartCode
097            Map searchCriteria = new HashMap();
098            searchCriteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, salaryTotalEntry.getOrganizationChartOfAccountsCode());
099            Chart chart = (Chart) businessObjectService.findByPrimaryKey(Chart.class, searchCriteria);
100    
101            // set OrgCode and Desc
102            String orgName = salaryTotalEntry.getOrganization().getOrganizationName();
103            orgSalaryStatisticsReportEntry.setOrganizationCode(salaryTotalEntry.getOrganizationCode());
104            if (orgName == null) {
105                orgSalaryStatisticsReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
106            }
107            else {
108                orgSalaryStatisticsReportEntry.setOrganizationName(orgName);
109            }
110            // set ChartCode and Desc
111            if (chart == null) {
112                orgSalaryStatisticsReportEntry.setChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
113                orgSalaryStatisticsReportEntry.setChartOfAccountsCode(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
114            }
115            else {
116                orgSalaryStatisticsReportEntry.setChartOfAccountsCode(chart.getChartOfAccountsCode());
117                orgSalaryStatisticsReportEntry.setChartOfAccountDescription(chart.getFinChartOfAccountDescription());
118            }
119            Integer prevPrevFiscalyear = prevFiscalyear - 1;
120            orgSalaryStatisticsReportEntry.setObjectCodes(objectCodes);
121        }
122    
123    
124        public void buildReportsBody(BudgetConstructionOrgSalaryStatisticsReport orgSalaryStatisticsReportEntry, BudgetConstructionSalaryTotal salaryTotalEntry) {
125            orgSalaryStatisticsReportEntry.setInitialRequestedFteQuantity(salaryTotalEntry.getInitialRequestedFteQuantity());
126            
127            orgSalaryStatisticsReportEntry.setTotalInitialRequestedAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getInitialRequestedAmount()));
128    
129            BigDecimal averageAmount = BudgetConstructionReportHelper.calculateDivide(salaryTotalEntry.getInitialRequestedAmount().bigDecimalValue(), salaryTotalEntry.getInitialRequestedFteQuantity());
130            orgSalaryStatisticsReportEntry.setTotalAverageAmount(BudgetConstructionReportHelper.setDecimalDigit(averageAmount, 0, false).intValue());
131            
132            BigDecimal requestedFteQuantity = salaryTotalEntry.getAppointmentRequestedFteQuantity().setScale(5, BigDecimal.ROUND_HALF_UP);
133            orgSalaryStatisticsReportEntry.setAppointmentRequestedFteQuantity(requestedFteQuantity);
134            
135            orgSalaryStatisticsReportEntry.setTotalCsfAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getCsfAmount()));
136            orgSalaryStatisticsReportEntry.setTotalAppointmentRequestedAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getAppointmentRequestedAmount()));
137    
138            BigDecimal csfAmount = new BigDecimal(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getCsfAmount()));
139            BigDecimal averageCfsAmount = BudgetConstructionReportHelper.calculateDivide(csfAmount, salaryTotalEntry.getAppointmentRequestedFteQuantity());
140            orgSalaryStatisticsReportEntry.setAverageCsfAmount(BudgetConstructionReportHelper.setDecimalDigit(averageCfsAmount, 0, false));
141            
142            BigDecimal appointmentRequestedAmount = new BigDecimal(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getAppointmentRequestedAmount()));
143            BigDecimal averageRequestedAmount = BudgetConstructionReportHelper.calculateDivide(appointmentRequestedAmount, requestedFteQuantity);
144            orgSalaryStatisticsReportEntry.setAverageAppointmentRequestedAmount(BudgetConstructionReportHelper.setDecimalDigit(averageRequestedAmount, 0, false));
145            
146            BigDecimal averageChange = orgSalaryStatisticsReportEntry.getAverageAppointmentRequestedAmount().subtract(orgSalaryStatisticsReportEntry.getAverageCsfAmount());
147            orgSalaryStatisticsReportEntry.setAverageChange(averageChange);
148          
149            BigDecimal percentChange = BudgetConstructionReportHelper.calculatePercent(orgSalaryStatisticsReportEntry.getAverageChange(), orgSalaryStatisticsReportEntry.getAverageCsfAmount());
150            orgSalaryStatisticsReportEntry.setPercentChange(percentChange);
151        }
152    
153        /**
154         * builds orderByList for sort order.
155         * 
156         * @return returnList
157         */
158        public List<String> buildOrderByList() {
159            List<String> returnList = new ArrayList();
160            returnList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
161            returnList.add(KFSPropertyConstants.ORGANIZATION_CODE);
162            return returnList;
163        }
164    
165    
166        public void setBudgetConstructionSalaryStatisticsReportDao(BudgetConstructionSalaryStatisticsReportDao budgetConstructionSalaryStatisticsReportDao) {
167            this.budgetConstructionSalaryStatisticsReportDao = budgetConstructionSalaryStatisticsReportDao;
168        }
169    
170        public void setBudgetConstructionOrganizationReportsService(BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService) {
171            this.budgetConstructionOrganizationReportsService = budgetConstructionOrganizationReportsService;
172        }
173    
174    
175        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
176            this.businessObjectService = businessObjectService;
177        }
178    
179        public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
180            this.kualiConfigurationService = kualiConfigurationService;
181        }
182    
183        /**
184         * Sets the budgetConstructionReportsServiceHelper attribute value.
185         * @param budgetConstructionReportsServiceHelper The budgetConstructionReportsServiceHelper to set.
186         */
187        public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) {
188            this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper;
189        }
190    
191    }
192