/*
* 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.ContractsGrantsInvoiceReport;
import org.kuali.kfs.module.ar.report.ContractsGrantsInvoiceReportDetailDataHolder;
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;
/**
* Implementation of ContractsGrantsReportBuilderService to build a report data holder for ContractsGrantsInvoiceReport records
*/
public class ContractsGrantsInvoiceReportBuilderServiceImpl implements ContractsGrantsReportDataBuilderService {
protected ReportInfo reportInfo;
protected ContractsGrantsReportHelperService contractsGrantsReportHelperService;
/**
* Builds the report for ContractsGrantsInvoiceReport records
* @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.cgInvoiceReportSubtotalFieldsList.contains(sortPropertyName);
Map<String, List<KualiDecimal>> subTotalMap = new HashMap<String, List<KualiDecimal>>();
if (isFieldSubtotalRequired) {
subTotalMap = buildSubTotalMap((List<ContractsGrantsInvoiceReport>)displayList, sortPropertyName);
}
// build report
ContractsGrantsReportDataHolder cgInvoiceReportDataHolder = new ContractsGrantsReportDataHolder();
List<ContractsGrantsInvoiceReportDetailDataHolder> details = cgInvoiceReportDataHolder.getDetails();
for (ContractsGrantsInvoiceReport cgInvoiceReportEntry : (List<ContractsGrantsInvoiceReport>)displayList) {
ContractsGrantsInvoiceReportDetailDataHolder reportDetail = new ContractsGrantsInvoiceReportDetailDataHolder();
// set report data
setReportDate(cgInvoiceReportEntry, reportDetail);
if (isFieldSubtotalRequired) {
// set sortedFieldValue for grouping in the report
reportDetail.setSortedFieldValue(getContractsGrantsReportHelperService().getPropertyValue(cgInvoiceReportEntry, sortPropertyName));
reportDetail.setDisplaySubtotal(true);
// set subTotal from subTotalMap
reportDetail.setInvoiceSubTotal(subTotalMap.get(getContractsGrantsReportHelperService().getPropertyValue(cgInvoiceReportEntry, sortPropertyName)).get(0).bigDecimalValue());
reportDetail.setPaymentSubTotal(subTotalMap.get(getContractsGrantsReportHelperService().getPropertyValue(cgInvoiceReportEntry, sortPropertyName)).get(1).bigDecimalValue());
reportDetail.setRemainingSubTotal(subTotalMap.get(getContractsGrantsReportHelperService().getPropertyValue(cgInvoiceReportEntry, sortPropertyName)).get(2).bigDecimalValue());
}
else {
// set this to empty string for not displaying subtotal
reportDetail.setDisplaySubtotal(false);
}
details.add(reportDetail);
}
cgInvoiceReportDataHolder.setDetails(details);
return cgInvoiceReportDataHolder;
}
/**
* Returns ContractsGrantsInvoiceReport.class
* @see org.kuali.kfs.module.ar.report.service.ContractsGrantsReportDataBuilderService#getDetailsClass()
*/
@Override
public Class<? extends BusinessObject> getDetailsClass() {
return ContractsGrantsInvoiceReport.class;
}
/**
* @param displayList
* @param sortPropertyName
* @return
*/
protected Map<String, List<KualiDecimal>> buildSubTotalMap(List<ContractsGrantsInvoiceReport> 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;
KualiDecimal remainingSubTotal = KualiDecimal.ZERO;
for (ContractsGrantsInvoiceReport cgInvoiceReportEntry : displayList) {
// set fieldValue as "" when it is null
if (value.equals(getContractsGrantsReportHelperService().getPropertyValue(cgInvoiceReportEntry, sortPropertyName))) {
invoiceSubTotal = invoiceSubTotal.add(cgInvoiceReportEntry.getInvoiceAmount());
paymentSubTotal = paymentSubTotal.add(cgInvoiceReportEntry.getPaymentAmount());
remainingSubTotal = remainingSubTotal.add(cgInvoiceReportEntry.getRemainingAmount());
}
}
List<KualiDecimal> allSubTotal = new ArrayList<KualiDecimal>();
allSubTotal.add(0, invoiceSubTotal);
allSubTotal.add(1, paymentSubTotal);
allSubTotal.add(2, remainingSubTotal);
returnSubTotalMap.put(value, allSubTotal);
}
return returnSubTotalMap;
}
/**
* @param cgInvoiceReportEntry
* @param reportDetail
*/
protected void setReportDate(ContractsGrantsInvoiceReport cgInvoiceReportEntry, ContractsGrantsInvoiceReportDetailDataHolder reportDetail) {
reportDetail.setProposalNumber(cgInvoiceReportEntry.getProposalNumber());
reportDetail.setDocumentNumber(cgInvoiceReportEntry.getDocumentNumber());
reportDetail.setInvoiceType(cgInvoiceReportEntry.getInvoiceType());
reportDetail.setInvoiceDate(cgInvoiceReportEntry.getInvoiceDate());
reportDetail.setInvoiceDueDate(cgInvoiceReportEntry.getInvoiceDueDate());
reportDetail.setOpenInvoiceIndicator(cgInvoiceReportEntry.getOpenInvoiceIndicator());
reportDetail.setCustomerNumber(cgInvoiceReportEntry.getCustomerNumber());
reportDetail.setCustomerName(cgInvoiceReportEntry.getCustomerName());
BigDecimal invoiceAmount = (ObjectUtils.isNull(cgInvoiceReportEntry.getInvoiceAmount())) ? BigDecimal.ZERO : cgInvoiceReportEntry.getInvoiceAmount().bigDecimalValue();
reportDetail.setInvoiceAmount(invoiceAmount);
BigDecimal paymentAmount = (ObjectUtils.isNull(cgInvoiceReportEntry.getPaymentAmount())) ? BigDecimal.ZERO : cgInvoiceReportEntry.getPaymentAmount().bigDecimalValue();
reportDetail.setPaymentAmount(paymentAmount);
BigDecimal remainingAmount = (ObjectUtils.isNull(cgInvoiceReportEntry.getRemainingAmount())) ? BigDecimal.ZERO : cgInvoiceReportEntry.getRemainingAmount().bigDecimalValue();
reportDetail.setRemainingAmount(remainingAmount);
reportDetail.setAgeInDays(cgInvoiceReportEntry.getAgeInDays());
}
@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;
}
}