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 java.sql.Date; 019 import java.util.Iterator; 020 import java.util.List; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.fp.businessobject.BasicFormatWithLineDescriptionAccountingLineParser; 024 import org.kuali.kfs.fp.businessobject.CapitalAssetInformation; 025 import org.kuali.kfs.integration.cam.CapitalAssetManagementModuleService; 026 import org.kuali.kfs.sys.KFSConstants; 027 import org.kuali.kfs.sys.KFSPropertyConstants; 028 import org.kuali.kfs.sys.businessobject.AccountingLine; 029 import org.kuali.kfs.sys.businessobject.AccountingLineBase; 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.service.DebitDeterminerService; 036 import org.kuali.rice.kns.util.KualiDecimal; 037 import org.kuali.rice.kns.util.ObjectUtils; 038 039 /** 040 * Abstract class which defines behavior common to CashReceipt-like documents. 041 */ 042 abstract public class CashReceiptFamilyBase extends AccountingDocumentBase implements CapitalAssetEditable { 043 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CashReceiptFamilyBase.class); 044 protected String campusLocationCode; // TODO Needs to be an actual object - also need to clarify this 045 protected Date depositDate; 046 047 // capital asset 048 protected transient CapitalAssetInformation capitalAssetInformation; 049 050 /** 051 * Constructs a CashReceiptFamilyBase 052 */ 053 public CashReceiptFamilyBase() { 054 setCampusLocationCode(KFSConstants.CashReceiptConstants.DEFAULT_CASH_RECEIPT_CAMPUS_LOCATION_CODE); 055 } 056 057 /** 058 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#buildListOfDeletionAwareLists() 059 */ 060 @Override 061 public List buildListOfDeletionAwareLists() { 062 List<List> managedLists = super.buildListOfDeletionAwareLists(); 063 if (ObjectUtils.isNotNull(capitalAssetInformation) && ObjectUtils.isNotNull(capitalAssetInformation.getCapitalAssetInformationDetails())) { 064 managedLists.add(capitalAssetInformation.getCapitalAssetInformationDetails()); 065 } 066 return managedLists; 067 } 068 069 /** 070 * Documents in the CashReceiptFamily do not perform Sufficient Funds checking 071 * 072 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#documentPerformsSufficientFundsCheck() 073 */ 074 @Override 075 public boolean documentPerformsSufficientFundsCheck() { 076 return false; 077 } 078 079 /** 080 * Gets the campusLocationCode attribute. 081 * 082 * @return Returns the campusLocationCode. 083 */ 084 public String getCampusLocationCode() { 085 return campusLocationCode; 086 } 087 088 /** 089 * Sets the campusLocationCode attribute value. 090 * 091 * @param campusLocationCode The campusLocationCode to set. 092 */ 093 public void setCampusLocationCode(String campusLocationCode) { 094 this.campusLocationCode = campusLocationCode; 095 } 096 097 098 /** 099 * Gets the depositDate attribute. 100 * 101 * @return Returns the depositDate. 102 */ 103 public Date getDepositDate() { 104 return depositDate; 105 } 106 107 /** 108 * Sets the depositDate attribute value. 109 * 110 * @param depositDate The depositDate to set. 111 */ 112 public void setDepositDate(Date depositDate) { 113 this.depositDate = depositDate; 114 } 115 116 117 /** 118 * Total for a Cash Receipt according to the spec should be the sum of the amounts on accounting lines belonging to object codes 119 * having the 'income' object type, less the sum of the amounts on accounting lines belonging to object codes having the 120 * 'expense' object type. 121 * 122 * @see org.kuali.kfs.sys.document.AccountingDocument#getSourceTotal() 123 */ 124 @Override 125 public KualiDecimal getSourceTotal() { 126 KualiDecimal total = KualiDecimal.ZERO; 127 AccountingLineBase al = null; 128 if (ObjectUtils.isNull(getSourceAccountingLines()) || getSourceAccountingLines().isEmpty()) { 129 refreshReferenceObject(KFSPropertyConstants.SOURCE_ACCOUNTING_LINES); 130 } 131 Iterator iter = getSourceAccountingLines().iterator(); 132 while (iter.hasNext()) { 133 al = (AccountingLineBase) iter.next(); 134 try { 135 KualiDecimal amount = al.getAmount().abs(); 136 if (amount != null && amount.isNonZero()) { 137 if (isDebit(al)) { 138 total = total.subtract(amount); 139 } 140 else { // in this context, if it's not a debit, it's a credit 141 total = total.add(amount); 142 } 143 } 144 } 145 catch (Exception e) { 146 // Possibly caused by accounting lines w/ bad data 147 LOG.error("Error occured trying to compute Cash receipt total, returning 0", e); 148 return KualiDecimal.ZERO; 149 } 150 } 151 return total; 152 } 153 154 /** 155 * Cash Receipts only have source lines, so this should always return 0. 156 * 157 * @see org.kuali.kfs.sys.document.AccountingDocument#getTargetTotal() 158 */ 159 @Override 160 public KualiDecimal getTargetTotal() { 161 return KualiDecimal.ZERO; 162 } 163 164 /** 165 * Overrides the base implementation to return an empty string. 166 * 167 * @see org.kuali.kfs.sys.document.AccountingDocument#getSourceAccountingLinesSectionTitle() 168 */ 169 @Override 170 public String getSourceAccountingLinesSectionTitle() { 171 return KFSConstants.EMPTY_STRING; 172 } 173 174 /** 175 * Overrides the base implementation to return an empty string. 176 * 177 * @see org.kuali.kfs.sys.document.AccountingDocument#getTargetAccountingLinesSectionTitle() 178 */ 179 @Override 180 public String getTargetAccountingLinesSectionTitle() { 181 return KFSConstants.EMPTY_STRING; 182 } 183 184 /** 185 * Returns true if accounting line is debit 186 * 187 * @param financialDocument 188 * @param accountingLine 189 * @param true if accountline line 190 * @see IsDebitUtils#isDebitConsideringType(FinancialDocumentRuleBase, FinancialDocument, AccountingLine) 191 * @see org.kuali.rice.kns.rule.AccountingLineRule#isDebit(org.kuali.rice.kns.document.FinancialDocument, 192 * org.kuali.rice.kns.bo.AccountingLine) 193 */ 194 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) { 195 // error corrections are not allowed 196 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class); 197 isDebitUtils.disallowErrorCorrectionDocumentCheck(this); 198 return isDebitUtils.isDebitConsideringType(this, (AccountingLine) postable); 199 } 200 201 /** 202 * Overrides to set the entry's description to the description from the accounting line, if a value exists. 203 * 204 * @param financialDocument submitted accounting document 205 * @param accountingLine accounting line in accounting document 206 * @param explicitEntry general ledger pending entry 207 * @see org.kuali.module.financial.rules.FinancialDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(org.kuali.rice.kns.document.FinancialDocument, 208 * org.kuali.rice.kns.bo.AccountingLine, org.kuali.module.gl.bo.GeneralLedgerPendingEntry) 209 */ 210 @Override 211 public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) { 212 String accountingLineDescription = postable.getFinancialDocumentLineDescription(); 213 if (StringUtils.isNotBlank(accountingLineDescription)) { 214 explicitEntry.setTransactionLedgerEntryDescription(accountingLineDescription); 215 } 216 } 217 218 219 /** 220 * @see org.kuali.kfs.fp.document.CapitalAssetEditable#getCapitalAssetInformation() 221 */ 222 public CapitalAssetInformation getCapitalAssetInformation() { 223 return ObjectUtils.isNull(capitalAssetInformation) ? null : capitalAssetInformation; 224 } 225 226 /** 227 * @see org.kuali.kfs.fp.document.CapitalAssetEditable#setCapitalAssetInformation(org.kuali.kfs.fp.businessobject.CapitalAssetInformation) 228 */ 229 public void setCapitalAssetInformation(CapitalAssetInformation capitalAssetInformation) { 230 this.capitalAssetInformation = capitalAssetInformation; 231 } 232 233 234 protected CapitalAssetManagementModuleService getCapitalAssetManagementModuleService() { 235 return SpringContext.getBean(CapitalAssetManagementModuleService.class); 236 } 237 }