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