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.BudgetConstructionAdministrativePost; 026 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionCalculatedSalaryFoundationTracker; 027 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent; 028 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgPositionFundingDetailReport; 029 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrgPositionFundingDetailReportTotal; 030 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; 031 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPositionFunding; 032 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionReportThresholdSettings; 033 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; 034 import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionPositionFundingDetailReportDao; 035 import org.kuali.kfs.module.bc.document.service.BudgetConstructionPositionFundingDetailReportService; 036 import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper; 037 import org.kuali.kfs.module.bc.document.service.SalarySettingService; 038 import org.kuali.kfs.module.bc.report.BudgetConstructionReportHelper; 039 import org.kuali.kfs.sys.KFSPropertyConstants; 040 import org.kuali.rice.kns.service.KualiConfigurationService; 041 import org.kuali.rice.kns.util.KualiDecimal; 042 import org.springframework.transaction.annotation.Transactional; 043 044 /** 045 * Service implementation of BudgetConstructionPositionFundingDetailReportService. 046 */ 047 @Transactional 048 public class BudgetConstructionPositionFundingDetailReportServiceImpl implements BudgetConstructionPositionFundingDetailReportService { 049 050 private BudgetConstructionPositionFundingDetailReportDao budgetConstructionPositionFundingDetailReportDao; 051 private KualiConfigurationService kualiConfigurationService; 052 private BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper; 053 private SalarySettingService salarySettingService; 054 055 /** 056 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionPositionFundingDetailReportService#updatePositionFundingDetailReport(java.lang.String, 057 * org.kuali.kfs.module.bc.businessobject.BudgetConstructionReportThresholdSettings) 058 */ 059 public void updatePositionFundingDetailReport(String principalName, BudgetConstructionReportThresholdSettings budgetConstructionReportThresholdSettings) { 060 boolean applyAThreshold = budgetConstructionReportThresholdSettings.isUseThreshold(); 061 boolean selectOnlyGreaterThanOrEqualToThreshold = budgetConstructionReportThresholdSettings.isUseGreaterThanOperator(); 062 KualiDecimal thresholdPercent = budgetConstructionReportThresholdSettings.getThresholdPercent(); 063 budgetConstructionPositionFundingDetailReportDao.updateReportsPositionFundingDetailTable(principalName, applyAThreshold, selectOnlyGreaterThanOrEqualToThreshold, thresholdPercent); 064 } 065 066 /** 067 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionPositionFundingDetailReportService#buildReports(java.lang.Integer, 068 * java.lang.String) 069 */ 070 public Collection<BudgetConstructionOrgPositionFundingDetailReport> buildReports(Integer universityFiscalYear, String principalName) { 071 Collection<BudgetConstructionOrgPositionFundingDetailReport> reportSet = new ArrayList(); 072 073 Collection<BudgetConstructionPositionFunding> positionFundingDetailList = budgetConstructionReportsServiceHelper.getDataForBuildingReports(BudgetConstructionPositionFunding.class, principalName, buildOrderByList()); 074 075 List<BudgetConstructionPositionFunding> listForCalculateTotalPerson = BudgetConstructionReportHelper.deleteDuplicated((List) positionFundingDetailList, fieldsForPerson()); 076 List<BudgetConstructionPositionFunding> listForCalculateTotalOrg = BudgetConstructionReportHelper.deleteDuplicated((List) positionFundingDetailList, fieldsForOrg()); 077 078 // Calculate Total Section 079 Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> fundingDetailTotalPerson = calculatePersonTotal(positionFundingDetailList, listForCalculateTotalPerson); 080 Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> fundingDetailTotalOrg = calculateOrgTotal(positionFundingDetailList, listForCalculateTotalOrg); 081 082 // Get selected objectCodes 083 String objectCodes = budgetConstructionReportsServiceHelper.getSelectedObjectCodes(principalName); 084 for (BudgetConstructionPositionFunding positionFundingDetailEntry : positionFundingDetailList) { 085 BudgetConstructionOrgPositionFundingDetailReport orgPositionFundingDetailReportEntry = new BudgetConstructionOrgPositionFundingDetailReport(); 086 buildReportsHeader(universityFiscalYear, objectCodes, orgPositionFundingDetailReportEntry, positionFundingDetailEntry); 087 buildReportsBody(universityFiscalYear, orgPositionFundingDetailReportEntry, positionFundingDetailEntry); 088 buildReportsTotal(orgPositionFundingDetailReportEntry, positionFundingDetailEntry, fundingDetailTotalPerson, fundingDetailTotalOrg); 089 reportSet.add(orgPositionFundingDetailReportEntry); 090 } 091 return reportSet; 092 } 093 094 /** 095 * builds report header 096 * 097 * @param universityFiscalYear 098 * @param objectCodes 099 * @param orgPositionFundingDetailReportEntry 100 * @param positionFundingDetail 101 */ 102 public void buildReportsHeader(Integer universityFiscalYear, String objectCodes, BudgetConstructionOrgPositionFundingDetailReport orgPositionFundingDetailReportEntry, BudgetConstructionPositionFunding positionFundingDetail) { 103 String chartDesc = positionFundingDetail.getSelectedOrganizationChartOfAccounts().getFinChartOfAccountDescription(); 104 String orgName = positionFundingDetail.getSelectedOrganization().getOrganizationName(); 105 Integer prevFiscalyear = universityFiscalYear - 1; 106 orgPositionFundingDetailReportEntry.setFiscalYear(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4)); 107 orgPositionFundingDetailReportEntry.setOrganizationCode(positionFundingDetail.getSelectedOrganizationCode()); 108 109 if (orgName == null) { 110 orgPositionFundingDetailReportEntry.setOrganizationName(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME)); 111 } 112 else { 113 orgPositionFundingDetailReportEntry.setOrganizationName(orgName); 114 } 115 116 orgPositionFundingDetailReportEntry.setOrgChartOfAccountsCode(positionFundingDetail.getSelectedOrganizationChartOfAccountsCode()); 117 if (chartDesc == null) { 118 orgPositionFundingDetailReportEntry.setOrgChartOfAccountDescription(kualiConfigurationService.getPropertyString(BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION)); 119 } 120 else { 121 orgPositionFundingDetailReportEntry.setOrgChartOfAccountDescription(chartDesc); 122 } 123 orgPositionFundingDetailReportEntry.setReqFy(prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4)); 124 orgPositionFundingDetailReportEntry.setFinancialObjectCode(positionFundingDetail.getFinancialObjectCode()); 125 orgPositionFundingDetailReportEntry.setObjectCodes(objectCodes); 126 } 127 128 /** 129 * builds report body 130 * 131 * @param universityFiscalYear 132 * @param orgPositionFundingDetailReportEntry 133 * @param positionFundingDetailEntry 134 */ 135 public void buildReportsBody(Integer universityFiscalYear, BudgetConstructionOrgPositionFundingDetailReport detailReportEntry, BudgetConstructionPositionFunding positionFundingDetailEntry) { 136 PendingBudgetConstructionAppointmentFunding appointmentFundingEntry = positionFundingDetailEntry.getPendingAppointmentFunding(); 137 // get budgetConstructionIntendedIncumbent, budgetConstructionAdministrativePost, budgetConstructionPosition objects 138 BudgetConstructionIntendedIncumbent budgetConstructionIntendedIncumbent = budgetConstructionReportsServiceHelper.getBudgetConstructionIntendedIncumbent(appointmentFundingEntry); 139 BudgetConstructionAdministrativePost budgetConstructionAdministrativePost = budgetConstructionReportsServiceHelper.getBudgetConstructionAdministrativePost(appointmentFundingEntry); 140 BudgetConstructionPosition budgetConstructionPosition = budgetConstructionReportsServiceHelper.getBudgetConstructionPosition(universityFiscalYear, appointmentFundingEntry); 141 142 // set report body 143 detailReportEntry.setChartOfAccountsCode(positionFundingDetailEntry.getChartOfAccountsCode()); 144 detailReportEntry.setAccountNumber(positionFundingDetailEntry.getAccountNumber()); 145 detailReportEntry.setSubAccountNumber(positionFundingDetailEntry.getSubAccountNumber()); 146 detailReportEntry.setFinancialSubObjectCode(positionFundingDetailEntry.getFinancialSubObjectCode()); 147 if (positionFundingDetailEntry.getName() != null) { 148 int nameLength = positionFundingDetailEntry.getName().length(); 149 detailReportEntry.setName(positionFundingDetailEntry.getName().substring(0, (nameLength > 35) ? 35 : nameLength)); 150 if (budgetConstructionIntendedIncumbent != null) { 151 if (budgetConstructionIntendedIncumbent.getIuClassificationLevel() == null) { 152 detailReportEntry.setCls(BCConstants.Report.UNDF); 153 } 154 else { 155 detailReportEntry.setCls(budgetConstructionIntendedIncumbent.getIuClassificationLevel()); 156 } 157 } 158 } 159 else { 160 detailReportEntry.setName(BCConstants.Report.VACANT); 161 detailReportEntry.setCls(BCConstants.Report.BLANK); 162 } 163 164 if (budgetConstructionAdministrativePost != null) { 165 detailReportEntry.setAdministrativePost(budgetConstructionAdministrativePost.getAdministrativePost()); 166 } 167 if (budgetConstructionPosition != null) { 168 detailReportEntry.setPositionNumber(budgetConstructionPosition.getPositionNumber()); 169 detailReportEntry.setNormalWorkMonthsAndiuPayMonths(budgetConstructionPosition.getIuNormalWorkMonths() + "/" + budgetConstructionPosition.getIuPayMonths()); 170 detailReportEntry.setPositionFte(BudgetConstructionReportHelper.setDecimalDigit(budgetConstructionPosition.getPositionFullTimeEquivalency(), 2, false)); 171 detailReportEntry.setPositionSalaryPlanDefault(budgetConstructionPosition.getPositionSalaryPlanDefault()); 172 detailReportEntry.setPositionGradeDefault(budgetConstructionPosition.getPositionGradeDefault()); 173 detailReportEntry.setPositionStandardHoursDefault(budgetConstructionPosition.getPositionStandardHoursDefault()); 174 } 175 176 BudgetConstructionCalculatedSalaryFoundationTracker csfTracker = appointmentFundingEntry.getEffectiveCSFTracker(); 177 detailReportEntry.setAmountChange(new Integer(0)); 178 detailReportEntry.setPercentChange(BigDecimal.ZERO); 179 if (csfTracker != null) { 180 detailReportEntry.setCsfFundingStatusCode(csfTracker.getCsfFundingStatusCode()); 181 detailReportEntry.setCsfTimePercent(BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfTimePercent(), 2, false)); 182 detailReportEntry.setCsfAmount(new Integer(csfTracker.getCsfAmount().intValue())); 183 detailReportEntry.setCsfFullTimeEmploymentQuantity(BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfFullTimeEmploymentQuantity(), 5, false)); 184 185 // calculate amountChange and percentChange 186 Integer amountChange = new Integer(0); 187 BigDecimal percentChange = BigDecimal.ZERO; 188 BigDecimal csfFte = BudgetConstructionReportHelper.setDecimalDigit(csfTracker.getCsfFullTimeEmploymentQuantity(), 5, false); 189 BigDecimal reqFte = BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedFteQuantity(), 5, false); 190 if (reqFte.compareTo(csfFte) == 0) { 191 amountChange = appointmentFundingEntry.getAppointmentRequestedAmount().subtract(csfTracker.getCsfAmount()).intValue(); 192 percentChange = BudgetConstructionReportHelper.calculatePercent(new BigDecimal(amountChange.intValue()), csfTracker.getCsfAmount().bigDecimalValue()); 193 } 194 detailReportEntry.setAmountChange(amountChange); 195 detailReportEntry.setPercentChange(BudgetConstructionReportHelper.calculatePercent(new BigDecimal(amountChange.intValue()), csfTracker.getCsfAmount().bigDecimalValue())); 196 } 197 198 if (appointmentFundingEntry != null) { 199 detailReportEntry.setFinancialSubObjectCode(appointmentFundingEntry.getFinancialSubObjectCode()); 200 201 detailReportEntry.setAppointmentFundingMonth(appointmentFundingEntry.getAppointmentFundingMonth()); 202 detailReportEntry.setAppointmentRequestedAmount(new Integer(appointmentFundingEntry.getAppointmentRequestedAmount().intValue())); 203 detailReportEntry.setAppointmentRequestedTimePercent(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedTimePercent(), 2, false)); 204 detailReportEntry.setAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedFteQuantity(), 5, false)); 205 if (salarySettingService.isHourlyPaidObject(appointmentFundingEntry.getUniversityFiscalYear(), appointmentFundingEntry.getChartOfAccountsCode(), appointmentFundingEntry.getFinancialObjectCode())){ 206 detailReportEntry.setAppointmentRequestedPayRate(appointmentFundingEntry.getAppointmentRequestedPayRate()); 207 } 208 209 detailReportEntry.setAppointmentFundingDurationCode(appointmentFundingEntry.getAppointmentFundingDurationCode()); 210 detailReportEntry.setAppointmentRequestedCsfAmount(BudgetConstructionReportHelper.convertKualiInteger(appointmentFundingEntry.getAppointmentRequestedCsfAmount())); 211 detailReportEntry.setAppointmentRequestedCsfTimePercent(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedCsfTimePercent(), 2, false)); 212 detailReportEntry.setAppointmentRequestedCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentRequestedCsfFteQuantity(), 5, false)); 213 214 detailReportEntry.setAppointmentTotalIntendedAmount(BudgetConstructionReportHelper.convertKualiInteger(appointmentFundingEntry.getAppointmentTotalIntendedAmount())); 215 detailReportEntry.setAppointmentTotalIntendedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(appointmentFundingEntry.getAppointmentTotalIntendedFteQuantity(), 5, false)); 216 217 detailReportEntry.setEmplid(appointmentFundingEntry.getEmplid()); 218 } 219 220 if (appointmentFundingEntry.isAppointmentFundingDeleteIndicator()) { 221 detailReportEntry.setDeleteBox(BCConstants.Report.DELETE_MARK); 222 } 223 else { 224 detailReportEntry.setDeleteBox(BCConstants.Report.BLANK); 225 } 226 } 227 228 /** 229 * builds report total 230 * 231 * @param orgPositionFundingDetailReportEntry 232 * @param positionFundingDetail 233 * @param fundingDetailTotalPerson 234 * @param fundingDetailTotalOrg 235 */ 236 public void buildReportsTotal(BudgetConstructionOrgPositionFundingDetailReport orgPositionFundingDetailReportEntry, BudgetConstructionPositionFunding positionFundingDetail, Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> fundingDetailTotalPerson, Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> fundingDetailTotalOrg) { 237 // set person part of total 238 for (BudgetConstructionOrgPositionFundingDetailReportTotal fundingDetailTotalPersonEntry : fundingDetailTotalPerson) { 239 240 if (BudgetConstructionReportHelper.isSameEntry(fundingDetailTotalPersonEntry.getBudgetConstructionPositionFunding(), positionFundingDetail, fieldsForPerson())) { 241 orgPositionFundingDetailReportEntry.setTotalPersonPositionCsfAmount(fundingDetailTotalPersonEntry.getTotalPersonPositionCsfAmount()); 242 orgPositionFundingDetailReportEntry.setTotalPersonAppointmentRequestedAmount(fundingDetailTotalPersonEntry.getTotalPersonAppointmentRequestedAmount()); 243 orgPositionFundingDetailReportEntry.setTotalPersonPositionCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalPersonEntry.getTotalPersonPositionCsfFteQuantity(), 5, false)); 244 orgPositionFundingDetailReportEntry.setTotalPersonAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalPersonEntry.getTotalPersonAppointmentRequestedFteQuantity(), 5, false)); 245 246 // calculate amountChange and percentChange 247 orgPositionFundingDetailReportEntry.setTotalPersonAmountChange(new Integer(0)); 248 orgPositionFundingDetailReportEntry.setTotalPersonPercentChange(BigDecimal.ZERO); 249 BigDecimal csfFte = BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalPersonEntry.getTotalPersonPositionCsfFteQuantity(), 5, false); 250 BigDecimal reqFte = BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalPersonEntry.getTotalPersonAppointmentRequestedFteQuantity(), 5, false); 251 if (csfFte.compareTo(reqFte) == 0) { 252 Integer amountChange = fundingDetailTotalPersonEntry.getTotalPersonAppointmentRequestedAmount() - fundingDetailTotalPersonEntry.getTotalPersonPositionCsfAmount(); 253 BigDecimal percentChange = BigDecimal.ZERO; 254 orgPositionFundingDetailReportEntry.setTotalPersonAmountChange(amountChange); 255 if (!fundingDetailTotalPersonEntry.getTotalPersonPositionCsfAmount().equals(new Integer(0))) { 256 percentChange = BudgetConstructionReportHelper.calculatePercent(amountChange, fundingDetailTotalPersonEntry.getTotalPersonPositionCsfAmount().intValue()); 257 } 258 orgPositionFundingDetailReportEntry.setTotalPersonPercentChange(percentChange); 259 } 260 261 orgPositionFundingDetailReportEntry.setPersonSortCode(fundingDetailTotalPersonEntry.getPersonSortCode()); 262 } 263 } 264 // set org part of total 265 for (BudgetConstructionOrgPositionFundingDetailReportTotal fundingDetailTotalOrgEntry : fundingDetailTotalOrg) { 266 if (BudgetConstructionReportHelper.isSameEntry(fundingDetailTotalOrgEntry.getBudgetConstructionPositionFunding(), positionFundingDetail, fieldsForOrg())) { 267 orgPositionFundingDetailReportEntry.setTotalOrgPositionCsfAmount(fundingDetailTotalOrgEntry.getTotalOrgPositionCsfAmount()); 268 orgPositionFundingDetailReportEntry.setTotalOrgAppointmentRequestedAmount(fundingDetailTotalOrgEntry.getTotalOrgAppointmentRequestedAmount()); 269 orgPositionFundingDetailReportEntry.setTotalOrgPositionCsfFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalOrgEntry.getTotalOrgPositionCsfFteQuantity(), 5, false)); 270 orgPositionFundingDetailReportEntry.setTotalOrgAppointmentRequestedFteQuantity(BudgetConstructionReportHelper.setDecimalDigit(fundingDetailTotalOrgEntry.getTotalOrgAppointmentRequestedFteQuantity(), 5, false)); 271 Integer amountChange = fundingDetailTotalOrgEntry.getTotalOrgAppointmentRequestedAmount() - fundingDetailTotalOrgEntry.getTotalOrgPositionCsfAmount(); 272 orgPositionFundingDetailReportEntry.setTotalOrgAmountChange(amountChange); 273 orgPositionFundingDetailReportEntry.setTotalOrgPercentChange(BudgetConstructionReportHelper.calculatePercent(new BigDecimal(amountChange.intValue()), new BigDecimal(fundingDetailTotalOrgEntry.getTotalOrgPositionCsfAmount().intValue()))); 274 if (orgPositionFundingDetailReportEntry.getPersonSortCode() == null) { 275 orgPositionFundingDetailReportEntry.setPersonSortCode(fundingDetailTotalOrgEntry.getPersonSortCode()); 276 } 277 } 278 } 279 } 280 281 /** 282 * calculates total part of person 283 * 284 * @param positionFundingDetailList 285 * @param listForCalculateTotalPerson 286 * @return 287 */ 288 protected Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> calculatePersonTotal(Collection<BudgetConstructionPositionFunding> positionFundingDetailList, List<BudgetConstructionPositionFunding> listForCalculateTotalPerson) { 289 Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> returnCollection = new ArrayList(); 290 Integer totalPersonPositionCsfAmount = new Integer(0); 291 Integer totalPersonAppointmentRequestedAmount = new Integer(0); 292 BigDecimal totalPersonPositionCsfFteQuantity = BigDecimal.ZERO; 293 BigDecimal totalPersonAppointmentRequestedFteQuantity = BigDecimal.ZERO; 294 Integer personSortCode = new Integer(0); 295 PendingBudgetConstructionAppointmentFunding pendingAppointmentFunding = null; 296 for (BudgetConstructionPositionFunding budgetConstructionPositionFunding : listForCalculateTotalPerson) { 297 for (BudgetConstructionPositionFunding positionFundingEntry : positionFundingDetailList) { 298 if (BudgetConstructionReportHelper.isSameEntry(budgetConstructionPositionFunding, positionFundingEntry, fieldsForPerson())) { 299 pendingAppointmentFunding = positionFundingEntry.getPendingAppointmentFunding(); 300 if (pendingAppointmentFunding.getBcnCalculatedSalaryFoundationTracker().size() > 0) { 301 BudgetConstructionCalculatedSalaryFoundationTracker calculatedSalaryFoundationTracker = pendingAppointmentFunding.getBcnCalculatedSalaryFoundationTracker().get(0); 302 totalPersonPositionCsfAmount = totalPersonPositionCsfAmount + new Integer(calculatedSalaryFoundationTracker.getCsfAmount().intValue()); 303 totalPersonPositionCsfFteQuantity = totalPersonPositionCsfFteQuantity.add(calculatedSalaryFoundationTracker.getCsfFullTimeEmploymentQuantity()); 304 } 305 if (pendingAppointmentFunding != null) { 306 totalPersonAppointmentRequestedAmount = totalPersonAppointmentRequestedAmount + new Integer(pendingAppointmentFunding.getAppointmentRequestedAmount().intValue()); 307 totalPersonAppointmentRequestedFteQuantity = totalPersonAppointmentRequestedFteQuantity.add(pendingAppointmentFunding.getAppointmentRequestedFteQuantity()); 308 } 309 // sort code for person - display total part of person, when person have more than one info 310 personSortCode += 1; 311 } 312 } 313 BudgetConstructionOrgPositionFundingDetailReportTotal budgetConstructionOrgPositionFundingDetailReportTotal = new BudgetConstructionOrgPositionFundingDetailReportTotal(); 314 budgetConstructionOrgPositionFundingDetailReportTotal.setBudgetConstructionPositionFunding(budgetConstructionPositionFunding); 315 budgetConstructionOrgPositionFundingDetailReportTotal.setTotalPersonPositionCsfAmount(totalPersonPositionCsfAmount); 316 budgetConstructionOrgPositionFundingDetailReportTotal.setTotalPersonPositionCsfFteQuantity(totalPersonPositionCsfFteQuantity); 317 budgetConstructionOrgPositionFundingDetailReportTotal.setTotalPersonAppointmentRequestedAmount(totalPersonAppointmentRequestedAmount); 318 budgetConstructionOrgPositionFundingDetailReportTotal.setTotalPersonAppointmentRequestedFteQuantity(totalPersonAppointmentRequestedFteQuantity); 319 if (personSortCode.intValue() > 1) { 320 budgetConstructionOrgPositionFundingDetailReportTotal.setPersonSortCode(new Integer(1)); 321 } 322 returnCollection.add(budgetConstructionOrgPositionFundingDetailReportTotal); 323 // set all values to zero, after the entry was added to collection 324 totalPersonPositionCsfAmount = new Integer(0); 325 totalPersonAppointmentRequestedAmount = new Integer(0); 326 totalPersonPositionCsfFteQuantity = BigDecimal.ZERO; 327 totalPersonAppointmentRequestedFteQuantity = BigDecimal.ZERO; 328 personSortCode = new Integer(0); 329 } 330 return returnCollection; 331 } 332 333 /** 334 * calculates total part of org 335 * 336 * @param positionFundingDetailList 337 * @param listForCalculateTotalOrg 338 * @return 339 */ 340 protected Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> calculateOrgTotal(Collection<BudgetConstructionPositionFunding> positionFundingDetailList, List<BudgetConstructionPositionFunding> listForCalculateTotalOrg) { 341 Collection<BudgetConstructionOrgPositionFundingDetailReportTotal> returnCollection = new ArrayList(); 342 Integer totalOrgPositionCsfAmount = new Integer(0); 343 Integer totalOrgAppointmentRequestedAmount = new Integer(0); 344 BigDecimal totalOrgPositionCsfFteQuantity = BigDecimal.ZERO; 345 BigDecimal totalOrgAppointmentRequestedFteQuantity = BigDecimal.ZERO; 346 PendingBudgetConstructionAppointmentFunding pendingAppointmentFunding = null; 347 for (BudgetConstructionPositionFunding budgetConstructionPositionFunding : listForCalculateTotalOrg) { 348 for (BudgetConstructionPositionFunding positionFundingEntry : positionFundingDetailList) { 349 if (BudgetConstructionReportHelper.isSameEntry(budgetConstructionPositionFunding, positionFundingEntry, fieldsForOrg())) { 350 pendingAppointmentFunding = positionFundingEntry.getPendingAppointmentFunding(); 351 if (pendingAppointmentFunding.getBcnCalculatedSalaryFoundationTracker().size() > 0) { 352 BudgetConstructionCalculatedSalaryFoundationTracker calculatedSalaryFoundationTracker = pendingAppointmentFunding.getBcnCalculatedSalaryFoundationTracker().get(0); 353 totalOrgPositionCsfAmount = totalOrgPositionCsfAmount + new Integer(calculatedSalaryFoundationTracker.getCsfAmount().intValue()); 354 totalOrgPositionCsfFteQuantity = totalOrgPositionCsfFteQuantity.add(calculatedSalaryFoundationTracker.getCsfFullTimeEmploymentQuantity()); 355 } 356 if (pendingAppointmentFunding != null) { 357 totalOrgAppointmentRequestedAmount = totalOrgAppointmentRequestedAmount + new Integer(pendingAppointmentFunding.getAppointmentRequestedAmount().intValue()); 358 totalOrgAppointmentRequestedFteQuantity = totalOrgAppointmentRequestedFteQuantity.add(pendingAppointmentFunding.getAppointmentRequestedFteQuantity()); 359 } 360 } 361 } 362 BudgetConstructionOrgPositionFundingDetailReportTotal budgetConstructionOrgOrgFundingDetailReportTotal = new BudgetConstructionOrgPositionFundingDetailReportTotal(); 363 budgetConstructionOrgOrgFundingDetailReportTotal.setBudgetConstructionPositionFunding(budgetConstructionPositionFunding); 364 budgetConstructionOrgOrgFundingDetailReportTotal.setTotalOrgPositionCsfAmount(totalOrgPositionCsfAmount); 365 budgetConstructionOrgOrgFundingDetailReportTotal.setTotalOrgPositionCsfFteQuantity(totalOrgPositionCsfFteQuantity); 366 budgetConstructionOrgOrgFundingDetailReportTotal.setTotalOrgAppointmentRequestedAmount(totalOrgAppointmentRequestedAmount); 367 budgetConstructionOrgOrgFundingDetailReportTotal.setTotalOrgAppointmentRequestedFteQuantity(totalOrgAppointmentRequestedFteQuantity); 368 returnCollection.add(budgetConstructionOrgOrgFundingDetailReportTotal); 369 // set all values to zero, after the entry was added to collection 370 totalOrgPositionCsfAmount = new Integer(0); 371 totalOrgAppointmentRequestedAmount = new Integer(0); 372 totalOrgPositionCsfFteQuantity = BigDecimal.ZERO; 373 totalOrgAppointmentRequestedFteQuantity = BigDecimal.ZERO; 374 } 375 return returnCollection; 376 } 377 378 /** 379 * builds orderByList for sort order. 380 * 381 * @return List<String> returnList 382 */ 383 public List<String> buildOrderByList() { 384 List<String> returnList = new ArrayList(); 385 returnList.add(KFSPropertyConstants.SELECTED_ORGANIZATION_CHART_OF_ACCOUNTS_CODE); 386 returnList.add(KFSPropertyConstants.SELECTED_ORGANIZATION_CODE); 387 returnList.add(KFSPropertyConstants.PERSON_NAME); 388 returnList.add(KFSPropertyConstants.EMPLID); 389 returnList.add(KFSPropertyConstants.POSITION_NUMBER); 390 returnList.add(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); 391 returnList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 392 returnList.add(KFSPropertyConstants.ACCOUNT_NUMBER); 393 returnList.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER); 394 returnList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); 395 returnList.add(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE); 396 return returnList; 397 } 398 399 /** 400 * builds list of fields for comparing entry of person total 401 * 402 * @return List<String> 403 */ 404 protected List<String> fieldsForPerson() { 405 List<String> fieldList = new ArrayList(); 406 fieldList.addAll(fieldsForOrg()); 407 fieldList.add(KFSPropertyConstants.EMPLID); 408 return fieldList; 409 } 410 411 /** 412 * builds list of fields for comparing entry of org total 413 * 414 * @return List<String> 415 */ 416 protected List<String> fieldsForOrg() { 417 List<String> fieldList = new ArrayList(); 418 fieldList.add(KFSPropertyConstants.SELECTED_ORGANIZATION_CHART_OF_ACCOUNTS_CODE); 419 fieldList.add(KFSPropertyConstants.SELECTED_ORGANIZATION_CODE); 420 return fieldList; 421 } 422 423 public void setBudgetConstructionPositionFundingDetailReportDao(BudgetConstructionPositionFundingDetailReportDao budgetConstructionPositionFundingDetailReportDao) { 424 this.budgetConstructionPositionFundingDetailReportDao = budgetConstructionPositionFundingDetailReportDao; 425 } 426 427 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) { 428 this.kualiConfigurationService = kualiConfigurationService; 429 } 430 431 public void setBudgetConstructionReportsServiceHelper(BudgetConstructionReportsServiceHelper budgetConstructionReportsServiceHelper) { 432 this.budgetConstructionReportsServiceHelper = budgetConstructionReportsServiceHelper; 433 } 434 435 /** 436 * Sets the salarySettingService attribute value. 437 * @param salarySettingService The salarySettingService to set. 438 */ 439 public void setSalarySettingService(SalarySettingService salarySettingService) { 440 this.salarySettingService = salarySettingService; 441 } 442 }