/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.ar.report.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.kuali.kfs.module.ar.ArConstants; import org.kuali.kfs.module.ar.businessobject.ContractsGrantsPaymentHistoryReport; import org.kuali.kfs.module.ar.report.ContractsGrantsPaymentHistoryReportDetailDataHolder; import org.kuali.kfs.module.ar.report.ContractsGrantsReportDataHolder; import org.kuali.kfs.module.ar.report.service.ContractsGrantsReportDataBuilderService; import org.kuali.kfs.module.ar.report.service.ContractsGrantsReportHelperService; import org.kuali.kfs.sys.report.ReportInfo; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.krad.bo.BusinessObject; import org.kuali.rice.krad.util.ObjectUtils; /** * An implementation of ContractsGrantsReportDataBuilderService for the Contracts & Grants Payment History Report */ public class ContractsGrantsPaymentHistoryReportBuilderServiceImpl implements ContractsGrantsReportDataBuilderService { protected ReportInfo reportInfo; protected ContractsGrantsReportHelperService contractsGrantsReportHelperService; /** * Builds the report * @see org.kuali.kfs.module.ar.report.service.ContractsGrantsReportDataBuilderService#buildReportDataHolder(java.util.List, java.lang.String) */ @Override public ContractsGrantsReportDataHolder buildReportDataHolder(List<? extends BusinessObject> displayList, String sortPropertyName) { // check field is valid for subtotal boolean isFieldSubtotalRequired = ArConstants.ReportsConstants.cgPaymentHistoryReportSubtotalFieldsList.contains(sortPropertyName); Map<String, List<KualiDecimal>> subTotalMap = new HashMap<String, List<KualiDecimal>>(); if (isFieldSubtotalRequired) { subTotalMap = buildSubTotalMap((List<ContractsGrantsPaymentHistoryReport>)displayList, sortPropertyName); } ContractsGrantsReportDataHolder cgPaymentHistoryReportDataHolder = new ContractsGrantsReportDataHolder(); List<ContractsGrantsPaymentHistoryReportDetailDataHolder> details = cgPaymentHistoryReportDataHolder.getDetails(); for (ContractsGrantsPaymentHistoryReport cgPaymentHistoryReportEntry : (List<ContractsGrantsPaymentHistoryReport>)displayList) { ContractsGrantsPaymentHistoryReportDetailDataHolder reportDetail = new ContractsGrantsPaymentHistoryReportDetailDataHolder(); // set report data setReportDate(cgPaymentHistoryReportEntry, reportDetail); if (isFieldSubtotalRequired) { // set sortedFieldValue for grouping in the report reportDetail.setSortedFieldValue(getContractsGrantsReportHelperService().getPropertyValue(cgPaymentHistoryReportEntry, sortPropertyName)); reportDetail.setDisplaySubtotal(true); // set subTotal from subTotalMap reportDetail.setInvoiceSubTotal(subTotalMap.get(getContractsGrantsReportHelperService().getPropertyValue(cgPaymentHistoryReportEntry, sortPropertyName)).get(0).bigDecimalValue()); reportDetail.setPaymentSubTotal(subTotalMap.get(getContractsGrantsReportHelperService().getPropertyValue(cgPaymentHistoryReportEntry, sortPropertyName)).get(1).bigDecimalValue()); } else { // set this to empty string for not displaying subtotal reportDetail.setDisplaySubtotal(false); } details.add(reportDetail); } cgPaymentHistoryReportDataHolder.setDetails(details); return cgPaymentHistoryReportDataHolder; } /** * Returns the class of ContractsGrantsPaymentHistoryReport * @see org.kuali.kfs.module.ar.report.service.ContractsGrantsReportDataBuilderService#getDetailsClass() */ @Override public Class<? extends BusinessObject> getDetailsClass() { return ContractsGrantsPaymentHistoryReport.class; } /** * @param displayList * @param sortPropertyName * @return */ protected Map<String, List<KualiDecimal>> buildSubTotalMap(List<ContractsGrantsPaymentHistoryReport> displayList, String sortPropertyName) { Map<String, List<KualiDecimal>> returnSubTotalMap = new HashMap<String, List<KualiDecimal>>(); // get list of sort fields List<String> valuesOfsortProperty = getContractsGrantsReportHelperService().getListOfValuesSortedProperties(displayList, sortPropertyName); // calculate sub_total and build subTotalMap for (String value : valuesOfsortProperty) { KualiDecimal invoiceSubTotal = KualiDecimal.ZERO; KualiDecimal paymentSubTotal = KualiDecimal.ZERO; for (ContractsGrantsPaymentHistoryReport cgPaymentHistoryReportEntry : displayList) { // set fieldValue as "" when it is null if (value.equals(getContractsGrantsReportHelperService().getPropertyValue(cgPaymentHistoryReportEntry, sortPropertyName))) { invoiceSubTotal = invoiceSubTotal.add(cgPaymentHistoryReportEntry.getInvoiceAmount()); paymentSubTotal = paymentSubTotal.add(cgPaymentHistoryReportEntry.getPaymentAmount()); } } List<KualiDecimal> allSubTotal = new ArrayList<KualiDecimal>(); allSubTotal.add(0, invoiceSubTotal); allSubTotal.add(1, paymentSubTotal); returnSubTotalMap.put(value, allSubTotal); } return returnSubTotalMap; } /** * @param cgPaymentHistoryReportEntry * @param reportDetail */ protected void setReportDate(ContractsGrantsPaymentHistoryReport cgPaymentHistoryReportEntry, ContractsGrantsPaymentHistoryReportDetailDataHolder reportDetail) { reportDetail.setPaymentNumber(cgPaymentHistoryReportEntry.getPaymentNumber()); reportDetail.setPaymentDate(cgPaymentHistoryReportEntry.getPaymentDate()); reportDetail.setCustomerNumber(cgPaymentHistoryReportEntry.getCustomerNumber()); reportDetail.setCustomerName(cgPaymentHistoryReportEntry.getCustomerName()); BigDecimal paymentAmount = (ObjectUtils.isNull(cgPaymentHistoryReportEntry.getPaymentAmount())) ? BigDecimal.ZERO : cgPaymentHistoryReportEntry.getPaymentAmount().bigDecimalValue(); reportDetail.setPaymentAmount(paymentAmount); reportDetail.setInvoiceNumber(cgPaymentHistoryReportEntry.getInvoiceNumber()); BigDecimal invoiceAmount = (ObjectUtils.isNull(cgPaymentHistoryReportEntry.getInvoiceAmount())) ? BigDecimal.ZERO : cgPaymentHistoryReportEntry.getInvoiceAmount().bigDecimalValue(); reportDetail.setInvoiceAmount(invoiceAmount); reportDetail.setAwardNumber(cgPaymentHistoryReportEntry.getAwardNumber().toString()); reportDetail.setReversedIndicator(cgPaymentHistoryReportEntry.isReversedIndicator() ? "Yes" : "No"); reportDetail.setAppliedIndicator(cgPaymentHistoryReportEntry.isAppliedIndicator() ? "Yes" : "No"); } @Override public ReportInfo getReportInfo() { return reportInfo; } public void setReportInfo(ReportInfo reportInfo) { this.reportInfo = reportInfo; } public ContractsGrantsReportHelperService getContractsGrantsReportHelperService() { return contractsGrantsReportHelperService; } public void setContractsGrantsReportHelperService(ContractsGrantsReportHelperService contractsGrantsReportHelperService) { this.contractsGrantsReportHelperService = contractsGrantsReportHelperService; } }