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.List;
022
023 import org.kuali.kfs.coa.businessobject.ObjectCode;
024 import org.kuali.kfs.module.bc.BCConstants;
025 import org.kuali.kfs.module.bc.BCKeyConstants;
026 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionObjectSummary;
027 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgObjectSummaryReport;
028 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgObjectSummaryReportTotal;
029 import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionObjectSummaryReportDao;
030 import org.kuali.kfs.module.bc.document.service.BudgetConstructionObjectSummaryReportService;
031 import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper;
032 import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper;
033 import org.kuali.kfs.sys.KFSPropertyConstants;
034 import org.kuali.rice.kns.service.KualiConfigurationService;
035 import org.springframework.transaction.annotation.Transactional;
036
037 /**
038 * Service implementation of BudgetConstructionLevelSummaryReportService.
039 */
040 @Transactional
041 public class BudgetConstructionObjectSummaryReportServiceImpl implements BudgetConstructionObjectSummaryReportService {
042
043 private BudgetConstructionObjectSummaryReportDao budgetConstructionObjectSummaryReportDao;
044 private KualiConfigurationService kualiConfigurationService;
045 private BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper;
046
047 /**
048 * @see org.kuali.kfs.module.bc.document.service.BudgetReportsControlListService#updateRepotsLevelSummaryTable(java.lang.String)
049 */
050 public void updateObjectSummaryReport(String principalName) {
051 budgetConstructionObjectSummaryReportDao.cleanGeneralLedgerObjectSummaryTable(principalName);
052 budgetConstructionObjectSummaryReportDao.updateGeneralLedgerObjectSummaryTable(principalName);
053 }
054
055 /**
056 * sets budgetConstructionLevelSummaryReportDao
057 *
058 * @param budgetConstructionLevelSummaryReportDao
059 */
060 public void setBudgetConstructionObjectSummaryReportDao(BudgetConstructionObjectSummaryReportDao budgetConstructionObjectSummaryReportDao) {
061 this.budgetConstructionObjectSummaryReportDao = budgetConstructionObjectSummaryReportDao;
062 }
063
064 /**
065 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionLevelSummaryReportService#buildReports(java.lang.Integer,
066 * java.util.Collection)
067 */
068 public Collection<BudgetConstructionOrgObjectSummaryReport> buildReports(Integer universityFiscalYear, String principalName) {
069 Collection<BudgetConstructionOrgObjectSummaryReport> reportSet = new ArrayList();
070 Collection<BudgetConstructionObjectSummary> objectSummaryList = budgetConstructionReportsServiceHelper.getDataForBuildingReports(BudgetConstructionObjectSummary.class, principalName, buildOrderByList());
071
072 //
073 List listForCalculateLevel = BudgetConstructionReportHelper.deleteDuplicated((List) objectSummaryList, fieldsForLevel());
074 List listForCalculateCons = BudgetConstructionReportHelper.deleteDuplicated((List) objectSummaryList, fieldsForCons());
075 List listForCalculateGexpAndType = BudgetConstructionReportHelper.deleteDuplicated((List) objectSummaryList, fieldsForGexpAndType());
076 List listForCalculateTotal = BudgetConstructionReportHelper.deleteDuplicated((List) objectSummaryList, fieldsForTotal());
077
078 // Calculate Total Section
079 List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalLevelList = calculateLevelTotal((List) objectSummaryList, listForCalculateLevel);
080 List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalConsList = calculateConsTotal((List) objectSummaryList, listForCalculateCons);
081 List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalGexpAndTypeList = calculateGexpAndTypeTotal((List) objectSummaryList, listForCalculateGexpAndType);
082 List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalList = calculateTotal((List) objectSummaryList, listForCalculateTotal);
083
084 for (BudgetConstructionObjectSummary objectSummaryEntry : objectSummaryList) {
085 BudgetConstructionOrgObjectSummaryReport orgObjectSummaryReportEntry = new BudgetConstructionOrgObjectSummaryReport();
086 buildReportsHeader(universityFiscalYear, orgObjectSummaryReportEntry, objectSummaryEntry);
087 buildReportsBody(universityFiscalYear, orgObjectSummaryReportEntry, objectSummaryEntry);
088 buildReportsTotal(orgObjectSummaryReportEntry, objectSummaryEntry, objectSummaryTotalLevelList, objectSummaryTotalConsList, objectSummaryTotalGexpAndTypeList, objectSummaryTotalList);
089 reportSet.add(orgObjectSummaryReportEntry);
090 }
091
092 return reportSet;
093 }
094
095 /**
096 * builds report Header
097 *
098 * @param BudgetConstructionObjectSummary bcas
099 */
100 protected void buildReportsHeader(Integer universityFiscalYear, BudgetConstructionOrgObjectSummaryReport orgObjectSummaryReportEntry, BudgetConstructionObjectSummary objectSummary) {
101 String orgChartDesc = objectSummary.getOrganizationChartOfAccounts().getFinChartOfAccountDescription();
102 String chartDesc = objectSummary.getChartOfAccounts().getFinChartOfAccountDescription();
103 String orgName = objectSummary.getOrganization().getOrganizationName();
104 String reportChartDesc = objectSummary.getChartOfAccounts().getReportsToChartOfAccounts().getFinChartOfAccountDescription();
105 String subFundGroupName = objectSummary.getSubFundGroup().getSubFundGroupCode();
106 String subFundGroupDes = objectSummary.getSubFundGroup().getSubFundGroupDescription();
107 String fundGroupName = objectSummary.getSubFundGroup().getFundGroupCode();
108 String fundGroupDes = objectSummary.getSubFundGroup().getFundGroup().getName();
109
110 Integer prevFiscalyear = universityFiscalYear - 1;
111 orgObjectSummaryReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
112 orgObjectSummaryReportEntry.setOrgChartOfAccountsCode(objectSummary.getOrganizationChartOfAccountsCode());
113
114 if (orgChartDesc == null) {
115 orgObjectSummaryReportEntry.setOrgChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
116 }
117 else {
118 orgObjectSummaryReportEntry.setOrgChartOfAccountDescription(orgChartDesc);
119 }
120
121 orgObjectSummaryReportEntry.setOrganizationCode(objectSummary.getOrganizationCode());
122 if (orgName == null) {
123 orgObjectSummaryReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
124 }
125 else {
126 orgObjectSummaryReportEntry.setOrganizationName(orgName);
127 }
128
129 orgObjectSummaryReportEntry.setChartOfAccountsCode(objectSummary.getChartOfAccountsCode());
130 if (chartDesc == null) {
131 orgObjectSummaryReportEntry.setChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
132 }
133 else {
134 orgObjectSummaryReportEntry.setChartOfAccountDescription(chartDesc);
135 }
136
137 orgObjectSummaryReportEntry.setFundGroupCode(objectSummary.getSubFundGroup().getFundGroupCode());
138 if (fundGroupDes == null) {
139 orgObjectSummaryReportEntry.setFundGroupName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_FUNDGROUP_NAME));
140 }
141 else {
142 orgObjectSummaryReportEntry.setFundGroupName(fundGroupDes);
143 }
144
145 orgObjectSummaryReportEntry.setSubFundGroupCode(objectSummary.getSubFundGroupCode());
146 if (subFundGroupDes == null) {
147 orgObjectSummaryReportEntry.setSubFundGroupDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_SUBFUNDGROUP_DESCRIPTION));
148 }
149 else {
150 orgObjectSummaryReportEntry.setSubFundGroupDescription(subFundGroupDes);
151 }
152
153 Integer prevPrevFiscalyear = prevFiscalyear - 1;
154 orgObjectSummaryReportEntry.setBaseFy(prevPrevFiscalyear.toString() + "-" + prevFiscalyear.toString().substring(2, 4));
155 orgObjectSummaryReportEntry.setReqFy(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
156 orgObjectSummaryReportEntry.setHeader1("Object Name");
157 orgObjectSummaryReportEntry.setHeader2a("Lv. FTE");
158 orgObjectSummaryReportEntry.setHeader2("FTE");
159 orgObjectSummaryReportEntry.setHeader3("Amount");
160 orgObjectSummaryReportEntry.setHeader31("FTE");
161 orgObjectSummaryReportEntry.setHeader40("FTE");
162 orgObjectSummaryReportEntry.setHeader4("Amount");
163 orgObjectSummaryReportEntry.setHeader5(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
164 orgObjectSummaryReportEntry.setHeader6(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
165 orgObjectSummaryReportEntry.setConsHdr("");
166
167 // For page break for objectObjectCode
168 orgObjectSummaryReportEntry.setFinancialObjectLevelCode(objectSummary.getFinancialObjectLevelCode());
169 orgObjectSummaryReportEntry.setIncomeExpenseCode(objectSummary.getIncomeExpenseCode());
170 orgObjectSummaryReportEntry.setFinancialConsolidationSortCode(objectSummary.getFinancialConsolidationSortCode());
171 orgObjectSummaryReportEntry.setFinancialLevelSortCode(objectSummary.getFinancialLevelSortCode());
172 }
173
174 /**
175 * builds report body
176 *
177 * @param BudgetConstructionLevelSummary bcas
178 */
179 protected void buildReportsBody(Integer universityFiscalYear, BudgetConstructionOrgObjectSummaryReport orgObjectSummaryReportEntry, BudgetConstructionObjectSummary objectSummary) {
180
181 orgObjectSummaryReportEntry.setFinancialObjectCode(objectSummary.getFinancialObjectCode());
182 // To get ObjectName: There is no universityFiscalyear field in BudgetConstructionObjectSummary,
183 // so we can get ObjectName by getting ObjectCode with Primary key.
184 ObjectCode objectCode = budgetConstructionReportsServiceHelper.getObjectCode(universityFiscalYear, objectSummary.getChartOfAccountsCode(), objectSummary.getFinancialObjectCode());
185 String objectName = null;
186
187 if (objectCode == null) {
188 orgObjectSummaryReportEntry.setFinancialObjectName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_OBJECT_CODE));
189 }
190 else {
191 objectName = objectCode.getFinancialObjectCodeName();
192 if (objectName == null) {
193 orgObjectSummaryReportEntry.setFinancialObjectName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_OBJECT_NAME));
194 }
195 else {
196 orgObjectSummaryReportEntry.setFinancialObjectName(objectName);
197 }
198 }
199 orgObjectSummaryReportEntry.setPositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(objectSummary.getPositionCsfLeaveFteQuantity(), 2, true));
200 orgObjectSummaryReportEntry.setCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(objectSummary.getCsfFullTimeEmploymentQuantity(), 2, true));
201 orgObjectSummaryReportEntry.setAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(objectSummary.getAppointmentRequestedCsfFteQuantity(), 2, true));
202 orgObjectSummaryReportEntry.setAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(objectSummary.getAppointmentRequestedFteQuantity(), 2, true));
203
204 if (objectSummary.getAccountLineAnnualBalanceAmount() != null) {
205 orgObjectSummaryReportEntry.setAccountLineAnnualBalanceAmount(new Integer(objectSummary.getAccountLineAnnualBalanceAmount().intValue()));
206 }
207
208 if (objectSummary.getFinancialBeginningBalanceLineAmount() != null) {
209 orgObjectSummaryReportEntry.setFinancialBeginningBalanceLineAmount(new Integer(objectSummary.getFinancialBeginningBalanceLineAmount().intValue()));
210 }
211
212 if (objectSummary.getAccountLineAnnualBalanceAmount() != null && objectSummary.getFinancialBeginningBalanceLineAmount() != null) {
213 int changeAmount = objectSummary.getAccountLineAnnualBalanceAmount().subtract(objectSummary.getFinancialBeginningBalanceLineAmount()).intValue();
214 orgObjectSummaryReportEntry.setAmountChange(new Integer(changeAmount));
215 }
216
217 orgObjectSummaryReportEntry.setPercentChange(BudgetConstructionReportHelper.calculatePercent(orgObjectSummaryReportEntry.getAmountChange(), orgObjectSummaryReportEntry.getFinancialBeginningBalanceLineAmount()));
218 }
219
220 /**
221 * builds report total
222 *
223 * @param BudgetConstructionObjectSummary bcas
224 * @param List reportTotalList
225 */
226 protected void buildReportsTotal(BudgetConstructionOrgObjectSummaryReport orgObjectSummaryReportEntry, BudgetConstructionObjectSummary objectSummary, List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalLevelList, List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalConsList, List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalGexpAndTypeList, List<BudgetConstructionOrgObjectSummaryReportTotal> objectSummaryTotalList) {
227
228 for (BudgetConstructionOrgObjectSummaryReportTotal levelTotal : objectSummaryTotalLevelList) {
229 if (BudgetConstructionReportHelper.isSameEntry(objectSummary, levelTotal.getBcos(), fieldsForLevel())) {
230 orgObjectSummaryReportEntry.setTotalLevelDescription(objectSummary.getFinancialObjectLevel().getFinancialObjectLevelName());
231
232 orgObjectSummaryReportEntry.setTotalLevelPositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelTotal.getTotalLevelPositionCsfLeaveFteQuantity(), 2, true));
233 orgObjectSummaryReportEntry.setTotalLevelPositionCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelTotal.getTotalLevelPositionCsfFullTimeEmploymentQuantity(), 2, true));
234 orgObjectSummaryReportEntry.setTotalLevelFinancialBeginningBalanceLineAmount(levelTotal.getTotalLevelFinancialBeginningBalanceLineAmount());
235 orgObjectSummaryReportEntry.setTotalLevelAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelTotal.getTotalLevelAppointmentRequestedCsfFteQuantity(), 2, true));
236 orgObjectSummaryReportEntry.setTotalLevelAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelTotal.getTotalLevelAppointmentRequestedFteQuantity(), 2, true));
237 orgObjectSummaryReportEntry.setTotalLevelAccountLineAnnualBalanceAmount(levelTotal.getTotalLevelAccountLineAnnualBalanceAmount());
238
239 Integer totalLevelAmountChange = levelTotal.getTotalLevelAccountLineAnnualBalanceAmount() - levelTotal.getTotalLevelFinancialBeginningBalanceLineAmount();
240 orgObjectSummaryReportEntry.setTotalLevelAmountChange(totalLevelAmountChange);
241 orgObjectSummaryReportEntry.setTotalLevelPercentChange(BudgetConstructionReportHelper.calculatePercent(totalLevelAmountChange, levelTotal.getTotalLevelFinancialBeginningBalanceLineAmount()));
242 }
243 }
244
245 for (BudgetConstructionOrgObjectSummaryReportTotal consTotal : objectSummaryTotalConsList) {
246 if (BudgetConstructionReportHelper.isSameEntry(objectSummary, consTotal.getBcos(), fieldsForCons())) {
247 orgObjectSummaryReportEntry.setTotalConsolidationDescription(objectSummary.getFinancialConsolidationObject().getFinConsolidationObjectName());
248
249 orgObjectSummaryReportEntry.setTotalConsolidationPositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationPositionCsfLeaveFteQuantity(), 2, true));
250 orgObjectSummaryReportEntry.setTotalConsolidationPositionCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationPositionCsfFullTimeEmploymentQuantity(), 2, true));
251 orgObjectSummaryReportEntry.setTotalConsolidationFinancialBeginningBalanceLineAmount(consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount());
252 orgObjectSummaryReportEntry.setTotalConsolidationAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationAppointmentRequestedCsfFteQuantity(), 2, true));
253 orgObjectSummaryReportEntry.setTotalConsolidationAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationAppointmentRequestedFteQuantity(), 2, true));
254 orgObjectSummaryReportEntry.setTotalConsolidationAccountLineAnnualBalanceAmount(consTotal.getTotalConsolidationAccountLineAnnualBalanceAmount());
255 Integer totalConsolidationAmountChange = consTotal.getTotalConsolidationAccountLineAnnualBalanceAmount() - consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount();
256 orgObjectSummaryReportEntry.setTotalConsolidationAmountChange(totalConsolidationAmountChange);
257 orgObjectSummaryReportEntry.setTotalConsolidationPercentChange(BudgetConstructionReportHelper.calculatePercent(totalConsolidationAmountChange, consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount()));
258
259 }
260 }
261
262 for (BudgetConstructionOrgObjectSummaryReportTotal gexpAndTypeTotal : objectSummaryTotalGexpAndTypeList) {
263 if (BudgetConstructionReportHelper.isSameEntry(objectSummary, gexpAndTypeTotal.getBcos(), fieldsForGexpAndType())) {
264
265 orgObjectSummaryReportEntry.setGrossFinancialBeginningBalanceLineAmount(gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount());
266 orgObjectSummaryReportEntry.setGrossAccountLineAnnualBalanceAmount(gexpAndTypeTotal.getGrossAccountLineAnnualBalanceAmount());
267 Integer grossAmountChange = gexpAndTypeTotal.getGrossAccountLineAnnualBalanceAmount() - gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount();
268 orgObjectSummaryReportEntry.setGrossAmountChange(grossAmountChange);
269 orgObjectSummaryReportEntry.setGrossPercentChange(BudgetConstructionReportHelper.calculatePercent(grossAmountChange, gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount()));
270
271 if (objectSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_A)) {
272 orgObjectSummaryReportEntry.setTypeDesc(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_UPPERCASE_REVENUE));
273 }
274 else {
275 orgObjectSummaryReportEntry.setTypeDesc(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXPENDITURE_NET_TRNFR));
276 }
277 orgObjectSummaryReportEntry.setTypePositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypePositionCsfLeaveFteQuantity(), 2, true));
278 orgObjectSummaryReportEntry.setTypePositionCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypePositionCsfFullTimeEmploymentQuantity(), 2, true));
279 orgObjectSummaryReportEntry.setTypeFinancialBeginningBalanceLineAmount(gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount());
280 orgObjectSummaryReportEntry.setTypeAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypeAppointmentRequestedCsfFteQuantity(), 2, true));
281 orgObjectSummaryReportEntry.setTypeAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypeAppointmentRequestedFteQuantity(), 2, true));
282 orgObjectSummaryReportEntry.setTypeAccountLineAnnualBalanceAmount(gexpAndTypeTotal.getTypeAccountLineAnnualBalanceAmount());
283 Integer typeAmountChange = gexpAndTypeTotal.getTypeAccountLineAnnualBalanceAmount() - gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount();
284 orgObjectSummaryReportEntry.setTypeAmountChange(typeAmountChange);
285 orgObjectSummaryReportEntry.setTypePercentChange(BudgetConstructionReportHelper.calculatePercent(typeAmountChange, gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount()));
286 }
287 }
288
289 for (BudgetConstructionOrgObjectSummaryReportTotal total : objectSummaryTotalList) {
290 if (BudgetConstructionReportHelper.isSameEntry(objectSummary, total.getBcos(), fieldsForTotal())) {
291 orgObjectSummaryReportEntry.setTotalSubFundGroupDesc(objectSummary.getSubFundGroup().getSubFundGroupDescription());
292 orgObjectSummaryReportEntry.setRevenueFinancialBeginningBalanceLineAmount(total.getRevenueFinancialBeginningBalanceLineAmount());
293 orgObjectSummaryReportEntry.setRevenueAccountLineAnnualBalanceAmount(total.getRevenueAccountLineAnnualBalanceAmount());
294 orgObjectSummaryReportEntry.setExpenditureFinancialBeginningBalanceLineAmount(total.getExpenditureFinancialBeginningBalanceLineAmount());
295 orgObjectSummaryReportEntry.setExpenditureAccountLineAnnualBalanceAmount(total.getExpenditureAccountLineAnnualBalanceAmount());
296
297 Integer revenueAmountChange = total.getRevenueAccountLineAnnualBalanceAmount() - total.getRevenueFinancialBeginningBalanceLineAmount();
298 orgObjectSummaryReportEntry.setRevenueAmountChange(revenueAmountChange);
299 orgObjectSummaryReportEntry.setRevenuePercentChange(BudgetConstructionReportHelper.calculatePercent(revenueAmountChange, total.getRevenueFinancialBeginningBalanceLineAmount()));
300
301 Integer expenditureAmountChange = total.getExpenditureAccountLineAnnualBalanceAmount() - total.getExpenditureFinancialBeginningBalanceLineAmount();
302 orgObjectSummaryReportEntry.setExpenditureAmountChange(expenditureAmountChange);
303 orgObjectSummaryReportEntry.setExpenditurePercentChange(BudgetConstructionReportHelper.calculatePercent(expenditureAmountChange, total.getExpenditureFinancialBeginningBalanceLineAmount()));
304
305 orgObjectSummaryReportEntry.setDifferenceFinancialBeginningBalanceLineAmount(total.getDifferenceFinancialBeginningBalanceLineAmount());
306 orgObjectSummaryReportEntry.setDifferenceAccountLineAnnualBalanceAmount(total.getDifferenceAccountLineAnnualBalanceAmount());
307
308 Integer differenceAmountChange = total.getDifferenceAccountLineAnnualBalanceAmount() - total.getDifferenceFinancialBeginningBalanceLineAmount();
309 orgObjectSummaryReportEntry.setDifferenceAmountChange(differenceAmountChange);
310 orgObjectSummaryReportEntry.setDifferencePercentChange(BudgetConstructionReportHelper.calculatePercent(differenceAmountChange, total.getDifferenceFinancialBeginningBalanceLineAmount()));
311 }
312 }
313 }
314
315 protected List calculateLevelTotal(List<BudgetConstructionObjectSummary> bcosList, List<BudgetConstructionObjectSummary> simpleList) {
316
317 BigDecimal totalLevelPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
318 BigDecimal totalLevelPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
319 Integer totalLevelFinancialBeginningBalanceLineAmount = new Integer(0);
320 BigDecimal totalLevelAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
321 BigDecimal totalLevelAppointmentRequestedFteQuantity = BigDecimal.ZERO;
322 Integer totalLevelAccountLineAnnualBalanceAmount = new Integer(0);
323
324 List returnList = new ArrayList();
325
326 for (BudgetConstructionObjectSummary simpleBcosEntry : simpleList) {
327 BudgetConstructionOrgObjectSummaryReportTotal bcObjectTotal = new BudgetConstructionOrgObjectSummaryReportTotal();
328 for (BudgetConstructionObjectSummary bcosListEntry : bcosList) {
329 if (BudgetConstructionReportHelper.isSameEntry(simpleBcosEntry, bcosListEntry, fieldsForLevel())) {
330 totalLevelFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
331 totalLevelAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
332 totalLevelPositionCsfLeaveFteQuantity = totalLevelPositionCsfLeaveFteQuantity.add(bcosListEntry.getPositionCsfLeaveFteQuantity());
333 totalLevelPositionCsfFullTimeEmploymentQuantity = totalLevelPositionCsfFullTimeEmploymentQuantity.add(bcosListEntry.getCsfFullTimeEmploymentQuantity());
334 totalLevelAppointmentRequestedCsfFteQuantity = totalLevelAppointmentRequestedCsfFteQuantity.add(bcosListEntry.getAppointmentRequestedCsfFteQuantity());
335 totalLevelAppointmentRequestedFteQuantity = totalLevelAppointmentRequestedFteQuantity.add(bcosListEntry.getAppointmentRequestedFteQuantity());
336 }
337 }
338 bcObjectTotal.setBcos(simpleBcosEntry);
339 bcObjectTotal.setTotalLevelPositionCsfLeaveFteQuantity(totalLevelPositionCsfLeaveFteQuantity);
340 bcObjectTotal.setTotalLevelPositionCsfFullTimeEmploymentQuantity(totalLevelPositionCsfFullTimeEmploymentQuantity);
341 bcObjectTotal.setTotalLevelFinancialBeginningBalanceLineAmount(totalLevelFinancialBeginningBalanceLineAmount);
342 bcObjectTotal.setTotalLevelAppointmentRequestedCsfFteQuantity(totalLevelAppointmentRequestedCsfFteQuantity);
343 bcObjectTotal.setTotalLevelAppointmentRequestedFteQuantity(totalLevelAppointmentRequestedFteQuantity);
344 bcObjectTotal.setTotalLevelAccountLineAnnualBalanceAmount(totalLevelAccountLineAnnualBalanceAmount);
345 returnList.add(bcObjectTotal);
346
347 totalLevelPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
348 totalLevelPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
349 totalLevelFinancialBeginningBalanceLineAmount = new Integer(0);
350 totalLevelAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
351 totalLevelAppointmentRequestedFteQuantity = BigDecimal.ZERO;
352 totalLevelAccountLineAnnualBalanceAmount = new Integer(0);
353 }
354 return returnList;
355
356 }
357
358 protected List calculateConsTotal(List<BudgetConstructionObjectSummary> bcosList, List<BudgetConstructionObjectSummary> simpleList) {
359
360 BigDecimal totalConsolidationPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
361 BigDecimal totalConsolidationPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
362 Integer totalConsolidationFinancialBeginningBalanceLineAmount = new Integer(0);
363 BigDecimal totalConsolidationAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
364 BigDecimal totalConsolidationAppointmentRequestedFteQuantity = BigDecimal.ZERO;
365 Integer totalConsolidationAccountLineAnnualBalanceAmount = new Integer(0);
366
367 List returnList = new ArrayList();
368 for (BudgetConstructionObjectSummary simpleBcosEntry : simpleList) {
369 BudgetConstructionOrgObjectSummaryReportTotal bcObjectTotal = new BudgetConstructionOrgObjectSummaryReportTotal();
370 for (BudgetConstructionObjectSummary bcosListEntry : bcosList) {
371 if (BudgetConstructionReportHelper.isSameEntry(simpleBcosEntry, bcosListEntry, fieldsForCons())) {
372 totalConsolidationFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
373 totalConsolidationAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
374 totalConsolidationPositionCsfLeaveFteQuantity = totalConsolidationPositionCsfLeaveFteQuantity.add(bcosListEntry.getPositionCsfLeaveFteQuantity());
375 totalConsolidationPositionCsfFullTimeEmploymentQuantity = totalConsolidationPositionCsfFullTimeEmploymentQuantity.add(bcosListEntry.getCsfFullTimeEmploymentQuantity());
376 totalConsolidationAppointmentRequestedCsfFteQuantity = totalConsolidationAppointmentRequestedCsfFteQuantity.add(bcosListEntry.getAppointmentRequestedCsfFteQuantity());
377 totalConsolidationAppointmentRequestedFteQuantity = totalConsolidationAppointmentRequestedFteQuantity.add(bcosListEntry.getAppointmentRequestedFteQuantity());
378 }
379 }
380 bcObjectTotal.setBcos(simpleBcosEntry);
381 bcObjectTotal.setTotalConsolidationPositionCsfLeaveFteQuantity(totalConsolidationPositionCsfLeaveFteQuantity);
382 bcObjectTotal.setTotalConsolidationPositionCsfFullTimeEmploymentQuantity(totalConsolidationPositionCsfFullTimeEmploymentQuantity);
383 bcObjectTotal.setTotalConsolidationFinancialBeginningBalanceLineAmount(totalConsolidationFinancialBeginningBalanceLineAmount);
384 bcObjectTotal.setTotalConsolidationAppointmentRequestedCsfFteQuantity(totalConsolidationAppointmentRequestedCsfFteQuantity);
385 bcObjectTotal.setTotalConsolidationAppointmentRequestedFteQuantity(totalConsolidationAppointmentRequestedFteQuantity);
386 bcObjectTotal.setTotalConsolidationAccountLineAnnualBalanceAmount(totalConsolidationAccountLineAnnualBalanceAmount);
387 returnList.add(bcObjectTotal);
388
389 totalConsolidationPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
390 totalConsolidationPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
391 totalConsolidationFinancialBeginningBalanceLineAmount = new Integer(0);
392 totalConsolidationAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
393 totalConsolidationAppointmentRequestedFteQuantity = BigDecimal.ZERO;
394 totalConsolidationAccountLineAnnualBalanceAmount = new Integer(0);
395 }
396 return returnList;
397 }
398
399 protected List calculateGexpAndTypeTotal(List<BudgetConstructionObjectSummary> bcosList, List<BudgetConstructionObjectSummary> simpleList) {
400
401 Integer grossFinancialBeginningBalanceLineAmount = new Integer(0);
402 Integer grossAccountLineAnnualBalanceAmount = new Integer(0);
403
404 BigDecimal typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
405 BigDecimal typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
406 Integer typeFinancialBeginningBalanceLineAmount = new Integer(0);
407 BigDecimal typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
408 BigDecimal typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
409 Integer typeAccountLineAnnualBalanceAmount = new Integer(0);
410
411 List returnList = new ArrayList();
412 for (BudgetConstructionObjectSummary simpleBcosEntry : simpleList) {
413 BudgetConstructionOrgObjectSummaryReportTotal bcObjectTotal = new BudgetConstructionOrgObjectSummaryReportTotal();
414 for (BudgetConstructionObjectSummary bcosListEntry : bcosList) {
415 if (BudgetConstructionReportHelper.isSameEntry(simpleBcosEntry, bcosListEntry, fieldsForGexpAndType())) {
416
417 typeFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
418 typeAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
419 typePositionCsfLeaveFteQuantity = typePositionCsfLeaveFteQuantity.add(bcosListEntry.getPositionCsfLeaveFteQuantity());
420 typePositionCsfFullTimeEmploymentQuantity = typePositionCsfFullTimeEmploymentQuantity.add(bcosListEntry.getCsfFullTimeEmploymentQuantity());
421 typeAppointmentRequestedCsfFteQuantity = typeAppointmentRequestedCsfFteQuantity.add(bcosListEntry.getAppointmentRequestedCsfFteQuantity());
422 typeAppointmentRequestedFteQuantity = typeAppointmentRequestedFteQuantity.add(bcosListEntry.getAppointmentRequestedFteQuantity());
423
424 if (bcosListEntry.getIncomeExpenseCode().equals("B") && !bcosListEntry.getFinancialObjectLevelCode().equals("CORI") && !bcosListEntry.getFinancialObjectLevelCode().equals("TRIN")) {
425 grossFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
426 grossAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
427 }
428 }
429 }
430 bcObjectTotal.setBcos(simpleBcosEntry);
431
432 bcObjectTotal.setGrossFinancialBeginningBalanceLineAmount(grossFinancialBeginningBalanceLineAmount);
433 bcObjectTotal.setGrossAccountLineAnnualBalanceAmount(grossAccountLineAnnualBalanceAmount);
434
435 bcObjectTotal.setTypePositionCsfLeaveFteQuantity(typePositionCsfLeaveFteQuantity);
436 bcObjectTotal.setTypePositionCsfFullTimeEmploymentQuantity(typePositionCsfFullTimeEmploymentQuantity);
437 bcObjectTotal.setTypeFinancialBeginningBalanceLineAmount(typeFinancialBeginningBalanceLineAmount);
438 bcObjectTotal.setTypeAppointmentRequestedCsfFteQuantity(typeAppointmentRequestedCsfFteQuantity);
439 bcObjectTotal.setTypeAppointmentRequestedFteQuantity(typeAppointmentRequestedFteQuantity);
440 bcObjectTotal.setTypeAccountLineAnnualBalanceAmount(typeAccountLineAnnualBalanceAmount);
441
442 returnList.add(bcObjectTotal);
443 grossFinancialBeginningBalanceLineAmount = new Integer(0);
444 grossAccountLineAnnualBalanceAmount = new Integer(0);
445
446 typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
447 typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
448 typeFinancialBeginningBalanceLineAmount = new Integer(0);
449 typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
450 typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
451 typeAccountLineAnnualBalanceAmount = new Integer(0);
452 }
453
454 return returnList;
455 }
456
457
458 protected List calculateTotal(List<BudgetConstructionObjectSummary> bcosList, List<BudgetConstructionObjectSummary> simpleList) {
459
460 Integer revenueFinancialBeginningBalanceLineAmount = new Integer(0);
461 Integer revenueAccountLineAnnualBalanceAmount = new Integer(0);
462
463 Integer expenditureFinancialBeginningBalanceLineAmount = new Integer(0);
464 Integer expenditureAccountLineAnnualBalanceAmount = new Integer(0);
465
466 Integer differenceFinancialBeginningBalanceLineAmount = new Integer(0);
467 Integer differenceAccountLineAnnualBalanceAmount = new Integer(0);
468
469 List returnList = new ArrayList();
470
471 for (BudgetConstructionObjectSummary simpleBcosEntry : simpleList) {
472 BudgetConstructionOrgObjectSummaryReportTotal bcObjectTotal = new BudgetConstructionOrgObjectSummaryReportTotal();
473 for (BudgetConstructionObjectSummary bcosListEntry : bcosList) {
474 if (BudgetConstructionReportHelper.isSameEntry(simpleBcosEntry, bcosListEntry, fieldsForTotal())) {
475
476 if (bcosListEntry.getIncomeExpenseCode().equals("A")) {
477 revenueFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
478 revenueAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
479 }
480 else {
481 expenditureFinancialBeginningBalanceLineAmount += new Integer(bcosListEntry.getFinancialBeginningBalanceLineAmount().intValue());
482 expenditureAccountLineAnnualBalanceAmount += new Integer(bcosListEntry.getAccountLineAnnualBalanceAmount().intValue());
483 }
484 }
485 }
486
487 bcObjectTotal.setBcos(simpleBcosEntry);
488
489 bcObjectTotal.setRevenueFinancialBeginningBalanceLineAmount(revenueFinancialBeginningBalanceLineAmount);
490 bcObjectTotal.setRevenueAccountLineAnnualBalanceAmount(revenueAccountLineAnnualBalanceAmount);
491
492 bcObjectTotal.setExpenditureFinancialBeginningBalanceLineAmount(expenditureFinancialBeginningBalanceLineAmount);
493 bcObjectTotal.setExpenditureAccountLineAnnualBalanceAmount(expenditureAccountLineAnnualBalanceAmount);
494
495 differenceFinancialBeginningBalanceLineAmount = revenueFinancialBeginningBalanceLineAmount - expenditureFinancialBeginningBalanceLineAmount;
496 differenceAccountLineAnnualBalanceAmount = revenueAccountLineAnnualBalanceAmount - expenditureAccountLineAnnualBalanceAmount;
497 bcObjectTotal.setDifferenceFinancialBeginningBalanceLineAmount(differenceFinancialBeginningBalanceLineAmount);
498 bcObjectTotal.setDifferenceAccountLineAnnualBalanceAmount(differenceAccountLineAnnualBalanceAmount);
499
500 returnList.add(bcObjectTotal);
501
502 revenueFinancialBeginningBalanceLineAmount = new Integer(0);
503 revenueAccountLineAnnualBalanceAmount = new Integer(0);
504
505 expenditureFinancialBeginningBalanceLineAmount = new Integer(0);
506 expenditureAccountLineAnnualBalanceAmount = new Integer(0);
507
508 differenceFinancialBeginningBalanceLineAmount = new Integer(0);
509 differenceAccountLineAnnualBalanceAmount = new Integer(0);
510 }
511 return returnList;
512 }
513
514
515 protected List<String> fieldsForLevel() {
516 List<String> fieldList = new ArrayList();
517 fieldList.addAll(fieldsForCons());
518 fieldList.add(KFSPropertyConstants.FINANCIAL_LEVEL_SORT_CODE);
519 return fieldList;
520 }
521
522 protected List<String> fieldsForCons() {
523 List<String> fieldList = new ArrayList();
524 fieldList.addAll(fieldsForGexpAndType());
525 fieldList.add(KFSPropertyConstants.FINANCIAL_CONSOLIDATION_SORT_CODE);
526 return fieldList;
527 }
528
529
530 protected List<String> fieldsForGexpAndType() {
531 List<String> fieldList = new ArrayList();
532 fieldList.addAll(fieldsForTotal());
533 fieldList.add(KFSPropertyConstants.INCOME_EXPENSE_CODE);
534 return fieldList;
535 }
536
537
538 protected List<String> fieldsForTotal() {
539 List<String> fieldList = new ArrayList();
540 fieldList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
541 fieldList.add(KFSPropertyConstants.ORGANIZATION_CODE);
542 fieldList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
543 fieldList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
544 /*
545 * fieldList.add(KFSPropertyConstants.INCOME_EXPENSE_CODE);
546 * fieldList.add(KFSPropertyConstants.FINANCIAL_CONSOLIDATION_SORT_CODE);
547 * fieldList.add(KFSPropertyConstants.FINANCIAL_LEVEL_SORT_CODE); fieldList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
548 */
549 return fieldList;
550 }
551
552 /**
553 * builds orderByList for sort order.
554 *
555 * @return returnList
556 */
557 protected List<String> buildOrderByList() {
558 List<String> returnList = new ArrayList();
559 returnList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
560 returnList.add(KFSPropertyConstants.ORGANIZATION_CODE);
561 returnList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
562 returnList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
563 returnList.add(KFSPropertyConstants.INCOME_EXPENSE_CODE);
564 returnList.add(KFSPropertyConstants.FINANCIAL_CONSOLIDATION_SORT_CODE);
565 returnList.add(KFSPropertyConstants.FINANCIAL_LEVEL_SORT_CODE);
566 returnList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
567
568 return returnList;
569 }
570
571 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
572 this.kualiConfigurationService = kualiConfigurationService;
573 }
574
575 public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) {
576 this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper;
577 }
578 }