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 package org.kuali.kfs.module.ld.document; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry; 022 import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService; 023 import org.kuali.kfs.sys.KFSConstants; 024 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper; 025 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 026 import org.kuali.kfs.sys.context.SpringContext; 027 import org.kuali.kfs.sys.document.AccountingDocumentBase; 028 import org.kuali.kfs.sys.document.AmountTotaling; 029 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO; 030 import org.kuali.rice.kns.exception.ValidationException; 031 import org.kuali.rice.kns.rule.event.KualiDocumentEvent; 032 033 /** 034 * Labor Document base class implementation for all labor eDocs that are transactional, meaning implementing 035 * TransactionalDocumentBase. Additional functionality for labor is provided by this class, suchc as retrieving labor ledger pending 036 * entries. 037 */ 038 public abstract class LaborLedgerPostingDocumentBase extends AccountingDocumentBase implements LaborLedgerPostingDocument { 039 protected List<LaborLedgerPendingEntry> laborLedgerPendingEntries; 040 041 protected final static String LABOR_LEDGER_GENERAL_LEDGER_POSTING_HELPER_BEAN_ID = "kfsDoNothingGeneralLedgerPostingHelper"; 042 043 /** 044 * Initializes the pending entries. 045 */ 046 public LaborLedgerPostingDocumentBase() { 047 super(); 048 setLaborLedgerPendingEntries(new ArrayList<LaborLedgerPendingEntry>()); 049 } 050 051 /** 052 * @see org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument#getLaborLedgerPendingEntries() 053 */ 054 public List<LaborLedgerPendingEntry> getLaborLedgerPendingEntries() { 055 return this.laborLedgerPendingEntries; 056 } 057 058 /** 059 * @see org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument#setLaborLedgerPendingEntries(java.util.List) 060 */ 061 public void setLaborLedgerPendingEntries(List<LaborLedgerPendingEntry> laborLedgerPendingEntries) { 062 this.laborLedgerPendingEntries = laborLedgerPendingEntries; 063 } 064 065 /** 066 * Override to call super and then iterate over all GLPEs and update the approved code appropriately. 067 * 068 * @see Document#doRouteStatusChange() 069 */ 070 @Override 071 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) { 072 super.doRouteStatusChange(statusChangeEvent); 073 if (getDocumentHeader().getWorkflowDocument().stateIsProcessed()) { 074 changeLedgerPendingEntriesApprovedStatusCode(); 075 } 076 else if (getDocumentHeader().getWorkflowDocument().stateIsCanceled() || getDocumentHeader().getWorkflowDocument().stateIsDisapproved()) { 077 removeLedgerPendingEntries(); 078 } 079 } 080 081 /** 082 * This method iterates over all of the pending entries for a document and sets their approved status code to APPROVED "A". 083 */ 084 protected void changeLedgerPendingEntriesApprovedStatusCode() { 085 for (LaborLedgerPendingEntry pendingEntry : laborLedgerPendingEntries) { 086 pendingEntry.setFinancialDocumentApprovedCode(KFSConstants.DocumentStatusCodes.APPROVED); 087 } 088 } 089 090 /** 091 * This method calls the service to remove all of the pending entries associated with this document 092 */ 093 protected void removeLedgerPendingEntries() { 094 LaborLedgerPendingEntryService laborLedgerPendingEntryService = SpringContext.getBean(LaborLedgerPendingEntryService.class); 095 laborLedgerPendingEntryService.delete(getDocumentHeader().getDocumentNumber()); 096 } 097 098 /** 099 * This implementation is coupled tightly with some underlying issues that the Struts PojoProcessor plugin has with how objects 100 * get instantiated within lists. The first three lines are required otherwise when the PojoProcessor tries to automatically 101 * inject values into the list, it will get an index out of bounds error if the instance at an index is being called and prior 102 * instances at indices before that one are not being instantiated. So changing the code below will cause things to break. 103 * 104 * @param index of Labor Ledger Pending Entry to retrieve 105 * @return LaborLedgerPendingEntry 106 */ 107 public LaborLedgerPendingEntry getLaborLedgerPendingEntry(int index) { 108 while (laborLedgerPendingEntries.size() <= index) { 109 laborLedgerPendingEntries.add(new LaborLedgerPendingEntry()); 110 } 111 return laborLedgerPendingEntries.get(index); 112 } 113 114 /** 115 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent) 116 */ 117 @Override 118 public void prepareForSave(KualiDocumentEvent event) { 119 if (!SpringContext.getBean(LaborLedgerPendingEntryService.class).generateLaborLedgerPendingEntries(this)) { 120 logErrors(); 121 throw new ValidationException("labor ledger LLPE generation failed"); 122 } 123 } 124 125 /** 126 * This is a "do nothing" version of the method - it just won't create GLPEs 127 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#generateGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper) 128 */ 129 @Override 130 public boolean generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) { 131 return true; 132 } 133 134 /** 135 * Labor docs never generate general ledger pending entries, and therefore, this method is never called, but we always return true, since 136 * we're required to have a concrete representation 137 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#isDebit(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail) 138 */ 139 @Override 140 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) { 141 return true; 142 } 143 144 }