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.apache.ojb.broker.PersistenceBrokerException;
026    import org.kuali.kfs.module.bc.BCConstants;
027    import org.kuali.kfs.module.bc.BCKeyConstants;
028    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAdministrativePost;
029    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionCalculatedSalaryFoundationTracker;
030    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent;
031    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionObjectDump;
032    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgAccountFundingDetailReport;
033    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgAccountFundingDetailReportTotal;
034    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition;
035    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
036    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionAccountFundingDetailReportDao;
037    import org.kuali.kfs.module.bc.document.service.BudgetConstructionAccountFundingDetailReportService;
038    import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper;
039    import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper;
040    import org.kuali.kfs.sys.KFSPropertyConstants;
041    import org.kuali.rice.kns.service.KualiConfigurationService;
042    import org.springframework.transaction.annotation.Transactional;
043    
044    /**
045     * Service implementation of BudgetConstructionAccountFundingDetailReportService.
046     */
047    @Transactional
048    public class BudgetConstructionAccountFundingDetailReportServiceImpl implements BudgetConstructionAccountFundingDetailReportService {
049    
050        BudgetConstructionAccountFundingDetailReportDao budgetConstructionAccountFundingDetailReportDao;
051        BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper;
052        KualiConfigurationService kualiConfigurationService;
053    
054        /**
055         * @see org.kuali.kfs.module.bc.document.service.BudgetReportsControlListService#updateRepotsAccountFundingDetailTable(java.lang.String)
056         */
057        public void updateAccountFundingDetailTable(String principalName) {
058            budgetConstructionAccountFundingDetailReportDao.updateReportsAccountFundingDetailTable(principalName);
059        }
060    
061        /**
062         * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionAccountFundingDetailReportService#buildReports(java.lang.Integer,
063         *      java.util.Collection)
064         */
065        public Collection<BudgetConstructionOrgAccountFundingDetailReport> buildReports(Integer universityFiscalYear, String principalName) {
066            Collection<BudgetConstructionOrgAccountFundingDetailReport> reportSet = new ArrayList();
067            List<BudgetConstructionOrgAccountFundingDetailReportTotal> orgAccountFundingDetailReportTotalList;
068            BudgetConstructionOrgAccountFundingDetailReport orgAccountFundingDetailReportEntry;
069            Collection<BudgetConstructionObjectDump> accountFundingDetailList = budgetConstructionReportsServiceHelper.getDataForBuildingReports(BudgetConstructionObjectDump.class, principalName, buildOrderByList());
070    
071            Map<BudgetConstructionObjectDump, Collection<PendingBudgetConstructionAppointmentFunding>> appointmentFundingEntireMap = new HashMap();
072            for (BudgetConstructionObjectDump accountFundingDetailEntry : accountFundingDetailList) {
073                appointmentFundingEntireMap.put(accountFundingDetailEntry, budgetConstructionReportsServiceHelper.getPendingBudgetConstructionAppointmentFundingList(universityFiscalYear, accountFundingDetailEntry));
074            }
075    
076            String objectCodes = budgetConstructionReportsServiceHelper.getSelectedObjectCodes(principalName);
077    
078            List<BudgetConstructionObjectDump> listForCalculateTotalObject = BudgetConstructionReportHelper.deleteDuplicated((List) accountFundingDetailList, fieldsForObject());
079            List<BudgetConstructionObjectDump> listForCalculateTotalAccount = BudgetConstructionReportHelper.deleteDuplicated((List) accountFundingDetailList, fieldsForAccount());
080    
081            // Calculate Total Section
082            Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> fundingDetailTotalObject = calculateObjectTotal(appointmentFundingEntireMap, listForCalculateTotalObject);
083            Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> fundingDetailTotalAccount = calculateAccountTotal(fundingDetailTotalObject, listForCalculateTotalAccount);
084    
085            for (BudgetConstructionObjectDump accountFundingDetailEntry : accountFundingDetailList) {
086                Collection<PendingBudgetConstructionAppointmentFunding> appointmentFundingCollection = appointmentFundingEntireMap.get(accountFundingDetailEntry);
087                for (PendingBudgetConstructionAppointmentFunding appointmentFundingEntry : appointmentFundingCollection) {
088    
089                    orgAccountFundingDetailReportEntry = new BudgetConstructionOrgAccountFundingDetailReport();
090                    buildReportsHeader(universityFiscalYear, objectCodes, orgAccountFundingDetailReportEntry, accountFundingDetailEntry);
091                    buildReportsBody(universityFiscalYear, orgAccountFundingDetailReportEntry, appointmentFundingEntry);
092                    buildReportsTotal(orgAccountFundingDetailReportEntry, accountFundingDetailEntry, fundingDetailTotalObject, fundingDetailTotalAccount);
093    
094                    reportSet.add(orgAccountFundingDetailReportEntry);
095                }
096            }
097    
098            return reportSet;
099        }
100    
101        /**
102         * builds report Header
103         * 
104         * @param BudgetConstructionObjectDump bcod
105         */
106        public void buildReportsHeader(Integer universityFiscalYear, String objectCodes, BudgetConstructionOrgAccountFundingDetailReport orgAccountFundingDetailReportEntry, BudgetConstructionObjectDump accountFundingDetail) {
107            String orgChartDesc = accountFundingDetail.getOrganizationChartOfAccounts().getFinChartOfAccountDescription();
108            String chartDesc = accountFundingDetail.getChartOfAccounts().getFinChartOfAccountDescription();
109            String orgName = accountFundingDetail.getOrganization().getOrganizationName();
110            String reportChartDesc = accountFundingDetail.getChartOfAccounts().getReportsToChartOfAccounts().getFinChartOfAccountDescription();
111            String subFundGroupName = accountFundingDetail.getSubFundGroup().getSubFundGroupCode();
112            String subFundGroupDes = accountFundingDetail.getSubFundGroup().getSubFundGroupDescription();
113            String fundGroupName = accountFundingDetail.getSubFundGroup().getFundGroupCode();
114            String fundGroupDes = accountFundingDetail.getSubFundGroup().getFundGroup().getName();
115    
116            Integer prevFiscalyear = universityFiscalYear - 1;
117            orgAccountFundingDetailReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
118            orgAccountFundingDetailReportEntry.setOrgChartOfAccountsCode(accountFundingDetail.getOrganizationChartOfAccountsCode());
119    
120            if (orgChartDesc == null) {
121                orgAccountFundingDetailReportEntry.setOrgChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
122            }
123            else {
124                orgAccountFundingDetailReportEntry.setOrgChartOfAccountDescription(orgChartDesc);
125            }
126    
127            orgAccountFundingDetailReportEntry.setOrganizationCode(accountFundingDetail.getOrganizationCode());
128            if (orgName == null) {
129                orgAccountFundingDetailReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
130            }
131            else {
132                orgAccountFundingDetailReportEntry.setOrganizationName(orgName);
133            }
134    
135            orgAccountFundingDetailReportEntry.setChartOfAccountsCode(accountFundingDetail.getChartOfAccountsCode());
136            if (chartDesc == null) {
137                orgAccountFundingDetailReportEntry.setChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
138            }
139            else {
140                orgAccountFundingDetailReportEntry.setChartOfAccountDescription(chartDesc);
141            }
142    
143            orgAccountFundingDetailReportEntry.setFundGroupCode(accountFundingDetail.getSubFundGroup().getFundGroupCode());
144            if (fundGroupDes == null) {
145                orgAccountFundingDetailReportEntry.setFundGroupName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_FUNDGROUP_NAME));
146            }
147            else {
148                orgAccountFundingDetailReportEntry.setFundGroupName(fundGroupDes);
149            }
150    
151            orgAccountFundingDetailReportEntry.setSubFundGroupCode(accountFundingDetail.getSubFundGroupCode());
152            if (subFundGroupDes == null) {
153                orgAccountFundingDetailReportEntry.setSubFundGroupDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_SUBFUNDGROUP_DESCRIPTION));
154            }
155            else {
156                orgAccountFundingDetailReportEntry.setSubFundGroupDescription(subFundGroupDes);
157            }
158    
159    
160            Integer prevPrevFiscalyear = prevFiscalyear - 1;
161            orgAccountFundingDetailReportEntry.setReqFy(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
162            orgAccountFundingDetailReportEntry.setConsHdr("");
163    
164            orgAccountFundingDetailReportEntry.setFinancialObjectCode(accountFundingDetail.getFinancialObjectCode());
165            orgAccountFundingDetailReportEntry.setFinancialObjectCodeName(accountFundingDetail.getFinancialObject().getFinancialObjectCodeName());
166            // group
167            orgAccountFundingDetailReportEntry.setSubAccountNumber(accountFundingDetail.getSubAccountNumber() + accountFundingDetail.getAccountNumber());
168            orgAccountFundingDetailReportEntry.setObjectCodes(objectCodes);
169    
170            String subAccountName = "";
171            String subAccountNumberAndName = "";
172            String divider = "";
173            // set accountNumber and name, subAccountNumber and name
174            if (accountFundingDetail.getAccount() != null) {
175                orgAccountFundingDetailReportEntry.setAccountNumberAndName(accountFundingDetail.getAccountNumber() + " " + accountFundingDetail.getAccount().getAccountName());
176                orgAccountFundingDetailReportEntry.setAccountName(accountFundingDetail.getAccount().getAccountName());
177            }
178    
179            if (!accountFundingDetail.getSubAccountNumber().equals(BCConstants.Report.DASHES_SUB_ACCOUNT_CODE)) {
180                divider = BCConstants.Report.DIVIDER;
181                try {
182                    subAccountName = accountFundingDetail.getSubAccount().getSubAccountName();
183                    subAccountNumberAndName = accountFundingDetail.getSubAccount().getSubAccountNumber() + " " + accountFundingDetail.getSubAccount().getSubAccountName();
184                }
185                catch (PersistenceBrokerException e) {
186                    subAccountName = kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_SUB_ACCOUNT_DESCRIPTION);
187                    subAccountNumberAndName = subAccountName;
188                }
189            }
190            orgAccountFundingDetailReportEntry.setSubAccountName(subAccountName);
191            orgAccountFundingDetailReportEntry.setSubAccountNumberAndName(subAccountNumberAndName);
192            orgAccountFundingDetailReportEntry.setDivider(divider);
193        }
194    
195    
196        /**
197         * builds report body
198         * 
199         * @param BudgetConstructionObjectDump bcod
200         */
201        public void buildReportsBody(Integer universityFiscalYear, BudgetConstructionOrgAccountFundingDetailReport orgAccountFundingDetailReportEntry, PendingBudgetConstructionAppointmentFunding appointmentFundingEntry) {
202    
203            // get budgetConstructionIntendedIncumbent, budgetConstructionAdministrativePost, budgetConstructionPosition objects
204            BudgetConstructionIntendedIncumbent budgetConstructionIntendedIncumbent = budgetConstructionReportsServiceHelper.getBudgetConstructionIntendedIncumbent(appointmentFundingEntry);
205            BudgetConstructionAdministrativePost budgetConstructionAdministrativePost = budgetConstructionReportsServiceHelper.getBudgetConstructionAdministrativePost(appointmentFundingEntry);
206            BudgetConstructionPosition budgetConstructionPosition = budgetConstructionReportsServiceHelper.getBudgetConstructionPosition(universityFiscalYear, appointmentFundingEntry);
207    
208            // set report body
209            if (budgetConstructionIntendedIncumbent != null) {
210                if (budgetConstructionIntendedIncumbent.getName() == null) {
211                    orgAccountFundingDetailReportEntry.setName(BCConstants.Report.VACANT);
212                }
213                else {
214                    int nameLength = budgetConstructionIntendedIncumbent.getName().length();
215                    orgAccountFundingDetailReportEntry.setName(budgetConstructionIntendedIncumbent.getName().substring(0, (nameLength > 33) ? 33 : nameLength));
216                }
217    
218                orgAccountFundingDetailReportEntry.setIuClassificationLevel(budgetConstructionIntendedIncumbent.getIuClassificationLevel());
219            }
220            else {
221                orgAccountFundingDetailReportEntry.setName(BCConstants.Report.VACANT);
222                orgAccountFundingDetailReportEntry.setIuClassificationLevel(BCConstants.Report.BLANK);
223            }
224    
225    
226            if (budgetConstructionAdministrativePost != null) {
227                orgAccountFundingDetailReportEntry.setAdministrativePost(budgetConstructionAdministrativePost.getAdministrativePost());
228            }
229    
230            if (budgetConstructionPosition != null) {
231                orgAccountFundingDetailReportEntry.setPositionNumber(budgetConstructionPosition.getPositionNumber());
232                orgAccountFundingDetailReportEntry.setNormalWorkMonthsAndiuPayMonths(budgetConstructionPosition.getIuNormalWorkMonths() + "/" + budgetConstructionPosition.getIuPayMonths());
233                orgAccountFundingDetailReportEntry.setPositionFte(BudgetConstructionReportHelper.setDecimalDigit(budgetConstructionPosition.getPositionFullTimeEquivalency(), 5, true));
234                orgAccountFundingDetailReportEntry.setPositionSalaryPlanDefault(budgetConstructionPosition.getPositionSalaryPlanDefault());
235                orgAccountFundingDetailReportEntry.setPositionGradeDefault(budgetConstructionPosition.getPositionGradeDefault());
236                orgAccountFundingDetailReportEntry.setPositionStandardHoursDefault(budgetConstructionPosition.getPositionStandardHoursDefault());
237            }
238    
239            BudgetConstructionCalculatedSalaryFoundationTracker csfTracker = appointmentFundingEntry.getEffectiveCSFTracker();
240            orgAccountFundingDetailReportEntry.setAmountChange(new Integer(0));
241            orgAccountFundingDetailReportEntry.setPercentChange(BigDecimal.ZERO);
242            if (csfTracker != null) {
243                orgAccountFundingDetailReportEntry.setCsfTimePercent(BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfTimePercent(), 2, false));
244                orgAccountFundingDetailReportEntry.setCsfAmount(new Integer(csfTracker.getCsfAmount().intValue()));
245                orgAccountFundingDetailReportEntry.setCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfFullTimeEmploymentQuantity(), 5, true));
246    
247                // calculate amountChange and percentChange
248                Integer amountChange = new Integer(0);
249                BigDecimal percentChange = BigDecimal.ZERO;
250                BigDecimal csfFte = BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfFullTimeEmploymentQuantity(), 5, false);
251                BigDecimal reqFte = BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedFteQuantity(), 5, false);
252                if (reqFte.compareTo(csfFte) == 0) {
253                    amountChange = appointmentFundingEntry.getAppointmentRequestedAmount().subtract(csfTracker.getCsfAmount()).intValue();
254                    percentChange = BudgetConstructionReportHelper.calculatePercent(new BigDecimal(amountChange.intValue()), csfTracker.getCsfAmount().bigDecimalValue());
255                }
256                orgAccountFundingDetailReportEntry.setAmountChange(amountChange);
257                orgAccountFundingDetailReportEntry.setPercentChange(percentChange);
258            }
259    
260            if (appointmentFundingEntry != null) {
261                if (appointmentFundingEntry.getFinancialSubObjectCode().equals(BCConstants.Report.BLANK_SUB_OBJECT_CODE)) {
262                    orgAccountFundingDetailReportEntry.setFinancialSubObjectCode(BCConstants.Report.BLANK);
263                }
264                else {
265                    orgAccountFundingDetailReportEntry.setFinancialSubObjectCode(appointmentFundingEntry.getFinancialSubObjectCode());
266                }
267    
268                orgAccountFundingDetailReportEntry.setAppointmentFundingMonth(appointmentFundingEntry.getAppointmentFundingMonth());
269                orgAccountFundingDetailReportEntry.setAppointmentRequestedAmount(new Integer(appointmentFundingEntry.getAppointmentRequestedAmount().intValue()));
270                orgAccountFundingDetailReportEntry.setAppointmentRequestedTimePercent(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedTimePercent(), 2, false));
271                orgAccountFundingDetailReportEntry.setAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedFteQuantity(), 5, false));
272                orgAccountFundingDetailReportEntry.setAppointmentFundingDurationCode(appointmentFundingEntry.getAppointmentFundingDurationCode());
273    
274                orgAccountFundingDetailReportEntry.setAppointmentRequestedCsfAmount(BudgetConstructionReportHelper.convertKualiInteger(appointmentFundingEntry.getAppointmentRequestedCsfAmount()));
275                orgAccountFundingDetailReportEntry.setAppointmentRequestedCsfTimePercent(appointmentFundingEntry.getAppointmentRequestedCsfTimePercent());
276                orgAccountFundingDetailReportEntry.setAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedCsfFteQuantity(), 5, false));
277    
278                orgAccountFundingDetailReportEntry.setAppointmentTotalIntendedAmount(BudgetConstructionReportHelper.convertKualiInteger(appointmentFundingEntry.getAppointmentTotalIntendedAmount()));
279                orgAccountFundingDetailReportEntry.setAppointmentTotalIntendedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentTotalIntendedFteQuantity(), 5, false));
280    
281                orgAccountFundingDetailReportEntry.setEmplid(appointmentFundingEntry.getEmplid());
282            }
283    
284    
285            if (appointmentFundingEntry.isAppointmentFundingDeleteIndicator()) {
286                orgAccountFundingDetailReportEntry.setDeleteBox(BCConstants.Report.DELETE_MARK);
287            }
288            else {
289                orgAccountFundingDetailReportEntry.setDeleteBox(BCConstants.Report.BLANK);
290            }
291        }
292    
293        public void buildReportsTotal(BudgetConstructionOrgAccountFundingDetailReport orgAccountFundingDetailReportEntry, BudgetConstructionObjectDump accountFundingDetail, Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> fundingDetailTotalObject, Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> fundingDetailTotalAccount) {
294            for (BudgetConstructionOrgAccountFundingDetailReportTotal fundingDetailTotalObjectEntry : fundingDetailTotalObject) {
295                if (BudgetConstructionReportHelper.isSameEntry(fundingDetailTotalObjectEntry.getBudgetConstructionObjectDump(), accountFundingDetail, fieldsForObject())) {
296                    if (accountFundingDetail.getFinancialObject() != null) {
297                        orgAccountFundingDetailReportEntry.setTotalObjectname(accountFundingDetail.getFinancialObject().getName());
298                    }
299                    orgAccountFundingDetailReportEntry.setTotalObjectPositionCsfAmount(fundingDetailTotalObjectEntry.getTotalObjectPositionCsfAmount());
300                    orgAccountFundingDetailReportEntry.setTotalObjectAppointmentRequestedAmount(fundingDetailTotalObjectEntry.getTotalObjectAppointmentRequestedAmount());
301                    orgAccountFundingDetailReportEntry.setTotalObjectPositionCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalObjectEntry.getTotalObjectPositionCsfFteQuantity(), 5, true));
302                    orgAccountFundingDetailReportEntry.setTotalObjectAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalObjectEntry.getTotalObjectAppointmentRequestedFteQuantity(), 5, true));
303                    // calculate amountChange and percentChange
304                    Integer amountChange = fundingDetailTotalObjectEntry.getTotalObjectAppointmentRequestedAmount() - fundingDetailTotalObjectEntry.getTotalObjectPositionCsfAmount();
305                    orgAccountFundingDetailReportEntry.setTotalObjectAmountChange(amountChange);
306                    orgAccountFundingDetailReportEntry.setTotalObjectPercentChange(BudgetConstructionReportHelper.calculatePercent(amountChange, fundingDetailTotalObjectEntry.getTotalObjectPositionCsfAmount()));
307                }
308            }
309    
310            for (BudgetConstructionOrgAccountFundingDetailReportTotal fundingDetailTotalAccountEntry : fundingDetailTotalAccount) {
311                if (BudgetConstructionReportHelper.isSameEntry(fundingDetailTotalAccountEntry.getBudgetConstructionObjectDump(), accountFundingDetail, fieldsForAccount())) {
312    
313                    orgAccountFundingDetailReportEntry.setTotalAccountPositionCsfAmount(fundingDetailTotalAccountEntry.getTotalAccountPositionCsfAmount());
314                    orgAccountFundingDetailReportEntry.setTotalAccountAppointmentRequestedAmount(fundingDetailTotalAccountEntry.getTotalAccountAppointmentRequestedAmount());
315                    orgAccountFundingDetailReportEntry.setTotalAccountPositionCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalAccountEntry.getTotalAccountPositionCsfFteQuantity(), 5, true));
316                    orgAccountFundingDetailReportEntry.setTotalAccountAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalAccountEntry.getTotalAccountAppointmentRequestedFteQuantity(), 5, true));
317                    Integer amountChange = fundingDetailTotalAccountEntry.getTotalAccountAppointmentRequestedAmount() - fundingDetailTotalAccountEntry.getTotalAccountPositionCsfAmount();
318                    orgAccountFundingDetailReportEntry.setTotalAccountAmountChange(amountChange);
319                    orgAccountFundingDetailReportEntry.setTotalAccountPercentChange(BudgetConstructionReportHelper.calculatePercent(amountChange, fundingDetailTotalAccountEntry.getTotalAccountPositionCsfAmount()));
320                }
321            }
322        }
323    
324    
325        /**
326         * builds report total
327         * 
328         * @param BudgetConstructionObjectDump bcod
329         * @param List reportTotalList
330         */
331        protected Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> calculateObjectTotal(Map appointmentFundingEntireMap, List<BudgetConstructionObjectDump> listForCalculateTotalObject) {
332            Integer totalObjectPositionCsfAmount = new Integer(0);
333            Integer totalObjectAppointmentRequestedAmount = new Integer(0);
334            BigDecimal totalObjectPositionCsfFteQuantity = BigDecimal.ZERO;
335            BigDecimal totalObjectAppointmentRequestedFteQuantity = BigDecimal.ZERO;
336    
337            Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> returnCollection = new ArrayList();
338    
339            for (BudgetConstructionObjectDump budgetConstructionObjectDump : listForCalculateTotalObject) {
340                Collection<PendingBudgetConstructionAppointmentFunding> accountFundingCollection = new ArrayList();
341                accountFundingCollection = (Collection<PendingBudgetConstructionAppointmentFunding>) appointmentFundingEntireMap.get(budgetConstructionObjectDump);
342                for (PendingBudgetConstructionAppointmentFunding accountFundingEntry : accountFundingCollection) {
343                    if (accountFundingEntry.getBcnCalculatedSalaryFoundationTracker().size() > 0) {
344                        BudgetConstructionCalculatedSalaryFoundationTracker calculatedSalaryFoundationTracker = accountFundingEntry.getBcnCalculatedSalaryFoundationTracker().get(0);
345                        totalObjectPositionCsfAmount = totalObjectPositionCsfAmount + new Integer(calculatedSalaryFoundationTracker.getCsfAmount().intValue());
346                        totalObjectPositionCsfFteQuantity = totalObjectPositionCsfFteQuantity.add(calculatedSalaryFoundationTracker.getCsfFullTimeEmploymentQuantity());
347                    }
348                    totalObjectAppointmentRequestedAmount = totalObjectAppointmentRequestedAmount + new Integer(accountFundingEntry.getAppointmentRequestedAmount().intValue());
349                    totalObjectAppointmentRequestedFteQuantity = totalObjectAppointmentRequestedFteQuantity.add(accountFundingEntry.getAppointmentRequestedFteQuantity());
350                }
351    
352                BudgetConstructionOrgAccountFundingDetailReportTotal budgetConstructionOrgAccountFundingDetailReportTotal = new BudgetConstructionOrgAccountFundingDetailReportTotal();
353    
354                budgetConstructionOrgAccountFundingDetailReportTotal.setBudgetConstructionObjectDump(budgetConstructionObjectDump);
355                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalObjectPositionCsfAmount(totalObjectPositionCsfAmount);
356                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalObjectPositionCsfFteQuantity(totalObjectPositionCsfFteQuantity);
357                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalObjectAppointmentRequestedAmount(totalObjectAppointmentRequestedAmount);
358                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalObjectAppointmentRequestedFteQuantity(totalObjectAppointmentRequestedFteQuantity);
359    
360                returnCollection.add(budgetConstructionOrgAccountFundingDetailReportTotal);
361    
362                totalObjectPositionCsfAmount = new Integer(0);
363                totalObjectAppointmentRequestedAmount = new Integer(0);
364                totalObjectPositionCsfFteQuantity = BigDecimal.ZERO;
365                totalObjectAppointmentRequestedFteQuantity = BigDecimal.ZERO;
366            }
367    
368    
369            return returnCollection;
370        }
371    
372        protected Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> calculateAccountTotal(Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> fundingDetailTotalObject, List<BudgetConstructionObjectDump> listForCalculateTotalAccount) {
373    
374            // private Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> calculateAccountTotal(Map
375            // appointmentFundingEntireMap, Collection<BudgetConstructionObjectDump> accountFundingDetailList,
376            // List<BudgetConstructionObjectDump> listForCalculateTotalAccount) {
377    
378            Integer totalAccountPositionCsfAmount = new Integer(0);
379            Integer totalAccountAppointmentRequestedAmount = new Integer(0);
380            BigDecimal totalAccountPositionCsfFteQuantity = BigDecimal.ZERO;
381            BigDecimal totalAccountAppointmentRequestedFteQuantity = BigDecimal.ZERO;
382    
383            Collection<BudgetConstructionOrgAccountFundingDetailReportTotal> returnCollection = new ArrayList();
384            for (BudgetConstructionObjectDump budgetConstructionObjectDump : listForCalculateTotalAccount) {
385                for (BudgetConstructionOrgAccountFundingDetailReportTotal fundingDetailTotalObjectEntry : fundingDetailTotalObject) {
386                    if (BudgetConstructionReportHelper.isSameEntry(budgetConstructionObjectDump, fundingDetailTotalObjectEntry.getBudgetConstructionObjectDump(), fieldsForAccount())) {
387                        totalAccountPositionCsfAmount = totalAccountPositionCsfAmount + fundingDetailTotalObjectEntry.getTotalObjectPositionCsfAmount();
388                        totalAccountPositionCsfFteQuantity = totalAccountPositionCsfFteQuantity.add(fundingDetailTotalObjectEntry.getTotalObjectPositionCsfFteQuantity());
389                        totalAccountAppointmentRequestedAmount = totalAccountAppointmentRequestedAmount + fundingDetailTotalObjectEntry.getTotalObjectAppointmentRequestedAmount();
390                        totalAccountAppointmentRequestedFteQuantity = totalAccountAppointmentRequestedFteQuantity.add(fundingDetailTotalObjectEntry.getTotalObjectAppointmentRequestedFteQuantity());
391                    }
392                }
393                BudgetConstructionOrgAccountFundingDetailReportTotal budgetConstructionOrgAccountFundingDetailReportTotal = new BudgetConstructionOrgAccountFundingDetailReportTotal();
394                budgetConstructionOrgAccountFundingDetailReportTotal.setBudgetConstructionObjectDump(budgetConstructionObjectDump);
395                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalAccountPositionCsfAmount(totalAccountPositionCsfAmount);
396                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalAccountPositionCsfFteQuantity(totalAccountPositionCsfFteQuantity);
397                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalAccountAppointmentRequestedAmount(totalAccountAppointmentRequestedAmount);
398                budgetConstructionOrgAccountFundingDetailReportTotal.setTotalAccountAppointmentRequestedFteQuantity(totalAccountAppointmentRequestedFteQuantity);
399    
400                returnCollection.add(budgetConstructionOrgAccountFundingDetailReportTotal);
401    
402                totalAccountPositionCsfAmount = new Integer(0);
403                totalAccountAppointmentRequestedAmount = new Integer(0);
404                totalAccountPositionCsfFteQuantity = BigDecimal.ZERO;
405                totalAccountAppointmentRequestedFteQuantity = BigDecimal.ZERO;
406            }
407            return returnCollection;
408        }
409    
410        protected List<String> fieldsForObject() {
411            List<String> fieldList = new ArrayList();
412            fieldList.addAll(fieldsForAccount());
413            fieldList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
414            return fieldList;
415        }
416    
417        protected List<String> fieldsForAccount() {
418            List<String> fieldList = new ArrayList();
419            fieldList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
420            fieldList.add(KFSPropertyConstants.ORGANIZATION_CODE);
421            fieldList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
422            fieldList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
423            fieldList.add(KFSPropertyConstants.ACCOUNT_NUMBER);
424            fieldList.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
425            return fieldList;
426        }
427    
428        /**
429         * builds orderByList for sort order.
430         * 
431         * @return returnList
432         */
433        public List<String> buildOrderByList() {
434            List<String> returnList = new ArrayList();
435            returnList.add(KFSPropertyConstants.ORGANIZATION_CHART_OF_ACCOUNTS_CODE);
436            returnList.add(KFSPropertyConstants.ORGANIZATION_CODE);
437            returnList.add(KFSPropertyConstants.SUB_FUND_GROUP_CODE);
438            returnList.add(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
439            returnList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
440            returnList.add(KFSPropertyConstants.ACCOUNT_NUMBER);
441            returnList.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
442            returnList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
443            return returnList;
444        }
445    
446        public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
447            this.kualiConfigurationService = kualiConfigurationService;
448        }
449    
450        public void setBudgetConstructionAccountFundingDetailReportDao(BudgetConstructionAccountFundingDetailReportDao budgetConstructionAccountFundingDetailReportDao) {
451            this.budgetConstructionAccountFundingDetailReportDao = budgetConstructionAccountFundingDetailReportDao;
452        }
453    
454        public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) {
455            this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper;
456        }
457    
458    }