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