1 /* 2 * Copyright 2005-2006 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 package org.kuali.ole.fp.document; 17 18 import static org.kuali.ole.sys.OLEConstants.BALANCE_TYPE_ACTUAL; 19 20 import org.kuali.ole.sys.OLEConstants; 21 import org.kuali.ole.sys.businessobject.AccountingLine; 22 import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry; 23 import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 24 import org.kuali.ole.sys.businessobject.SystemOptions; 25 import org.kuali.ole.sys.context.SpringContext; 26 import org.kuali.ole.sys.document.AccountingDocumentBase; 27 import org.kuali.ole.sys.document.AmountTotaling; 28 import org.kuali.ole.sys.document.Correctable; 29 import org.kuali.ole.sys.document.service.AccountingDocumentRuleHelperService; 30 import org.kuali.ole.sys.document.service.DebitDeterminerService; 31 import org.kuali.ole.sys.service.OptionsService; 32 import org.kuali.rice.krad.document.Copyable; 33 34 /** 35 * The Transfer of Funds (TF) document is used to transfer funds (cash) between accounts. There are two kinds of transfer 36 * transactions, mandatory and non-mandatory. Mandatory transfers are required to meet contractual agreements. Specific object codes 37 * are used to identify these transactions. Examples of these are: moving dedicated student fees to the retirement of indebtedness 38 * fund group for principal and interest payments on bonds. Non-mandatory transfers are allocations of unrestricted cash between 39 * fund groups which are not required either by the terms of a loan or by other external agreements. These transfers are the most 40 * commonly used throughout the university. 41 */ 42 public class TransferOfFundsDocument extends AccountingDocumentBase implements Copyable, Correctable, AmountTotaling { 43 protected static final long serialVersionUID = -3871133713027969492L; 44 45 /** 46 * Initializes the array lists and some basic info. 47 */ 48 public TransferOfFundsDocument() { 49 super(); 50 } 51 52 /** 53 * Overrides the base implementation to return "From". 54 * 55 * @see org.kuali.ole.sys.document.AccountingDocument#getSourceAccountingLinesSectionTitle() 56 */ 57 public String getSourceAccountingLinesSectionTitle() { 58 return OLEConstants.FROM; 59 } 60 61 /** 62 * Overrides the base implementation to return "To". 63 * 64 * @see org.kuali.ole.sys.document.AccountingDocument#getTargetAccountingLinesSectionTitle() 65 */ 66 public String getTargetAccountingLinesSectionTitle() { 67 return OLEConstants.TO; 68 } 69 70 /** 71 * Set attributes of an offset pending entry according to rules specific to TransferOfFundsDocument. The current rules 72 * require setting the balance type code to 'actual'. 73 * 74 * @param financialDocument The accounting document containing the general ledger pending entries being customized. 75 * @param accountingLine The accounting line the explicit general ledger pending entry was generated from. 76 * @param explicitEntry The explicit general ledger pending entry the offset entry is generated for. 77 * @param offsetEntry The offset general ledger pending entry being customized. 78 * @return This method always returns true. 79 * 80 * @see org.kuali.ole.sys.document.validation.impl.AccountingDocumentRuleBase#customizeOffsetGeneralLedgerPendingEntry(org.kuali.rice.krad.document.FinancialDocument, 81 * org.kuali.rice.krad.bo.AccountingLine, org.kuali.module.gl.bo.GeneralLedgerPendingEntry, 82 * org.kuali.module.gl.bo.GeneralLedgerPendingEntry) 83 */ 84 @Override 85 public boolean customizeOffsetGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail accountingLine, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntry offsetEntry) { 86 offsetEntry.setFinancialBalanceTypeCode(BALANCE_TYPE_ACTUAL); 87 return true; 88 } 89 90 /** 91 * Set attributes of an explicit pending entry according to rules specific to TransferOfFundsDocument. 92 * 93 * @param financialDocument The accounting document containing the general ledger pending entries being customized. 94 * @param accountingLine The accounting line the explicit general ledger pending entry was generated from. 95 * @param explicitEntry The explicit general ledger pending entry to be customized. 96 * 97 * @see org.kuali.ole.sys.document.validation.impl.AccountingDocumentRuleBase#customizeExplicitGeneralLedgerPendingEntry(org.kuali.rice.krad.document.FinancialDocument, 98 * org.kuali.rice.krad.bo.AccountingLine, org.kuali.module.gl.bo.GeneralLedgerPendingEntry) 99 */ 100 @Override 101 public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail generalLedgerPendingEntrySourceDetail, GeneralLedgerPendingEntry explicitEntry) { 102 AccountingLine accountingLine = (AccountingLine)generalLedgerPendingEntrySourceDetail; 103 SystemOptions options = SpringContext.getBean(OptionsService.class).getCurrentYearOptions(); 104 105 explicitEntry.setFinancialBalanceTypeCode(BALANCE_TYPE_ACTUAL); 106 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class); 107 if (isDebitUtils.isExpense(accountingLine)) { 108 explicitEntry.setFinancialObjectTypeCode(options.getFinancialObjectTypeTransferExpenseCd()); 109 } 110 else { 111 if (isDebitUtils.isIncome(accountingLine)) { 112 explicitEntry.setFinancialObjectTypeCode(options.getFinancialObjectTypeTransferIncomeCd()); 113 } 114 else { 115 AccountingDocumentRuleHelperService accountingDocumentRuleUtil = SpringContext.getBean(AccountingDocumentRuleHelperService.class); 116 explicitEntry.setFinancialObjectTypeCode(accountingDocumentRuleUtil.getObjectCodeTypeCodeWithoutSideEffects(accountingLine)); 117 } 118 } 119 } 120 121 /** 122 * Adds the following restrictions in addition to those provided by <code>IsDebitUtils.isDebitConsideringNothingPositiveOnly</code> 123 * <ol> 124 * <li> Only allow income or expense object type codes 125 * <li> Target lines have the opposite debit/credit codes as the source lines 126 * </ol> 127 * 128 * @param financialDocument The document used to determine if the accounting line is a debit line. 129 * @param accountingLine The accounting line to be analyzed. 130 * @return True if the accounting line provided is a debit line, false otherwise. 131 * 132 * @see IsDebitUtils#isDebitConsideringNothingPositiveOnly(FinancialDocumentRuleBase, FinancialDocument, AccountingLine) 133 * @see org.kuali.rice.krad.rule.AccountingLineRule#isDebit(org.kuali.rice.krad.document.FinancialDocument, 134 * org.kuali.rice.krad.bo.AccountingLine) 135 */ 136 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) { 137 AccountingLine accountingLine = (AccountingLine)postable; 138 // only allow income or expense 139 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class); 140 if (!isDebitUtils.isIncome(accountingLine) && !isDebitUtils.isExpense(accountingLine)) { 141 throw new IllegalStateException(isDebitUtils.getDebitCalculationIllegalStateExceptionMessage()); 142 } 143 boolean isDebit = false; 144 if (accountingLine.isSourceAccountingLine()) { 145 isDebit = isDebitUtils.isDebitConsideringNothingPositiveOnly(this, accountingLine); 146 } 147 else if (accountingLine.isTargetAccountingLine()) { 148 isDebit = !isDebitUtils.isDebitConsideringNothingPositiveOnly(this, accountingLine); 149 } 150 else { 151 throw new IllegalStateException(isDebitUtils.getInvalidLineTypeIllegalArgumentExceptionMessage()); 152 } 153 154 return isDebit; 155 } 156 }