View Javadoc
1   /*
2    * Copyright 2007 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  
17  package org.kuali.ole.module.purap.document;
18  
19  import org.kuali.ole.module.purap.PurapConstants;
20  import org.kuali.ole.module.purap.PurapConstants.PurapDocTypeCodes;
21  import org.kuali.ole.module.purap.PurapConstants.PurchaseOrderStatuses;
22  import org.kuali.ole.module.purap.businessobject.PurchaseOrderView;
23  import org.kuali.ole.module.purap.document.service.PurchaseOrderService;
24  import org.kuali.ole.module.purap.service.PurapGeneralLedgerService;
25  import org.kuali.ole.sys.OLEConstants;
26  import org.kuali.ole.sys.businessobject.AccountingLine;
27  import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry;
28  import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
29  import org.kuali.ole.sys.context.SpringContext;
30  import org.kuali.rice.kew.api.exception.WorkflowException;
31  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
32  import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent;
33  import org.kuali.rice.krad.workflow.service.WorkflowDocumentService;
34  
35  import java.util.ArrayList;
36  import java.util.Iterator;
37  import java.util.List;
38  
39  import static org.kuali.ole.sys.OLEConstants.GL_CREDIT_CODE;
40  
41  /**
42   * Purchase Order Close Document
43   */
44  public class PurchaseOrderCloseDocument extends PurchaseOrderDocument {
45      protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderCloseDocument.class);
46  
47      /**
48       * General Ledger pending entries are not created on save for this document. They are created when the document has been finally
49       * processed. Overriding this method so that entries are not created yet.
50       *
51       * @see org.kuali.ole.module.purap.document.PurchaseOrderDocument#prepareForSave(org.kuali.rice.krad.rule.event.KualiDocumentEvent)
52       */
53      @Override
54      public void prepareForSave(KualiDocumentEvent event) {
55          LOG.info("prepareForSave(KualiDocumentEvent) do not create gl entries");
56          setSourceAccountingLines(new ArrayList());
57          setGeneralLedgerPendingEntries(new ArrayList());
58      }
59  
60      /**
61       * When Purchase Order Close document has been Processed through Workflow, the general ledger entries are created and the PO
62       * status changes to "CLOSED".
63       *
64       * @see org.kuali.ole.module.purap.document.PurchaseOrderDocument#doRouteStatusChange()
65       */
66      @Override
67      public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
68          super.doRouteStatusChange(statusChangeEvent);
69  
70          try {
71              // DOCUMENT PROCESSED
72              if (this.getFinancialSystemDocumentHeader().getWorkflowDocument().isProcessed()) {
73                  // generate GL entries
74                  //SpringContext.getBean(PurapGeneralLedgerService.class).generateEntriesClosePurchaseOrder(this);
75  
76                  // update indicators
77                  SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForApprovedPODocuments(this);
78  
79                  // for app doc status
80                  updateAndSaveAppDocStatus(PurchaseOrderStatuses.APPDOC_CLOSED);
81              }
82              // DOCUMENT DISAPPROVED
83              else if (this.getFinancialSystemDocumentHeader().getWorkflowDocument().isDisapproved()) {
84                  SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForDisapprovedChangePODocuments(this);
85  
86                  // for app doc status
87                  try {
88                      String nodeName = SpringContext.getBean(WorkflowDocumentService.class).getCurrentRouteLevelName(this.getFinancialSystemDocumentHeader().getWorkflowDocument());
89                      String reqStatus = PurapConstants.PurchaseOrderStatuses.getPurchaseOrderAppDocDisapproveStatuses().get(nodeName);
90                      updateAndSaveAppDocStatus(PurapConstants.PurchaseOrderStatuses.getPurchaseOrderAppDocDisapproveStatuses().get(reqStatus));
91  
92                  } catch (WorkflowException e) {
93                      logAndThrowRuntimeException("Error saving routing data while saving App Doc Status " + getDocumentNumber(), e);
94                  }
95  
96              }
97              // DOCUMENT CANCELLED
98              else if (this.getFinancialSystemDocumentHeader().getWorkflowDocument().isCanceled()) {
99                  SpringContext.getBean(PurchaseOrderService.class).setCurrentAndPendingIndicatorsForCancelledChangePODocuments(this);
100                 // for app doc status
101                 updateAndSaveAppDocStatus(PurchaseOrderStatuses.APPDOC_CLOSED);
102             }
103         } catch (WorkflowException e) {
104             logAndThrowRuntimeException("Error saving routing data while saving document with id " + getDocumentNumber(), e);
105         }
106     }
107 
108     /**
109      * @see org.kuali.module.purap.rules.PurapAccountingDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(org.kuali.ole.sys.document.AccountingDocument,
110      *      org.kuali.ole.sys.businessobject.AccountingLine, org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry)
111      */
112     @Override
113     public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) {
114         super.customizeExplicitGeneralLedgerPendingEntry(postable, explicitEntry);
115 
116         SpringContext.getBean(PurapGeneralLedgerService.class).customizeGeneralLedgerPendingEntry(this, (AccountingLine) postable, explicitEntry, getPurapDocumentIdentifier(), GL_CREDIT_CODE, PurapDocTypeCodes.PO_DOCUMENT, true);
117 
118         // don't think i should have to override this, but default isn't getting the right PO doc
119         explicitEntry.setFinancialDocumentTypeCode(PurapDocTypeCodes.PO_CLOSE_DOCUMENT);
120         explicitEntry.setFinancialDocumentApprovedCode(OLEConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED);
121     }
122 
123     @Override
124     public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails() {
125         List<GeneralLedgerPendingEntrySourceDetail> accountingLines = new ArrayList<GeneralLedgerPendingEntrySourceDetail>();
126         if (getGlOnlySourceAccountingLines() != null) {
127             Iterator iter = getGlOnlySourceAccountingLines().iterator();
128             while (iter.hasNext()) {
129                 accountingLines.add((GeneralLedgerPendingEntrySourceDetail) iter.next());
130             }
131         }
132         return accountingLines;
133     }
134 
135     // MSU Contribution OLEMI-8643 DTT-3800 OLECNTRB-956
136     @Override
137     public List<String> getWorkflowEngineDocumentIdsToLock() {
138         List<String> docIdStrings = new ArrayList<String>();
139         docIdStrings.add(getDocumentNumber());
140         String currentDocumentTypeName = this.getFinancialSystemDocumentHeader().getWorkflowDocument()
141                 .getDocumentTypeName();
142 
143         List<PurchaseOrderView> relatedPoViews = getRelatedViews().getRelatedPurchaseOrderViews();
144         for (PurchaseOrderView poView : relatedPoViews) {
145             if (poView.isPurchaseOrderCurrentIndicator()) {
146                 docIdStrings.add(poView.getDocumentNumber());
147             }
148         }
149         if (LOG.isDebugEnabled()) {
150             LOG.debug("***** getWorkflowEngineDocumentIdsToLock(" + this.documentNumber + ") = '" + docIdStrings + "'");
151         }
152         return docIdStrings;
153     }
154 
155 }