/*
* jPOS Project [http://jpos.org]
* Copyright (C) 2000-2017 jPOS Software SRL
*
* 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.jpos.gl;
import java.util.Date;
import java.math.BigDecimal;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.hibernate.Transaction;
import org.hibernate.HibernateException;
public class RulesTest extends TestBase {
Journal journal;
Account chart;
FinalAccount cashUS;
FinalAccount cashPesos;
FinalAccount bank;
FinalAccount loan;
FinalAccount bobEquity;
public void setUp () throws Exception {
super.setUp();
journal = gls.getJournal ("TestJournal");
chart = gls.getChart ("TestChart");
cashUS = gls.getFinalAccount (chart, "111");
cashPesos = gls.getFinalAccount (chart, "112");
bank = gls.getFinalAccount (chart, "113");
loan = gls.getFinalAccount (chart, "21");
bobEquity = gls.getFinalAccount (chart, "31");
}
public void testSimplePost () throws Exception {
BigDecimal amount = new BigDecimal ("5.00");
GLTransaction txn =
createTransaction ("Check ability to post",
cashUS, amount, cashPesos, amount, (short) 0);
Transaction tx = gls.beginTransaction();
gls.post (journal, txn);
tx.commit();
}
public void testUnbalancedPost () throws Exception {
GLTransaction txn =
createTransaction (
"Unbalanced transaction",
cashUS, new BigDecimal ("5.00"),
cashPesos, new BigDecimal ("5.01"), (short) 0
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
assertEquals (
"Transaction does not balance. debits=5.00, credits=5.01",
e.getMessage()
);
tx.rollback();
return;
}
fail ("GLException should have been raised");
}
public void testFinalMinBalance () throws Exception {
BigDecimal amount = new BigDecimal ("4996.00");
GLTransaction txn =
createTransaction (
"check MinBalance rule", cashUS, amount,
cashPesos, amount, (short) 0
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
tx.rollback();
if (!e.getMessage().startsWith (
"FinalMinBalance rule for account 112 failed"))
{
fail ("Unexpected GLException " + e.getMessage());
}
return;
}
fail ("GLException should have been raised");
}
public void testFinalMinBalanceInLayerOne () throws Exception {
BigDecimal amount = new BigDecimal ("4996.00");
GLTransaction txn =
createTransaction (
"check MinBalance rule", cashUS, amount,
cashPesos, amount, (short) 1
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
tx.rollback();
if (!e.getMessage().startsWith (
"FinalMinBalance rule for account 112 failed"))
{
fail ("Unexpected GLException " + e.getMessage());
}
return;
}
fail ("GLException should have been raised");
}
public void testCompositeMinBalance () throws Exception {
BigDecimal amount = new BigDecimal ("5001.00");
GLTransaction txn =
createTransaction (
"check parent MinBalance rule",
loan, amount,
bank, amount,
(short) 0
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
tx.rollback();
if (!e.getMessage().startsWith (
"CompositeMinBalance rule for account 11 failed"))
{
fail ("Unexpected GLException " + e.getMessage());
}
return;
}
fail ("GLException should have been raised");
}
public void testCompositeMaxBalance () throws Exception {
BigDecimal amount = new BigDecimal ("1000000.00");
GLTransaction txn =
createTransaction (
"check parent MaxBalance rule",
bank, amount,
loan, amount,
(short) 0
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
tx.rollback();
if (!e.getMessage().startsWith (
"CompositeMaxBalance rule for account 1 failed"))
{
fail ("Unexpected GLException " + e.getMessage());
}
return;
}
fail ("GLException should have been raised");
}
public void testFinalMaxBalance () throws Exception {
BigDecimal amount = new BigDecimal ("100000.00");
GLTransaction txn =
createTransaction (
"check parent MaxBalance rule",
cashUS, amount,
bobEquity, amount,
(short) 0
);
Transaction tx = gls.beginTransaction();
try {
gls.post (journal, txn);
tx.commit();
} catch (GLException e) {
tx.rollback();
if (!e.getMessage().startsWith (
"FinalMaxBalance rule for account 31 failed"))
{
fail ("Unexpected GLException " + e.getMessage());
}
return;
}
fail ("GLException should have been raised");
}
private GLTransaction createTransaction
(String detail,
FinalAccount debitAccount, BigDecimal debitAmount,
FinalAccount creditAccount, BigDecimal creditAmount, short layer)
throws GLException, HibernateException
{
GLTransaction txn = new GLTransaction (detail);
txn.setPostDate (new Date());
txn.createDebit (debitAccount, debitAmount, null, layer);
txn.createCredit (creditAccount, creditAmount, null, layer);
return txn;
}
}