/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.document.service; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; import org.kuali.kfs.sys.document.AccountingDocument; import org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource; /** * A collection of methods that help accounting docs determine whether an accounting line represents a debit or not */ public interface DebitDeterminerService { /** * @param debitCreditCode * @return true if debitCreditCode equals the the debit constant */ public abstract boolean isDebitCode(String debitCreditCode); /** * <ol> * <li>object type is included in determining if a line is debit or credit. * </ol> * the following are credits (return false) * <ol> * <li> (isIncome || isLiability) && (lineAmount > 0) * <li> (isExpense || isAsset) && (lineAmount < 0) * </ol> * the following are debits (return true) * <ol> * <li> (isIncome || isLiability) && (lineAmount < 0) * <li> (isExpense || isAsset) && (lineAmount > 0) * </ol> * the following are invalid ( throws an <code>IllegalStateException</code>) * <ol> * <li> document isErrorCorrection * <li> lineAmount == 0 * <li> ! (isIncome || isLiability || isExpense || isAsset) * </ol> * * @param rule * @param accountingDocument * @param accountingLine * @return boolean */ public abstract boolean isDebitConsideringType(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable); /** * <ol> * <li>object type is not included in determining if a line is debit or credit. * <li>accounting line section (source/target) is not included in determining if a line is debit or credit. * </ol> * the following are credits (return false) * <ol> * <li> none * </ol> * the following are debits (return true) * <ol> * <li> (isIncome || isLiability || isExpense || isAsset) && (lineAmount > 0) * </ol> * the following are invalid ( throws an <code>IllegalStateException</code>) * <ol> * <li> lineAmount <= 0 * <li> ! (isIncome || isLiability || isExpense || isAsset) * </ol> * * @param rule * @param accountingDocument * @param accountingLine * @return boolean */ public abstract boolean isDebitConsideringNothingPositiveOrNegative(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable); /** * <ol> * <li>object type is not included in determining if a line is debit or credit. * <li>accounting line section (source/target) is not included in determining if a line is debit or credit. * </ol> * the following are credits (return false) * <ol> * <li> lineAmount <= 0 * </ol> * the following are debits (return true) * <ol> * <li> (isIncome || isLiability || isExpense || isAsset) && (lineAmount > 0) * </ol> * * @param rule * @param accountingDocument * @param accountingLine * @return boolean */ public abstract boolean isDebitConsideringNothingPositiveOnly(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable); /** * <ol> * <li>accounting line section (source/target) type is included in determining if a line is debit or credit. * <li> zero line amounts are never allowed * </ol> * the following are credits (return false) * <ol> * <li> isSourceLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount > 0) * <li> isTargetLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount < 0) * </ol> * the following are debits (return true) * <ol> * <li> isSourceLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount < 0) * <li> isTargetLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount > 0) * </ol> * the following are invalid ( throws an <code>IllegalStateException</code>) * <ol> * <li> lineAmount == 0 * <li> ! (isIncome || isLiability || isExpense || isAsset) * </ol> * * @param rule * @param accountingDocument * @param accountingLine * @return boolean */ public abstract boolean isDebitConsideringSection(AccountingDocument accountingDocument, AccountingLine accountingLine); /** * <ol> * <li>accounting line section (source/target) and object type is included in determining if a line is debit or credit. * <li> negative line amounts are <b>Only</b> allowed during error correction * </ol> * the following are credits (return false) * <ol> * <li> isSourceLine && (isExpense || isAsset) && (lineAmount > 0) * <li> isTargetLine && (isIncome || isLiability) && (lineAmount > 0) * <li> isErrorCorrection && isSourceLine && (isIncome || isLiability) && (lineAmount < 0) * <li> isErrorCorrection && isTargetLine && (isExpense || isAsset) && (lineAmount < 0) * </ol> * the following are debits (return true) * <ol> * <li> isSourceLine && (isIncome || isLiability) && (lineAmount > 0) * <li> isTargetLine && (isExpense || isAsset) && (lineAmount > 0) * <li> isErrorCorrection && (isExpense || isAsset) && (lineAmount < 0) * <li> isErrorCorrection && (isIncome || isLiability) && (lineAmount < 0) * </ol> * the following are invalid ( throws an <code>IllegalStateException</code>) * <ol> * <li> !isErrorCorrection && !(lineAmount > 0) * </ol> * * @param rule * @param accountingDocument * @param accountingLine * @return boolean */ public abstract boolean isDebitConsideringSectionAndTypePositiveOnly(AccountingDocument accountingDocument, AccountingLine accountingLine); /** * This method is to convert amount to positive or negative based on the object type and Debit CreditCode combination. * */ public String getConvertedAmount(String objectType , String debitCreditCode, String amount) ; /** * throws an <code>IllegalStateException</code> if the document is an error correction. otherwise does nothing * * @param rule * @param accountingDocument */ public abstract void disallowErrorCorrectionDocumentCheck(GeneralLedgerPendingEntrySource poster); /** * Convience method for determine if a document is an error correction document. * * @param accountingDocument * @return true if document is an error correct */ public abstract boolean isErrorCorrection(GeneralLedgerPendingEntrySource poster); /** * Determines whether an accounting line is an asset line. * * @param accountingLine * @return boolean True if a line is an asset line. */ public abstract boolean isAsset(GeneralLedgerPendingEntrySourceDetail postable); /** * Determines whether an accounting line is a liability line. * * @param accountingLine * @return boolean True if the line is a liability line. */ public abstract boolean isLiability(GeneralLedgerPendingEntrySourceDetail postable); /** * Determines whether an accounting line is an income line or not. This goes agains the configurable object type code list in * the ApplicationParameter mechanism. This list can be configured externally. * * @param accountingLine * @return boolean True if the line is an income line. */ public abstract boolean isIncome(GeneralLedgerPendingEntrySourceDetail postable); /** * Check object code type to determine whether the accounting line is expense. * * @param accountingLine * @return boolean True if the line is an expense line. */ public abstract boolean isExpense(GeneralLedgerPendingEntrySourceDetail postable); /** * Determines whether an accounting line is an expense or asset. * * @param line * @return boolean True if it's an expense or asset. */ public abstract boolean isExpenseOrAsset(GeneralLedgerPendingEntrySourceDetail postable); /** * Determines whether an accounting line is an income or liability line. * * @param line * @return boolean True if the line is an income or liability line. */ public abstract boolean isIncomeOrLiability(GeneralLedgerPendingEntrySourceDetail postable); /** * Check object code type to determine whether the accounting line is revenue. * * @param line * @return boolean True if the line is a revenue line. */ public abstract boolean isRevenue(GeneralLedgerPendingEntrySourceDetail postable); /** * Determines whether the <code>objectTypeCode</code> is an asset. * * @param objectTypeCode * @return Is she asset or something completely different? */ public abstract boolean isAssetTypeCode(String objectTypeCode); /** * Determines whether the <code>objectTypeCode</code> is a liability. * * @param objectTypeCode * @return Is she liability or something completely different? */ public abstract boolean isLiabilityTypeCode(String objectTypeCode); /** * Gets the isDebitCalculationIllegalStateExceptionMessage attribute. * @return Returns the isDebitCalculationIllegalStateExceptionMessage. */ public abstract String getDebitCalculationIllegalStateExceptionMessage(); /** * Gets the isErrorCorrectionIllegalStateExceptionMessage attribute. * @return Returns the isErrorCorrectionIllegalStateExceptionMessage. */ public abstract String getErrorCorrectionIllegalStateExceptionMessage(); /** * Gets the isInvalidLineTypeIllegalArgumentExceptionMessage attribute. * @return Returns the isInvalidLineTypeIllegalArgumentExceptionMessage. */ public abstract String getInvalidLineTypeIllegalArgumentExceptionMessage(); }