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.fp.document;
017
018 import static org.kuali.kfs.sys.KFSConstants.FROM;
019 import static org.kuali.kfs.sys.KFSConstants.TO;
020
021 import java.util.List;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
025 import org.kuali.kfs.fp.businessobject.GECSourceAccountingLine;
026 import org.kuali.kfs.fp.businessobject.GECTargetAccountingLine;
027 import org.kuali.kfs.fp.businessobject.GeneralErrorCorrectionDocumentAccountingLineParser;
028 import org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService;
029 import org.kuali.kfs.sys.businessobject.AccountingLine;
030 import org.kuali.kfs.sys.businessobject.AccountingLineParser;
031 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
032 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
033 import org.kuali.kfs.sys.context.SpringContext;
034 import org.kuali.kfs.sys.document.AccountingDocumentBase;
035 import org.kuali.kfs.sys.document.AmountTotaling;
036 import org.kuali.kfs.sys.document.Correctable;
037 import org.kuali.kfs.sys.document.service.DebitDeterminerService;
038 import org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE;
039 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO;
040 import org.kuali.rice.kns.document.Copyable;
041 import org.kuali.rice.kns.rule.event.KualiDocumentEvent;
042 import org.kuali.rice.kns.rule.event.SaveDocumentEvent;
043 import org.kuali.rice.kns.service.DataDictionaryService;
044 import org.kuali.rice.kns.util.ObjectUtils;
045
046
047 /**
048 * This is the business object that represents the GeneralErrorCorrectionDocument in Kuali. This is a transactional document that
049 * will eventually post transactions to the G/L. It integrates with workflow and also contains two groupings of accounting lines:
050 * from and to. From lines are the source lines, to lines are the target lines.
051 */
052 public class GeneralErrorCorrectionDocument extends AccountingDocumentBase implements Copyable, Correctable, AmountTotaling, CapitalAssetEditable {
053
054 protected CapitalAssetInformation capitalAssetInformation;
055 protected transient CapitalAssetManagementModuleService capitalAssetManagementModuleService;
056
057 /**
058 * Initializes the array lists and some basic info.
059 */
060 public GeneralErrorCorrectionDocument() {
061 super();
062 }
063
064 /**
065 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#buildListOfDeletionAwareLists()
066 */
067 @Override
068 public List buildListOfDeletionAwareLists() {
069 List<List> managedLists = super.buildListOfDeletionAwareLists();
070 if (ObjectUtils.isNotNull(capitalAssetInformation) && ObjectUtils.isNotNull(capitalAssetInformation.getCapitalAssetInformationDetails())) {
071 managedLists.add(capitalAssetInformation.getCapitalAssetInformationDetails());
072 }
073 return managedLists;
074 }
075
076 /**
077 * Overrides the base implementation to return "From".
078 *
079 * @see org.kuali.kfs.sys.document.AccountingDocument#getSourceAccountingLinesSectionTitle()
080 */
081 @Override
082 public String getSourceAccountingLinesSectionTitle() {
083 return FROM;
084 }
085
086 /**
087 * Overrides the base implementation to return "To".
088 *
089 * @see org.kuali.kfs.sys.document.AccountingDocument#getTargetAccountingLinesSectionTitle()
090 */
091 @Override
092 public String getTargetAccountingLinesSectionTitle() {
093 return TO;
094 }
095
096 /**
097 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#getSourceAccountingLineClass()
098 */
099 @Override
100 public Class getSourceAccountingLineClass() {
101 return GECSourceAccountingLine.class;
102 }
103
104 /**
105 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#getTargetAccountingLineClass()
106 */
107 @Override
108 public Class getTargetAccountingLineClass() {
109 return GECTargetAccountingLine.class;
110 }
111
112 /**
113 * Returns true if accounting line is debit
114 *
115 * @param transactionalDocument submitted accounting document
116 * @param accountingLine accounting line in account document
117 * @see IsDebitUtils#isDebitConsideringSectionAndTypePositiveOnly(FinancialDocumentRuleBase, FinancialDocument, AccountingLine)
118 * @see org.kuali.rice.kns.rule.AccountingLineRule#isDebit(org.kuali.rice.kns.document.FinancialDocument,
119 * org.kuali.rice.kns.bo.AccountingLine)
120 */
121 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) {
122 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class);
123 return isDebitUtils.isDebitConsideringSectionAndTypePositiveOnly(this, (AccountingLine) postable);
124 }
125
126 /**
127 * Customizes a GLPE by setting financial document number, financial system origination code and document type code to null
128 *
129 * @param transactionalDocument submitted accounting document
130 * @param accountingLine accounting line in document
131 * @param explicitEntry general ledger pending entry
132 * @see FinancialDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(FinancialDocument, AccountingLine,
133 * GeneralLedgerPendingEntry)
134 */
135 @Override
136 public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) {
137 explicitEntry.setTransactionLedgerEntryDescription(buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(postable));
138
139 // Clearing fields that are already handled by the parent algorithm - we don't actually want
140 // these to copy over from the accounting lines b/c they don't belong in the GLPEs
141 // if the aren't nulled, then GECs fail to post
142 explicitEntry.setReferenceFinancialDocumentNumber(null);
143 explicitEntry.setReferenceFinancialSystemOriginationCode(null);
144 explicitEntry.setReferenceFinancialDocumentTypeCode(null);
145 }
146
147 /**
148 * Builds an appropriately formatted string to be used for the <code>transactionLedgerEntryDescription</code>. It is built
149 * using information from the <code>{@link AccountingLine}</code>. Format is "01-12345: blah blah blah".
150 *
151 * @param line accounting line
152 * @param transactionalDocument submitted accounting document
153 * @return String formatted string to be used for transaction ledger entry description
154 */
155 protected String buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(GeneralLedgerPendingEntrySourceDetail line) {
156 String description = "";
157 description = line.getReferenceOriginCode() + "-" + line.getReferenceNumber();
158
159 if (StringUtils.isNotBlank(line.getFinancialDocumentLineDescription())) {
160 description += ": " + line.getFinancialDocumentLineDescription();
161 }
162 else {
163 description += ": " + getDocumentHeader().getDocumentDescription();
164 }
165
166 if (description.length() > GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH) {
167 description = description.substring(0, GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH - 3) + "...";
168 }
169
170 return description;
171 }
172
173 /**
174 * Gets the capitalAssetInformation attribute.
175 *
176 * @return Returns the capitalAssetInformation.
177 */
178 public CapitalAssetInformation getCapitalAssetInformation() {
179 return ObjectUtils.isNull(capitalAssetInformation) ? null : capitalAssetInformation;
180 }
181
182 /**
183 * Sets the capitalAssetInformation attribute value.
184 *
185 * @param capitalAssetInformation The capitalAssetInformation to set.
186 */
187 @Deprecated
188 public void setCapitalAssetInformation(CapitalAssetInformation capitalAssetInformation) {
189 this.capitalAssetInformation = capitalAssetInformation;
190 }
191
192 /**
193 * @see org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase#doRouteStatusChange()
194 */
195 @Override
196 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) {
197 super.doRouteStatusChange(statusChangeEvent);
198 this.getCapitalAssetManagementModuleService().deleteDocumentAssetLocks(this);
199 }
200
201
202 /**
203 * @see org.kuali.rice.kns.document.DocumentBase#postProcessSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent)
204 */
205 @Override
206 public void postProcessSave(KualiDocumentEvent event) {
207 super.postProcessSave(event);
208 if (!(event instanceof SaveDocumentEvent)) { // don't lock until they route
209 String documentTypeName = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(this.getClass());
210 this.getCapitalAssetManagementModuleService().generateCapitalAssetLock(this, documentTypeName);
211 }
212 }
213
214 /**
215 * @return CapitalAssetManagementModuleService
216 */
217 public CapitalAssetManagementModuleService getCapitalAssetManagementModuleService() {
218 if (capitalAssetManagementModuleService == null) {
219 capitalAssetManagementModuleService = SpringContext.getBean(CapitalAssetManagementModuleService.class);
220 }
221 return capitalAssetManagementModuleService;
222 }
223 }