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.BCConstants;
027 import org.kuali.kfs.module.bc.BCKeyConstants;
028 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgReasonStatisticsReport;
029 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionReportThresholdSettings;
030 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionSalaryTotal;
031 import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionReasonStatisticsReportDao;
032 import org.kuali.kfs.module.bc.document.service.BudgetConstructionOrganizationReportsService;
033 import org.kuali.kfs.module.bc.document.service.BudgetConstructionReasonStatisticsReportService;
034 import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper;
035 import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper;
036 import org.kuali.kfs.sys.KFSPropertyConstants;
037 import org.kuali.rice.kns.service.BusinessObjectService;
038 import org.kuali.rice.kns.service.KualiConfigurationService;
039 import org.kuali.rice.kns.util.KualiDecimal;
040 import org.springframework.transaction.annotation.Transactional;
041
042 /**
043 * Service implementation of BudgetConstructionAccountSummaryReportService.
044 */
045 @Transactional
046 public class BudgetConstructionReasonStatisticsReportServiceImpl implements BudgetConstructionReasonStatisticsReportService {
047
048 BudgetConstructionReasonStatisticsReportDao budgetConstructionReasonStatisticsReportDao;
049 BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService;
050 private BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper;
051 KualiConfigurationService kualiConfigurationService;
052 BusinessObjectService businessObjectService;
053
054 /**
055 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionReasonStatisticsReportService#updateReasonStatisticsReport(java.lang.String,
056 * java.lang.Integer, org.kuali.kfs.module.bc.businessobject.BudgetConstructionReportThresholdSettings)
057 */
058 public void updateReasonStatisticsReport(String principalName, Integer universityFiscalYear, BudgetConstructionReportThresholdSettings budgetConstructionReportThresholdSettings) {
059 boolean applyAThreshold = budgetConstructionReportThresholdSettings.isUseThreshold();
060 boolean selectOnlyGreaterThanOrEqualToThreshold = budgetConstructionReportThresholdSettings.isUseGreaterThanOperator();
061 KualiDecimal thresholdPercent = budgetConstructionReportThresholdSettings.getThresholdPercent();
062 if (applyAThreshold) {
063 budgetConstructionReasonStatisticsReportDao.updateReasonStatisticsReportsWithAThreshold(principalName, universityFiscalYear - 1, selectOnlyGreaterThanOrEqualToThreshold, thresholdPercent);
064 }
065 else {
066 budgetConstructionReasonStatisticsReportDao.updateReasonStatisticsReportsWithoutAThreshold(principalName, universityFiscalYear - 1);
067 }
068
069 }
070
071 /**
072 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionReasonStatisticsReportService#buildReports(java.lang.Integer,
073 * java.lang.String, org.kuali.kfs.module.bc.businessobject.BudgetConstructionReportThresholdSettings)
074 */
075 public Collection<BudgetConstructionOrgReasonStatisticsReport> buildReports(Integer universityFiscalYear, String principalId, BudgetConstructionReportThresholdSettings budgetConstructionReportThresholdSettings) {
076 Collection<BudgetConstructionOrgReasonStatisticsReport> reportSet = new ArrayList<BudgetConstructionOrgReasonStatisticsReport>();
077
078 BudgetConstructionOrgReasonStatisticsReport orgReasonStatisticsReportEntry;
079 // build searchCriteria
080 Map<String, Object> searchCriteria = new HashMap<String, Object>();
081 searchCriteria.put(KFSPropertyConstants.KUALI_USER_PERSON_UNIVERSAL_IDENTIFIER, principalId);
082
083 // build order list
084 List<String> orderList = buildOrderByList();
085 Collection<BudgetConstructionSalaryTotal> reasonStatisticsList = budgetConstructionOrganizationReportsService.getBySearchCriteriaOrderByList(BudgetConstructionSalaryTotal.class, searchCriteria, orderList);
086
087 // get object codes
088 String objectCodes = budgetConstructionReportsServiceHelper.getSelectedObjectCodes(principalId);
089
090 // get reason codes
091 String reasonCodes = budgetConstructionReportsServiceHelper.getSelectedReasonCodes(principalId);
092
093 // build reports
094 for (BudgetConstructionSalaryTotal reasonStatisticsEntry : reasonStatisticsList) {
095 orgReasonStatisticsReportEntry = new BudgetConstructionOrgReasonStatisticsReport();
096 buildReportsHeader(universityFiscalYear, objectCodes, reasonCodes, orgReasonStatisticsReportEntry, reasonStatisticsEntry, budgetConstructionReportThresholdSettings);
097 buildReportsBody(orgReasonStatisticsReportEntry, reasonStatisticsEntry);
098 reportSet.add(orgReasonStatisticsReportEntry);
099 }
100
101 return reportSet;
102 }
103
104 /**
105 * builds report Header
106 *
107 * @param BudgetConstructionObjectDump bcod
108 */
109 public void buildReportsHeader(Integer universityFiscalYear, String objectCodes, String reasonCodes, BudgetConstructionOrgReasonStatisticsReport orgReasonStatisticsReportEntry, BudgetConstructionSalaryTotal salaryTotalEntry, BudgetConstructionReportThresholdSettings budgetConstructionReportThresholdSettings) {
110
111 // set fiscal year
112 Integer prevFiscalyear = universityFiscalYear - 1;
113 orgReasonStatisticsReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
114
115 // get Chart with orgChartCode
116 Map<String, Object> searchCriteria = new HashMap<String, Object>();
117 searchCriteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, salaryTotalEntry.getOrganizationChartOfAccountsCode());
118 Chart chart = (Chart) businessObjectService.findByPrimaryKey(Chart.class, searchCriteria);
119
120 // set OrgCode and Desc
121 String orgName = salaryTotalEntry.getOrganization().getOrganizationName();
122 orgReasonStatisticsReportEntry.setOrganizationCode(salaryTotalEntry.getOrganizationCode());
123 if (orgName == null) {
124 orgReasonStatisticsReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
125 }
126 else {
127 orgReasonStatisticsReportEntry.setOrganizationName(orgName);
128 }
129 // set ChartCode and Desc
130 if (chart == null) {
131 orgReasonStatisticsReportEntry.setChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
132 orgReasonStatisticsReportEntry.setChartOfAccountsCode(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
133 }
134 else {
135 orgReasonStatisticsReportEntry.setChartOfAccountsCode(chart.getChartOfAccountsCode());
136 orgReasonStatisticsReportEntry.setChartOfAccountDescription(chart.getFinChartOfAccountDescription());
137 }
138 Integer prevPrevFiscalyear = prevFiscalyear - 1;
139 orgReasonStatisticsReportEntry.setObjectCodes(objectCodes);
140
141 if (budgetConstructionReportThresholdSettings.isUseThreshold()) {
142 if (budgetConstructionReportThresholdSettings.isUseGreaterThanOperator()) {
143 orgReasonStatisticsReportEntry.setThresholdOrReason(BCConstants.Report.THRESHOLD + BCConstants.Report.THRESHOLD_GREATER + budgetConstructionReportThresholdSettings.getThresholdPercent().toString() + BCConstants.Report.PERCENT);
144 }
145 else {
146 orgReasonStatisticsReportEntry.setThresholdOrReason(BCConstants.Report.THRESHOLD + BCConstants.Report.THRESHOLD_LESS + budgetConstructionReportThresholdSettings.getThresholdPercent().toString() + BCConstants.Report.PERCENT);
147 }
148 }
149 else {
150 orgReasonStatisticsReportEntry.setThresholdOrReason(BCConstants.Report.SELECTED_REASONS + reasonCodes);
151 }
152
153 }
154
155 public void buildReportsBody(BudgetConstructionOrgReasonStatisticsReport orgReasonStatisticsReportEntry, BudgetConstructionSalaryTotal salaryTotalEntry) {
156 orgReasonStatisticsReportEntry.setInitialRequestedFteQuantity(salaryTotalEntry.getInitialRequestedFteQuantity());
157 orgReasonStatisticsReportEntry.setTotalInitialRequestedAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getInitialRequestedAmount()));
158
159 BigDecimal averageAmount = BudgetConstructionReportHelper.calculateDivide(salaryTotalEntry.getInitialRequestedAmount().bigDecimalValue(), salaryTotalEntry.getInitialRequestedFteQuantity());
160 orgReasonStatisticsReportEntry.setTotalAverageAmount(BudgetConstructionReportHelper.setDecimalDigit(averageAmount, 0, false).intValue());
161
162 BigDecimal requestedFteQuantity = salaryTotalEntry.getAppointmentRequestedFteQuantity().setScale(5, BigDecimal.ROUND_HALF_UP);
163 orgReasonStatisticsReportEntry.setAppointmentRequestedFteQuantity(requestedFteQuantity);
164
165 orgReasonStatisticsReportEntry.setTotalCsfAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getCsfAmount()));
166 orgReasonStatisticsReportEntry.setTotalAppointmentRequestedAmount(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getAppointmentRequestedAmount()));
167
168 BigDecimal csfAmount = new BigDecimal(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getCsfAmount()));
169 BigDecimal averageCsfAmount = BudgetConstructionReportHelper.calculateDivide(csfAmount, salaryTotalEntry.getAppointmentRequestedFteQuantity());
170 orgReasonStatisticsReportEntry.setAverageCsfAmount(BudgetConstructionReportHelper.setDecimalDigit(averageCsfAmount, 0, false));
171
172 BigDecimal appointmentRequestedAmount = new BigDecimal(BudgetConstructionReportHelper.convertKualiInteger(salaryTotalEntry.getAppointmentRequestedAmount()));
173 BigDecimal averageRequestedAmount = BudgetConstructionReportHelper.calculateDivide(appointmentRequestedAmount, requestedFteQuantity);
174 orgReasonStatisticsReportEntry.setAverageAppointmentRequestedAmount(BudgetConstructionReportHelper.setDecimalDigit(averageRequestedAmount, 0, false));
175
176 orgReasonStatisticsReportEntry.setAverageChange(orgReasonStatisticsReportEntry.getAverageAppointmentRequestedAmount().subtract(orgReasonStatisticsReportEntry.getAverageCsfAmount()));
177
178 orgReasonStatisticsReportEntry.setPercentChange(BudgetConstructionReportHelper.calculatePercent(orgReasonStatisticsReportEntry.getAverageChange(), orgReasonStatisticsReportEntry.getAverageCsfAmount()));
179 }
180
181 /**
182 * builds orderByList for sort order.
183 *
184 * @return returnList
185 */
186 public List<String> buildOrderByList() {
187 List<String> returnList = new ArrayList<String>();
188 returnList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
189 returnList.add(KFSPropertyConstants.ORGANIZATION_CODE);
190
191 return returnList;
192 }
193
194 /**
195 * Sets the budgetConstructionReasonStatisticsReportDao attribute value.
196 *
197 * @param budgetConstructionReasonStatisticsReportDao The budgetConstructionReasonStatisticsReportDao to set.
198 */
199 public void setBudgetConstructionReasonStatisticsReportDao(BudgetConstructionReasonStatisticsReportDao budgetConstructionReasonStatisticsReportDao) {
200 this.budgetConstructionReasonStatisticsReportDao = budgetConstructionReasonStatisticsReportDao;
201 }
202
203 /**
204 * Sets the budgetConstructionOrganizationReportsService attribute value.
205 *
206 * @param budgetConstructionOrganizationReportsService The budgetConstructionOrganizationReportsService to set.
207 */
208 public void setBudgetConstructionOrganizationReportsService(BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService) {
209 this.budgetConstructionOrganizationReportsService = budgetConstructionOrganizationReportsService;
210 }
211
212 /**
213 * Sets the kualiConfigurationService attribute value.
214 *
215 * @param kualiConfigurationService The kualiConfigurationService to set.
216 */
217 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
218 this.kualiConfigurationService = kualiConfigurationService;
219 }
220
221 /**
222 * Sets the businessObjectService attribute value.
223 *
224 * @param businessObjectService The businessObjectService to set.
225 */
226 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
227 this.businessObjectService = businessObjectService;
228 }
229
230 /**
231 * Sets the budgetConstructionReportsServiceHelper attribute value.
232 *
233 * @param budgetConstructionReportsServiceHelper The budgetConstructionReportsServiceHelper to set.
234 */
235 public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) {
236 this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper;
237 }
238 }