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_CREDIT_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.PurapConstants.PurapDocTypeCodes;
027 import org.kuali.kfs.module.purap.document.service.PurapService;
028 import org.kuali.kfs.module.purap.document.service.PurchaseOrderService;
029 import org.kuali.kfs.module.purap.service.PurapGeneralLedgerService;
030 import org.kuali.kfs.sys.KFSConstants;
031 import org.kuali.kfs.sys.businessobject.AccountingLine;
032 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
033 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
034 import org.kuali.kfs.sys.context.SpringContext;
035 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO;
036 import org.kuali.rice.kns.rule.event.KualiDocumentEvent;
037 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
038
039 /**
040 * Purchase Order Void Document
041 */
042 public class PurchaseOrderVoidDocument extends PurchaseOrderDocument {
043 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderVoidDocument.class);
044
045 /**
046 * Default constructor.
047 */
048 public PurchaseOrderVoidDocument() {
049 super();
050 }
051
052
053 /**
054 * General Ledger pending entries are not created on save for this document. They are created when the document has been finally
055 * processed. Overriding this method so that entries are not created yet.
056 *
057 * @see org.kuali.kfs.module.purap.document.PurchaseOrderDocument#prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent)
058 */
059 @Override
060 public void prepareForSave(KualiDocumentEvent event) {
061 KualiWorkflowDocument workFlowDocument = getDocumentHeader().getWorkflowDocument();
062 if (workFlowDocument.stateIsCanceled()) {
063 setSourceAccountingLines(new ArrayList());
064 setGeneralLedgerPendingEntries(new ArrayList());
065 }
066 }
067
068 @Override
069 public List<Long> getWorkflowEngineDocumentIdsToLock() {
070 return super.getWorkflowEngineDocumentIdsToLock();
071 }
072
073 /**
074 * When Purchase Order Void document has been processed through Workflow, the general ledger entries are created and the PO
075 * status changes to "VOID".
076 *
077 * @see org.kuali.kfs.module.purap.document.PurchaseOrderDocument#doRouteStatusChange()
078 */
079 @Override
080 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) {
081 super.doRouteStatusChange(statusChangeEvent);
082
083 // DOCUMENT PROCESSED
084 if (getDocumentHeader().getWorkflowDocument().stateIsProcessed()) {
085 // generate GL entries
086 SpringContext.getBean(PurapGeneralLedgerService.class).generateEntriesVoidPurchaseOrder(this);
087
088
089 // update indicators
090 SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForApprovedPODocuments(this);
091
092 // set purap status
093 SpringContext.getBean(PurapService.class).updateStatus(this, PurapConstants.PurchaseOrderStatuses.VOID);
094
095 }
096 // DOCUMENT DISAPPROVED
097 else if (getDocumentHeader().getWorkflowDocument().stateIsDisapproved()) {
098 SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForDisapprovedChangePODocuments(this);
099 }
100 // DOCUMENT CANCELED
101 else if (getDocumentHeader().getWorkflowDocument().stateIsCanceled()) {
102 SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForCancelledChangePODocuments(this);
103 }
104 }
105
106 /**
107 * @see org.kuali.module.purap.rules.PurapAccountingDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(org.kuali.kfs.sys.document.AccountingDocument,
108 * org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
109 */
110 @Override
111 public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) {
112 super.customizeExplicitGeneralLedgerPendingEntry(postable, explicitEntry);
113
114 SpringContext.getBean(PurapGeneralLedgerService.class).customizeGeneralLedgerPendingEntry(this, (AccountingLine)postable, explicitEntry, getPurapDocumentIdentifier(), GL_CREDIT_CODE, PurapDocTypeCodes.PO_DOCUMENT, true);
115
116 // don't think i should have to override this, but default isn't getting the right PO doc
117 explicitEntry.setFinancialDocumentTypeCode(PurapDocTypeCodes.PO_VOID_DOCUMENT);
118 explicitEntry.setFinancialDocumentApprovedCode(KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED);
119 }
120
121 @Override
122 public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails() {
123 List<GeneralLedgerPendingEntrySourceDetail> accountingLines = new ArrayList<GeneralLedgerPendingEntrySourceDetail>();
124 if (getGlOnlySourceAccountingLines() != null) {
125 Iterator iter = getGlOnlySourceAccountingLines().iterator();
126 while (iter.hasNext()) {
127 accountingLines.add((GeneralLedgerPendingEntrySourceDetail) iter.next());
128 }
129 }
130 return accountingLines;
131 }
132
133 }