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.purap.document.service;
017    
018    import java.sql.Date;
019    import java.util.Collection;
020    import java.util.Iterator;
021    import java.util.List;
022    import java.util.Set;
023    
024    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
025    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
026    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
027    import org.kuali.kfs.module.purap.util.VendorGroupingHelper;
028    import org.kuali.rice.kim.bo.Person;
029    
030    /**
031     * Defines methods that must be implemented by a CreditMemoService implementation.
032     */
033    public interface CreditMemoService extends AccountsPayableDocumentSpecificService {
034    
035        /**
036         * Populates the document from either the associated payment request document, purchase order document, or vendor detail based
037         * on the credit memo type.
038         * 
039         * @param cmDocument - Credit Memo Document to Populate
040         */
041        public void populateDocumentAfterInit(VendorCreditMemoDocument cmDocument);
042    
043        /**
044         * Gets the Credit memos that can be extracted.
045         * 
046         * @param chartCode Chart to select from.
047         * @return Iterator of credit memos.
048         */
049        public Iterator<VendorCreditMemoDocument> getCreditMemosToExtract(String chartCode);
050    
051        /**
052         * Pulls a distinct list of all vendors on CM documents which are ready for extraction.
053         * 
054         * @param chartCode
055         * @return
056         */
057        public Set<VendorGroupingHelper> getVendorsOnCreditMemosToExtract( String chartCode);
058        
059        /**
060         * Pulls all extractable credit memo documents for a given vendor.
061         * 
062         * @param chartCode
063         * @param vendor
064         * @return
065         */
066        public Collection<VendorCreditMemoDocument> getCreditMemosToExtractByVendor( String chartCode, VendorGroupingHelper vendor );
067        
068        /**
069         * Get a credit memo by document number.
070         * 
071         * @param documentNumber  The document number of the credit memo to be retrieved.
072         * @return                The credit memo document whose document number matches the input parameter.
073         */
074        public VendorCreditMemoDocument getCreditMemoByDocumentNumber(String documentNumber);
075    
076        /**
077         * Retrieves the Credit Memo document by the purapDocumentIdentifier.
078         * 
079         * @param purchasingDocumentIdentifier  The purapDocumentIdentifier of the credit memo to be retrieved.
080         * @return                              The credit memo document whose purapDocumentIdentifier matches the input parameter.
081         */
082        public VendorCreditMemoDocument getCreditMemoDocumentById(Integer purchasingDocumentIdentifier);
083    
084        /**
085         * Makes call to dao to check for duplicate credit memos, and if one is found a message is returned. A duplicate error happens
086         * if there is an existing credit memo with the same vendor number and credit memo number as the one which is being created, or
087         * same vendor number and credit memo date.
088         * 
089         * @param cmDocument - CreditMemoDocument to run duplicate check on.
090         * @return String - message indicating a duplicate was found.
091         */
092        public String creditMemoDuplicateMessages(VendorCreditMemoDocument cmDocument);
093    
094        /**
095         * Iterates through the items of the purchase order document and checks for items that have been invoiced.
096         * 
097         * @param poDocument - purchase order document containing the lines to check.
098         * @return List<PurchaseOrderItem> - list of invoiced items found.
099         */
100        public List<PurchaseOrderItem> getPOInvoicedItems(PurchaseOrderDocument poDocument);
101    
102        /**
103         * Persists the credit memo with business rule checks.
104         * 
105         * @param creditMemoDocument - credit memo document to save.
106         */
107        public void populateAndSaveCreditMemo(VendorCreditMemoDocument creditMemoDocument);
108    
109        /**
110         * Performs the credit memo item extended price calculation.
111         * 
112         * @param cmDocument - credit memo document to calculate.
113         */
114        public void calculateCreditMemo(VendorCreditMemoDocument cmDocument);
115    
116        /**
117         * Marks a credit memo as on hold.
118         * 
119         * @param cmDocument - credit memo document to hold.
120         * @param note - note explaining why the document is being put on hold.
121         * @return the CreditMemoDocument with updated information.
122         * @throws Exception
123         */
124        public VendorCreditMemoDocument addHoldOnCreditMemo(VendorCreditMemoDocument cmDocument, String note) throws Exception;
125    
126        /**
127         * Removes a hold on the credit memo document.
128         * 
129         * @param cmDocument - credit memo document to remove hold on.
130         * @param note - note explaining why the credit memo is being taken off hold.
131         * @return the CreditMemoDocument with updated information.
132         */
133        public VendorCreditMemoDocument removeHoldOnCreditMemo(VendorCreditMemoDocument cmDocument, String note) throws Exception;
134    
135        /**
136         * This is called by PDP to cancel a CreditMemoDocument that has already been extracted     
137         * @param cmDocument  The credit memo document to be resetted.
138         * @param note        The note to be added to the credit memo document.
139         */
140        public void resetExtractedCreditMemo(VendorCreditMemoDocument cmDocument, String note);
141    
142        /**
143         * This is called by PDP to cancel a CreditMemoDocument that has already been extracted
144         * 
145         * @param cmDocument  The credit memo document to be canceled.
146         * @param note        The note to be added to the document to be canceled.
147         */
148        public void cancelExtractedCreditMemo(VendorCreditMemoDocument cmDocument, String note);
149    
150        /**
151         * Reopens the purchase order document related to the given credit memo
152         * document if it is closed.
153         * 
154         * @param cmDocument  The credit memo document to be used to obtained the 
155         *                    purchase order document to be closed.
156         */
157        public void reopenClosedPO(VendorCreditMemoDocument cmDocument);
158    
159        /**
160         * Mark a credit memo is being used on a payment
161         * 
162         * @param cm           The credit memo document to be marked as paid.
163         * @param processDate  The date to be set as the credit memo's paid timestamp.
164         */
165        public void markPaid(VendorCreditMemoDocument cm, Date processDate);
166        
167        /**
168         * Determines if there are active credit memos for a purchase order.
169         * 
170         * @param purchaseOrderIdentifier
171         * @return
172         */
173        public boolean hasActiveCreditMemosForPurchaseOrder(Integer purchaseOrderIdentifier);
174    
175    }
176