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.sys.document.service; 017 018 import org.kuali.kfs.sys.businessobject.AccountingLine; 019 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 020 import org.kuali.kfs.sys.document.AccountingDocument; 021 import org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource; 022 023 /** 024 * A collection of methods that help accounting docs determine whether an accounting line represents a debit or not 025 */ 026 public interface DebitDeterminerService { 027 /** 028 * @param debitCreditCode 029 * @return true if debitCreditCode equals the the debit constant 030 */ 031 public abstract boolean isDebitCode(String debitCreditCode); 032 033 /** 034 * <ol> 035 * <li>object type is included in determining if a line is debit or credit. 036 * </ol> 037 * the following are credits (return false) 038 * <ol> 039 * <li> (isIncome || isLiability) && (lineAmount > 0) 040 * <li> (isExpense || isAsset) && (lineAmount < 0) 041 * </ol> 042 * the following are debits (return true) 043 * <ol> 044 * <li> (isIncome || isLiability) && (lineAmount < 0) 045 * <li> (isExpense || isAsset) && (lineAmount > 0) 046 * </ol> 047 * the following are invalid ( throws an <code>IllegalStateException</code>) 048 * <ol> 049 * <li> document isErrorCorrection 050 * <li> lineAmount == 0 051 * <li> ! (isIncome || isLiability || isExpense || isAsset) 052 * </ol> 053 * 054 * @param rule 055 * @param accountingDocument 056 * @param accountingLine 057 * @return boolean 058 */ 059 public abstract boolean isDebitConsideringType(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable); 060 061 /** 062 * <ol> 063 * <li>object type is not included in determining if a line is debit or credit. 064 * <li>accounting line section (source/target) is not included in determining if a line is debit or credit. 065 * </ol> 066 * the following are credits (return false) 067 * <ol> 068 * <li> none 069 * </ol> 070 * the following are debits (return true) 071 * <ol> 072 * <li> (isIncome || isLiability || isExpense || isAsset) && (lineAmount > 0) 073 * </ol> 074 * the following are invalid ( throws an <code>IllegalStateException</code>) 075 * <ol> 076 * <li> lineAmount <= 0 077 * <li> ! (isIncome || isLiability || isExpense || isAsset) 078 * </ol> 079 * 080 * @param rule 081 * @param accountingDocument 082 * @param accountingLine 083 * @return boolean 084 */ 085 public abstract boolean isDebitConsideringNothingPositiveOnly(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable); 086 087 /** 088 * <ol> 089 * <li>accounting line section (source/target) type is included in determining if a line is debit or credit. 090 * <li> zero line amounts are never allowed 091 * </ol> 092 * the following are credits (return false) 093 * <ol> 094 * <li> isSourceLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount > 0) 095 * <li> isTargetLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount < 0) 096 * </ol> 097 * the following are debits (return true) 098 * <ol> 099 * <li> isSourceLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount < 0) 100 * <li> isTargetLine && (isIncome || isExpense || isAsset || isLiability) && (lineAmount > 0) 101 * </ol> 102 * the following are invalid ( throws an <code>IllegalStateException</code>) 103 * <ol> 104 * <li> lineAmount == 0 105 * <li> ! (isIncome || isLiability || isExpense || isAsset) 106 * </ol> 107 * 108 * @param rule 109 * @param accountingDocument 110 * @param accountingLine 111 * @return boolean 112 */ 113 public abstract boolean isDebitConsideringSection(AccountingDocument accountingDocument, AccountingLine accountingLine); 114 115 /** 116 * <ol> 117 * <li>accounting line section (source/target) and object type is included in determining if a line is debit or credit. 118 * <li> negative line amounts are <b>Only</b> allowed during error correction 119 * </ol> 120 * the following are credits (return false) 121 * <ol> 122 * <li> isSourceLine && (isExpense || isAsset) && (lineAmount > 0) 123 * <li> isTargetLine && (isIncome || isLiability) && (lineAmount > 0) 124 * <li> isErrorCorrection && isSourceLine && (isIncome || isLiability) && (lineAmount < 0) 125 * <li> isErrorCorrection && isTargetLine && (isExpense || isAsset) && (lineAmount < 0) 126 * </ol> 127 * the following are debits (return true) 128 * <ol> 129 * <li> isSourceLine && (isIncome || isLiability) && (lineAmount > 0) 130 * <li> isTargetLine && (isExpense || isAsset) && (lineAmount > 0) 131 * <li> isErrorCorrection && (isExpense || isAsset) && (lineAmount < 0) 132 * <li> isErrorCorrection && (isIncome || isLiability) && (lineAmount < 0) 133 * </ol> 134 * the following are invalid ( throws an <code>IllegalStateException</code>) 135 * <ol> 136 * <li> !isErrorCorrection && !(lineAmount > 0) 137 * </ol> 138 * 139 * @param rule 140 * @param accountingDocument 141 * @param accountingLine 142 * @return boolean 143 */ 144 public abstract boolean isDebitConsideringSectionAndTypePositiveOnly(AccountingDocument accountingDocument, AccountingLine accountingLine); 145 146 /** 147 * throws an <code>IllegalStateException</code> if the document is an error correction. otherwise does nothing 148 * 149 * @param rule 150 * @param accountingDocument 151 */ 152 public abstract void disallowErrorCorrectionDocumentCheck(GeneralLedgerPendingEntrySource poster); 153 154 /** 155 * Convience method for determine if a document is an error correction document. 156 * 157 * @param accountingDocument 158 * @return true if document is an error correct 159 */ 160 public abstract boolean isErrorCorrection(GeneralLedgerPendingEntrySource poster); 161 162 /** 163 * Determines whether an accounting line is an asset line. 164 * 165 * @param accountingLine 166 * @return boolean True if a line is an asset line. 167 */ 168 public abstract boolean isAsset(GeneralLedgerPendingEntrySourceDetail postable); 169 170 /** 171 * Determines whether an accounting line is a liability line. 172 * 173 * @param accountingLine 174 * @return boolean True if the line is a liability line. 175 */ 176 public abstract boolean isLiability(GeneralLedgerPendingEntrySourceDetail postable); 177 178 /** 179 * Determines whether an accounting line is an income line or not. This goes agains the configurable object type code list in 180 * the ApplicationParameter mechanism. This list can be configured externally. 181 * 182 * @param accountingLine 183 * @return boolean True if the line is an income line. 184 */ 185 public abstract boolean isIncome(GeneralLedgerPendingEntrySourceDetail postable); 186 187 /** 188 * Check object code type to determine whether the accounting line is expense. 189 * 190 * @param accountingLine 191 * @return boolean True if the line is an expense line. 192 */ 193 public abstract boolean isExpense(GeneralLedgerPendingEntrySourceDetail postable); 194 195 /** 196 * Determines whether an accounting line is an expense or asset. 197 * 198 * @param line 199 * @return boolean True if it's an expense or asset. 200 */ 201 public abstract boolean isExpenseOrAsset(GeneralLedgerPendingEntrySourceDetail postable); 202 203 /** 204 * Determines whether an accounting line is an income or liability line. 205 * 206 * @param line 207 * @return boolean True if the line is an income or liability line. 208 */ 209 public abstract boolean isIncomeOrLiability(GeneralLedgerPendingEntrySourceDetail postable); 210 211 /** 212 * Check object code type to determine whether the accounting line is revenue. 213 * 214 * @param line 215 * @return boolean True if the line is a revenue line. 216 */ 217 public abstract boolean isRevenue(GeneralLedgerPendingEntrySourceDetail postable); 218 219 /** 220 * Determines whether the <code>objectTypeCode</code> is an asset. 221 * 222 * @param objectTypeCode 223 * @return Is she asset or something completely different? 224 */ 225 public abstract boolean isAssetTypeCode(String objectTypeCode); 226 227 /** 228 * Determines whether the <code>objectTypeCode</code> is a liability. 229 * 230 * @param objectTypeCode 231 * @return Is she liability or something completely different? 232 */ 233 public abstract boolean isLiabilityTypeCode(String objectTypeCode); 234 235 /** 236 * Gets the isDebitCalculationIllegalStateExceptionMessage attribute. 237 * @return Returns the isDebitCalculationIllegalStateExceptionMessage. 238 */ 239 public abstract String getDebitCalculationIllegalStateExceptionMessage(); 240 241 /** 242 * Gets the isErrorCorrectionIllegalStateExceptionMessage attribute. 243 * @return Returns the isErrorCorrectionIllegalStateExceptionMessage. 244 */ 245 public abstract String getErrorCorrectionIllegalStateExceptionMessage(); 246 247 /** 248 * Gets the isInvalidLineTypeIllegalArgumentExceptionMessage attribute. 249 * @return Returns the isInvalidLineTypeIllegalArgumentExceptionMessage. 250 */ 251 public abstract String getInvalidLineTypeIllegalArgumentExceptionMessage(); 252 }