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.ar.businessobject.lookup;
017    
018    import java.util.Collection;
019    import java.util.HashMap;
020    import java.util.Iterator;
021    import java.util.List;
022    import java.util.Map;
023    
024    import org.kuali.kfs.module.ar.ArConstants;
025    import org.kuali.kfs.module.ar.businessobject.Customer;
026    import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceWriteoffLookupResult;
027    import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
028    import org.kuali.kfs.sys.context.SpringContext;
029    import org.kuali.rice.kns.bo.PersistableBusinessObject;
030    import org.kuali.rice.kns.lookup.LookupResultsService;
031    import org.kuali.rice.kns.util.KualiDecimal;
032    import org.kuali.rice.kns.util.TypedArrayList;
033    
034    public class CustomerInvoiceWriteoffLookupUtil {
035        
036        /**
037         * This helper method returns a list of customer invoice writeoff lookup result BO's based off a collection of customer invoice documents
038         * @param customerInvoiceDocuments
039         * @return
040         */
041        public static Collection<CustomerInvoiceWriteoffLookupResult> getPopulatedCustomerInvoiceWriteoffLookupResults(Collection<CustomerInvoiceDocument> customerInvoiceDocuments){
042            Collection<CustomerInvoiceWriteoffLookupResult> populatedCustomerInvoiceWriteoffLookupResults = new TypedArrayList(CustomerInvoiceWriteoffLookupResult.class);
043            
044            if (customerInvoiceDocuments.size() == 0)
045                return populatedCustomerInvoiceWriteoffLookupResults;
046                
047            Iterator iter = getCustomerInvoiceDocumentsByCustomerNumberMap(customerInvoiceDocuments).entrySet().iterator();
048            CustomerInvoiceWriteoffLookupResult customerInvoiceWriteoffLookupResult = null;
049            while(iter.hasNext()) {
050                
051                Map.Entry entry = (Map.Entry)iter.next();
052                String customerNumber = (String)entry.getKey();
053                List<CustomerInvoiceDocument> list = (List<CustomerInvoiceDocument>)entry.getValue();
054                
055                //just get data from first invoice for customer data
056                Customer customer = ((CustomerInvoiceDocument)list.get(0)).getCustomer();
057                customerInvoiceWriteoffLookupResult = new CustomerInvoiceWriteoffLookupResult();
058                customerInvoiceWriteoffLookupResult.setCustomerName(customer.getCustomerName());
059                customerInvoiceWriteoffLookupResult.setCustomerNumber(customer.getCustomerNumber());
060                customerInvoiceWriteoffLookupResult.setCollectionStatus(ArConstants.NO_COLLECTION_STATUS_STRING);
061                customerInvoiceWriteoffLookupResult.setCustomerTotal(getCustomerTotal(list));
062                customerInvoiceWriteoffLookupResult.setCustomerInvoiceDocuments(list);
063                
064                populatedCustomerInvoiceWriteoffLookupResults.add(customerInvoiceWriteoffLookupResult);
065            }
066      
067            return populatedCustomerInvoiceWriteoffLookupResults;
068        }
069        
070        public static KualiDecimal getCustomerTotal(List<CustomerInvoiceDocument> customerInvoiceDocuments){
071            KualiDecimal customerTotal = KualiDecimal.ZERO;
072            for( CustomerInvoiceDocument customerInvoiceDocument : customerInvoiceDocuments ){
073                customerTotal = customerTotal.add(customerInvoiceDocument.getOpenAmount());
074            }
075            return customerTotal;
076        }
077        
078        /**
079         * This helper method returns a map of a list of invoices by customer number
080         * @param customerInvoiceDocuments
081         * @return
082         */
083        public static Map<String, List<CustomerInvoiceDocument>> getCustomerInvoiceDocumentsByCustomerNumberMap(Collection<CustomerInvoiceDocument> customerInvoiceDocuments){
084            //use a map to sort invoices by customer number
085            Map<String, List<CustomerInvoiceDocument>> customerInvoiceDocumentsByCustomerNumberMap = new HashMap<String, List<CustomerInvoiceDocument>>();
086            for( CustomerInvoiceDocument customerInvoiceDocument : customerInvoiceDocuments){
087                String customerNumber = customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber();
088                if( customerInvoiceDocumentsByCustomerNumberMap.containsKey(customerNumber) ){
089                    ((List<CustomerInvoiceDocument>)customerInvoiceDocumentsByCustomerNumberMap.get(customerNumber)).add(customerInvoiceDocument);
090                } else {
091                    List<CustomerInvoiceDocument> customerInvoiceDocumentsForCustomerNumber = new TypedArrayList(CustomerInvoiceDocument.class);
092                    customerInvoiceDocumentsForCustomerNumber.add(customerInvoiceDocument);
093                    customerInvoiceDocumentsByCustomerNumberMap.put(customerNumber, customerInvoiceDocumentsForCustomerNumber);
094                }
095            }
096            
097            return customerInvoiceDocumentsByCustomerNumberMap;
098        }
099        
100        public static Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsFromLookupResultsSequenceNumber(String lookupResultsSequenceNumber, String personId) {
101            Collection<CustomerInvoiceDocument> customerInvoiceDocuments = new TypedArrayList(CustomerInvoiceDocument.class);
102            try {
103                for (PersistableBusinessObject obj : SpringContext.getBean(LookupResultsService.class).retrieveSelectedResultBOs(lookupResultsSequenceNumber, CustomerInvoiceDocument.class, personId)) {
104                    customerInvoiceDocuments.add((CustomerInvoiceDocument) obj);
105                }
106            }
107            catch (Exception e) {
108                throw new RuntimeException(e);
109            }
110    
111            return customerInvoiceDocuments;
112        }
113        
114        public static Collection<CustomerInvoiceWriteoffLookupResult> getCustomerInvoiceWriteoffResutlsFromLookupResultsSequenceNumber(String lookupResultsSequenceNumber, String personId){
115            return CustomerInvoiceWriteoffLookupUtil.getPopulatedCustomerInvoiceWriteoffLookupResults(getCustomerInvoiceDocumentsFromLookupResultsSequenceNumber(lookupResultsSequenceNumber, personId));
116        }    
117    
118    }
119