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.module.bc.BCConstants;
024    import org.kuali.kfs.module.bc.BCKeyConstants;
025    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionLevelSummary;
026    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgLevelSummaryReport;
027    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgLevelSummaryReportTotal;
028    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLevelSummaryReportDao;
029    import org.kuali.kfs.module.bc.document.service.BudgetConstructionLevelSummaryReportService;
030    import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper;
031    import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper;
032    import org.kuali.kfs.sys.KFSPropertyConstants;
033    import org.kuali.rice.kns.service.KualiConfigurationService;
034    import org.springframework.transaction.annotation.Transactional;
035    
036    /**
037     * Service implementation of BudgetConstructionLevelSummaryReportService.
038     */
039    @Transactional
040    public class BudgetConstructionLevelSummaryReportServiceImpl implements BudgetConstructionLevelSummaryReportService {
041    
042        BudgetConstructionLevelSummaryReportDao budgetConstructionLevelSummaryReportDao;
043        KualiConfigurationService kualiConfigurationService;
044        BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper;
045    
046        /**
047         * @see org.kuali.kfs.module.bc.document.service.BudgetReportsControlListService#updateRepotsLevelSummaryTable(java.lang.String)
048         */
049        public void updateLevelSummaryReport(String principalName) {
050            budgetConstructionLevelSummaryReportDao.cleanReportsLevelSummaryTable(principalName);
051            budgetConstructionLevelSummaryReportDao.updateReportsLevelSummaryTable(principalName);
052        }
053    
054        /**
055         * sets budgetConstructionLevelSummaryReportDao
056         * 
057         * @param budgetConstructionLevelSummaryReportDao
058         */
059        public void setBudgetConstructionLevelSummaryReportDao(BudgetConstructionLevelSummaryReportDao budgetConstructionLevelSummaryReportDao) {
060            this.budgetConstructionLevelSummaryReportDao = budgetConstructionLevelSummaryReportDao;
061        }
062    
063        /**
064         * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionLevelSummaryReportService#buildReports(java.lang.Integer,
065         *      java.util.Collection)
066         */
067        public Collection<BudgetConstructionOrgLevelSummaryReport> buildReports(Integer universityFiscalYear, String principalName) {
068            Collection<BudgetConstructionOrgLevelSummaryReport> reportSet = new ArrayList();
069    
070            BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry;
071            Collection<BudgetConstructionLevelSummary> levelSummaryList = budgetConstructionReportsServiceHelper.getDataForBuildingReports(BudgetConstructionLevelSummary.class, principalName, buildOrderByList());
072    
073    
074            // Making a list with same organizationChartOfAccountsCode, organizationCode, chartOfAccountsCode, subFundGroupCode
075            List listForCalculateCons = BudgetConstructionReportHelper.deleteDuplicated((List) levelSummaryList, fieldsForCons());
076            List listForCalculateGexpAndType = BudgetConstructionReportHelper.deleteDuplicated((List) levelSummaryList, fieldsForGexpAndType());
077            List listForCalculateTotal = BudgetConstructionReportHelper.deleteDuplicated((List) levelSummaryList, fieldsForTotal());
078    
079            // Calculate Total Section
080            List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalConsList = calculateConsTotal((List) levelSummaryList, listForCalculateCons);
081            List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalGexpAndTypeList = calculateGexpAndTypeTotal((List) levelSummaryList, listForCalculateGexpAndType);
082            List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalList = calculateTotal((List) levelSummaryList, listForCalculateTotal);
083    
084            for (BudgetConstructionLevelSummary levelSummaryEntry : levelSummaryList) {
085                orgLevelSummaryReportEntry = new BudgetConstructionOrgLevelSummaryReport();
086                buildReportsHeader(universityFiscalYear, orgLevelSummaryReportEntry, levelSummaryEntry);
087                buildReportsBody(orgLevelSummaryReportEntry, levelSummaryEntry);
088                buildReportsTotal(orgLevelSummaryReportEntry, levelSummaryEntry, levelSummaryTotalConsList, levelSummaryTotalGexpAndTypeList, levelSummaryTotalList);
089                reportSet.add(orgLevelSummaryReportEntry);
090            }
091    
092            return reportSet;
093        }
094    
095        /**
096         * builds report Header
097         * 
098         * @param BudgetConstructionLevelSummary bcas
099         */
100        public void buildReportsHeader(Integer universityFiscalYear, BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry, BudgetConstructionLevelSummary levelSummary) {
101            String orgChartDesc = levelSummary.getOrganizationChartOfAccounts().getFinChartOfAccountDescription();
102            String chartDesc = levelSummary.getChartOfAccounts().getFinChartOfAccountDescription();
103            String orgName = levelSummary.getOrganization().getOrganizationName();
104            String reportChartDesc = levelSummary.getChartOfAccounts().getReportsToChartOfAccounts().getFinChartOfAccountDescription();
105            String subFundGroupName = levelSummary.getSubFundGroup().getSubFundGroupCode();
106            String subFundGroupDes = levelSummary.getSubFundGroup().getSubFundGroupDescription();
107            String fundGroupName = levelSummary.getSubFundGroup().getFundGroupCode();
108            String fundGroupDes = levelSummary.getSubFundGroup().getFundGroup().getName();
109    
110            Integer prevFiscalyear = universityFiscalYear - 1;
111            orgLevelSummaryReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
112            orgLevelSummaryReportEntry.setOrgChartOfAccountsCode(levelSummary.getOrganizationChartOfAccountsCode());
113    
114            if (orgChartDesc == null) {
115                orgLevelSummaryReportEntry.setOrgChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
116            }
117            else {
118                orgLevelSummaryReportEntry.setOrgChartOfAccountDescription(orgChartDesc);
119            }
120    
121            orgLevelSummaryReportEntry.setOrganizationCode(levelSummary.getOrganizationCode());
122            if (orgName == null) {
123                orgLevelSummaryReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
124            }
125            else {
126                orgLevelSummaryReportEntry.setOrganizationName(orgName);
127            }
128    
129            orgLevelSummaryReportEntry.setChartOfAccountsCode(levelSummary.getChartOfAccountsCode());
130            if (chartDesc == null) {
131                orgLevelSummaryReportEntry.setChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
132            }
133            else {
134                orgLevelSummaryReportEntry.setChartOfAccountDescription(chartDesc);
135            }
136    
137            orgLevelSummaryReportEntry.setFundGroupCode(levelSummary.getSubFundGroup().getFundGroupCode());
138            if (fundGroupDes == null) {
139                orgLevelSummaryReportEntry.setFundGroupName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_FUNDGROUP_NAME));
140            }
141            else {
142                orgLevelSummaryReportEntry.setFundGroupName(fundGroupDes);
143            }
144    
145            orgLevelSummaryReportEntry.setSubFundGroupCode(levelSummary.getSubFundGroupCode());
146            if (subFundGroupDes == null) {
147                orgLevelSummaryReportEntry.setSubFundGroupDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_SUBFUNDGROUP_DESCRIPTION));
148            }
149            else {
150                orgLevelSummaryReportEntry.setSubFundGroupDescription(subFundGroupDes);
151            }
152    
153            Integer prevPrevFiscalyear = prevFiscalyear - 1;
154            orgLevelSummaryReportEntry.setBaseFy(prevPrevFiscalyear.toString() + "-" + prevFiscalyear.toString().substring(2, 4));
155            orgLevelSummaryReportEntry.setReqFy(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
156            orgLevelSummaryReportEntry.setHeader1("Object Level Name");
157            orgLevelSummaryReportEntry.setHeader2a("Lv. FTE");
158            orgLevelSummaryReportEntry.setHeader2("FTE");
159            orgLevelSummaryReportEntry.setHeader3("Amount");
160            orgLevelSummaryReportEntry.setHeader31("FTE");
161            orgLevelSummaryReportEntry.setHeader40("FTE");
162            orgLevelSummaryReportEntry.setHeader4("Amount");
163            orgLevelSummaryReportEntry.setHeader5(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
164            orgLevelSummaryReportEntry.setHeader6(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
165            orgLevelSummaryReportEntry.setConsHdr("");
166    
167            // For page break for objectLevelCode
168            orgLevelSummaryReportEntry.setFinancialObjectLevelCode(levelSummary.getFinancialObjectLevelCode());
169            orgLevelSummaryReportEntry.setIncomeExpenseCode(levelSummary.getIncomeExpenseCode());
170            orgLevelSummaryReportEntry.setFinancialConsolidationSortCode(levelSummary.getFinancialConsolidationSortCode());
171    
172        }
173    
174        /**
175         * builds report body
176         * 
177         * @param BudgetConstructionLevelSummary bcas
178         */
179        public void buildReportsBody(BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry, BudgetConstructionLevelSummary levelSummary) {
180    
181            if (levelSummary.getFinancialObjectLevel() == null) {
182                orgLevelSummaryReportEntry.setFinancialObjectLevelName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_OBJECT_LEVEL_NAME));
183            }
184            else {
185                orgLevelSummaryReportEntry.setFinancialObjectLevelName(levelSummary.getFinancialObjectLevel().getFinancialObjectLevelName());
186            }
187    
188            orgLevelSummaryReportEntry.setPositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelSummary.getPositionCsfLeaveFteQuantity(), 2, true));
189            orgLevelSummaryReportEntry.setCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelSummary.getCsfFullTimeEmploymentQuantity(), 2, true));
190            orgLevelSummaryReportEntry.setAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelSummary.getAppointmentRequestedCsfFteQuantity(), 2, true));
191            orgLevelSummaryReportEntry.setAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(levelSummary.getAppointmentRequestedFteQuantity(), 2, true));
192    
193            if (levelSummary.getAccountLineAnnualBalanceAmount() != null) {
194                orgLevelSummaryReportEntry.setAccountLineAnnualBalanceAmount(new Integer(levelSummary.getAccountLineAnnualBalanceAmount().intValue()));
195            }
196    
197            if (levelSummary.getFinancialBeginningBalanceLineAmount() != null) {
198                orgLevelSummaryReportEntry.setFinancialBeginningBalanceLineAmount(new Integer(levelSummary.getFinancialBeginningBalanceLineAmount().intValue()));
199            }
200    
201            if (levelSummary.getAccountLineAnnualBalanceAmount() != null && levelSummary.getFinancialBeginningBalanceLineAmount() != null) {
202                int changeAmount = levelSummary.getAccountLineAnnualBalanceAmount().subtract(levelSummary.getFinancialBeginningBalanceLineAmount()).intValue();
203                orgLevelSummaryReportEntry.setAmountChange(new Integer(changeAmount));
204            }
205    
206            orgLevelSummaryReportEntry.setPercentChange(BudgetConstructionReportHelper.calculatePercent(orgLevelSummaryReportEntry.getAmountChange(), orgLevelSummaryReportEntry.getFinancialBeginningBalanceLineAmount()));
207        }
208    
209        /**
210         * builds report total
211         * 
212         * @param BudgetConstructionLevelSummary bcas
213         * @param List reportTotalList
214         */
215        public void buildReportsTotal(BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry, BudgetConstructionLevelSummary levelSummary, List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalConsList, List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalGexpAndTypeList, List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalList) {
216    
217            for (BudgetConstructionOrgLevelSummaryReportTotal consTotal : levelSummaryTotalConsList) {
218                if (BudgetConstructionReportHelper.isSameEntry(levelSummary, consTotal.getBcls(), fieldsForCons())) {
219                    orgLevelSummaryReportEntry.setTotalConsolidationDescription(levelSummary.getFinancialConsolidationObject().getFinConsolidationObjectName());
220    
221                    // The total part shouldn't have null value, so just checking '0'
222                    orgLevelSummaryReportEntry.setTotalConsolidationPositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationPositionCsfLeaveFteQuantity(), 2, true));
223                    orgLevelSummaryReportEntry.setTotalConsolidationPositionCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationPositionCsfFullTimeEmploymentQuantity(), 2, true));
224                    orgLevelSummaryReportEntry.setTotalConsolidationFinancialBeginningBalanceLineAmount(consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount());
225                    orgLevelSummaryReportEntry.setTotalConsolidationAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationAppointmentRequestedCsfFteQuantity(), 2, true));
226                    orgLevelSummaryReportEntry.setTotalConsolidationAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(consTotal.getTotalConsolidationAppointmentRequestedFteQuantity(), 2, true));
227                    orgLevelSummaryReportEntry.setTotalConsolidationAccountLineAnnualBalanceAmount(consTotal.getTotalConsolidationAccountLineAnnualBalanceAmount());
228    
229                    Integer amountChange = consTotal.getTotalConsolidationAccountLineAnnualBalanceAmount() - consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount();
230                    orgLevelSummaryReportEntry.setTotalConsolidationAmountChange(amountChange);
231                    orgLevelSummaryReportEntry.setTotalConsolidationPercentChange(BudgetConstructionReportHelper.calculatePercent(amountChange, consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount()));
232                }
233            }
234    
235            for (BudgetConstructionOrgLevelSummaryReportTotal gexpAndTypeTotal : levelSummaryTotalGexpAndTypeList) {
236                if (BudgetConstructionReportHelper.isSameEntry(levelSummary, gexpAndTypeTotal.getBcls(), fieldsForGexpAndType())) {
237    
238                    orgLevelSummaryReportEntry.setGrossFinancialBeginningBalanceLineAmount(gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount());
239                    orgLevelSummaryReportEntry.setGrossAccountLineAnnualBalanceAmount(gexpAndTypeTotal.getGrossAccountLineAnnualBalanceAmount());
240                    Integer gexpAndTypeAmountChange = gexpAndTypeTotal.getGrossAccountLineAnnualBalanceAmount() - gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount();
241                    orgLevelSummaryReportEntry.setGrossAmountChange(gexpAndTypeAmountChange);
242                    orgLevelSummaryReportEntry.setGrossPercentChange(BudgetConstructionReportHelper.calculatePercent(gexpAndTypeAmountChange, gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount()));
243    
244                    if (levelSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_A)) {
245                        orgLevelSummaryReportEntry.setTypeDesc(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_UPPERCASE_REVENUE));
246                    }
247                    else {
248                        orgLevelSummaryReportEntry.setTypeDesc(kualiConfigurationService.getPropertyString(BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXPENDITURE_NET_TRNFR));
249                    }
250                    orgLevelSummaryReportEntry.setTypePositionCsfLeaveFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypePositionCsfLeaveFteQuantity(), 2, true));
251                    orgLevelSummaryReportEntry.setTypePositionCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypePositionCsfFullTimeEmploymentQuantity(), 2, true));
252                    orgLevelSummaryReportEntry.setTypeFinancialBeginningBalanceLineAmount(gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount());
253                    orgLevelSummaryReportEntry.setTypeAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypeAppointmentRequestedCsfFteQuantity(), 2, true));
254                    orgLevelSummaryReportEntry.setTypeAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(gexpAndTypeTotal.getTypeAppointmentRequestedFteQuantity(), 2, true));
255    
256                    orgLevelSummaryReportEntry.setTypeAccountLineAnnualBalanceAmount(gexpAndTypeTotal.getTypeAccountLineAnnualBalanceAmount());
257                    Integer typeAmountChange = gexpAndTypeTotal.getTypeAccountLineAnnualBalanceAmount() - gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount();
258                    orgLevelSummaryReportEntry.setTypeAmountChange(typeAmountChange);
259                    orgLevelSummaryReportEntry.setTypePercentChange(BudgetConstructionReportHelper.calculatePercent(typeAmountChange, gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount()));
260                }
261            }
262    
263            for (BudgetConstructionOrgLevelSummaryReportTotal total : levelSummaryTotalList) {
264                if (BudgetConstructionReportHelper.isSameEntry(levelSummary, total.getBcls(), fieldsForTotal())) {
265    
266                    orgLevelSummaryReportEntry.setTotalSubFundGroupDesc(levelSummary.getSubFundGroup().getSubFundGroupDescription());
267                    orgLevelSummaryReportEntry.setRevenueFinancialBeginningBalanceLineAmount(total.getRevenueFinancialBeginningBalanceLineAmount());
268                    orgLevelSummaryReportEntry.setRevenueAccountLineAnnualBalanceAmount(total.getRevenueAccountLineAnnualBalanceAmount());
269                    orgLevelSummaryReportEntry.setExpenditureFinancialBeginningBalanceLineAmount(total.getExpenditureFinancialBeginningBalanceLineAmount());
270                    orgLevelSummaryReportEntry.setExpenditureAccountLineAnnualBalanceAmount(total.getExpenditureAccountLineAnnualBalanceAmount());
271    
272                    Integer revenueAmountChange = total.getRevenueAccountLineAnnualBalanceAmount() - total.getRevenueFinancialBeginningBalanceLineAmount();
273                    orgLevelSummaryReportEntry.setRevenueAmountChange(revenueAmountChange);
274                    orgLevelSummaryReportEntry.setRevenuePercentChange(BudgetConstructionReportHelper.calculatePercent(revenueAmountChange, total.getRevenueFinancialBeginningBalanceLineAmount()));
275    
276                    Integer expenditureAmountChange = total.getExpenditureAccountLineAnnualBalanceAmount() - total.getExpenditureFinancialBeginningBalanceLineAmount();
277                    orgLevelSummaryReportEntry.setExpenditureAmountChange(expenditureAmountChange);
278                    orgLevelSummaryReportEntry.setExpenditurePercentChange(BudgetConstructionReportHelper.calculatePercent(expenditureAmountChange, total.getExpenditureFinancialBeginningBalanceLineAmount()));
279    
280                    orgLevelSummaryReportEntry.setDifferenceFinancialBeginningBalanceLineAmount(total.getDifferenceFinancialBeginningBalanceLineAmount());
281                    orgLevelSummaryReportEntry.setDifferenceAccountLineAnnualBalanceAmount(total.getDifferenceAccountLineAnnualBalanceAmount());
282    
283                    Integer differenceAmountChange = total.getDifferenceAccountLineAnnualBalanceAmount() - total.getDifferenceFinancialBeginningBalanceLineAmount();
284                    orgLevelSummaryReportEntry.setDifferenceAmountChange(differenceAmountChange);
285                    orgLevelSummaryReportEntry.setDifferencePercentChange(BudgetConstructionReportHelper.calculatePercent(differenceAmountChange, total.getDifferenceFinancialBeginningBalanceLineAmount()));
286                }
287            }
288        }
289    
290    
291        public List calculateConsTotal(List<BudgetConstructionLevelSummary> bclsList, List<BudgetConstructionLevelSummary> simpleList) {
292    
293            BigDecimal totalConsolidationPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
294            BigDecimal totalConsolidationPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
295            Integer totalConsolidationFinancialBeginningBalanceLineAmount = new Integer(0);
296            BigDecimal totalConsolidationAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
297            BigDecimal totalConsolidationAppointmentRequestedFteQuantity = BigDecimal.ZERO;
298            Integer totalConsolidationAccountLineAnnualBalanceAmount = new Integer(0);
299    
300            List returnList = new ArrayList();
301            for (BudgetConstructionLevelSummary simpleBclsEntry : simpleList) {
302                BudgetConstructionOrgLevelSummaryReportTotal bcLevelTotal = new BudgetConstructionOrgLevelSummaryReportTotal();
303                for (BudgetConstructionLevelSummary bclsListEntry : bclsList) {
304                    if (BudgetConstructionReportHelper.isSameEntry(simpleBclsEntry, bclsListEntry, fieldsForCons())) {
305                        totalConsolidationFinancialBeginningBalanceLineAmount += new Integer(bclsListEntry.getFinancialBeginningBalanceLineAmount().intValue());
306                        totalConsolidationAccountLineAnnualBalanceAmount += new Integer(bclsListEntry.getAccountLineAnnualBalanceAmount().intValue());
307                        totalConsolidationPositionCsfLeaveFteQuantity = totalConsolidationPositionCsfLeaveFteQuantity.add(bclsListEntry.getPositionCsfLeaveFteQuantity());
308                        totalConsolidationPositionCsfFullTimeEmploymentQuantity = totalConsolidationPositionCsfFullTimeEmploymentQuantity.add(bclsListEntry.getCsfFullTimeEmploymentQuantity());
309                        totalConsolidationAppointmentRequestedCsfFteQuantity = totalConsolidationAppointmentRequestedCsfFteQuantity.add(bclsListEntry.getAppointmentRequestedCsfFteQuantity());
310                        totalConsolidationAppointmentRequestedFteQuantity = totalConsolidationAppointmentRequestedFteQuantity.add(bclsListEntry.getAppointmentRequestedFteQuantity());
311                    }
312                }
313                bcLevelTotal.setBcls(simpleBclsEntry);
314                bcLevelTotal.setTotalConsolidationPositionCsfLeaveFteQuantity(totalConsolidationPositionCsfLeaveFteQuantity);
315                bcLevelTotal.setTotalConsolidationPositionCsfFullTimeEmploymentQuantity(totalConsolidationPositionCsfFullTimeEmploymentQuantity);
316                bcLevelTotal.setTotalConsolidationFinancialBeginningBalanceLineAmount(totalConsolidationFinancialBeginningBalanceLineAmount);
317                bcLevelTotal.setTotalConsolidationAppointmentRequestedCsfFteQuantity(totalConsolidationAppointmentRequestedCsfFteQuantity);
318                bcLevelTotal.setTotalConsolidationAppointmentRequestedFteQuantity(totalConsolidationAppointmentRequestedFteQuantity);
319                bcLevelTotal.setTotalConsolidationAccountLineAnnualBalanceAmount(totalConsolidationAccountLineAnnualBalanceAmount);
320                returnList.add(bcLevelTotal);
321    
322                totalConsolidationPositionCsfLeaveFteQuantity = BigDecimal.ZERO;
323                totalConsolidationPositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
324                totalConsolidationFinancialBeginningBalanceLineAmount = new Integer(0);
325                totalConsolidationAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
326                totalConsolidationAppointmentRequestedFteQuantity = BigDecimal.ZERO;
327                totalConsolidationAccountLineAnnualBalanceAmount = new Integer(0);
328            }
329            return returnList;
330        }
331    
332        public List calculateGexpAndTypeTotal(List<BudgetConstructionLevelSummary> bclsList, List<BudgetConstructionLevelSummary> simpleList) {
333    
334            Integer grossFinancialBeginningBalanceLineAmount = new Integer(0);
335            Integer grossAccountLineAnnualBalanceAmount = new Integer(0);
336    
337            BigDecimal typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
338            BigDecimal typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
339            Integer typeFinancialBeginningBalanceLineAmount = new Integer(0);
340            BigDecimal typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
341            BigDecimal typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
342            Integer typeAccountLineAnnualBalanceAmount = new Integer(0);
343            Integer typeAmountChange = new Integer(0);
344            BigDecimal typePercentChange = BigDecimal.ZERO;
345    
346            List returnList = new ArrayList();
347            for (BudgetConstructionLevelSummary simpleBclsEntry : simpleList) {
348                BudgetConstructionOrgLevelSummaryReportTotal bcLevelTotal = new BudgetConstructionOrgLevelSummaryReportTotal();
349                for (BudgetConstructionLevelSummary bclsListEntry : bclsList) {
350                    if (BudgetConstructionReportHelper.isSameEntry(simpleBclsEntry, bclsListEntry, fieldsForGexpAndType())) {
351    
352                        typeFinancialBeginningBalanceLineAmount += new Integer(bclsListEntry.getFinancialBeginningBalanceLineAmount().intValue());
353                        typeAccountLineAnnualBalanceAmount += new Integer(bclsListEntry.getAccountLineAnnualBalanceAmount().intValue());
354                        typePositionCsfLeaveFteQuantity = typePositionCsfLeaveFteQuantity.add(bclsListEntry.getPositionCsfLeaveFteQuantity());
355                        typePositionCsfFullTimeEmploymentQuantity = typePositionCsfFullTimeEmploymentQuantity.add(bclsListEntry.getCsfFullTimeEmploymentQuantity());
356                        typeAppointmentRequestedCsfFteQuantity = typeAppointmentRequestedCsfFteQuantity.add(bclsListEntry.getAppointmentRequestedCsfFteQuantity());
357                        typeAppointmentRequestedFteQuantity = typeAppointmentRequestedFteQuantity.add(bclsListEntry.getAppointmentRequestedFteQuantity());
358    
359                        if (bclsListEntry.getIncomeExpenseCode().equals("B") && !bclsListEntry.getFinancialObjectLevelCode().equals("CORI") && !bclsListEntry.getFinancialObjectLevelCode().equals("TRIN")) {
360                            grossFinancialBeginningBalanceLineAmount += new Integer(bclsListEntry.getFinancialBeginningBalanceLineAmount().intValue());
361                            grossAccountLineAnnualBalanceAmount += new Integer(bclsListEntry.getAccountLineAnnualBalanceAmount().intValue());
362                        }
363                    }
364                }
365                bcLevelTotal.setBcls(simpleBclsEntry);
366    
367                bcLevelTotal.setGrossFinancialBeginningBalanceLineAmount(grossFinancialBeginningBalanceLineAmount);
368                bcLevelTotal.setGrossAccountLineAnnualBalanceAmount(grossAccountLineAnnualBalanceAmount);
369    
370                bcLevelTotal.setTypePositionCsfLeaveFteQuantity(typePositionCsfLeaveFteQuantity);
371                bcLevelTotal.setTypePositionCsfFullTimeEmploymentQuantity(typePositionCsfFullTimeEmploymentQuantity);
372                bcLevelTotal.setTypeFinancialBeginningBalanceLineAmount(typeFinancialBeginningBalanceLineAmount);
373                bcLevelTotal.setTypeAppointmentRequestedCsfFteQuantity(typeAppointmentRequestedCsfFteQuantity);
374                bcLevelTotal.setTypeAppointmentRequestedFteQuantity(typeAppointmentRequestedFteQuantity);
375                bcLevelTotal.setTypeAccountLineAnnualBalanceAmount(typeAccountLineAnnualBalanceAmount);
376    
377    
378                returnList.add(bcLevelTotal);
379                grossFinancialBeginningBalanceLineAmount = new Integer(0);
380                grossAccountLineAnnualBalanceAmount = new Integer(0);
381    
382                typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
383                typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
384                typeFinancialBeginningBalanceLineAmount = new Integer(0);
385                typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
386                typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
387                typeAccountLineAnnualBalanceAmount = new Integer(0);
388                typeAmountChange = new Integer(0);
389                typePercentChange = BigDecimal.ZERO;
390            }
391            return returnList;
392        }
393    
394    
395        public List calculateTotal(List<BudgetConstructionLevelSummary> bclsList, List<BudgetConstructionLevelSummary> simpleList) {
396    
397            Integer revenueFinancialBeginningBalanceLineAmount = new Integer(0);
398            Integer revenueAccountLineAnnualBalanceAmount = new Integer(0);
399    
400            Integer expenditureFinancialBeginningBalanceLineAmount = new Integer(0);
401            Integer expenditureAccountLineAnnualBalanceAmount = new Integer(0);
402    
403            Integer differenceFinancialBeginningBalanceLineAmount = new Integer(0);
404            Integer differenceAccountLineAnnualBalanceAmount = new Integer(0);
405    
406            List returnList = new ArrayList();
407            for (BudgetConstructionLevelSummary simpleBclsEntry : simpleList) {
408                BudgetConstructionOrgLevelSummaryReportTotal bcLevelTotal = new BudgetConstructionOrgLevelSummaryReportTotal();
409                for (BudgetConstructionLevelSummary bclsListEntry : bclsList) {
410                    if (BudgetConstructionReportHelper.isSameEntry(simpleBclsEntry, bclsListEntry, fieldsForTotal())) {
411    
412                        if (bclsListEntry.getIncomeExpenseCode().equals("A")) {
413                            revenueFinancialBeginningBalanceLineAmount += new Integer(bclsListEntry.getFinancialBeginningBalanceLineAmount().intValue());
414                            revenueAccountLineAnnualBalanceAmount += new Integer(bclsListEntry.getAccountLineAnnualBalanceAmount().intValue());
415                        }
416                        else {
417                            expenditureFinancialBeginningBalanceLineAmount += new Integer(bclsListEntry.getFinancialBeginningBalanceLineAmount().intValue());
418                            expenditureAccountLineAnnualBalanceAmount += new Integer(bclsListEntry.getAccountLineAnnualBalanceAmount().intValue());
419                        }
420                    }
421                }
422    
423                bcLevelTotal.setBcls(simpleBclsEntry);
424    
425                bcLevelTotal.setRevenueFinancialBeginningBalanceLineAmount(revenueFinancialBeginningBalanceLineAmount);
426                bcLevelTotal.setRevenueAccountLineAnnualBalanceAmount(revenueAccountLineAnnualBalanceAmount);
427    
428                bcLevelTotal.setExpenditureFinancialBeginningBalanceLineAmount(expenditureFinancialBeginningBalanceLineAmount);
429                bcLevelTotal.setExpenditureAccountLineAnnualBalanceAmount(expenditureAccountLineAnnualBalanceAmount);
430    
431                differenceFinancialBeginningBalanceLineAmount = revenueFinancialBeginningBalanceLineAmount - expenditureFinancialBeginningBalanceLineAmount;
432                differenceAccountLineAnnualBalanceAmount = revenueAccountLineAnnualBalanceAmount - expenditureAccountLineAnnualBalanceAmount;
433                bcLevelTotal.setDifferenceFinancialBeginningBalanceLineAmount(differenceFinancialBeginningBalanceLineAmount);
434                bcLevelTotal.setDifferenceAccountLineAnnualBalanceAmount(differenceAccountLineAnnualBalanceAmount);
435    
436                returnList.add(bcLevelTotal);
437    
438                revenueFinancialBeginningBalanceLineAmount = new Integer(0);
439                revenueAccountLineAnnualBalanceAmount = new Integer(0);
440    
441                expenditureFinancialBeginningBalanceLineAmount = new Integer(0);
442                expenditureAccountLineAnnualBalanceAmount = new Integer(0);
443    
444                differenceFinancialBeginningBalanceLineAmount = new Integer(0);
445                differenceAccountLineAnnualBalanceAmount = new Integer(0);
446            }
447            return returnList;
448        }
449    
450    
451        /**
452         * builds orderByList for sort order.
453         * 
454         * @return returnList
455         */
456        public List<String> buildOrderByList() {
457            List<String> returnList = new ArrayList();
458            returnList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
459            returnList.add(KFSPropertyConstants.ORGANIZATION_CODE);
460            returnList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
461            returnList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
462            returnList.add(KFSPropertyConstants.INCOME_EXPENSE_CODE);
463            returnList.add(KFSPropertyConstants.FINANCIAL_CONSOLIDATION_SORT_CODE);
464            returnList.add(KFSPropertyConstants.FINANCIAL_LEVEL_SORT_CODE);
465            return returnList;
466        }
467    
468        protected List<String> fieldsForCons() {
469            List<String> fieldList = new ArrayList();
470            fieldList.addAll(fieldsForGexpAndType());
471            fieldList.add(KFSPropertyConstants.FINANCIAL_CONSOLIDATION_SORT_CODE);
472            return fieldList;
473        }
474    
475        protected List<String> fieldsForGexpAndType() {
476            List<String> fieldList = new ArrayList();
477            fieldList.addAll(fieldsForTotal());
478            fieldList.add(KFSPropertyConstants.INCOME_EXPENSE_CODE);
479            return fieldList;
480        }
481    
482        protected List<String> fieldsForTotal() {
483            List<String> fieldList = new ArrayList();
484            fieldList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
485            fieldList.add(KFSPropertyConstants.ORGANIZATION_CODE);
486            fieldList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
487            fieldList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
488            return fieldList;
489        }
490    
491        public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) {
492            this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper;
493        }
494    
495        public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
496            this.kualiConfigurationService = kualiConfigurationService;
497        }
498    }