001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.kuali.kfs.module.purap.document; 018 019 import static org.kuali.kfs.sys.KFSConstants.GL_DEBIT_CODE; 020 021 import java.util.ArrayList; 022 import java.util.Iterator; 023 import java.util.List; 024 025 import org.kuali.kfs.module.purap.PurapConstants; 026 import org.kuali.kfs.module.purap.PurapWorkflowConstants; 027 import org.kuali.kfs.module.purap.PurapConstants.PurapDocTypeCodes; 028 import org.kuali.kfs.module.purap.document.service.PurapService; 029 import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; 030 import org.kuali.kfs.module.purap.document.service.ReceivingService; 031 import org.kuali.kfs.module.purap.service.PurapGeneralLedgerService; 032 import org.kuali.kfs.sys.KFSConstants; 033 import org.kuali.kfs.sys.businessobject.AccountingLine; 034 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; 035 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 036 import org.kuali.kfs.sys.context.SpringContext; 037 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO; 038 import org.kuali.rice.kns.rule.event.KualiDocumentEvent; 039 040 /** 041 * Purchase Order Amendment Document 042 */ 043 public class PurchaseOrderAmendmentDocument extends PurchaseOrderDocument { 044 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderAmendmentDocument.class); 045 046 boolean newUnorderedItem; //Used for routing 047 String receivingDeliveryCampusCode; //Used for routing 048 049 /** 050 * Default constructor. 051 */ 052 public PurchaseOrderAmendmentDocument() { 053 super(); 054 } 055 056 057 @Override 058 public List<Long> getWorkflowEngineDocumentIdsToLock() { 059 return super.getWorkflowEngineDocumentIdsToLock(); 060 } 061 062 /** 063 * When Purchase Order Amendment document has been Processed through Workflow, the general ledger entries are created and the PO 064 * status remains "OPEN". 065 * 066 * @see org.kuali.kfs.module.purap.document.PurchaseOrderDocument#doRouteStatusChange() 067 */ 068 @Override 069 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) { 070 super.doRouteStatusChange(statusChangeEvent); 071 072 // DOCUMENT PROCESSED 073 if (getDocumentHeader().getWorkflowDocument().stateIsProcessed()) { 074 // generate GL entries 075 SpringContext.getBean(PurapGeneralLedgerService.class).generateEntriesApproveAmendPurchaseOrder(this); 076 077 // update indicators 078 SpringContext.getBean(PurchaseOrderService.class).completePurchaseOrderAmendment(this); 079 080 // update vendor commodity code by automatically spawning vendor maintenance document 081 SpringContext.getBean(PurchaseOrderService.class).updateVendorCommodityCode(this); 082 083 // set purap status 084 SpringContext.getBean(PurapService.class).updateStatus(this, PurapConstants.PurchaseOrderStatuses.OPEN); 085 086 } 087 // DOCUMENT DISAPPROVED 088 else if (getDocumentHeader().getWorkflowDocument().stateIsDisapproved()) { 089 SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForDisapprovedChangePODocuments(this); 090 SpringContext.getBean(PurapService.class).saveDocumentNoValidation(this); 091 } 092 // DOCUMENT CANCELED 093 else if (getDocumentHeader().getWorkflowDocument().stateIsCanceled()) { 094 SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForCancelledChangePODocuments(this); 095 SpringContext.getBean(PurapService.class).saveDocumentNoValidation(this); 096 } 097 } 098 099 /** 100 * @see org.kuali.module.purap.rules.PurapAccountingDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(org.kuali.kfs.sys.document.AccountingDocument, 101 * org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry) 102 */ 103 @Override 104 public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) { 105 super.customizeExplicitGeneralLedgerPendingEntry(postable, explicitEntry); 106 107 SpringContext.getBean(PurapGeneralLedgerService.class).customizeGeneralLedgerPendingEntry(this, (AccountingLine)postable, explicitEntry, getPurapDocumentIdentifier(), GL_DEBIT_CODE, PurapDocTypeCodes.PO_DOCUMENT, true); 108 109 // don't think i should have to override this, but default isn't getting the right PO doc 110 explicitEntry.setFinancialDocumentTypeCode(PurapDocTypeCodes.PO_AMENDMENT_DOCUMENT); 111 explicitEntry.setFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED); 112 } 113 114 @Override 115 public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails() { 116 List<GeneralLedgerPendingEntrySourceDetail> accountingLines = new ArrayList<GeneralLedgerPendingEntrySourceDetail>(); 117 if (getGlOnlySourceAccountingLines() != null) { 118 Iterator iter = getGlOnlySourceAccountingLines().iterator(); 119 while (iter.hasNext()) { 120 accountingLines.add((GeneralLedgerPendingEntrySourceDetail) iter.next()); 121 } 122 } 123 return accountingLines; 124 } 125 126 127 @Override 128 public void populateDocumentForRouting() { 129 newUnorderedItem = SpringContext.getBean(PurchaseOrderService.class).hasNewUnorderedItem(this); 130 receivingDeliveryCampusCode = SpringContext.getBean(ReceivingService.class).getReceivingDeliveryCampusCode(this); 131 super.populateDocumentForRouting(); 132 } 133 134 public boolean isNewUnorderedItem() { 135 return newUnorderedItem; 136 } 137 138 public void setNewUnorderedItem(boolean newUnorderedItem) { 139 this.newUnorderedItem = newUnorderedItem; 140 } 141 142 public String getReceivingDeliveryCampusCode() { 143 return receivingDeliveryCampusCode; 144 } 145 146 public void setReceivingDeliveryCampusCode(String receivingDeliveryCampusCode) { 147 this.receivingDeliveryCampusCode = receivingDeliveryCampusCode; 148 } 149 150 @Override 151 public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException { 152 if (nodeName.equals(PurapWorkflowConstants.HAS_NEW_UNORDERED_ITEMS)) return isNewUnorderedItem(); 153 throw new UnsupportedOperationException("Cannot answer split question for this node you call \""+nodeName+"\""); 154 } 155 156 }