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