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.module.ld.util;
017
018 import org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine;
019 import org.kuali.kfs.sys.KFSConstants;
020 import org.kuali.kfs.sys.context.SpringContext;
021 import org.kuali.kfs.sys.document.service.DebitDeterminerService;
022 import org.kuali.rice.kns.util.KualiDecimal;
023
024 /**
025 * This class provides a set of utilities that handle the debit credit logic.
026 */
027 public class DebitCreditUtil {
028
029 /**
030 * Determine the Debit Credit code based on the given amount. Normally (isReverse flag is set as false), the debit code returns
031 * if the amount is positive while the credit code returns if the amount is negative. When isReverse flag is set as true, the
032 * credit returns for positive amount and the debit code for negative amount.
033 *
034 * @param amount the given amount, which can be either negative or positive number.
035 * @param isReversed a flag that indicates if normal accounting practice is used. False for normal accoutning practice; true for
036 * reverse.
037 * @return the Debit Credit code based on the given transaction amount and the value of isReversed
038 */
039 public static String getDebitCreditCode(KualiDecimal amount, boolean isReversed) {
040 return getDebitCreditCode(amount, "", isReversed);
041 }
042
043 /**
044 * Determine the Debit Credit code based on the given amount. Normally (isReverse flag is set as false), the debit code returns
045 * if the amount is positive while the credit code returns if the amount is negative. When isReverse flag is set as true, the
046 * credit returns for positive amount and the debit code for negative amount.
047 *
048 * @param amount the given amount, which can be either negative or positive number.
049 * @param currentDebitCreditCode the current debit credit code
050 * @param isReversed a flag that indicates if normal accounting practice is used. False for normal accoutning practice; true for
051 * reverse.
052 * @return the Debit Credit code based on the given transaction amount and the value of isReversed
053 */
054 public static String getDebitCreditCode(KualiDecimal amount, String currentDebitCreditCode, boolean isReversed) {
055 String debitCreditCode = null;
056 if (amount.isNegative()) {
057 if (KFSConstants.GL_CREDIT_CODE.equals(currentDebitCreditCode)) {
058 debitCreditCode = KFSConstants.GL_DEBIT_CODE;
059 }
060 else {
061 debitCreditCode = KFSConstants.GL_CREDIT_CODE;
062 }
063 }
064 else {
065 if (KFSConstants.GL_CREDIT_CODE.equals(currentDebitCreditCode)) {
066 debitCreditCode = KFSConstants.GL_CREDIT_CODE;
067 }
068 else {
069 debitCreditCode = KFSConstants.GL_DEBIT_CODE;
070 }
071 }
072
073 if (isReversed) {
074 debitCreditCode = getReverseDebitCreditCode(debitCreditCode);
075 }
076 return debitCreditCode;
077 }
078
079 /**
080 * Determines the Debit Credit code for the expense accountine line (Salary Expense and Benefit Expense documents).
081 *
082 * @param accountingLine - line to determine code for
083 * @return String representing the debit/credit code for the line
084 */
085 public static String getDebitCreditCodeForExpenseDocument(ExpenseTransferAccountingLine accountingLine) {
086 String debitCreditCode = null;
087 boolean isPositiveAmount = accountingLine.getAmount().isPositive();
088
089 if (accountingLine.isSourceAccountingLine()) {
090 if (isPositiveAmount) {
091 debitCreditCode = KFSConstants.GL_CREDIT_CODE;
092 }
093 else {
094 debitCreditCode = KFSConstants.GL_DEBIT_CODE;
095 }
096 }
097 else if (accountingLine.isTargetAccountingLine()) {
098 if (isPositiveAmount) {
099 debitCreditCode = KFSConstants.GL_DEBIT_CODE;
100 }
101 else {
102 debitCreditCode = KFSConstants.GL_CREDIT_CODE;
103 }
104 }
105 else {
106 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class);
107 throw new IllegalStateException(isDebitUtils.getInvalidLineTypeIllegalArgumentExceptionMessage());
108 }
109
110 return debitCreditCode;
111 }
112
113 /**
114 * get the reversed debit credit code of the given code
115 *
116 * @param currentDebitCreditCode the current debit credit code
117 * @return the reversed debit credit code of the given code
118 */
119 public static String getReverseDebitCreditCode(String currentDebitCreditCode) {
120 if (KFSConstants.GL_DEBIT_CODE.equals(currentDebitCreditCode)) {
121 return KFSConstants.GL_CREDIT_CODE;
122 }
123
124 if (KFSConstants.GL_CREDIT_CODE.equals(currentDebitCreditCode)) {
125 return KFSConstants.GL_DEBIT_CODE;
126 }
127
128 return KFSConstants.GL_CREDIT_CODE;
129 }
130
131 /**
132 * Determine the actual amount based on Debit Credit code. If the code is credit code, then change the sign of the given amount;
133 * otherwise, do nothing
134 *
135 * @param amount the given amount, which can be either negative or positive number.
136 * @param currentDebitCreditCode the current debit credit code
137 * @return the actual numeric amount of the given amount
138 */
139 public static KualiDecimal getNumericAmount(KualiDecimal amount, String currentDebitCreditCode) {
140 KualiDecimal actualAmount = amount;
141
142 if (amount == null) {
143 actualAmount = KualiDecimal.ZERO;
144 }
145 else if (KFSConstants.GL_CREDIT_CODE.equals(currentDebitCreditCode)) {
146 actualAmount = actualAmount.multiply(new KualiDecimal(-1));
147 }
148 return actualAmount;
149 }
150 }