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.HashMap;
021    import java.util.Iterator;
022    import java.util.List;
023    
024    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
025    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
026    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
027    import org.kuali.kfs.module.purap.util.VendorGroupingHelper;
028    import org.kuali.kfs.vnd.businessobject.PaymentTermType;
029    import org.kuali.rice.kew.exception.WorkflowException;
030    import org.kuali.rice.kns.util.KualiDecimal;
031    
032    /**
033     * Defines methods that must be implemented by a PaymentRequestService implementation.
034     */
035    public interface PaymentRequestService extends AccountsPayableDocumentSpecificService {
036    
037        /**
038         * Obtains a list of payment request documents given the purchase order id.
039         * 
040         * @param poDocId  The purchase order id to be used to obtain a list of payment request documents.
041         * @return         The List of payment request documents given the purchase order id.
042         */
043        public List<PaymentRequestDocument> getPaymentRequestsByPurchaseOrderId(Integer poDocId);
044    
045        /**
046         * Obtains a list of payment request documents given the purchase order id, the invoice amount
047         * and the invoice date.
048         * 
049         * @param poId           The purchase order id used to obtain the payment request documents.
050         * @param invoiceAmount  The invoice amount used to obtain the payment request documents.
051         * @param invoiceDate    The invoice date used to obtain the payment request documents.
052         * @return               The List of payment request documents that match the given criterias (purchase order id, invoice amount and invoice date).
053         */
054        public List getPaymentRequestsByPOIdInvoiceAmountInvoiceDate(Integer poId, KualiDecimal invoiceAmount, Date invoiceDate);
055    
056        /**
057         * Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
058         *
059         * @param vendorHeaderGeneratedIdentifier The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
060         * @param vendorDetailAssignedIdentifier  The vendorDetailAssignedIdentifier used to obtain the payment request documents.
061         * @return                                The List of payment request documents that match the given criterias.
062         */
063        public List getPaymentRequestsByVendorNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier);
064    
065        /**
066         * Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
067         *
068         * @param vendorHeaderGeneratedIdentifier The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
069         * @param vendorDetailAssignedIdentifier  The vendorDetailAssignedIdentifier used to obtain the payment request documents.
070         * @param invoiceNumber                   The invoice number used to obtain the payment request documents.
071         * @return                                The List of payment request documents that match the given criterias.
072         */
073        public List getPaymentRequestsByVendorNumberInvoiceNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier, String invoiceNumber);
074    
075        
076        
077        /**
078         * Determines whether the invoice date is after today.
079         * 
080         * @param invoiceDate  The invoice date to be determined whether it's after today.
081         * @return             boolean true if the given invoice date is after today.
082         */
083        public boolean isInvoiceDateAfterToday(Date invoiceDate);
084    
085        /**
086         * Performs the processing to check whether the payment request is a duplicate and if so, adds
087         * the information about the type of duplication into the resulting HashMap to be returned by this method.
088         * 
089         * @param document  The payment request document to be processed/checked for duplicates.
090         * @return          The HashMap containing "PREQDuplicateInvoice" as the key and the string
091         *                  describing the types of duplication as the value.
092         */
093        public HashMap<String, String> paymentRequestDuplicateMessages(PaymentRequestDocument document);
094    
095        /**
096         * Calculate based on the terms and calculate a date 10 days from today. Pick the one that is the farthest out. We always
097         * calculate the discount date, if there is one.
098         * 
099         * @param invoiceDate  The invoice date to be used in the pay date calculation.
100         * @param terms        The payment term type to be used in the pay date calculation.
101         * @return             The resulting pay date given the invoice date and the terms.
102         */
103        public java.sql.Date calculatePayDate(Date invoiceDate, PaymentTermType terms);
104    
105        /**
106         * Marks a payment request on hold.
107         * 
108         * @param document    The payment request document to be marked as on hold.
109         * @param note        The note to be added to the payment request document while being marked as on hold.
110         * @return            The PaymentRequestDocument with updated information.
111         * @throws Exception
112         */
113        public PaymentRequestDocument addHoldOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
114    
115        /**
116         * Removes a hold on a payment request.
117         * 
118         * @param document    The payment request document whose hold is to be removed.
119         * @param note        The note to be added to the payment request document while its hold is being removed.
120         * @return            The PaymentRequestDocument with updated information.
121         * @throws Exception
122         */
123        public PaymentRequestDocument removeHoldOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
124    
125        /**
126         * Obtains the payment request document given the purapDocumentIdentifier.
127         * 
128         * @param poDocId  The purapDocumentIdentifier of the payment request document to be obtained.
129         * @return         The payment request document whose purapDocumentIdentifier matches with the input parameter.
130         */
131        public PaymentRequestDocument getPaymentRequestById(Integer poDocId);
132    
133        /**
134         * Obtains the payment request document given the document number.
135         * 
136         * @param documentNumber  The document number to be used to obtain the payment request document.
137         * @return                The payment request document whose document number matches with the given input parameter.
138         */
139        public PaymentRequestDocument getPaymentRequestByDocumentNumber(String documentNumber);
140    
141        /**
142         * Marks a payment request as requested to be canceled.
143         * 
144         * @param document    The payment request document to be marked as requested to be canceled.
145         * @param note        The note to be added to the payment request document while being marked as requested to be canceled.
146         * @throws Exception
147         */
148        public void requestCancelOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
149    
150        /**
151         * Returns true if the payment request has been extracted
152         * 
153         * @param document  The payment request document to be determined whether it is extracted.
154         * @return          boolean true if the payment request document is extracted.
155         */
156        public boolean isExtracted(PaymentRequestDocument document);
157    
158        /**
159         * Removes a request cancel on payment request.
160         * 
161         * @param document    The payment request document to be used for request cancel.
162         * @param note        The note to be added to the payment request document upon the removal of the request cancel.
163         * @throws Exception
164         */
165        public void removeRequestCancelOnPaymentRequest(PaymentRequestDocument document, String note) throws Exception;
166    
167        /**
168         * Resets a Payment Request that had an associated Payment Request or Credit Memo cancelled externally.
169         * 
170         * @param paymentRequest  The extracted payment request document to be resetted.
171         * @param note            The note to be added to the payment request document upon its reset.
172         */
173        public void resetExtractedPaymentRequest(PaymentRequestDocument paymentRequest, String note);
174    
175        /**
176         * Cancels a PREQ that has already been extracted if allowed.
177         * 
178         * @param paymentRequest  The extracted payment request document to be canceled.
179         * @param note            The note to be added to the payment request document.
180         */
181        public void cancelExtractedPaymentRequest(PaymentRequestDocument paymentRequest, String note);
182    
183        /**
184         * Get all the payment requests that are immediate and need to be extracted to PDP.
185         * 
186         * @param chartCode  The chart code to be used as one of the criterias to retrieve the payment request documents. 
187         * @return           The iterator of the list of the resulting payment request documents returned by the paymentRequestDao.
188         */
189        public Collection<PaymentRequestDocument> getImmediatePaymentRequestsToExtract(String chartCode);
190    
191        /**
192         * Get all the payment requests that match a credit memo.
193         * 
194         * @param cmd   The credit memo document to be used to obtain the payment requests.
195         * @return      The iterator of the resulting payment request documents returned by the paymentRequestDao.
196         */
197        public Iterator<PaymentRequestDocument> getPaymentRequestsToExtractByCM(String campusCode, VendorCreditMemoDocument cmd);
198    
199        /**
200         * Get all the payment requests that match a vendor.
201         * 
202         * @param vendor
203         * @param onOrBeforePaymentRequestPayDate only payment requests with a pay date on or before this date will be extracted
204         * @return Collection of the resulting payment request documents returned by the paymentRequestDao.
205         */
206        public Collection<PaymentRequestDocument> getPaymentRequestsToExtractByVendor(String campusCode, VendorGroupingHelper vendor, Date onOrBeforePaymentRequestPayDate);
207        
208        /**
209         * Get all the payment requests that need to be extracted.
210         * 
211         * @return The Collection of the resulting payment request documents returned by the paymentRequestDao.
212         */
213        public Collection<PaymentRequestDocument> getPaymentRequestsToExtract(Date onOrBeforePaymentRequestPayDate);
214    
215        /**
216         * Get all the special payment requests for a single chart that need to be extracted.
217         * 
218         * @param chartCode  The chart code to be used as one of the criterias to retrieve the payment request documents. 
219         * @return           The Collection of the resulting payment request documents returned by the paymentRequestDao.
220         */
221        public Collection<PaymentRequestDocument> getPaymentRequestsToExtractSpecialPayments(String chartCode, Date onOrBeforePaymentRequestPayDate);
222    
223        /**
224         * Get all the regular payment requests for a single campus.
225         * 
226         * @param chartCode  The chart code to be used as one of the criterias to retrieve the payment request documents. 
227         * @return           The collection of the resulting payment request documents returned by the paymentRequestDao.
228         */
229        public Collection<PaymentRequestDocument> getPaymentRequestToExtractByChart(String chartCode, Date onOrBeforePaymentRequestPayDate);
230    
231        /**
232         * Recalculate the payment request.
233         * 
234         * @param pr              The payment request document to be calculated.
235         * @param updateDiscount  boolean true if we also want to calculate the discount items for the payment request.
236         */
237        public void calculatePaymentRequest(PaymentRequestDocument pr, boolean updateDiscount);
238    
239        /**
240         * Performs calculations on the tax edit area, generates and adds NRA tax charge items as below the line items, with their accounting lines; 
241         * the calculation will activate updates on the account summary tab and the general ledger entries as well.
242         *
243         * The non-resident alien (NRA) tax lines consist of four possible sets of tax lines: 
244         * - Federal tax lines
245         * - Federal Gross up tax lines
246         * - State tax lines
247         * - State Gross up tax lines
248         * 
249         * Federal tax lines are generated if the federal tax rate in the payment request is not zero.
250         * State tax lines are generated if the state tax rate in the payment request is not zero.
251         * 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.
252         * 
253         * @param preq The payment request the NRA tax lines will be added to.
254         * 
255         */
256        public void calculateTaxArea(PaymentRequestDocument preq);
257        
258        /**
259         * Populate payment request.
260         * 
261         * @param preq  The payment request document to be populated.
262         */
263        public void populatePaymentRequest(PaymentRequestDocument preq);
264    
265        /**
266         * Populate and save payment request.
267         * 
268         * @param preq  The payment request document to be populated and saved.
269         */
270        public void populateAndSavePaymentRequest(PaymentRequestDocument preq) throws WorkflowException;
271    
272        /**
273         * Retrieve a list of PREQs that aren't approved, check to see if they match specific requirements, then auto-approve them if
274         * possible.
275         * 
276         * @return  boolean true if the auto approval of payment requests has at least one error.
277         */
278        public boolean autoApprovePaymentRequests();
279        /**
280         * Checks whether the payment request document is eligible for auto approval. If so, then updates
281         * the status of the document to auto approved and calls the documentService to blanket approve
282         * the document, then returns false.
283         * If the document is not eligible for auto approval then returns true.
284         * 
285         * @param docNumber            The payment request document number (not the payment request ID) to be auto approved.
286         * @param defaultMinimumLimit  The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
287         * @return                     boolean true if the payment request document is not eligible for auto approval.
288         * @throws RuntimeException    To indicate to Spring transactional management that the transaction for this document should be rolled back
289         */
290        public boolean autoApprovePaymentRequest(String docNumber, KualiDecimal defaultMinimumLimit);
291        
292        /**
293         * Checks whether the payment request document is eligible for auto approval. If so, then updates
294         * the status of the document to auto approved and calls the documentService to blanket approve
295         * the document, then returns false.
296         * If the document is not eligible for auto approval then returns true.
297         * 
298         * @param doc                  The payment request document to be auto approved.
299         * @param defaultMinimumLimit  The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
300         * @return                     boolean true if the payment request document is not eligible for auto approval.
301         * @throws RuntimeException    To indicate to Spring transactional management that the transaction for this document should be rolled back
302         */
303        public boolean autoApprovePaymentRequest(PaymentRequestDocument doc, KualiDecimal defaultMinimumLimit);
304    
305        /**
306         * Mark a payment request as being paid and set the payment request's paid date as the processDate.
307         * 
308         * @param pr           The payment request document to be marked as paid and paid date to be set.
309         * @param processDate  The date to be set as the payment request's paid date.
310         */
311        public void markPaid(PaymentRequestDocument pr, Date processDate);
312    
313        /**
314         * This method specifies whether the payment request document has a discount item.
315         * 
316         * @param preq  The payment request document to be verified whether it has a discount item.
317         * @return      boolean true if the payment request document has at least one discount item.
318         */
319        public boolean hasDiscountItem(PaymentRequestDocument preq);
320        
321        /**
322         * Changes the current vendor to the vendor passed in.
323         * 
324         * @param preq
325         * @param headerId
326         * @param detailId
327         * @param primaryHeaderId
328         * @param primaryDetailId
329         */
330        public void changeVendor(PaymentRequestDocument preq, Integer headerId, Integer detailId);
331        
332        /**
333         * A method to create the description for the payment request document.
334         * 
335         * @param purchaseOrderIdentifier  The purchase order identifier to be used as part of the description.
336         * @param vendorName               The vendor name to be used as part of the description.
337         * @return                         The resulting description string for the payment request document.
338         */
339        public String createPreqDocumentDescription(Integer purchaseOrderIdentifier, String vendorName);
340        
341        /**
342         * Determines if there are active payment requests for a purchase order.
343         * 
344         * @param purchaseOrderIdentifier
345         * @return
346         */
347        public boolean hasActivePaymentRequestsForPurchaseOrder(Integer purchaseOrderIdentifier);
348        
349        public void processPaymentRequestInReceivingStatus();
350        
351        /**
352         * Payment Requests created in the previous fiscal year get backdated if we're at the beginning of the new fiscal year (i.e.
353         * prior to first closing)
354         * 
355         * @param paymentRequestDocument
356         * @return
357         */
358        public boolean allowBackpost(PaymentRequestDocument paymentRequestDocument);
359        
360        public boolean isPurchaseOrderValidForPaymentRequestDocumentCreation(PaymentRequestDocument paymentRequestDocument,PurchaseOrderDocument po);
361        
362        /**
363         * Removes additional charge items that are not eligible on the payment request document.
364         * 
365         * @param document
366         */
367        public void removeIneligibleAdditionalCharges(PaymentRequestDocument document);
368        
369        public boolean encumberedItemExistsForInvoicing(PurchaseOrderDocument document);
370    }
371