/*
* 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.businessobject.lookup;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.kuali.kfs.module.ar.businessobject.Customer;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceWriteoffLookupResult;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kns.lookup.LookupResultsService;
import org.kuali.rice.krad.bo.PersistableBusinessObject;
import org.kuali.rice.krad.util.ObjectUtils;
public class CustomerInvoiceWriteoffLookupUtil {
/**
* This helper method returns a list of customer invoice writeoff lookup result BO's based off a collection of customer invoice documents
* @param customerInvoiceDocuments
* @return
*/
public static Collection<CustomerInvoiceWriteoffLookupResult> getPopulatedCustomerInvoiceWriteoffLookupResults(Collection<CustomerInvoiceDocument> customerInvoiceDocuments) {
Collection<CustomerInvoiceWriteoffLookupResult> populatedCustomerInvoiceWriteoffLookupResults = new ArrayList<CustomerInvoiceWriteoffLookupResult>();
if (customerInvoiceDocuments.size() == 0) {
return populatedCustomerInvoiceWriteoffLookupResults;
}
Iterator iter = getCustomerInvoiceDocumentsByCustomerNumberMap(customerInvoiceDocuments).entrySet().iterator();
CustomerInvoiceWriteoffLookupResult customerInvoiceWriteoffLookupResult = null;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String customerNumber = (String) entry.getKey();
List<CustomerInvoiceDocument> list = (List<CustomerInvoiceDocument>) entry.getValue();
// just get data from first invoice for customer data
if (CollectionUtils.isNotEmpty(list)) {
Customer customer = list.get(0).getCustomer();
customerInvoiceWriteoffLookupResult = new CustomerInvoiceWriteoffLookupResult();
if (ObjectUtils.isNotNull(customer)) {
customerInvoiceWriteoffLookupResult.setCustomerName(customer.getCustomerName());
customerInvoiceWriteoffLookupResult.setCustomerNumber(customer.getCustomerNumber());
customerInvoiceWriteoffLookupResult.setCustomerTotal(getCustomerTotal(list));
}
customerInvoiceWriteoffLookupResult.setCustomerInvoiceDocuments(list);
populatedCustomerInvoiceWriteoffLookupResults.add(customerInvoiceWriteoffLookupResult);
}
}
return populatedCustomerInvoiceWriteoffLookupResults;
}
public static KualiDecimal getCustomerTotal(List<CustomerInvoiceDocument> customerInvoiceDocuments) {
KualiDecimal customerTotal = KualiDecimal.ZERO;
for (CustomerInvoiceDocument customerInvoiceDocument : customerInvoiceDocuments) {
customerTotal = customerTotal.add(customerInvoiceDocument.getOpenAmount());
}
return customerTotal;
}
/**
* This helper method returns a map of a list of invoices by customer number
* @param customerInvoiceDocuments
* @return
*/
public static Map<String, List<CustomerInvoiceDocument>> getCustomerInvoiceDocumentsByCustomerNumberMap(Collection<CustomerInvoiceDocument> customerInvoiceDocuments) {
// use a map to sort invoices by customer number
Map<String, List<CustomerInvoiceDocument>> customerInvoiceDocumentsByCustomerNumberMap = new HashMap<String, List<CustomerInvoiceDocument>>();
for (CustomerInvoiceDocument customerInvoiceDocument : customerInvoiceDocuments) {
String customerNumber = customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber();
if (customerInvoiceDocumentsByCustomerNumberMap.containsKey(customerNumber)) {
customerInvoiceDocumentsByCustomerNumberMap.get(customerNumber).add(customerInvoiceDocument);
} else {
List<CustomerInvoiceDocument> customerInvoiceDocumentsForCustomerNumber = new ArrayList<CustomerInvoiceDocument>();
customerInvoiceDocumentsForCustomerNumber.add(customerInvoiceDocument);
customerInvoiceDocumentsByCustomerNumberMap.put(customerNumber, customerInvoiceDocumentsForCustomerNumber);
}
}
return customerInvoiceDocumentsByCustomerNumberMap;
}
public static Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsFromLookupResultsSequenceNumber(String lookupResultsSequenceNumber, String personId) {
Collection<CustomerInvoiceDocument> customerInvoiceDocuments = new ArrayList<CustomerInvoiceDocument>();
try {
for (PersistableBusinessObject obj : SpringContext.getBean(LookupResultsService.class).retrieveSelectedResultBOs(lookupResultsSequenceNumber, CustomerInvoiceDocument.class, personId)) {
customerInvoiceDocuments.add((CustomerInvoiceDocument) obj);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
return customerInvoiceDocuments;
}
public static Collection<CustomerInvoiceWriteoffLookupResult> getCustomerInvoiceWriteoffResutlsFromLookupResultsSequenceNumber(String lookupResultsSequenceNumber, String personId) {
return CustomerInvoiceWriteoffLookupUtil.getPopulatedCustomerInvoiceWriteoffLookupResults(getCustomerInvoiceDocumentsFromLookupResultsSequenceNumber(lookupResultsSequenceNumber, personId));
}
}