View Javadoc
1   /*
2    * Copyright 2006 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.integration.purap.CapitalAssetSystem;
19  import org.kuali.ole.module.purap.businessobject.*;
20  import org.kuali.ole.module.purap.document.ContractManagerAssignmentDocument;
21  import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
22  import org.kuali.ole.module.purap.document.PurchaseOrderSplitDocument;
23  import org.kuali.ole.module.purap.document.RequisitionDocument;
24  import org.kuali.ole.select.document.OlePurchaseOrderDocument;
25  import org.kuali.ole.vnd.businessobject.VendorDetail;
26  import org.kuali.ole.vnd.businessobject.VendorTransmissionFormatDetail;
27  import org.kuali.rice.core.api.util.type.KualiDecimal;
28  import org.kuali.rice.krad.bo.Note;
29  
30  import java.io.ByteArrayOutputStream;
31  import java.util.HashMap;
32  import java.util.List;
33  
34  /**
35   * Defines methods that must be implemented by classes providing a PurchaseOrderService.
36   */
37  public interface PurchaseOrderService extends PurchasingDocumentSpecificService {
38  
39      public boolean isCommodityCodeRequiredOnPurchaseOrder();
40  
41      public boolean isPurchaseOrderOpenForProcessing(Integer poId);
42  
43      public boolean isPurchaseOrderOpenForProcessing(PurchaseOrderDocument purchaseOrderDocument);
44  
45      /**
46       * Creates an automatic purchase order document using the given requisition document
47       *
48       * @param reqDocument The requisition document that this method will use to create the Automated Purchase Order (APO).
49       */
50      public void createAutomaticPurchaseOrderDocument(RequisitionDocument reqDocument);
51  
52      /**
53       * Creates a PurchaseOrderDocument from given RequisitionDocument. Both documents need to be saved after this method is called.
54       *
55       * @param reqDocument         The requisition document that this method will use to create the purchase order.
56       * @param newSessionUserId    The session user id that we'll use to invoke the performLogicWithFakedUserSession method of
57       *                            PurapService.
58       * @param contractManagerCode The contract manager code that we'll need to set on the purchase order.
59       * @return The purchase order document object that is created by this method.
60       */
61      public PurchaseOrderDocument createPurchaseOrderDocument(RequisitionDocument reqDocument, String newSessionUserId, Integer contractManagerCode);
62  
63      /**
64       * Creates and saves the purchase order change document (for example, PurchaseOrderAmendmentDocument) based on an existing
65       * purchase order document.
66       *
67       * @param documentNumber        The document number of the existing purchase order document from which we try to create a new change
68       *                              document.
69       * @param docType               The document type of the new change document.
70       * @param newDocumentStatusCode The status code that we want to set on the existing purchase order document after the new change
71       *                              document is created.
72       * @return The resulting new purchase order change document created by this method.
73       */
74      public PurchaseOrderDocument createAndSavePotentialChangeDocument(String documentNumber, String docType, String newDocumentStatusCode);
75  
76      /**
77       * Creates and routes the purchase order change document (for example, PurchaseOrderCloseDocument) based on an existing purchase
78       * order document.
79       *
80       * @param
81       * @param documentNumber         The document number of the existing purchase order document from which we try to create a new change
82       *                               document.
83       * @param docType                The document type of the new change document.
84       * @param annotation             The annotation that we'll use to invoke the routeDocument method of DocumentService.
85       * @param adhocRoutingRecipients The adhocRoutingRecipients that we'll use to invoke the routeDocument method of
86       *                               DocumentService.
87       * @param newDocumentStatusCode  The status code that we want to set on the existing purchase order document after the new change
88       *                               document is created.
89       * @return The resulting new purchase order change document created by this method.
90       */
91      public PurchaseOrderDocument createAndRoutePotentialChangeDocument(String documentNumber, String docType, String annotation, List adhocRoutingRecipients, String newDocumentStatusCode);
92  
93      /**
94       * Creates and saves a Purchase Order Split document based on the old PO document, and the items from that PO that the
95       * new Split PO is to contain.
96       *
97       * @param newPOItems      The List<PurchaseOrderItem> of the items that the new Split PO is to contain
98       * @param currentDocument The original PurchaseOrderDocument
99       * @param copyNotes       A boolean.  True if notes are to be copied from the old document to the new.
100      * @param splitNoteText   A String containing the text of the note to be added to the old document.
101      * @return A PurchaseOrderSplitDocument containing the given list of items
102      */
103     public PurchaseOrderSplitDocument createAndSavePurchaseOrderSplitDocument(List<PurchaseOrderItem> newPOItems, PurchaseOrderDocument currentDocument, boolean copyNotes, String splitNoteText);
104 
105     /**
106      * Obtains the internal purchasing dollar limit amount for a purchase order document.
107      *
108      * @param po The purchase order document for which this method is obtaining the internal purchasing dollar limit.
109      * @return The internal purchasing dollar limit for the given purchase order document.
110      */
111     public KualiDecimal getInternalPurchasingDollarLimit(PurchaseOrderDocument po);
112 
113     public boolean printPurchaseOrderQuoteRequestsListPDF(String documentNumber, ByteArrayOutputStream baosPDF);
114 
115     public boolean printPurchaseOrderQuotePDF(PurchaseOrderDocument po, PurchaseOrderVendorQuote povq, ByteArrayOutputStream baosPDF);
116 
117     /**
118      * Creates and displays the pdf document for the purchase order, sets the transmit dates, calls the
119      * takeAllActionsForGivenCriteria method in PurApWorkflowIntegrationService to perform all the workflow related steps that are
120      * necessary as part of the document initial print transmission and then performs the setup of initial of open document of the
121      * purchase order.
122      *
123      * @param documentNumber The document number of the purchase order document that we want to perform the first transmit.
124      * @param baosPDF        The ByteArrayOutputStream object that was passed in from the struts action so that we could display the pdf on
125      *                       the browser.
126      */
127     public void performPurchaseOrderFirstTransmitViaPrinting(String documentNumber, ByteArrayOutputStream baosPDF);
128 
129     /**
130      * Creates and displays the pdf document for the purchase order with a draft watermark
131      *
132      * @param documentNumber The document number of the purchase order document that we want to perform the first transmit.
133      * @param baosPDF        The ByteArrayOutputStream object that was passed in from the struts action so that we could display the pdf on
134      *                       the browser.
135      */
136     public void performPurchaseOrderPreviewPrinting(String documentNumber, ByteArrayOutputStream baosPDF);
137 
138     /**
139      * Generates and displays the purchase order pdf by invoking the generatePurchaseOrderPdf method of the PrintService.
140      *
141      * @param documentNumber The document number of the purchase order document that we want to print the pdf.
142      * @param baosPDF        The ByteArrayOutputStream object that we'll use to display the pdf on the browser.
143      */
144     public void performPrintPurchaseOrderPDFOnly(String documentNumber, ByteArrayOutputStream baosPDF);
145 
146     /**
147      * Generates and displays the purchase order retransmit pdf by invoking the generatePurchaseOrderPdfForRetransmission method of
148      * the PrintService.
149      *
150      * @param po      The purchase order document to be retransmitted.
151      * @param baosPDF The ByteArrayOutputStream object that we'll use to display the pdf on the browser.
152      */
153     public void retransmitPurchaseOrderPDF(PurchaseOrderDocument po, ByteArrayOutputStream baosPDF);
154 
155     /**
156      * Performs the steps needed to complete the newly approved purchase order document, which consists of setting the current and
157      * pending indicators for the purchase order document and if the status is not pending transmission, then calls the
158      * attemptsSetupOfInitialOpenOfDocument to set the statuses, the initial open date and save the document.
159      *
160      * @param po The newly approved purchase order document that we want to complete.
161      */
162     public void completePurchaseOrder(PurchaseOrderDocument po);
163 
164     public void retransmitB2BPurchaseOrder(PurchaseOrderDocument po);
165 
166     public void completePurchaseOrderAmendment(PurchaseOrderDocument po);
167 
168     /**
169      * Obtains the purchase order document whose current indicator is true, given a purchase order id which is the
170      * purapDocumentIdentifier.
171      *
172      * @param id The po id (purapDocumentIdentifier) that we'll use to retrieve the current purchase order document.
173      * @return The current purchase order document (the po whose current indicator is true).
174      */
175     public PurchaseOrderDocument getCurrentPurchaseOrder(Integer id);
176 
177     /**
178      * Obtains the purchase order document given the document number.
179      *
180      * @param documentNumber The document number of the purchase order that we want to retrieve.
181      * @return The purchase order document whose document number is the given document number.
182      */
183     public PurchaseOrderDocument getPurchaseOrderByDocumentNumber(String documentNumber);
184 
185     /**
186      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as its status, then save
187      * the purchase order.
188      *
189      * @param newPO The new purchase order document that has been approved.
190      */
191     public void setCurrentAndPendingIndicatorsForApprovedPODocuments(PurchaseOrderDocument newPO);
192 
193     /**
194      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
195      * save the purchase order.
196      *
197      * @param newPO The new purchase order document that has been disapproved.
198      */
199     public void setCurrentAndPendingIndicatorsForDisapprovedChangePODocuments(PurchaseOrderDocument newPO);
200 
201     /**
202      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
203      * save the purchase order.
204      *
205      * @param newPO The new purchase order document that has been canceled.
206      */
207     public void setCurrentAndPendingIndicatorsForCancelledChangePODocuments(PurchaseOrderDocument newPO);
208 
209     /**
210      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
211      * save the purchase order.
212      *
213      * @param newPO The new purchase order reopen document that has been canceled.
214      */
215     public void setCurrentAndPendingIndicatorsForCancelledReopenPODocuments(PurchaseOrderDocument newPO);
216 
217     /**
218      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
219      * save the purchase order.
220      *
221      * @param newPO The new purchase order reopen document that has been disapproved.
222      */
223     public void setCurrentAndPendingIndicatorsForDisapprovedReopenPODocuments(PurchaseOrderDocument newPO);
224 
225     /**
226      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
227      * save the purchase order
228      *
229      * @param newPO The new purchase order remove hold document that has been canceled.
230      */
231     public void setCurrentAndPendingIndicatorsForCancelledRemoveHoldPODocuments(PurchaseOrderDocument newPO);
232 
233     /**
234      * Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
235      * save the purchase order.
236      *
237      * @param newPO The new purchase order remove hold document that has been disapproved.
238      */
239     public void setCurrentAndPendingIndicatorsForDisapprovedRemoveHoldPODocuments(PurchaseOrderDocument newPO);
240 
241     /**
242      * Obtains the oldest purchase order given the purchase order object to be used to search, then calls the updateNotes method to
243      * set the notes on the oldest purchase order and finally return the oldest purchase order.
244      *
245      * @param po                     The current purchase order object from which we want to obtain the oldest purchase order.
246      * @param documentBusinessObject The documentBusinessObject of the current purchase order object.
247      * @return The oldest purchase order whose purchase order id is the same as the current purchase order's id.
248      */
249     public PurchaseOrderDocument getOldestPurchaseOrder(PurchaseOrderDocument po, PurchaseOrderDocument documentBusinessObject);
250 
251     /**
252      * Obtains all the notes that belong to this purchase order given the purchase order id.
253      *
254      * @param id The purchase order id (purapDocumentIdentifier).
255      * @return The list of notes that belong to this purchase order.
256      */
257     public List<Note> getPurchaseOrderNotes(Integer id);
258 
259     public List<PurchaseOrderQuoteStatus> getPurchaseOrderQuoteStatusCodes();
260 
261     /**
262      * Performs a threshold check on the purchase order to determine if any attribute on the purchase order
263      * falls within a defined threshold. This check is only perfromed if the receiving required flag is set to N.
264      *
265      * @param po
266      */
267     public void setReceivingRequiredIndicatorForPurchaseOrder(PurchaseOrderDocument po);
268 
269     /**
270      * If there are commodity codes on the items on the PurchaseOrderDocument that
271      * haven't existed yet on the vendor that the PurchaseOrderDocument is using,
272      * then we will spawn a new VendorDetailMaintenanceDocument automatically to
273      * update the vendor with the commodity codes that aren't already existing on
274      * the vendor.
275      *
276      * @param po The PurchaseOrderDocument containing the vendor that we want to update.
277      */
278     public void updateVendorCommodityCode(PurchaseOrderDocument po);
279 
280     /**
281      * Checks the item list for newly added unordered items.
282      *
283      * @param po
284      * @return
285      */
286     public boolean hasNewUnorderedItem(PurchaseOrderDocument po);
287 
288     /**
289      * Check whether each of the items contain commodity code, if so then loop
290      * through the vendor commodity codes on the vendor to find out whether the
291      * commodity code on the item has existed on the vendor. While doing that,
292      * also check whether there exists a default commodity code on the vendor,
293      * although we only need to check this until we find a vendor commodity code
294      * with default indicator set to true. If we didn't find any matching
295      * commodity code in the existing vendor commodity codes, then add the new
296      * commodity code to a List of commodity code, create a new vendor commodity
297      * code and set all of its attributes appropriately, including setting the
298      * default indicator to true if we had not found any existing default commodity
299      * code on the vendor, then add the newly created vendor commodity code to
300      * the vendor (which is a deep copy of the original vendor on the PO).
301      * After we're done with all of the items, if the List that contains the
302      * commodity code that were being added to the vendor is not empty, then
303      * for each entry on that list, we should create an empty VendorCommodityCode
304      * to be added to the old vendor (the original vendor that is on the PO document).
305      * The reason we're combining all of these processing here is so that we don't
306      * need to loop through items and vendor commodity codes too many times.
307      *
308      * @param po The PurchaseOrderDocument containing the vendor that we want to update.
309      * @return VendorDetail the vendorDetail object which is a deep copy of the original
310      *         vendorDetail on the PurchaseOrderDocument, whose commodity codes have
311      *         already been updated based on our findings on the items' commodity codes.
312      */
313     public VendorDetail updateVendorWithMissingCommodityCodesIfNecessary(PurchaseOrderDocument po);
314 
315     /**
316      * Determines if a purchase order item is new unordered item.
317      *
318      * @param poItem
319      * @return
320      */
321     public boolean isNewUnorderedItem(PurchaseOrderItem poItem);
322 
323     /**
324      * Determines if a purchase order item is newly added on
325      * the Purchase Order Amendment Document.
326      *
327      * @param poItem
328      * @return
329      */
330     public boolean isNewItemForAmendment(PurchaseOrderItem poItem);
331 
332     /**
333      * Used to provide sublists of the list of the original PO's items according to whether they
334      * are marked to be moved or not.  Retrieving the item from the hash with the key of 'movingPOItems'
335      * will retrieve those Items which should move, using 'remainingPOItems'.
336      *
337      * @param items A List<PurchaseOrderItem> from the original PO of a Split.
338      * @return A HashMap<String, List<PurchaseOrderItem>> of categorized lists of items
339      */
340     public HashMap<String, List<PurchaseOrderItem>> categorizeItemsForSplit(List<PurchaseOrderItem> items);
341 
342     /**
343      * Creates a PurchaseOrderVendorQuote based on the data on the selected vendor and the document number.
344      *
345      * @param headerId       The vendorHeaderGeneratedIdentifier of the selected vendor.
346      * @param detailId       The vendorDetailAssignedIdentifier of the selected vendor.
347      * @param documentNumber The documentNumber of the PurchaseOrderDocument containing this quote.
348      * @return The resulting PurchaseOrderVendorQuote object.
349      */
350     public PurchaseOrderVendorQuote populateQuoteWithVendor(Integer headerId, Integer detailId, String documentNumber);
351 
352     /**
353      * This method takes care of creating PurchaseOrderDocuments from a list of Requisitions on an ACM
354      *
355      * @param acmDoc An assign a contract manager document
356      */
357     public void processACMReq(ContractManagerAssignmentDocument acmDoc);
358 
359     /**
360      * This gets a list of Purchase Orders in Open status and checks to see if their
361      * line item encumbrances are all fully disencumbered and if so then the Purchase
362      * Order is closed and notes added to indicate the change occurred in batch
363      *
364      * @return boolean true if the job is completed successfully and false otherwise.
365      */
366     public boolean autoCloseFullyDisencumberedOrders();
367 
368 
369     /**
370      * - PO status is OPEN
371      * - Recurring payment type code is not null
372      * - Vendor Choice is not Sub-Contract
373      * - PO End Date <= parm date (comes from system parameter)
374      * - Verify that the system parameter date entered is not greater than the current date minus three months.
375      * If the date entered is invalid, the batch process will halt and an error will be generated.
376      * - Close and disencumber all recurring PO's that have end dates less than
377      * the system parameter date.
378      * - Set the system parameter date to mm/dd/yyyy after processing.
379      * - Send email indicating that the job ran and which orders were closed.
380      * Mail it to the AUTO_CLOSE_RECURRING_PO_EMAIL_ADDRESSES in system parameter.
381      *
382      * @return boolean true if the job is completed successfully and false otherwise.
383      */
384     public boolean autoCloseRecurringOrders();
385 
386 
387     /**
388      * Return a list of PurchasingCapitalAssetItems where each item would have a CapitalAssetSystem. The CapitalAssetSystem provides
389      * the capital asset information such as asset numbers and asset type.
390      *
391      * @param poId Purchase Order ID used to retrieve the asset information for the current PO
392      * @return List of PurchasingCapitalAssetItems (each of which contain a CapitalAssetSystem)
393      */
394     public List<PurchasingCapitalAssetItem> retrieveCapitalAssetItemsForIndividual(Integer poId);
395 
396 
397     /**
398      * Return a CapitalAssetSystem which provides the capital asset information such as asset numbers and asset type.
399      *
400      * @param poId Purchase Order ID used to retrieve the asset information for the current PO
401      * @return CapitalAssetSystem
402      */
403     public CapitalAssetSystem retrieveCapitalAssetSystemForOneSystem(Integer poId);
404 
405 
406     /**
407      * Return a list of CapitalAssetSystems which provide the capital asset information such as asset numbers and asset type.
408      *
409      * @param poId Purchase Order ID used to retrieve the asset information for the current PO
410      * @return List of CapitalAssetSystems
411      */
412     public List<CapitalAssetSystem> retrieveCapitalAssetSystemsForMultipleSystem(Integer poId);
413 
414 
415     /**
416      * This method gets all the Purchase orders that are waiting for faxing
417      *
418      * @return List of POs
419      */
420     public List<PurchaseOrderDocument> getPendingPurchaseOrderFaxes();
421 
422     /**
423      * Retrieves the purchase orders current status
424      *
425      * @param poId
426      * @return
427      */
428     public String getPurchaseOrderAppDocStatus(Integer poId);
429 
430     /**
431      * This method is to  send an FYI to fiscal officers for general ledger entries created for amend purchase order
432      *
433      * @param po
434      */
435     public void sendFyiForGLEntries(PurchaseOrderDocument po);
436 
437     public void initiateTransmission(PurchaseOrderDocument po, PurApItem item);
438 
439     public boolean processFTPTransmission(VendorTransmissionFormatDetail vendorTransmissionFormatDetail, String file, String ediFileName);
440 
441     public PurchaseOrderDocument createAndRoutePotentialChangeDocument(OlePurchaseOrderDocument olePurchaseOrderDocument, String docType, String annotation, List adhocRoutingRecipients, String currentDocumentStatusCode);
442 }