/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.purap.document.service;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.List;
import org.kuali.kfs.integration.purap.CapitalAssetSystem;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderQuoteStatus;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderVendorQuote;
import org.kuali.kfs.module.purap.businessobject.PurchasingCapitalAssetItem;
import org.kuali.kfs.module.purap.document.ContractManagerAssignmentDocument;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.PurchaseOrderSplitDocument;
import org.kuali.kfs.module.purap.document.RequisitionDocument;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.bo.Note;
/**
* Defines methods that must be implemented by classes providing a PurchaseOrderService.
*/
public interface PurchaseOrderService extends PurchasingDocumentSpecificService {
public boolean isCommodityCodeRequiredOnPurchaseOrder();
public boolean isPurchaseOrderOpenForProcessing(Integer poId);
public boolean isPurchaseOrderOpenForProcessing(PurchaseOrderDocument purchaseOrderDocument);
/**
* Creates an automatic purchase order document using the given requisition document
*
* @param reqDocument The requisition document that this method will use to create the Automated Purchase Order (APO).
*/
public void createAutomaticPurchaseOrderDocument(RequisitionDocument reqDocument);
/**
* Creates a PurchaseOrderDocument from given RequisitionDocument. Both documents need to be saved after this method is called.
*
* @param reqDocument The requisition document that this method will use to create the purchase order.
* @param newSessionUserId The session user id that we'll use to invoke the performLogicWithFakedUserSession method of
* PurapService.
* @param contractManagerCode The contract manager code that we'll need to set on the purchase order.
* @return The purchase order document object that is created by this method.
*/
public PurchaseOrderDocument createPurchaseOrderDocument(RequisitionDocument reqDocument, String newSessionUserId, Integer contractManagerCode);
/**
* Creates and saves the purchase order change document (for example, PurchaseOrderAmendmentDocument) based on an existing
* purchase order document.
*
* @param documentNumber The document number of the existing purchase order document from which we try to create a new change
* document.
* @param docType The document type of the new change document.
* @param newDocumentStatusCode The status code that we want to set on the existing purchase order document after the new change
* document is created.
* @return The resulting new purchase order change document created by this method.
*/
public PurchaseOrderDocument createAndSavePotentialChangeDocument(String documentNumber, String docType, String newDocumentStatusCode);
/**
* Creates and routes the purchase order change document (for example, PurchaseOrderCloseDocument) based on an existing purchase
* order document.
*
* @param
* @param documentNumber The document number of the existing purchase order document from which we try to create a new change
* document.
* @param docType The document type of the new change document.
* @param annotation The annotation that we'll use to invoke the routeDocument method of DocumentService.
* @param adhocRoutingRecipients The adhocRoutingRecipients that we'll use to invoke the routeDocument method of
* DocumentService.
* @param newDocumentStatusCode The status code that we want to set on the existing purchase order document after the new change
* document is created.
* @return The resulting new purchase order change document created by this method.
*/
public PurchaseOrderDocument createAndRoutePotentialChangeDocument(String documentNumber, String docType, String annotation, List adhocRoutingRecipients, String newDocumentStatusCode);
/**
* Creates and saves a Purchase Order Split document based on the old PO document, and the items from that PO that the
* new Split PO is to contain.
*
* @param newPOItems The List<PurchaseOrderItem> of the items that the new Split PO is to contain
* @param currentDocument The original PurchaseOrderDocument
* @param copyNotes A boolean. True if notes are to be copied from the old document to the new.
* @param splitNoteText A String containing the text of the note to be added to the old document.
* @return A PurchaseOrderSplitDocument containing the given list of items
*/
public PurchaseOrderSplitDocument createAndSavePurchaseOrderSplitDocument(List<PurchaseOrderItem> newPOItems, PurchaseOrderDocument currentDocument, boolean copyNotes, String splitNoteText);
/**
* Obtains the internal purchasing dollar limit amount for a purchase order document.
*
* @param po The purchase order document for which this method is obtaining the internal purchasing dollar limit.
* @return The internal purchasing dollar limit for the given purchase order document.
*/
public KualiDecimal getInternalPurchasingDollarLimit(PurchaseOrderDocument po);
public boolean printPurchaseOrderQuoteRequestsListPDF(String documentNumber, ByteArrayOutputStream baosPDF);
public boolean printPurchaseOrderQuotePDF(PurchaseOrderDocument po, PurchaseOrderVendorQuote povq, ByteArrayOutputStream baosPDF);
/**
* Creates and displays the pdf document for the purchase order, sets the transmit dates, calls the
* takeAllActionsForGivenCriteria method in PurApWorkflowIntegrationService to perform all the workflow related steps that are
* necessary as part of the document initial print transmission and then performs the setup of initial of open document of the
* purchase order.
*
* @param documentNumber The document number of the purchase order document that we want to perform the first transmit.
* @param baosPDF The ByteArrayOutputStream object that was passed in from the struts action so that we could display the pdf on
* the browser.
*/
public void performPurchaseOrderFirstTransmitViaPrinting(String documentNumber, ByteArrayOutputStream baosPDF);
/**
* Creates and displays the pdf document for the purchase order with a draft watermark
*
* @param documentNumber The document number of the purchase order document that we want to perform the first transmit.
* @param baosPDF The ByteArrayOutputStream object that was passed in from the struts action so that we could display the pdf on
* the browser.
*/
public void performPurchaseOrderPreviewPrinting(String documentNumber, ByteArrayOutputStream baosPDF);
/**
* Generates and displays the purchase order pdf by invoking the generatePurchaseOrderPdf method of the PrintService.
*
* @param documentNumber The document number of the purchase order document that we want to print the pdf.
* @param baosPDF The ByteArrayOutputStream object that we'll use to display the pdf on the browser.
*/
public void performPrintPurchaseOrderPDFOnly(String documentNumber, ByteArrayOutputStream baosPDF);
/**
* Generates and displays the purchase order retransmit pdf by invoking the generatePurchaseOrderPdfForRetransmission method of
* the PrintService.
*
* @param po The purchase order document to be retransmitted.
* @param baosPDF The ByteArrayOutputStream object that we'll use to display the pdf on the browser.
*/
public void retransmitPurchaseOrderPDF(PurchaseOrderDocument po, ByteArrayOutputStream baosPDF);
/**
* Performs the steps needed to complete the newly approved purchase order document, which consists of setting the current and
* pending indicators for the purchase order document and if the status is not pending transmission, then calls the
* attemptsSetupOfInitialOpenOfDocument to set the statuses, the initial open date and save the document.
*
* @param po The newly approved purchase order document that we want to complete.
*/
public void completePurchaseOrder(PurchaseOrderDocument po);
public void retransmitB2BPurchaseOrder(PurchaseOrderDocument po);
public void completePurchaseOrderAmendment(PurchaseOrderDocument po);
/**
* Obtains the purchase order document whose current indicator is true, given a purchase order id which is the
* purapDocumentIdentifier.
*
* @param id The po id (purapDocumentIdentifier) that we'll use to retrieve the current purchase order document.
* @return The current purchase order document (the po whose current indicator is true).
*/
public PurchaseOrderDocument getCurrentPurchaseOrder(Integer id);
/**
* Obtains the purchase order document given the document number.
*
* @param documentNumber The document number of the purchase order that we want to retrieve.
* @return The purchase order document whose document number is the given document number.
*/
public PurchaseOrderDocument getPurchaseOrderByDocumentNumber(String documentNumber);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as its status, then save
* the purchase order.
*
* @param newPO The new purchase order document that has been approved.
*/
public void setCurrentAndPendingIndicatorsForApprovedPODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order.
*
* @param newPO The new purchase order document that has been disapproved.
*/
public void setCurrentAndPendingIndicatorsForDisapprovedChangePODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order.
*
* @param newPO The new purchase order document that has been canceled.
*/
public void setCurrentAndPendingIndicatorsForCancelledChangePODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order.
*
* @param newPO The new purchase order reopen document that has been canceled.
*/
public void setCurrentAndPendingIndicatorsForCancelledReopenPODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order.
*
* @param newPO The new purchase order reopen document that has been disapproved.
*/
public void setCurrentAndPendingIndicatorsForDisapprovedReopenPODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order
*
* @param newPO The new purchase order remove hold document that has been canceled.
*/
public void setCurrentAndPendingIndicatorsForCancelledRemoveHoldPODocuments(PurchaseOrderDocument newPO);
/**
* Sets the current and pending indicators of the new purchase order and the old purchase order as well as their statuses, then
* save the purchase order.
*
* @param newPO The new purchase order remove hold document that has been disapproved.
*/
public void setCurrentAndPendingIndicatorsForDisapprovedRemoveHoldPODocuments(PurchaseOrderDocument newPO);
/**
* Obtains the oldest purchase order given the purchase order object to be used to search, then calls the updateNotes method to
* set the notes on the oldest purchase order and finally return the oldest purchase order.
*
* @param po The current purchase order object from which we want to obtain the oldest purchase order.
* @param documentBusinessObject The documentBusinessObject of the current purchase order object.
* @return The oldest purchase order whose purchase order id is the same as the current purchase order's id.
*/
public PurchaseOrderDocument getOldestPurchaseOrder(PurchaseOrderDocument po, PurchaseOrderDocument documentBusinessObject);
/**
* Obtains all the notes that belong to this purchase order given the purchase order id.
*
* @param id The purchase order id (purapDocumentIdentifier).
* @return The list of notes that belong to this purchase order.
*/
public List<Note> getPurchaseOrderNotes(Integer id);
public List<PurchaseOrderQuoteStatus> getPurchaseOrderQuoteStatusCodes();
/**
* Performs a threshold check on the purchase order to determine if any attribute on the purchase order
* falls within a defined threshold. This check is only perfromed if the receiving required flag is set to N.
*
* @param po
*/
public void setReceivingRequiredIndicatorForPurchaseOrder(PurchaseOrderDocument po);
/**
* If there are commodity codes on the items on the PurchaseOrderDocument that
* haven't existed yet on the vendor that the PurchaseOrderDocument is using,
* then we will spawn a new VendorDetailMaintenanceDocument automatically to
* update the vendor with the commodity codes that aren't already existing on
* the vendor.
*
* @param po The PurchaseOrderDocument containing the vendor that we want to update.
*/
public void updateVendorCommodityCode(PurchaseOrderDocument po);
/**
* Checks the item list for newly added unordered items.
*
* @param po
* @return
*/
public boolean hasNewUnorderedItem(PurchaseOrderDocument po);
/**
* Check whether each of the items contain commodity code, if so then loop
* through the vendor commodity codes on the vendor to find out whether the
* commodity code on the item has existed on the vendor. While doing that,
* also check whether there exists a default commodity code on the vendor,
* although we only need to check this until we find a vendor commodity code
* with default indicator set to true. If we didn't find any matching
* commodity code in the existing vendor commodity codes, then add the new
* commodity code to a List of commodity code, create a new vendor commodity
* code and set all of its attributes appropriately, including setting the
* default indicator to true if we had not found any existing default commodity
* code on the vendor, then add the newly created vendor commodity code to
* the vendor (which is a deep copy of the original vendor on the PO).
* After we're done with all of the items, if the List that contains the
* commodity code that were being added to the vendor is not empty, then
* for each entry on that list, we should create an empty VendorCommodityCode
* to be added to the old vendor (the original vendor that is on the PO document).
* The reason we're combining all of these processing here is so that we don't
* need to loop through items and vendor commodity codes too many times.
*
* @param po The PurchaseOrderDocument containing the vendor that we want to update.
*
* @return VendorDetail the vendorDetail object which is a deep copy of the original
* vendorDetail on the PurchaseOrderDocument, whose commodity codes have
* already been updated based on our findings on the items' commodity codes.
*/
public VendorDetail updateVendorWithMissingCommodityCodesIfNecessary(PurchaseOrderDocument po);
/**
* Determines if a purchase order item is new unordered item.
*
* @param poItem
* @return
*/
public boolean isNewUnorderedItem(PurchaseOrderItem poItem);
/**
* Determines if a purchase order item is newly added on
* the Purchase Order Amendment Document.
*
* @param poItem
* @return
*/
public boolean isNewItemForAmendment(PurchaseOrderItem poItem);
/**
* Used to provide sublists of the list of the original PO's items according to whether they
* are marked to be moved or not. Retrieving the item from the hash with the key of 'movingPOItems'
* will retrieve those Items which should move, using 'remainingPOItems'.
*
* @param items A List<PurchaseOrderItem> from the original PO of a Split.
* @return A HashMap<String, List<PurchaseOrderItem>> of categorized lists of items
*/
public HashMap<String, List<PurchaseOrderItem>> categorizeItemsForSplit(List<PurchaseOrderItem> items);
/**
* Creates a PurchaseOrderVendorQuote based on the data on the selected vendor and the document number.
*
* @param headerId The vendorHeaderGeneratedIdentifier of the selected vendor.
* @param detailId The vendorDetailAssignedIdentifier of the selected vendor.
* @param documentNumber The documentNumber of the PurchaseOrderDocument containing this quote.
* @return The resulting PurchaseOrderVendorQuote object.
*/
public PurchaseOrderVendorQuote populateQuoteWithVendor(Integer headerId, Integer detailId, String documentNumber);
/**
*
* This method takes care of creating PurchaseOrderDocuments from a list of Requisitions on an ACM
* @param acmDoc An assign a contract manager document
*/
public void processACMReq(ContractManagerAssignmentDocument acmDoc);
/**
* This gets a list of Purchase Orders in Open status and checks to see if their
* line item encumbrances are all fully disencumbered and if so then the Purchase
* Order is closed and notes added to indicate the change occurred in batch
*
* @return boolean true if the job is completed successfully and false otherwise.
*/
public boolean autoCloseFullyDisencumberedOrders();
/**
* - PO status is OPEN
* - Recurring payment type code is not null
* - Vendor Choice is not Sub-Contract
* - PO End Date <= parm date (comes from system parameter)
* - Verify that the system parameter date entered is not greater than the current date minus three months.
* If the date entered is invalid, the batch process will halt and an error will be generated.
* - Close and disencumber all recurring PO's that have end dates less than
* the system parameter date.
* - Set the system parameter date to mm/dd/yyyy after processing.
* - Send email indicating that the job ran and which orders were closed.
* Mail it to the AUTO_CLOSE_RECURRING_PO_EMAIL_ADDRESSES in system parameter.
*
* @return boolean true if the job is completed successfully and false otherwise.
*/
public boolean autoCloseRecurringOrders();
/**
* Return a list of PurchasingCapitalAssetItems where each item would have a CapitalAssetSystem. The CapitalAssetSystem provides
* the capital asset information such as asset numbers and asset type.
*
* @param poId Purchase Order ID used to retrieve the asset information for the current PO
* @return List of PurchasingCapitalAssetItems (each of which contain a CapitalAssetSystem)
*/
public List<PurchasingCapitalAssetItem> retrieveCapitalAssetItemsForIndividual(Integer poId);
/**
* Return a CapitalAssetSystem which provides the capital asset information such as asset numbers and asset type.
*
* @param poId Purchase Order ID used to retrieve the asset information for the current PO
* @return CapitalAssetSystem
*/
public CapitalAssetSystem retrieveCapitalAssetSystemForOneSystem(Integer poId);
/**
* Return a list of CapitalAssetSystems which provide the capital asset information such as asset numbers and asset type.
*
* @param poId Purchase Order ID used to retrieve the asset information for the current PO
* @return List of CapitalAssetSystems
*/
public List<CapitalAssetSystem> retrieveCapitalAssetSystemsForMultipleSystem(Integer poId);
/**
* This method gets all the Purchase orders that are waiting for faxing
* @return List of POs
*/
public List<PurchaseOrderDocument> getPendingPurchaseOrderFaxes();
/**
* Retrieves the purchase orders current status
*
* @param poId
* @return
*/
public String getPurchaseOrderAppDocStatus(Integer poId);
/**
*
* This method is to send an FYI to fiscal officers for general ledger entries created for amend purchase order
* @param po
*/
public void sendFyiForGLEntries(PurchaseOrderDocument po);
/**
*
* This method is to send an FYI to fiscal officers and Requisition Initiator
* @param po
*/
public void sendAdhocFyi(PurchaseOrderDocument po);
}