/*
* 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.service;
import java.util.List;
import java.util.Set;
import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
import org.kuali.kfs.module.purap.businessobject.PurApItem;
import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
import org.kuali.kfs.module.purap.util.SummaryAccount;
import org.kuali.kfs.module.purap.util.UseTaxContainer;
import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
import org.kuali.rice.core.api.util.type.KualiDecimal;
/**
* This class is used to generate Account Summaries for the Purchasing Accounts Payable Module account lists as well as to generate account lists that can be
* used for distribution to below the line items or any other items that may require distribution
*/
public interface PurapAccountingService {
/**
* unused see other generateAccountDistribution methods
* @deprecated
* @param accounts
* @param totalAmount
* @param percentScale
* @return
*/
@Deprecated
public List<PurApAccountingLine> generateAccountDistributionForProration(List<SourceAccountingLine> accounts, KualiDecimal totalAmount, Integer percentScale);
/**
*
* Determines an appropriate account distribution for a particular Purchasing Accounts Payable list of Accounts. It does this by looking at the accounts that were provided
* which should be generated from a generateSummary method. It then builds up a list of PurApAccountingLines (specified by the Class variable) and tries to determine the
* appropriate percents to use on the new accounts, this may require some moving of percents to the last account as a slush.
*
* @param accounts the incoming source accounts from generateSummary
* @param totalAmount the total amount of the document
* @param percentScale the scale to round to
* @param clazz the class of the Purchasing Accounts Payable Account
* @return a list of new Purchasing Accounts Payable Accounts
*/
public List<PurApAccountingLine> generateAccountDistributionForProration(List<SourceAccountingLine> accounts, KualiDecimal totalAmount, Integer percentScale, Class clazz);
/**
*
* Determines an appropriate account distribution for a particular Purchasing Accounts Payable list of Accounts. It does this by looking at the accounts that were provided
* which should be generated from a generateSummary method. It then builds up a list of PurApAccountingLines (specified by the Class variable) and tries to determine the
* appropriate percents to use on the new accounts, this may require some moving of percents to the last account as a slush. This is called when a document has a zero dollar
* total
* @param accounts the incoming source accounts from generateSummary
* @param percentScale the scale to round to
* @param clazz the class of the Purchasing Accounts Payable Account
* @return a list of new Purchasing Accounts Payable Accounts
*/
public List<PurApAccountingLine> generateAccountDistributionForProrationWithZeroTotal(PurchasingAccountsPayableDocument purapdoc);
/**
*
* This creates summary accounts based on a list of items.
* @param document the document to generate the summary accounts from
* @return a list of summary accounts.
*/
public List<SummaryAccount> generateSummaryAccounts(PurchasingAccountsPayableDocument document);
/**
*
* This creates summary accounts based on a list of items excluding zero totals.
* @param document the document to generate the summary accounts from
* @return a list of summary accounts.
*/
public List<SummaryAccount> generateSummaryAccountsWithNoZeroTotals(PurchasingAccountsPayableDocument document);
/**
*
* This creates summary accounts based on a list of items excluding zero totals and use tax.
* @param document the document to generate the summary accounts from
* @return a list of summary accounts.
*/
public List<SummaryAccount> generateSummaryAccountsWithNoZeroTotalsNoUseTax(PurchasingAccountsPayableDocument document);
/**
*
* Generates an account summary, that is it creates a list of source accounts
* by rounding up the Purchasing Accounts Payable accounts off of the Purchasing Accounts Payable items.
*
* @param document the document to generate the summary from
* @return a list of source accounts
*/
public List<SourceAccountingLine> generateSummary(List<PurApItem> items);
/**
* Generates an account summary with only taxable accounts.
*
* @param items
* @return
*/
public List<SourceAccountingLine> generateSummaryTaxableAccounts(List<PurApItem> items);
/**
*
* convenience method that generates a list of source accounts while excluding items with
* $0 amounts
*
* @param items the items to generate source accounts from
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryWithNoZeroTotals(List<PurApItem> items);
/**
*
* convenience method that generates a list of source accounts while excluding items with
* $0 amounts and use tax
*
* @param items the items to generate source accounts from
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryWithNoZeroTotalsNoUseTax(List<PurApItem> items);
/**
*
* convenience method that generates a list of source accounts while excluding items with
* $0 amounts and using the alternate amount
*
* @param items the items to generate source accounts from
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryWithNoZeroTotalsUsingAlternateAmount(List<PurApItem> items);
/**
*
* convenience method that generates a list of source accounts while excluding items with
* the specified item types
*
* @param items the items to generate source accounts from
* @param excludedItemTypeCodes the item types to exclude
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryExcludeItemTypes(List<PurApItem> items, Set excludedItemTypeCodes);
/**
*
* convenience method that generates a list of source accounts while excluding items with
* the specified item types and not including items with zero totals
*
* @param items the items to generate source accounts from
* @param excludedItemTypeCodes the item types to exclude
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryExcludeItemTypesAndNoZeroTotals(List<PurApItem> items, Set excludedItemTypeCodes);
/**
*
* convenience method that generates a list of source accounts while only including items with
* the specified item types
*
* @param items the items to generate source accounts from
* @param excludedItemTypeCodes the item types to include
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryIncludeItemTypes(List<PurApItem> items, Set includedItemTypeCodes);
/**
*
* convenience method that generates a list of source accounts while only including items with
* the specified item types and not including items with zero totals
*
* @param items the items to generate source accounts from
* @param excludedItemTypeCodes the item types to include
* @return a list of source accounts "rolled up" from the purap accounts
*/
public List<SourceAccountingLine> generateSummaryIncludeItemTypesAndNoZeroTotals(List<PurApItem> items, Set includedItemTypeCodes);
/**
* Updates account amounts based on the percents. If this is a preq past full entry it updates the
* percents based on the amounts instead
*
* @param document the document
*/
public void updateAccountAmounts(PurchasingAccountsPayableDocument document);
/**
* Updates a single items account amounts
*
* @param item
*/
public void updateItemAccountAmounts(PurApItem item);
/**
* Updates a single preq item accounts amounts
*
* @param item
*/
public void updatePreqItemAccountAmounts(PurApItem item);
/**
* Updates a single preq item accounts amounts
*
* @param item
*/
public void updatePreqProportionalItemAccountAmounts(PurApItem item);
public List<PurApAccountingLine> getAccountsFromItem(PurApItem item);
/**
* Deletes the ap summary accounts by the id of the doc type (Payment Request - PREQ or Credit Memo - CM)
*
* @param purapDocumentIdentifier The purapDocumentIdentifier of the document whose summary accounts are to be deleted.
*/
public void deleteSummaryAccounts(Integer purapDocumentIdentifier, String docType);
/**
* Retrieves the ap summary accounts by the id of the doc type (Payment Request - PREQ or Credit Memo - CM)
*
* @param purapDocumentIdentifier The purapDocumentIdentifier of the document.
*/
public List getAccountsPayableSummaryAccounts(Integer purapDocumentIdentifier, String docType);
/**
*
* This method generates summary accounts for a vendor payment.
* @param document
* @return This will get the proper amount on the items that is sent to the vendor
*/
public List<SourceAccountingLine> generateSourceAccountsForVendorRemit(PurchasingAccountsPayableDocument document);
/**
* Converts the amount to percent and updates the percent field on the CreditMemoAccount
*
* @param pr The payment request document containing the accounts whose percentage would be set.
*/
public void convertMoneyToPercent(PaymentRequestDocument pr);
/**
* Generates use tax helper class for a purap document
* @param document
* @return useTaxContainer
*/
public List<UseTaxContainer> generateUseTaxAccount(PurchasingAccountsPayableDocument document);
/**
* Checks whether the specified accounting line in the specified PurAP document is used for tax withholding.
* This applies only to PaymentRequestDocument; otherwise it always returns false.
* @param document the specified PurAP document
* @param account the specified accounting line
* @return true if the accounting line is a tax account
*/
public boolean isTaxAccount(PurchasingAccountsPayableDocument document, SourceAccountingLine account);
/**
* calculates values for a list of accounting lines based on an amount
*
* @param <T>
* @param sourceAccountingLines
* @param totalAmount
*/
public <T extends PurApAccountingLine> void updateAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
/**
* calculates values for a list of accounting lines based on an amount taking discount into account
*
* @param <T>
* @param sourceAccountingLines
* @param totalAmount
* @param discountAmount
*/
public <T extends PurApAccountingLine> void updateAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount, KualiDecimal discountAmount);
/**
* calculates values for a list of accounting lines based on an amount on preq for sequential method.
*
* @param <T>
* @param sourceAccountingLines
* @param totalAmount
*/
public <T extends PurApAccountingLine> void updatePreqAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
/**
* calculates values for a list of accounting lines based on an amount on preq for proportional method.
*
* @param <T>
* @param sourceAccountingLines
* @param totalAmount
*/
public <T extends PurApAccountingLine> void updatePreqProporationalAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
/**
* Merges list 2 into list 1
*
* @param list1
* @param list2
* @return
*/
public List<SourceAccountingLine> mergeAccountingLineLists(List<SourceAccountingLine> accountingLines1, List<SourceAccountingLine> accountingLines2);
/**
* Retrieves the summary accounts by payment request document id.
*
* @param paymentRequestIdentifier - payment request document id
* @return List of SummaryAccounts
*/
public List getSummaryAccountsbyPaymentRequestIdentifier(Integer paymentRequestIdentifier);
/**
* Retrieves the summary accounts by credit memo document id.
*
* @param creditMemoIdentifier - credit memo document id
* @return List of SummaryAccounts
*/
public List getSummaryAccountsbyCreditMemoIdentifier(Integer creditMemoIdentifier);
}