/*
* 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.fp.document.validation.impl;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.kuali.kfs.fp.businessobject.CashDrawer;
import org.kuali.kfs.fp.businessobject.CashDrawerTest;
import org.kuali.kfs.fp.businessobject.CashieringItemInProcess;
import org.kuali.kfs.fp.businessobject.CashieringTransaction;
import org.kuali.kfs.fp.businessobject.Check;
import org.kuali.kfs.fp.businessobject.CheckBase;
import org.kuali.kfs.fp.businessobject.CoinDetail;
import org.kuali.kfs.fp.businessobject.CoinDetailTest;
import org.kuali.kfs.fp.businessobject.CurrencyDetail;
import org.kuali.kfs.fp.businessobject.CurrencyDetailTest;
import org.kuali.kfs.fp.document.CashManagementDocument;
import org.kuali.kfs.fp.document.service.CashManagementService;
import org.kuali.kfs.fp.service.CashDrawerService;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.fixture.UserNameFixture;
import org.kuali.rice.core.api.util.type.KualiDecimal;
@ConfigureContext(session = UserNameFixture.twatson)
public class CashieringTransactionRuleTest extends KualiTestBase {
static final String CMST_CAMPUS = "KO";
public void testMoneyInOutBalanceRule() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testMoneyInNoNegatives");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
// currency and currency
CashieringTransaction transaction = cmDoc.getCurrentTransaction();
resetTransaction(transaction);
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_TENS_AMOUNT.convertToCurrencyDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_TENS_COIN_AMOUNT.convertToCoinDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_TENS_AMOUNT.convertToCurrencyDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_TENS_COIN_AMOUNT.convertToCoinDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
// checks and currency
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
Check justEnoughCheck = new CheckBase();
justEnoughCheck.setAmount(new KualiDecimal(3530.0));
transaction.getMoneyInChecks().add(justEnoughCheck);
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
Check notEnoughCheck = new CheckBase();
notEnoughCheck.setAmount(new KualiDecimal(3.0));
transaction.getMoneyInChecks().add(notEnoughCheck);
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
Check tooMuchCheck = new CheckBase();
tooMuchCheck.setAmount(new KualiDecimal(1500000.0));
transaction.getMoneyInChecks().add(tooMuchCheck);
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
// misc advance and currency
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
CashieringItemInProcess currAdvance = transaction.getNewItemInProcess();
currAdvance.setItemAmount(new KualiDecimal(3530.0));
currAdvance.setItemIdentifier(new Integer(27));
currAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
currAdvance = transaction.getNewItemInProcess();
currAdvance.setItemAmount(new KualiDecimal(30.0));
currAdvance.setItemIdentifier(new Integer(27));
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
currAdvance = transaction.getNewItemInProcess();
currAdvance.setItemAmount(new KualiDecimal(1000000.0));
currAdvance.setItemIdentifier(new Integer(27));
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
// currency and misc advance
resetTransaction(transaction);
CashieringItemInProcess oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
transaction.getOpenItemsInProcess().add(oldAdvance);
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
transaction.getOpenItemsInProcess().add(oldAdvance);
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
transaction.getOpenItemsInProcess().add(oldAdvance);
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_TENS_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_TENS_COIN_AMOUNT.convertToCoinDetail());
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
// checks and misc advance
resetTransaction(transaction);
oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(50.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
justEnoughCheck = new CheckBase();
justEnoughCheck.setAmount(new KualiDecimal(50.0));
transaction.getMoneyInChecks().add(justEnoughCheck);
transaction.getOpenItemsInProcess().add(oldAdvance);
assertTrue(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
transaction.getOpenItemsInProcess().add(oldAdvance);
notEnoughCheck = new CheckBase();
notEnoughCheck.setAmount(new KualiDecimal(3.0));
transaction.getMoneyInChecks().add(notEnoughCheck);
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
resetTransaction(transaction);
oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemRemainingAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(58));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
transaction.getOpenItemsInProcess().add(oldAdvance);
tooMuchCheck = new CheckBase();
tooMuchCheck.setAmount(new KualiDecimal(1500000.0));
transaction.getMoneyInChecks().add(tooMuchCheck);
assertFalse(rule.checkMoneyInMoneyOutBalance(transaction));
}
public void testMoneyInNoNegatives() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testMoneyInNoNegatives");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail());
assertFalse("Hundred Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentHundredDollarAmount(new KualiDecimal(100));
assertFalse("Fifty Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentFiftyDollarAmount(new KualiDecimal(100));
assertFalse("Twenty Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentTwentyDollarAmount(new KualiDecimal(100));
assertFalse("Ten Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentTenDollarAmount(new KualiDecimal(100));
assertFalse("Five Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentFiveDollarAmount(new KualiDecimal(100));
assertFalse("Two Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentTwoDollarAmount(new KualiDecimal(100));
assertFalse("One Dollar", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCurrency().setFinancialDocumentOneDollarAmount(new KualiDecimal(100));
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail());
assertFalse("Hundred Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentHundredCentAmount(new KualiDecimal(1));
assertFalse("Fifty Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentFiftyCentAmount(new KualiDecimal(1));
assertFalse("Twenty Five Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentTwentyFiveCentAmount(new KualiDecimal(1));
assertFalse("Ten Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentTenCentAmount(new KualiDecimal(1));
assertFalse("Five Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentFiveCentAmount(new KualiDecimal(1));
assertFalse("One Cent", rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyInCoin().setFinancialDocumentOneCentAmount(new KualiDecimal(1));
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyInNoNegatives(cmDoc.getCurrentTransaction()));
}
public void testMoneyOutNoNegatives() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testMoneyOutNoNegatives");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
cmDoc.getCurrentTransaction().setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
cmDoc.getCurrentTransaction().setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail());
assertFalse("Hundred Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentHundredDollarAmount(new KualiDecimal(100));
assertFalse("Fifty Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentFiftyDollarAmount(new KualiDecimal(100));
assertFalse("Twenty Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTwentyDollarAmount(new KualiDecimal(100));
assertFalse("Ten Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTenDollarAmount(new KualiDecimal(100));
assertFalse("Five Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentFiveDollarAmount(new KualiDecimal(100));
assertFalse("Two Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTwoDollarAmount(new KualiDecimal(100));
assertFalse("One Dollar", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentOneDollarAmount(new KualiDecimal(100));
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail());
assertFalse("Hundred Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentHundredCentAmount(new KualiDecimal(1));
assertFalse("Fifty Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentFiftyCentAmount(new KualiDecimal(1));
assertFalse("Twenty Five Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentTwentyFiveCentAmount(new KualiDecimal(1));
assertFalse("Ten Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentTenCentAmount(new KualiDecimal(1));
assertFalse("Five Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentFiveCentAmount(new KualiDecimal(1));
assertFalse("One Cent", rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentOneCentAmount(new KualiDecimal(1));
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkMoneyOutNoNegatives(cmDoc.getCurrentTransaction()));
}
public void testCheckNewItemInProcessDoesNotExceedCashDrawer() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testCheckNewItemInProcessDoesNotExceedCashDrawer");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ALL_FIVES_CASH_DRAWER);
resetTransaction(cmDoc.getCurrentTransaction());
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemAmount(new KualiDecimal(100));
assertTrue(rule.checkNewItemInProcessDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemAmount(new KualiDecimal(10000000));
assertFalse(rule.checkNewItemInProcessDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ZERO_CASH_DRAWER);
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemAmount(new KualiDecimal(100));
assertFalse(rule.checkNewItemInProcessDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
}
public void testCheckTransactionCheckTotalDoesNotExceedCashDrawer() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testCheckTransactionCheckTotalDoesNotExceedCashDrawer");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ALL_FIVES_CASH_DRAWER);
resetTransaction(cmDoc.getCurrentTransaction());
Check smallCheck = new CheckBase();
smallCheck.setAmount(new KualiDecimal(50.0));
cmDoc.getCurrentTransaction().addCheck(smallCheck);
assertTrue(rule.checkTransactionCheckTotalDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
Check largeCheck = new CheckBase();
largeCheck.setAmount(new KualiDecimal(1000000000.0));
cmDoc.getCurrentTransaction().addCheck(largeCheck);
assertFalse(rule.checkTransactionCheckTotalDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ZERO_CASH_DRAWER);
resetTransaction(cmDoc.getCurrentTransaction());
cmDoc.getCurrentTransaction().addCheck(smallCheck);
assertFalse(rule.checkTransactionCheckTotalDoesNotExceedCashDrawer(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
}
public void testCheckPaidBackItemInProcessDoesNotExceedTotal() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testCheckPaidBackItemInProcessDoesNotExceedTotal");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
CashieringItemInProcess oldAdvance = new CashieringItemInProcess();
oldAdvance.setCurrentPayment(new KualiDecimal(3530.0));
oldAdvance.setItemAmount(new KualiDecimal(10000.0));
oldAdvance.setItemIdentifier(new Integer(82));
oldAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
assertTrue(rule.checkPaidBackItemInProcessDoesNotExceedTotal(oldAdvance, 0));
oldAdvance.setCurrentPayment(null);
assertTrue(rule.checkPaidBackItemInProcessDoesNotExceedTotal(oldAdvance, 0));
oldAdvance.setCurrentPayment(new KualiDecimal(20000.0));
assertFalse(rule.checkPaidBackItemInProcessDoesNotExceedTotal(oldAdvance, 0));
}
public void testEnoughCashOnHand() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testEnoughCashOnHand");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
CurrencyDetail goodCurrency = CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail();
CurrencyDetail excessiveCurrency = CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_TENS_AMOUNT.convertToCurrencyDetail();
CoinDetail goodCoin = CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail excessiveCoin = CoinDetailTest.CoinDetailAmountFixture.ALL_TENS_COIN_AMOUNT.convertToCoinDetail();
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ALL_SEVENS_CASH_DRAWER);
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
cmDoc.getCurrentTransaction().setMoneyOutCurrency(goodCurrency);
cmDoc.getCurrentTransaction().setMoneyOutCoin(goodCoin);
assertTrue(rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCurrency(excessiveCurrency);
assertFalse("Hundred Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentHundredDollarAmount(new KualiDecimal(100));
assertFalse("Fifty Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentFiftyDollarAmount(new KualiDecimal(100));
assertFalse("Twenty Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTwentyDollarAmount(new KualiDecimal(100));
assertFalse("Ten Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTenDollarAmount(new KualiDecimal(100));
assertFalse("Five Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentFiveDollarAmount(new KualiDecimal(100));
assertFalse("Two Dollar", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentTwoDollarAmount(new KualiDecimal(100));
assertFalse("One", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCurrency().setFinancialDocumentOneDollarAmount(new KualiDecimal(100));
assertTrue("Dollars are good", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().setMoneyOutCoin(excessiveCoin);
assertFalse("Hundred Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentHundredCentAmount(new KualiDecimal(1));
assertFalse("Fifty Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentFiftyCentAmount(new KualiDecimal(1));
assertFalse("Twenty Five Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentTwentyFiveCentAmount(new KualiDecimal(1));
assertFalse("Ten Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentTenCentAmount(new KualiDecimal(1));
assertFalse("Five Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentFiveCentAmount(new KualiDecimal(1));
assertFalse("One Cent", rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getMoneyOutCoin().setFinancialDocumentOneCentAmount(new KualiDecimal(1));
assertTrue(rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.ZERO_CASH_DRAWER);
cmDoc.getCurrentTransaction().setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
cmDoc.getCurrentTransaction().setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
cmDoc.getCurrentTransaction().setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail());
cmDoc.getCurrentTransaction().setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail());
assertTrue(rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
putFixtureDataIntoCashDrawer(cmDoc.getCashDrawer(), CashDrawerTest.CashDrawerAmountFixture.NULL_CASH_DRAWER);
assertTrue(rule.checkEnoughCashForMoneyOut(cmDoc.getCashDrawer(), cmDoc.getCurrentTransaction()));
}
public void testAdvancesDoNotPayOffOtherAdvances() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testAdvancesDoNotPayOffOtherAdvances");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
assertTrue(rule.checkItemInProcessIsNotPayingOffItemInProcess(cmDoc.getCurrentTransaction()));
CashieringItemInProcess openAdvance = new CashieringItemInProcess();
openAdvance.setItemAmount(new KualiDecimal(10000.0));
openAdvance.setItemIdentifier(new Integer(82));
openAdvance.setCurrentPayment(new KualiDecimal(25.0));
openAdvance.setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
cmDoc.getCurrentTransaction().getOpenItemsInProcess().add(openAdvance);
assertTrue(rule.checkItemInProcessIsNotPayingOffItemInProcess(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemIdentifier(new Integer(80));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemAmount(new KualiDecimal(52));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemOpenDate(new Date(new GregorianCalendar().getTimeInMillis()));
assertFalse(rule.checkItemInProcessIsNotPayingOffItemInProcess(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getOpenItemsInProcess().remove(0);
assertTrue(rule.checkItemInProcessIsNotPayingOffItemInProcess(cmDoc.getCurrentTransaction()));
}
public void testNewAdvanceNotInFuture() {
CashManagementDocument cmDoc = this.cashManagementDocumentFixture("testAdvancesDoNotPayOffOtherAdvances");
CashManagementDocumentRule rule = new CashManagementDocumentRule();
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemIdentifier(new Integer(80));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemAmount(new KualiDecimal(52));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemOpenDate(oneWeekAgo());
assertTrue(rule.checkNewItemInProcessInPast(cmDoc.getCurrentTransaction()));
cmDoc.getCurrentTransaction().getNewItemInProcess().setItemOpenDate(oneWeekFromNow());
assertFalse(rule.checkNewItemInProcessInPast(cmDoc.getCurrentTransaction()));
}
private CashManagementDocument cashManagementDocumentFixture(String testName) {
// create a new cash drawer
CashDrawer cashDrawer = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS);
CashManagementDocument cmDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS, "Document Created for " + testName, "CMD");
return cmDoc;
}
private void putFixtureDataIntoCashDrawer(CashDrawer drawer, CashDrawerTest.CashDrawerAmountFixture fixture) {
CashDrawer fixtureDrawer = fixture.convertToCashDrawer();
drawer.setFinancialDocumentHundredDollarAmount(fixtureDrawer.getFinancialDocumentHundredDollarAmount());
drawer.setFinancialDocumentFiftyDollarAmount(fixtureDrawer.getFinancialDocumentFiftyDollarAmount());
drawer.setFinancialDocumentTwentyDollarAmount(fixtureDrawer.getFinancialDocumentTwentyDollarAmount());
drawer.setFinancialDocumentTenDollarAmount(fixtureDrawer.getFinancialDocumentTenDollarAmount());
drawer.setFinancialDocumentFiveDollarAmount(fixtureDrawer.getFinancialDocumentFiveDollarAmount());
drawer.setFinancialDocumentTwoDollarAmount(fixtureDrawer.getFinancialDocumentTwoDollarAmount());
drawer.setFinancialDocumentOneDollarAmount(fixtureDrawer.getFinancialDocumentOneDollarAmount());
drawer.setFinancialDocumentOtherDollarAmount(fixtureDrawer.getFinancialDocumentOtherDollarAmount());
drawer.setFinancialDocumentHundredCentAmount(fixtureDrawer.getFinancialDocumentHundredCentAmount());
drawer.setFinancialDocumentFiftyCentAmount(fixtureDrawer.getFinancialDocumentFiftyCentAmount());
drawer.setFinancialDocumentTwentyFiveCentAmount(fixtureDrawer.getFinancialDocumentTwentyFiveCentAmount());
drawer.setFinancialDocumentTenCentAmount(fixtureDrawer.getFinancialDocumentTenCentAmount());
drawer.setFinancialDocumentFiveCentAmount(fixtureDrawer.getFinancialDocumentFiveCentAmount());
drawer.setFinancialDocumentOneCentAmount(fixtureDrawer.getFinancialDocumentOneCentAmount());
drawer.setFinancialDocumentOtherCentAmount(fixtureDrawer.getFinancialDocumentOtherCentAmount());
}
private void resetTransaction(CashieringTransaction transaction) {
transaction.setMoneyInCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyInCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
transaction.setMoneyOutCurrency(CurrencyDetailTest.CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail());
transaction.setMoneyOutCoin(CoinDetailTest.CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail());
transaction.setMoneyInChecks(new ArrayList<Check>());
transaction.setBaselineChecks(new ArrayList());
transaction.getNewItemInProcess().setItemAmount(KualiDecimal.ZERO);
transaction.getNewItemInProcess().setItemReducedAmount(KualiDecimal.ZERO);
transaction.getNewItemInProcess().setItemRemainingAmount(KualiDecimal.ZERO);
transaction.setOpenItemsInProcess(new ArrayList<CashieringItemInProcess>());
}
private Date oneWeekAgo() {
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DATE, -7);
return new Date(cal.getTimeInMillis());
}
private Date oneWeekFromNow() {
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DATE, 7);
return new Date(cal.getTimeInMillis());
}
}