1 /*
2 * Copyright 2007 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.ole.module.purap.document.service;
17
18 import org.kuali.ole.module.purap.document.PaymentRequestDocument;
19 import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
20 import org.kuali.ole.module.purap.document.VendorCreditMemoDocument;
21 import org.kuali.ole.module.purap.util.VendorGroupingHelper;
22 import org.kuali.ole.vnd.businessobject.PaymentTermType;
23 import org.kuali.rice.core.api.util.type.KualiDecimal;
24 import org.kuali.rice.kew.api.exception.WorkflowException;
25
26 import java.sql.Date;
27 import java.util.Collection;
28 import java.util.HashMap;
29 import java.util.List;
30
31 /**
32 * Defines methods that must be implemented by a PaymentRequestService implementation.
33 */
34 public interface PaymentRequestService extends AccountsPayableDocumentSpecificService {
35
36 /**
37 * Obtains a list of payment request documents given the purchase order id.
38 *
39 * @param poDocId The purchase order id to be used to obtain a list of payment request documents.
40 * @return The List of payment request documents given the purchase order id.
41 */
42 public List<PaymentRequestDocument> getPaymentRequestsByPurchaseOrderId(Integer poDocId);
43
44 /**
45 * Obtains a list of payment request documents given the purchase order id, the invoice amount
46 * and the invoice date.
47 *
48 * @param poId The purchase order id used to obtain the payment request documents.
49 * @param invoiceAmount The invoice amount used to obtain the payment request documents.
50 * @param invoiceDate The invoice date used to obtain the payment request documents.
51 * @return The List of payment request documents that match the given criterias (purchase order id, invoice amount and invoice date).
52 */
53 public List getPaymentRequestsByPOIdInvoiceAmountInvoiceDate(Integer poId, KualiDecimal invoiceAmount, Date invoiceDate);
54
55 /**
56 * Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
57 *
58 * @param vendorHeaderGeneratedIdentifier
59 * The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
60 * @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the payment request documents.
61 * @return The List of payment request documents that match the given criterias.
62 */
63 public List getPaymentRequestsByVendorNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier);
64
65 /**
66 * Obtains a list of payment request documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
67 *
68 * @param vendorHeaderGeneratedIdentifier
69 * The vendorHeaderGeneratedIdentifier used to obtain the payment request documents.
70 * @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the payment request documents.
71 * @param invoiceNumber The invoice number used to obtain the payment request documents.
72 * @return The List of payment request documents that match the given criterias.
73 */
74 public List getPaymentRequestsByVendorNumberInvoiceNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier, String invoiceNumber);
75
76
77 /**
78 * Determines whether the invoice date is after today.
79 *
80 * @param invoiceDate The invoice date to be determined whether it's after today.
81 * @return boolean true if the given invoice date is after today.
82 */
83 public boolean isInvoiceDateAfterToday(Date invoiceDate);
84
85 /**
86 * Performs the processing to check whether the payment request is a duplicate and if so, adds
87 * the information about the type of duplication into the resulting HashMap to be returned by this method.
88 *
89 * @param document The payment request document to be processed/checked for duplicates.
90 * @return The HashMap containing "PREQDuplicateInvoice" as the key and the string
91 * describing the types of duplication as the value.
92 */
93 public HashMap<String, String> paymentRequestDuplicateMessages(PaymentRequestDocument document);
94
95 /**
96 * Calculate based on the terms and calculate a date 10 days from today. Pick the one that is the farthest out. We always
97 * calculate the discount date, if there is one.
98 *
99 * @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 Collection<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
204 * only payment requests with a pay date on or before this date will be extracted
205 * @return Collection of the resulting payment request documents returned by the paymentRequestDao.
206 */
207 public Collection<PaymentRequestDocument> getPaymentRequestsToExtractByVendor(String campusCode, VendorGroupingHelper vendor, Date onOrBeforePaymentRequestPayDate);
208
209 /**
210 * Get all the payment requests that need to be extracted.
211 *
212 * @return The Collection of the resulting payment request documents returned by the paymentRequestDao.
213 */
214 public Collection<PaymentRequestDocument> getPaymentRequestsToExtract(Date onOrBeforePaymentRequestPayDate);
215
216 /**
217 * Get all the special payment requests for a single chart that need to be extracted.
218 *
219 * @param chartCode The chart code to be used as one of the criterias to retrieve the payment request documents.
220 * @return The Collection of the resulting payment request documents returned by the paymentRequestDao.
221 */
222 public Collection<PaymentRequestDocument> getPaymentRequestsToExtractSpecialPayments(String chartCode, Date onOrBeforePaymentRequestPayDate);
223
224 /**
225 * Get all the regular payment requests for a single campus.
226 *
227 * @param chartCode The chart code to be used as one of the criterias to retrieve the payment request documents.
228 * @return The collection of the resulting payment request documents returned by the paymentRequestDao.
229 */
230 public Collection<PaymentRequestDocument> getPaymentRequestToExtractByChart(String chartCode, Date onOrBeforePaymentRequestPayDate);
231
232 /**
233 * Recalculate the payment request.
234 *
235 * @param pr The payment request document to be calculated.
236 * @param updateDiscount boolean true if we also want to calculate the discount items for the payment request.
237 */
238 public void calculatePaymentRequest(PaymentRequestDocument pr, boolean updateDiscount);
239
240 /**
241 * Performs calculations on the tax edit area, generates and adds NRA tax charge items as below the line items, with their accounting lines;
242 * the calculation will activate updates on the account summary tab and the general ledger entries as well.
243 * <p/>
244 * The non-resident alien (NRA) tax lines consist of four possible sets of tax lines:
245 * - Federal tax lines
246 * - Federal Gross up tax lines
247 * - State tax lines
248 * - State Gross up tax lines
249 * <p/>
250 * Federal tax lines are generated if the federal tax rate in the payment request is not zero.
251 * State tax lines are generated if the state tax rate in the payment request is not zero.
252 * 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.
253 *
254 * @param preq The payment request the NRA tax lines will be added to.
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 /**
281 * Checks whether the payment request document is eligible for auto approval. If so, then updates
282 * the status of the document to auto approved and calls the documentService to blanket approve
283 * the document, then returns false.
284 * If the document is not eligible for auto approval then returns true.
285 *
286 * @param docNumber The payment request document number (not the payment request ID) to be auto approved.
287 * @param defaultMinimumLimit The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
288 * @return boolean true if the payment request document is not eligible for auto approval.
289 * @throws RuntimeException To indicate to Spring transactional management that the transaction for this document should be rolled back
290 */
291 public boolean autoApprovePaymentRequest(String docNumber, KualiDecimal defaultMinimumLimit);
292
293 public boolean autoApprovePaymentRequest(PaymentRequestDocument doc);
294
295 /**
296 * Checks whether the payment request document is eligible for auto approval. If so, then updates
297 * the status of the document to auto approved and calls the documentService to blanket approve
298 * the document, then returns false.
299 * If the document is not eligible for auto approval then returns true.
300 *
301 * @param doc The payment request document to be auto approved.
302 * @param defaultMinimumLimit The default minimum limit amount to be used in determining the eligibility of the document to be auto approved.
303 * @return boolean true if the payment request document is not eligible for auto approval.
304 * @throws RuntimeException To indicate to Spring transactional management that the transaction for this document should be rolled back
305 */
306 public boolean autoApprovePaymentRequest(PaymentRequestDocument doc, KualiDecimal defaultMinimumLimit);
307
308 /**
309 * Mark a payment request as being paid and set the payment request's paid date as the processDate.
310 *
311 * @param pr The payment request document to be marked as paid and paid date to be set.
312 * @param processDate The date to be set as the payment request's paid date.
313 */
314 public void markPaid(PaymentRequestDocument pr, Date processDate);
315
316 /**
317 * This method specifies whether the payment request document has a discount item.
318 *
319 * @param preq The payment request document to be verified whether it has a discount item.
320 * @return boolean true if the payment request document has at least one discount item.
321 */
322 public boolean hasDiscountItem(PaymentRequestDocument preq);
323
324 /**
325 * Changes the current vendor to the vendor passed in.
326 *
327 * @param preq
328 * @param headerId
329 * @param detailId
330 */
331 public void changeVendor(PaymentRequestDocument preq, Integer headerId, Integer detailId);
332
333 /**
334 * A method to create the description for the payment request document.
335 *
336 * @param purchaseOrderIdentifier The purchase order identifier to be used as part of the description.
337 * @param vendorName The vendor name to be used as part of the description.
338 * @return The resulting description string for the payment request document.
339 */
340 public String createPreqDocumentDescription(Integer purchaseOrderIdentifier, String vendorName);
341
342 /**
343 * Determines if there are active payment requests for a purchase order.
344 *
345 * @param purchaseOrderIdentifier
346 * @return
347 */
348 public boolean hasActivePaymentRequestsForPurchaseOrder(Integer purchaseOrderIdentifier);
349
350 public void processPaymentRequestInReceivingStatus();
351
352 /**
353 * Payment Requests created in the previous fiscal year get backdated if we're at the beginning of the new fiscal year (i.e.
354 * prior to first closing)
355 *
356 * @param paymentRequestDocument
357 * @return
358 */
359 public boolean allowBackpost(PaymentRequestDocument paymentRequestDocument);
360
361 public boolean isPurchaseOrderValidForPaymentRequestDocumentCreation(PaymentRequestDocument paymentRequestDocument, PurchaseOrderDocument po);
362
363 /**
364 * Removes additional charge items that are not eligible on the payment request document.
365 *
366 * @param document
367 */
368 public void removeIneligibleAdditionalCharges(PaymentRequestDocument document);
369
370 public boolean encumberedItemExistsForInvoicing(PurchaseOrderDocument document);
371
372 /**
373 * Clears tax info.
374 *
375 * @param document The disbursement voucher document being modified.
376 */
377 public void clearTax(PaymentRequestDocument document);
378 }
379