/*
* 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.HashMap;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
import org.kuali.kfs.module.purap.util.VendorGroupingHelper;
import org.kuali.kfs.vnd.businessobject.PaymentTermType;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.exception.WorkflowException;
/**
* Defines methods that must be implemented by a PaymentRequestService implementation.
*/
public interface PaymentRequestService extends AccountsPayableDocumentSpecificService {
/**
* Obtains a list of payment request documents given the purchase order id.
*
* @param poDocId The purchase order id to be used to obtain a list of payment request documents.
* @return The List of payment request documents given the purchase order id.
*/
public List<PaymentRequestDocument> getPaymentRequestsByPurchaseOrderId(Integer poDocId);
/**
* Obtains a list of payment request documents given the purchase order id, the invoice amount
* and the invoice date.
*
* @param poId The purchase order id used to obtain the payment request documents.
* @param invoiceAmount The invoice amount used to obtain the payment request documents.
* @param invoiceDate The invoice date used to obtain the payment request documents.
* @return The List of payment request documents that match the given criterias (purchase order id, invoice amount and invoice date).
*/
public List getPaymentRequestsByPOIdInvoiceAmountInvoiceDate(Integer poId, KualiDecimal invoiceAmount, Date invoiceDate);
/**
* Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
*
* @param vendorHeaderGeneratedIdentifier The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
* @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the payment request documents.
* @return The List of payment request documents that match the given criterias.
*/
public List getPaymentRequestsByVendorNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier);
/**
* Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
*
* @param vendorHeaderGeneratedIdentifier The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
* @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the payment request documents.
* @param invoiceNumber The invoice number used to obtain the payment request documents.
* @return The List of payment request documents that match the given criterias.
*/
public List getPaymentRequestsByVendorNumberInvoiceNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier, String invoiceNumber);
/**
* Determines whether the invoice date is after today.
*
* @param invoiceDate The invoice date to be determined whether it's after today.
* @return boolean true if the given invoice date is after today.
*/
public boolean isInvoiceDateAfterToday(Date invoiceDate);
/**
* Performs the processing to check whether the payment request is a duplicate and if so, adds
* the information about the type of duplication into the resulting HashMap to be returned by this method.
*
* @param document The payment request document to be processed/checked for duplicates.
* @return The HashMap containing "PREQDuplicateInvoice" as the key and the string
* describing the types of duplication as the value.
*/
public HashMap<String, String> paymentRequestDuplicateMessages(PaymentRequestDocument document);
/**
* Calculate based on the terms and calculate a date 10 days from today. Pick the one that is the farthest out. We always
* calculate the discount date, if there is one.
*
* @param invoiceDate The invoice date to be used in the pay date calculation.
* @param terms The payment term type to be used in the pay date calculation.
* @return The resulting pay date given the invoice date and the terms.
*/
public java.sql.Date calculatePayDate(Date invoiceDate, PaymentTermType terms);
/**
* Marks a payment request on hold.
*
* @param document The payment request document to be marked as on hold.
* @param note The note to be added to the payment request document while being marked as on hold.
* @return The PaymentRequestDocument with updated information.
* @throws Exception
*/
public PaymentRequestDocument addHoldOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
/**
* Removes a hold on a payment request.
*
* @param document The payment request document whose hold is to be removed.
* @param note The note to be added to the payment request document while its hold is being removed.
* @return The PaymentRequestDocument with updated information.
* @throws Exception
*/
public PaymentRequestDocument removeHoldOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
/**
* Obtains the payment request document given the purapDocumentIdentifier.
*
* @param poDocId The purapDocumentIdentifier of the payment request document to be obtained.
* @return The payment request document whose purapDocumentIdentifier matches with the input parameter.
*/
public PaymentRequestDocument getPaymentRequestById(Integer poDocId);
/**
* Obtains the payment request document given the document number.
*
* @param documentNumber The document number to be used to obtain the payment request document.
* @return The payment request document whose document number matches with the given input parameter.
*/
public PaymentRequestDocument getPaymentRequestByDocumentNumber(String documentNumber);
/**
* Marks a payment request as requested to be canceled.
*
* @param document The payment request document to be marked as requested to be canceled.
* @param note The note to be added to the payment request document while being marked as requested to be canceled.
* @throws Exception
*/
public void requestCancelOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
/**
* Returns true if the payment request has been extracted
*
* @param document The payment request document to be determined whether it is extracted.
* @return boolean true if the payment request document is extracted.
*/
public boolean isExtracted(PaymentRequestDocument document);
/**
* Removes a request cancel on payment request.
*
* @param document The payment request document to be used for request cancel.
* @param note The note to be added to the payment request document upon the removal of the request cancel.
* @throws Exception
*/
public void removeRequestCancelOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
/**
* Resets a Payment Request that had an associated Payment Request or Credit Memo cancelled externally.
*
* @param paymentRequest The extracted payment request document to be resetted.
* @param note The note to be added to the payment request document upon its reset.
*/
public void resetExtractedPaymentRequest(PaymentRequestDocument paymentRequest, String note);
/**
* Cancels a PREQ that has already been extracted if allowed.
*
* @param paymentRequest The extracted payment request document to be canceled.
* @param note The note to be added to the payment request document.
*/
public void cancelExtractedPaymentRequest(PaymentRequestDocument paymentRequest, String note);
/**
* Get all the payment requests that are immediate and need to be extracted to PDP.
*
* @param chartCode The chart code to be used as one of the criterias to retrieve the payment request documents.
* @return The iterator of the list of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getImmediatePaymentRequestsToExtract(String chartCode);
/**
* Get all the payment requests that match a credit memo.
*
* @param cmd The credit memo document to be used to obtain the payment requests.
* @return The iterator of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getPaymentRequestsToExtractByCM(String campusCode, VendorCreditMemoDocument cmd);
/**
* Get all the payment requests that match a vendor.
*
* @param vendor
* @param onOrBeforePaymentRequestPayDate only payment requests with a pay date on or before this date will be extracted
* @return Collection of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getPaymentRequestsToExtractByVendor(String campusCode, VendorGroupingHelper vendor, Date onOrBeforePaymentRequestPayDate);
/**
* Get all the payment requests that need to be extracted.
*
* @return The Collection of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getPaymentRequestsToExtract(Date onOrBeforePaymentRequestPayDate);
/**
* Get all the special payment requests for a single chart that need to be extracted.
*
* @param chartCode The chart code to be used as one of the criterias to retrieve the payment request documents.
* @return The Collection of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getPaymentRequestsToExtractSpecialPayments(String chartCode, Date onOrBeforePaymentRequestPayDate);
/**
* Get all the regular payment requests for a single campus.
*
* @param chartCode The chart code to be used as one of the criterias to retrieve the payment request documents.
* @return The collection of the resulting payment request documents returned by the paymentRequestDao.
*/
public Collection<PaymentRequestDocument> getPaymentRequestToExtractByChart(String chartCode, Date onOrBeforePaymentRequestPayDate);
/**
* Recalculate the payment request.
*
* @param pr The payment request document to be calculated.
* @param updateDiscount boolean true if we also want to calculate the discount items for the payment request.
*/
public void calculatePaymentRequest(PaymentRequestDocument pr, boolean updateDiscount);
/**
* Performs calculations on the tax edit area, generates and adds NRA tax charge items as below the line items, with their accounting lines;
* the calculation will activate updates on the account summary tab and the general ledger entries as well.
*
* The non-resident alien (NRA) tax lines consist of four possible sets of tax lines:
* - Federal tax lines
* - Federal Gross up tax lines
* - State tax lines
* - State Gross up tax lines
*
* Federal tax lines are generated if the federal tax rate in the payment request is not zero.
* State tax lines are generated if the state tax rate in the payment request is not zero.
* Gross up tax lines are generated if the tax gross up indicator is set on the payment request and the tax rate is not zero.
*
* @param preq The payment request the NRA tax lines will be added to.
*
*/
public void calculateTaxArea(PaymentRequestDocument preq);
/**
* Populate payment request.
*
* @param preq The payment request document to be populated.
*/
public void populatePaymentRequest(PaymentRequestDocument preq);
/**
* Populate and save payment request.
*
* @param preq The payment request document to be populated and saved.
*/
public void populateAndSavePaymentRequest(PaymentRequestDocument preq) throws WorkflowException;
/**
* Retrieve a list of PREQs that aren't approved, check to see if they match specific requirements, then auto-approve them if
* possible.
*
* @return boolean true if the auto approval of payment requests has at least one error.
*/
public boolean autoApprovePaymentRequests();
/**
* Checks whether the payment request document is eligible for auto approval. If so, then updates
* the status of the document to auto approved and calls the documentService to blanket approve
* the document, then returns false.
* If the document is not eligible for auto approval then returns true.
*
* @param docNumber The payment request document number (not the payment request ID) to be auto approved.
* @param defaultMinimumLimit The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
* @return boolean true if the payment request document is not eligible for auto approval.
* @throws RuntimeException To indicate to Spring transactional management that the transaction for this document should be rolled back
*/
public boolean autoApprovePaymentRequest(String docNumber, KualiDecimal defaultMinimumLimit);
/**
* Checks whether the payment request document is eligible for auto approval. If so, then updates
* the status of the document to auto approved and calls the documentService to blanket approve
* the document, then returns false.
* If the document is not eligible for auto approval then returns true.
*
* @param doc The payment request document to be auto approved.
* @param defaultMinimumLimit The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
* @return boolean true if the payment request document is not eligible for auto approval.
* @throws RuntimeException To indicate to Spring transactional management that the transaction for this document should be rolled back
*/
public boolean autoApprovePaymentRequest(PaymentRequestDocument doc, KualiDecimal defaultMinimumLimit);
/**
* Mark a payment request as being paid and set the payment request's paid date as the processDate.
*
* @param pr The payment request document to be marked as paid and paid date to be set.
* @param processDate The date to be set as the payment request's paid date.
*/
public void markPaid(PaymentRequestDocument pr, Date processDate);
/**
* This method specifies whether the payment request document has a discount item.
*
* @param preq The payment request document to be verified whether it has a discount item.
* @return boolean true if the payment request document has at least one discount item.
*/
public boolean hasDiscountItem(PaymentRequestDocument preq);
/**
* Changes the current vendor to the vendor passed in.
*
* @param preq
* @param headerId
* @param detailId
* @param primaryHeaderId
* @param primaryDetailId
*/
public void changeVendor(PaymentRequestDocument preq, Integer headerId, Integer detailId);
/**
* A method to create the description for the payment request document.
*
* @param purchaseOrderIdentifier The purchase order identifier to be used as part of the description.
* @param vendorName The vendor name to be used as part of the description.
* @return The resulting description string for the payment request document.
*/
public String createPreqDocumentDescription(Integer purchaseOrderIdentifier, String vendorName);
/**
* Determines if there are active payment requests for a purchase order.
*
* @param purchaseOrderIdentifier
* @return
*/
public boolean hasActivePaymentRequestsForPurchaseOrder(Integer purchaseOrderIdentifier);
public void processPaymentRequestInReceivingStatus();
/**
* Payment Requests created in the previous fiscal year get backdated if we're at the beginning of the new fiscal year (i.e.
* prior to first closing)
*
* @param paymentRequestDocument
* @return
*/
public boolean allowBackpost(PaymentRequestDocument paymentRequestDocument);
public boolean isPurchaseOrderValidForPaymentRequestDocumentCreation(PaymentRequestDocument paymentRequestDocument,PurchaseOrderDocument po);
/**
* Removes additional charge items that are not eligible on the payment request document.
*
* @param document
*/
public void removeIneligibleAdditionalCharges(PaymentRequestDocument document);
public boolean encumberedItemExistsForInvoicing(PurchaseOrderDocument document);
/**
* Clears tax info.
*
* @param document The disbursement voucher document being modified.
*/
public void clearTax(PaymentRequestDocument document);
/**
* fetches list of document numebrs of payment requests for a given purchase order id.
* It filters the records by application document status.
*
* KFSMI-8687: The code is refactored from the patch provided in KFSCNTRB-14.
*
* @param applicationDocumentStatus
* @param purchaseOrderId
* @return Map <String, String> results indicating if hasInProcess and checkInProcess
* has results.
*/
public Map <String, String> getPaymentRequestsByStatusAndPurchaseOrderId(String applicationDocumentStatus, Integer purchaseOrderId);
}