/*
* 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.document.service;
import java.sql.Date;
import java.util.Collection;
import java.util.List;
import org.kuali.kfs.module.ar.businessobject.Customer;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.module.ar.businessobject.NonInvoicedDistribution;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
import org.kuali.kfs.module.ar.report.util.CustomerStatementResultHolder;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.WorkflowDocument;
public interface CustomerInvoiceDocumentService {
/**
* Converts discount lines on the customer invoice document to paidapplieds. This method is only intended to be used once the
* document is at least in the Processed state, and will throw an error if used on a document in an earlier state. This method
* is intended to be called from the CustomerInvoiceDocument.handleRouteStatusChange
*
* @param invoice A populated Invoice document that is at least PROCESSED.
*/
public void convertDiscountsToPaidApplieds(CustomerInvoiceDocument invoice);
/**
* Retrieves all invoice documents that are Open with outstanding balances, including workflow headers.
*
* @return A collection of CustomerInvoiceDocument documents, or an empty list of no matches.
*/
public Collection<CustomerInvoiceDocument> getAllOpenCustomerInvoiceDocuments();
/**
* Retrieves all invoice documents that are Open with outstanding balances. Will NOT retrieve workflow headers, so results of
* this are not suitable for using to route, save, or otherwise perform workflow operations upon.
*
* @return
*/
public Collection<CustomerInvoiceDocument> getAllOpenCustomerInvoiceDocumentsWithoutWorkflow();
/**
* Gets invoices without workflow headers, retrieves the workflow headers and returns invoices with workflow headers.
*
* @return
*/
public Collection<CustomerInvoiceDocument> attachWorkflowHeadersToTheInvoices(Collection<CustomerInvoiceDocument> invoices);
/**
* Retrieves all Open Invoices for this given Customer Number. IMPORTANT - Workflow headers and status are not retrieved by this
* method, only the raw Customer Invoice Document from the Database. If you need a full workflow document, you can do use
* DocumentService to retrieve each by document number.
*
* @param customerNumber
* @return
*/
public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerNumber(String customerNumber);
/**
* Retrieves all Open Invoices for the given Customer Name and Customer Type Code Note that the customerName field is turned
* into a 'LIKE customerName*' query. IMPORTANT - Workflow headers and status are not retrieved by this method, only the raw
* Customer Invoice Document from the Database. If you need a full workflow document, you can do use DocumentService to retrieve
* each by document number.
*
* @param customerName
* @param customerTypeCode
* @return
*/
public Collection getOpenInvoiceDocumentsByCustomerNameByCustomerType(String customerName, String customerTypeCode);
/**
* Retrieves all Open Invoices for the given Customer Name. Note that this is a leading substring search, so whatever is entered
* into the customerName field is turned into a 'LIKE customerName*' query. IMPORTANT - Workflow headers and status are not
* retrieved by this method, only the raw Customer Invoice Document from the Database. If you need a full workflow document, you
* can do use DocumentService to retrieve each by document number.
*
* @param customerName
* @return
*/
public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerName(String customerName);
/**
* Retrieves all Open Invoices for the given Customer Type Code. IMPORTANT - Workflow headers and status are not retrieved by
* this method, only the raw Customer Invoice Document from the Database. If you need a full workflow document, you can do use
* DocumentService to retrieve each by document number.
*
* @param customerTypeCode
* @return
*/
public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerType(String customerTypeCode);
/**
* This method sets up default values for customer invoice document on initiation.
*
* @param document
*/
public void setupDefaultValuesForNewCustomerInvoiceDocument(CustomerInvoiceDocument document);
/**
* This method sets up default values for customer invoice document when copied.
*
* @param customerInvoiceDocument
*/
public void setupDefaultValuesForCopiedCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* If the customer number and address identifiers are present, display customer information
*
* @param customerInvoiceDocument
*/
public void loadCustomerAddressesForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* This method returns a Collection of CustomerInvoiceDocuments corresponding to a customerNumber.
*
* @param customerNumber used to find invoices
* @return Collection<CustomerInvoiceDocument> invoice documents
*/
public Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByCustomerNumber(String customerNumber);
/**
* This method returns a Collection of CustomerInvoiceDetails for a customer invoice document number.
*
* @param customerInvoiceDocumentNumber used to find customer invoice details for a customer invoice document
* @return Collection<CustomerInvoiceDetail> customer invoice details
*/
public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocument(String customerInvoiceDocumentNumber);
/**
* This method returns a Collection of CustomerInvoiceDetails for a customer invoice document.
*
* @param customerInvoiceDocument used to find customer invoice details
* @return Collection<CustomerInvoiceDetail> customer invoice details
*/
public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* This method returns a Collection of CustomerInvoiceDetails for a customer invoice document.
* Cached for better performance
*
* @param customerInvoiceDocument used to find customer invoice details
* @return Collection<CustomerInvoiceDetail> customer invoice details
*/
public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocumentWithCaching(CustomerInvoiceDocument customerInvoiceDocument);
/**
* This method returns a Customer for an invoice based on organizationInvoiceNumber.
*
* @param invoiceNumber organizationInvoiceNumber used to find invoice and get the customer
* @return Customer for the invoice corresponding to the organizationInvoiceNumber
*/
public Customer getCustomerByOrganizationInvoiceNumber(String invoiceNumber);
/**
* This method returns a CustomerInvoiceDocument based on organizationInvoiceNumber.
*
* @param organizationInvoiceNumber used to find invoice and get the customer
* @return CustomerInvoiceDocument corresponding to the organizationInvoiceNumber
*/
public CustomerInvoiceDocument getInvoiceByOrganizationInvoiceNumber(String organizationInvoiceNumber);
/**
* This method returns a Customer for an invoice based on invoice document number.
*
* @param documentNumber used to find the invoice and get the customer
* @return Customer for the invoice corresponding to the documentNumber
*/
public Customer getCustomerByInvoiceDocumentNumber(String documentNumber);
/**
* This method returns a CustomerInvoiceDocument based on invoice document number.
*
* @param invoiceDocumentNumber used to find the invoice
* @return CustomerInvoiceDocument corresponding to the invoiceDocumentNumber
*/
public CustomerInvoiceDocument getInvoiceByInvoiceDocumentNumber(String invoiceDocumentNumber);
/**
* Gets the printable customer invoice for the specified initiatorPrincipalName.
*
* @param initiatorPrincipalName the specified initiatorPrincipalName
* @return the printable customer invoice for the specified initiatorPrincipalName
*/
public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByInitiatorPrincipalName(String initiatorPrincipalName);
/**
* Gets the printable customer invoice for the specified chartOfAccountsCode and organizationCode.
*
* @param chartOfAccountsCode
* @param organizationCode
* @return the printable customer invoice for the specified chartOfAccountsCode and organizationCode.
*/
public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode);
/**
* Gets the printable customer invoice for the BillingStatement by chartOfAccountsCode and organizationCode.
*
* @param chartOfAccountsCode
* @param organizationCode
* @return the printable customer invoice for the BillingStatement.
*/
public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsForBillingStatementByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode);
/**
* Gets the printable customer invoice for the specified chartOfAccountsCode and organizationCode.
*
* @param chartOfAccountsCode
* @param organizationCode
* @return the printable customer invoice
*/
public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByProcessingChartAndOrg(String chartOfAccountsCode, String organizationCode);
/**
* Gets customer invoice for the specified chartOfAccountsCode and organizationCode.
*
* @param chartOfAccountsCode
* @param organizationCode
* @return customer invoice
*/
public List<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode);
/**
* Get list of customer invoice by processing chartOfAccountsCode and organizationCode.
*
* @param chartOfAccountsCode
* @param organizationCode
* @return list of customer invoice
*/
public List<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByProcessingChartAndOrg(String chartOfAccountsCode, String organizationCode);
/**
* Gets customer invoice by account number.
*
* @param accountNumber
* @return collection of customer invoice.
*/
public Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByAccountNumber(String accountNumber);
/**
* This method returns the NonInvoicedDistributions for an invoice based on documentNumber.
*
* @param documentNumber used to find the invoice
* @return Collection<NonInvoicedDistribution> non invoiced distributions for the invoice corresponding to the documentNumber
*/
public Collection<NonInvoicedDistribution> getNonInvoicedDistributionsForInvoice(String documentNumber);
/**
* This method returns the total NonInvoicedDistribution amount for an invoice based on documentNumber.
*
* @param documentNumber used to find the invoice
* @return KualiDecimal non invoiced distribution total for the invoice
*/
public KualiDecimal getNonInvoicedTotalForInvoice(String documentNumber);
/**
* This method returns the total NonInvoicedDistribution amount for an invoice.
*
* @param invoice used to get the non invoiced distributions to total
* @return KualiDecimal non invoiced distribution total for the invoice
*/
public KualiDecimal getNonInvoicedTotalForInvoice(CustomerInvoiceDocument invoice);
/**
* This method returns the total InvoicePaidApplied amount for an invoice based on documentNumber.
*
* @param documentNumber used to find the invoice
* @return KualiDecimal paid applied total for the invoice
*/
public KualiDecimal getPaidAppliedTotalForInvoice(String documentNumber);
/**
* This method returns the total InvoicePaidApplied amount for an invoice.
*
* @param invoice used to get the invoice paid applied objects to total
* @return KualiDecimal paid applied total for the invoice
*/
public KualiDecimal getPaidAppliedTotalForInvoice(CustomerInvoiceDocument invoice);
/**
* This method updates the open invoice indicator if amounts have been completely paid off
*
* @param invoice
*/
public void closeCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* This method returns the total open amount for an invoice based on customerInvoiceDocumentNumber.
*
* @param customerInvoiceDocumentNumber used to find the invoice
* @return KualiDecimal total open amount for the invoice
*/
public KualiDecimal getOpenAmountForCustomerInvoiceDocument(String customerInvoiceDocumentNumber);
/**
* This method returns the total open amount for an invoice based on customerInvoiceDocumentNumber.
*
* @param customerInvoiceDocumentNumber invoice used to calculate total open amount
* @return KualiDecimal total open amount for the invoice
*/
public KualiDecimal getOpenAmountForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* get total amount of customer invoice by customer invoice.
*
* @param customerInvoiceDocument
* @return
*/
public KualiDecimal getOriginalTotalAmountForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument);
/**
* This method checks if the invoice is final.
*
* @param invDocumentNumber invoice to check
* @return true if invoice is final, false otherwise
*/
public boolean checkIfInvoiceNumberIsFinal(String invDocumentNumber);
/**
* Updates report date
*
* @param docNumber
*/
public void updateReportedDate(String docNumber);
/**
* Updates statement info
*
* @param data
*/
public void updateReportedInvoiceInfo(CustomerStatementResultHolder data);
/**
* get all customer invoice documents that are open and with the given age
*
* @param charts the selected charts of accounts
* @param organizations the selected organization codes
* @param invoiceAge the given invoice document age
*
* @return all customer invoice documents that are open and with the given age
*/
public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByBilling(List<String> charts, List<String> organizations, Integer invoiceAge);
/**
* get all customer invoice documents that are open and with the given age
*
* @param charts the selected charts of accounts
* @param organizations the selected organization codes
* @param invoiceAge the given invoice document age
*
* @return all customer invoice documents that are open and with the given age
*/
public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByProcessing(List<String> charts, List<String> organizations, Integer invoiceAge);
/**
* get all customer invoice documents that are open and with the given age
*
* @param charts the selected charts of accounts
* @param accounts the selected account numbers
* @param invoiceAge the given invoice document age
*
* @return all customer invoice documents that are open and with the given age
*/
public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByAccounts(List<String> charts, List<String> accounts, Integer invoiceAge);
/**
* get all customer invoice documents that are open and with the given age and customer types
*
* @param customerTypes the given customer types
* @param invoiceAge the given invoice document age
* @param invoiceBillingDateFrom the given invoice billing from date
*
* @return all customer invoice documents that are open and with the given age
*/
public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByCustomerTypes(List<String> customerTypes, Integer invoiceAge, Date invoiceDueDateFrom);
/**
* Adds a note to the CustomerInvoiceDocument about what person and document numbers closed it. This only occurs if
* openInvoiceIndicator=true at the time of calling this method.
*
* @param documentToClose- the document about to be closed which we want to add the note too
* @param closingDocument- the closing document
*/
public void addCloseNote(CustomerInvoiceDocument documentToClose, WorkflowDocument closingDocument);
/**
* Calculates the total amount of applied payments - either applied via payment application or customer credit memo documents - against the given invoice.
* @param invoice the invoice to find a payment amount for
* @return the applied payment amount
*/
public KualiDecimal calculateAppliedPaymentAmount(CustomerInvoiceDocument invoice);
}