/*
* 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.purap.document.service;
import java.sql.Date;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
import org.kuali.kfs.module.purap.util.VendorGroupingHelper;
/**
* Defines methods that must be implemented by a CreditMemoService implementation.
*/
public interface CreditMemoService extends AccountsPayableDocumentSpecificService {
/**
* Populates the document from either the associated payment request document, purchase order document, or vendor detail based
* on the credit memo type.
*
* @param cmDocument - Credit Memo Document to Populate
*/
public void populateDocumentAfterInit(VendorCreditMemoDocument cmDocument);
/**
* Gets the Credit memos that can be extracted.
*
* @param chartCode Chart to select from.
* @return Iterator of credit memos.
*/
public List<VendorCreditMemoDocument> getCreditMemosToExtract(String chartCode);
/**
* Pulls a distinct list of all vendors on CM documents which are ready for extraction.
*
* @param chartCode
* @return
*/
public Set<VendorGroupingHelper> getVendorsOnCreditMemosToExtract( String chartCode);
/**
* Pulls all extractable credit memo documents for a given vendor.
*
* @param chartCode
* @param vendor
* @return
*/
public Collection<VendorCreditMemoDocument> getCreditMemosToExtractByVendor( String chartCode, VendorGroupingHelper vendor );
/**
* Get a credit memo by document number.
*
* @param documentNumber The document number of the credit memo to be retrieved.
* @return The credit memo document whose document number matches the input parameter.
*/
public VendorCreditMemoDocument getCreditMemoByDocumentNumber(String documentNumber);
/**
* Retrieves the Credit Memo document by the purapDocumentIdentifier.
*
* @param purchasingDocumentIdentifier The purapDocumentIdentifier of the credit memo to be retrieved.
* @return The credit memo document whose purapDocumentIdentifier matches the input parameter.
*/
public VendorCreditMemoDocument getCreditMemoDocumentById(Integer purchasingDocumentIdentifier);
/**
* Makes call to dao to check for duplicate credit memos, and if one is found a message is returned. A duplicate error happens
* if there is an existing credit memo with the same vendor number and credit memo number as the one which is being created, or
* same vendor number and credit memo date.
*
* @param cmDocument - CreditMemoDocument to run duplicate check on.
* @return String - message indicating a duplicate was found.
*/
public String creditMemoDuplicateMessages(VendorCreditMemoDocument cmDocument);
/**
* Iterates through the items of the purchase order document and checks for items that have been invoiced.
*
* @param poDocument - purchase order document containing the lines to check.
* @return List<PurchaseOrderItem> - list of invoiced items found.
*/
public List<PurchaseOrderItem> getPOInvoicedItems(PurchaseOrderDocument poDocument);
/**
* Persists the credit memo with business rule checks.
*
* @param creditMemoDocument - credit memo document to save.
*/
public void populateAndSaveCreditMemo(VendorCreditMemoDocument creditMemoDocument);
/**
* Performs the credit memo item extended price calculation.
*
* @param cmDocument - credit memo document to calculate.
*/
public void calculateCreditMemo(VendorCreditMemoDocument cmDocument);
/**
* Marks a credit memo as on hold.
*
* @param cmDocument - credit memo document to hold.
* @param note - note explaining why the document is being put on hold.
* @return the CreditMemoDocument with updated information.
* @throws Exception
*/
public VendorCreditMemoDocument addHoldOnCreditMemo(VendorCreditMemoDocument cmDocument, String note) throws Exception;
/**
* Removes a hold on the credit memo document.
*
* @param cmDocument - credit memo document to remove hold on.
* @param note - note explaining why the credit memo is being taken off hold.
* @return the CreditMemoDocument with updated information.
*/
public VendorCreditMemoDocument removeHoldOnCreditMemo(VendorCreditMemoDocument cmDocument, String note) throws Exception;
/**
* This is called by PDP to cancel a CreditMemoDocument that has already been extracted
* @param cmDocument The credit memo document to be resetted.
* @param note The note to be added to the credit memo document.
*/
public void resetExtractedCreditMemo(VendorCreditMemoDocument cmDocument, String note);
/**
* This is called by PDP to cancel a CreditMemoDocument that has already been extracted
*
* @param cmDocument The credit memo document to be canceled.
* @param note The note to be added to the document to be canceled.
*/
public void cancelExtractedCreditMemo(VendorCreditMemoDocument cmDocument, String note);
/**
* Reopens the purchase order document related to the given credit memo
* document if it is closed.
*
* @param cmDocument The credit memo document to be used to obtained the
* purchase order document to be closed.
*/
public void reopenClosedPO(VendorCreditMemoDocument cmDocument);
/**
* Mark a credit memo is being used on a payment
*
* @param cm The credit memo document to be marked as paid.
* @param processDate The date to be set as the credit memo's paid timestamp.
*/
public void markPaid(VendorCreditMemoDocument cm, Date processDate);
/**
* Determines if there are active credit memos for a purchase order.
*
* @param purchaseOrderIdentifier
* @return
*/
public boolean hasActiveCreditMemosForPurchaseOrder(Integer purchaseOrderIdentifier);
}