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