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.InvoiceDocument;
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 InvoiceService implementation.
33 */
34 public interface InvoiceService extends AccountsPayableDocumentSpecificService {
35
36 /**
37 * Obtains a list of invoice documents given the purchase order id.
38 *
39 * @param poDocId The purchase order id to be used to obtain a list of invoice documents.
40 * @return The List of invoice documents given the purchase order id.
41 */
42 public List<InvoiceDocument> getInvoicesByPurchaseOrderId(Integer poDocId);
43
44 /**
45 * Obtains a list of invoice 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 invoice documents.
49 * @param invoiceAmount The invoice amount used to obtain the invoice documents.
50 * @param invoiceDate The invoice date used to obtain the invoice documents.
51 * @return The List of invoice documents that match the given criterias (purchase order id, invoice amount and invoice date).
52 */
53 public List getInvoicesByPOIdInvoiceAmountInvoiceDate(Integer poId, KualiDecimal invoiceAmount, Date invoiceDate);
54
55 /**
56 * Obtains a list of invoice documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
57 *
58 * @param vendorHeaderGeneratedIdentifier
59 * The vendorHeaderGeneratedIdentifier used to obtain the invoice documents.
60 * @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the invoice documents.
61 * @return The List of invoice documents that match the given criterias.
62 */
63 public List getInvoicesByVendorNumber(Integer vendorHeaderGeneratedIdentifier, Integer vendorDetailAssignedIdentifier);
64
65 /**
66 * Obtains a list of invoice documents given the vendorHeaderGeneratedIdentifier, vendorDetailAssignedIdentifier and the invoice number.
67 *
68 * @param vendorHeaderGeneratedIdentifier
69 * The vendorHeaderGeneratedIdentifier used to obtain the invoice documents.
70 * @param vendorDetailAssignedIdentifier The vendorDetailAssignedIdentifier used to obtain the invoice documents.
71 * @param invoiceNumber The invoice number used to obtain the invoice documents.
72 * @return The List of invoice documents that match the given criterias.
73 */
74 public List getInvoicesByVendorNumberInvoiceNumber(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 invoice 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 invoice 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> invoiceDuplicateMessages(InvoiceDocument 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 Date calculatePayDate(Date invoiceDate, PaymentTermType terms);
104
105 /**
106 * Marks a invoice on hold.
107 *
108 * @param document The invoice document to be marked as on hold.
109 * @param note The note to be added to the invoice document while being marked as on hold.
110 * @return The InvoiceDocument with updated information.
111 * @throws Exception
112 */
113 public InvoiceDocument addHoldOnInvoice(InvoiceDocument document, String note) throws Exception;
114
115 /**
116 * Removes a hold on a invoice.
117 *
118 * @param document The invoice document whose hold is to be removed.
119 * @param note The note to be added to the invoice document while its hold is being removed.
120 * @return The InvoiceDocument with updated information.
121 * @throws Exception
122 */
123 public InvoiceDocument removeHoldOnInvoice(InvoiceDocument document, String note) throws Exception;
124
125 /**
126 * Obtains the invoice document given the purapDocumentIdentifier.
127 *
128 * @param poDocId The purapDocumentIdentifier of the invoice document to be obtained.
129 * @return The invoice document whose purapDocumentIdentifier matches with the input parameter.
130 */
131 public InvoiceDocument getInvoiceById(Integer poDocId);
132
133 /**
134 * Obtains the invoice document given the document number.
135 *
136 * @param documentNumber The document number to be used to obtain the invoice document.
137 * @return The invoice document whose document number matches with the given input parameter.
138 */
139 public InvoiceDocument getInvoiceByDocumentNumber(String documentNumber);
140
141 /**
142 * Marks a invoice as requested to be canceled.
143 *
144 * @param document The invoice document to be marked as requested to be canceled.
145 * @param note The note to be added to the invoice document while being marked as requested to be canceled.
146 * @throws Exception
147 */
148 public void requestCancelOnInvoice(InvoiceDocument document, String note) throws Exception;
149
150 /**
151 * Returns true if the invoice has been extracted
152 *
153 * @param document The invoice document to be determined whether it is extracted.
154 * @return boolean true if the invoice document is extracted.
155 */
156 public boolean isExtracted(InvoiceDocument document);
157
158 /**
159 * Removes a request cancel on invoice.
160 *
161 * @param document The invoice document to be used for request cancel.
162 * @param note The note to be added to the invoice document upon the removal of the request cancel.
163 * @throws Exception
164 */
165 public void removeRequestCancelOnInvoice(InvoiceDocument document, String note) throws Exception;
166
167 /**
168 * Resets a Invoice that had an associated Invoice or Credit Memo cancelled externally.
169 *
170 * @param invoice The extracted invoice document to be resetted.
171 * @param note The note to be added to the invoice document upon its reset.
172 */
173 public void resetExtractedInvoice(InvoiceDocument invoice, String note);
174
175 /**
176 * Cancels a PREQ that has already been extracted if allowed.
177 *
178 * @param invoice The extracted invoice document to be canceled.
179 * @param note The note to be added to the invoice document.
180 */
181 public void cancelExtractedInvoice(InvoiceDocument invoice, String note);
182
183 /**
184 * Get all the invoices 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 invoice documents.
187 * @return The iterator of the list of the resulting invoice documents returned by the invoiceDao.
188 */
189 public Collection<InvoiceDocument> getImmediateInvoicesToExtract(String chartCode);
190
191 /**
192 * Get all the invoices that match a credit memo.
193 *
194 * @param cmd The credit memo document to be used to obtain the invoices.
195 * @return The iterator of the resulting invoice documents returned by the invoiceDao.
196 */
197 public Collection<InvoiceDocument> getInvoicesToExtractByCM(String campusCode, VendorCreditMemoDocument cmd);
198
199 /**
200 * Get all the invoices that match a vendor.
201 *
202 * @param vendor
203 * @param onOrBeforeInvoicePayDate only invoices with a pay date on or before this date will be extracted
204 * @return Collection of the resulting invoice documents returned by the invoiceDao.
205 */
206 public Collection<InvoiceDocument> getInvoicesToExtractByVendor(String campusCode, VendorGroupingHelper vendor, Date onOrBeforeInvoicePayDate);
207
208 /**
209 * Get all the invoices that need to be extracted.
210 *
211 * @return The Collection of the resulting invoice documents returned by the invoiceDao.
212 */
213 public Collection<InvoiceDocument> getInvoicesToExtract(Date onOrBeforeInvoicePayDate);
214
215 /**
216 * Get all the special invoices 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 invoice documents.
219 * @return The Collection of the resulting invoice documents returned by the invoiceDao.
220 */
221 public Collection<InvoiceDocument> getInvoicesToExtractSpecialPayments(String chartCode, Date onOrBeforeInvoicePayDate);
222
223 /**
224 * Get all the regular invoices for a single campus.
225 *
226 * @param chartCode The chart code to be used as one of the criterias to retrieve the invoice documents.
227 * @return The collection of the resulting invoice documents returned by the invoiceDao.
228 */
229 public Collection<InvoiceDocument> getInvoiceToExtractByChart(String chartCode, Date onOrBeforeInvoicePayDate);
230
231 /**
232 * Recalculate the invoice.
233 *
234 * @param pr The invoice document to be calculated.
235 * @param updateDiscount boolean true if we also want to calculate the discount items for the invoice.
236 */
237 public void calculateInvoice(InvoiceDocument 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 * <p/>
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 * <p/>
249 * Federal tax lines are generated if the federal tax rate in the invoice is not zero.
250 * State tax lines are generated if the state tax rate in the invoice is not zero.
251 * Gross up tax lines are generated if the tax gross up indicator is set on the invoice and the tax rate is not zero.
252 *
253 * @param preq The invoice the NRA tax lines will be added to.
254 */
255 public void calculateTaxArea(InvoiceDocument preq);
256
257 /**
258 * Populate invoice.
259 *
260 * @param preq The invoice document to be populated.
261 */
262 // public void populateInvoice(InvoiceDocument preq);
263
264 /**
265 * Populate and save invoice.
266 *
267 * @param preq The invoice document to be populated and saved.
268 */
269 public void populateAndSaveInvoice(InvoiceDocument preq) throws WorkflowException;
270
271 /**
272 * Retrieve a list of PREQs that aren't approved, check to see if they match specific requirements, then auto-approve them if
273 * possible.
274 *
275 * @return boolean true if the auto approval of invoices has at least one error.
276 */
277 public boolean autoApproveInvoices();
278
279 /**
280 * Checks whether the invoice 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 invoice document number (not the invoice 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 invoice 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 autoApproveInvoice(String docNumber, KualiDecimal defaultMinimumLimit);
291
292 /**
293 * Checks whether the invoice 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 invoice 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 invoice 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 autoApproveInvoice(InvoiceDocument doc, KualiDecimal defaultMinimumLimit);
304
305 /**
306 * Mark a invoice as being paid and set the invoice's paid date as the processDate.
307 *
308 * @param pr The invoice document to be marked as paid and paid date to be set.
309 * @param processDate The date to be set as the invoice's paid date.
310 */
311 public void markPaid(InvoiceDocument pr, Date processDate);
312
313 /**
314 * This method specifies whether the invoice document has a discount item.
315 *
316 * @param preq The invoice document to be verified whether it has a discount item.
317 * @return boolean true if the invoice document has at least one discount item.
318 */
319 public boolean hasDiscountItem(InvoiceDocument preq);
320
321 /**
322 * Changes the current vendor to the vendor passed in.
323 *
324 * @param preq
325 * @param headerId
326 * @param detailId
327 */
328 public void changeVendor(InvoiceDocument preq, Integer headerId, Integer detailId);
329
330 /**
331 * A method to create the description for the invoice document.
332 *
333 * @param purchaseOrderIdentifier The purchase order identifier to be used as part of the description.
334 * @param vendorName The vendor name to be used as part of the description.
335 * @return The resulting description string for the invoice document.
336 */
337 public String createPreqDocumentDescription(Integer purchaseOrderIdentifier, String vendorName);
338
339 /**
340 * Determines if there are active invoices for a purchase order.
341 *
342 * @param purchaseOrderIdentifier
343 * @return
344 */
345 public boolean hasActiveInvoicesForPurchaseOrder(Integer purchaseOrderIdentifier);
346
347 public void processInvoiceInReceivingStatus();
348
349 /**
350 * Invoices created in the previous fiscal year get backdated if we're at the beginning of the new fiscal year (i.e.
351 * prior to first closing)
352 *
353 * @param invoiceDocument
354 * @return
355 */
356 public boolean allowBackpost(InvoiceDocument invoiceDocument);
357
358 public boolean isPurchaseOrderValidForInvoiceDocumentCreation(InvoiceDocument invoiceDocument, PurchaseOrderDocument po);
359
360 /**
361 * Removes additional charge items that are not eligible on the invoice document.
362 *
363 * @param document
364 */
365 public void removeIneligibleAdditionalCharges(InvoiceDocument document);
366
367 public boolean encumberedItemExistsForInvoicing(PurchaseOrderDocument document);
368
369 /**
370 * Clears tax info.
371 *
372 * @param document The disbursement voucher document being modified.
373 */
374 public void clearTax(InvoiceDocument document);
375
376 /**
377 * Checks whether the invoice document is eligible for auto approval. If so, then updates
378 * the status of the document to auto approved and calls the documentService to blanket approve
379 * the document, then returns false.
380 * If the document is not eligible for auto approval then returns true.
381 *
382 * @param docNumber The invoice document number (not the invoice ID) to be auto approved.
383 * @return boolean true if the invoice document is not eligible for auto approval.
384 * @throws RuntimeException To indicate to Spring transactional management that the transaction for this document should be rolled back
385 */
386 public boolean autoApprovePaymentRequest(String docNumber);
387
388 public String getParameter(String namespaceCode, String componentCode, String parameterName);
389
390 public boolean getParameterBoolean(String namespaceCode, String componentCode, String parameterName);
391
392 }
393