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 org.kuali.kfs.fp.businessobject.IndirectCostAdjustmentDocumentAccountingLineParser; 019 import org.kuali.kfs.fp.document.validation.impl.IndirectCostAdjustmentDocumentRuleConstants; 020 import org.kuali.kfs.sys.KFSConstants; 021 import org.kuali.kfs.sys.businessobject.AccountingLine; 022 import org.kuali.kfs.sys.businessobject.AccountingLineParser; 023 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 024 import org.kuali.kfs.sys.businessobject.SourceAccountingLine; 025 import org.kuali.kfs.sys.businessobject.TargetAccountingLine; 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.kfs.sys.document.Correctable; 030 import org.kuali.kfs.sys.document.service.DebitDeterminerService; 031 import org.kuali.rice.kns.document.Copyable; 032 import org.kuali.rice.kns.exception.InfrastructureException; 033 import org.kuali.rice.kns.service.ParameterService; 034 035 public class IndirectCostAdjustmentDocument extends AccountingDocumentBase implements Copyable, Correctable, AmountTotaling { 036 037 /** 038 * Constructs a IndirectCostAdjustmentDocument.java. 039 */ 040 public IndirectCostAdjustmentDocument() { 041 super(); 042 } 043 044 /** 045 * @see org.kuali.kfs.sys.document.AccountingDocument#getSourceAccountingLinesSectionTitle() 046 */ 047 @Override 048 public String getSourceAccountingLinesSectionTitle() { 049 return KFSConstants.GRANT; 050 } 051 052 /** 053 * @see org.kuali.kfs.sys.document.AccountingDocument#getTargetAccountingLinesSectionTitle() 054 */ 055 @Override 056 public String getTargetAccountingLinesSectionTitle() { 057 return KFSConstants.ICR; 058 } 059 060 /** 061 * per ICA specs, adds a target(receipt) line when an source(grant) line is added using the following logic to populate the 062 * target line. 063 * <ol> 064 * <li>receipt line's chart = chart from grant line 065 * <li>receipt line's account = ICR account for the account entered on the grant line 066 * <li>receipt line's object code = Financial System Parameter APC for the document global receipt line object code (see APC 067 * setion below) 068 * <li>receipt line's amount = amount from grant line 069 * </ol> 070 * 071 * @see org.kuali.kfs.sys.document.AccountingDocumentBase#addSourceAccountingLine(SourceAccountingLine) 072 */ 073 @Override 074 public void addSourceAccountingLine(SourceAccountingLine line) { 075 // add source 076 super.addSourceAccountingLine(line); 077 // create and populate target line 078 TargetAccountingLine targetAccountingLine = null; 079 try { 080 targetAccountingLine = (TargetAccountingLine) getTargetAccountingLineClass().newInstance(); 081 } 082 catch (Exception e) { 083 throw new InfrastructureException("unable to create a target accounting line", e); 084 } 085 // get apc object code value 086 String objectCode = SpringContext.getBean(ParameterService.class).getParameterValue(IndirectCostAdjustmentDocument.class, IndirectCostAdjustmentDocumentRuleConstants.RECEIPT_OBJECT_CODE); 087 targetAccountingLine.setFinancialObjectCode(objectCode); 088 targetAccountingLine.setAccountNumber(line.getAccount().getIndirectCostRecoveryAcctNbr()); 089 targetAccountingLine.setChartOfAccountsCode(line.getAccount().getIndirectCostRcvyFinCoaCode()); 090 targetAccountingLine.setDocumentNumber(line.getDocumentNumber()); 091 targetAccountingLine.setPostingYear(line.getPostingYear()); 092 targetAccountingLine.setAmount(line.getAmount()); 093 // refresh reference objects 094 095 targetAccountingLine.refresh(); 096 // add target line 097 addTargetAccountingLine(targetAccountingLine); 098 } 099 100 /** 101 * Same logic as <code>IsDebitUtils#isDebitConsideringType(FinancialDocumentRuleBase, FinancialDocument, AccountingLine)</code> 102 * but has the following accounting line restrictions: 103 * 104 * for grant lines(source): 105 * <ol> 106 * <li>only allow expense object type codes 107 * </ol> 108 * for receipt lines(target): 109 * <ol> 110 * <li>only allow income object type codes 111 * </ol> 112 * 113 * @param transactionDocument The document associated with the accounting line being reviewed to determine if it's a debit. 114 * @param accountingLine The accounting line being reviewed to determine if it's a debit line. 115 * @return True if the accounting line is a debit. See IsDebitUtils.isDebitConsideringType(). 116 * @throws IllegalStateException Thrown if the accounting line given is a source accounting line representing an expense 117 * or is a target accounting line representing an income. 118 * 119 * @see IsDebitUtils#isDebitConsideringType(FinancialDocumentRuleBase, FinancialDocument, AccountingLine) 120 * @see org.kuali.rice.kns.rule.AccountingLineRule#isDebit(org.kuali.rice.kns.document.FinancialDocument, 121 * org.kuali.rice.kns.bo.AccountingLine) 122 */ 123 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) throws IllegalStateException { 124 AccountingLine accountingLine = (AccountingLine)postable; 125 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class); 126 if (!(accountingLine.isSourceAccountingLine() && isDebitUtils.isExpense(accountingLine)) && !(accountingLine.isTargetAccountingLine() && isDebitUtils.isIncome(accountingLine))) { 127 throw new IllegalStateException(isDebitUtils.getDebitCalculationIllegalStateExceptionMessage()); 128 } 129 130 return isDebitUtils.isDebitConsideringType(this, accountingLine); 131 } 132 }