package org.fourthline.konto.test.ledger;
import org.fourthline.konto.server.dao.AccountDAO;
import org.fourthline.konto.server.dao.EntryDAO;
import org.seamless.util.time.DateRange;
import org.fourthline.konto.shared.entity.Account;
import org.fourthline.konto.shared.entity.Entry;
import org.fourthline.konto.shared.entity.Split;
import org.fourthline.konto.shared.query.LedgerLinesQueryCriteria;
import org.fourthline.konto.shared.result.LedgerLine;
import org.fourthline.konto.test.HibernateTest;
import org.testng.annotations.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import static org.testng.Assert.assertEquals;
/**
* @author Christian Bauer
*/
public class LedgerLineQueryTest extends HibernateTest {
@Test
public void loadLinesAccountOne() {
getCurrentSession().beginTransaction();
Account account = new AccountDAO().getAccount(1l);
EntryDAO entryDAO = new EntryDAO();
List<LedgerLine> lines = entryDAO.getLedgerLines(account, new LedgerLinesQueryCriteria(null));
assertEquals(lines.size(), 10);
Iterator<LedgerLine> it = lines.iterator();
LedgerLine line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(10));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Paid mortgage interest");
assertEquals(line.getFromToAccount().getName(), "Mortgage Interest");
assertEquals(line.getDebit().getString(), "150.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "1000.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(12));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Withdrawal at ATM");
assertEquals(line.getFromToAccount().getName(), "Cash in Wallet");
assertEquals(line.getDebit().getString(), "100.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "1150.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(11));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Salary paid by employer");
assertEquals(line.getFromToAccount().getName(), "Salary");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "700.00");
assertEquals(line.getBalance().getString(), "1250.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(8));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Amortization");
assertEquals(line.getFromToAccount().getName(), "Mortgage");
assertEquals(line.getDebit().getString(), "500.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "550.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(10));
assertEquals(line.getLedgerEntry().getClass(), Split.class);
assertEquals(((Split) line.getLedgerEntry()).getEntryMonetaryUnit().getCurrencyCode(), "EUR");
assertEquals(((Split) line.getLedgerEntry()).getMonetaryUnit().getCurrencyCode(), "USD");
assertEquals(line.getDescription(), "Converted to USD");
assertEquals(line.getFromToAccount().getName(), "My other account");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "50.00");
assertEquals(line.getBalance().getString(), "1050.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(5));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Mastercard Bill");
assertEquals(line.getFromToAccount(), null);
assertEquals(line.getDebit().getString(), "130.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "1000.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(4));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Salary paid by employer");
assertEquals(line.getFromToAccount().getName(), "Salary");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "700.00");
assertEquals(line.getBalance().getString(), "1130.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(3));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Transfering money to EUR account");
assertEquals(line.getFromToAccount().getName(), "My other account");
assertEquals(line.getDebit().getString(), "500.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "430.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(2));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Changing the tires");
assertEquals(line.getFromToAccount().getName(), "Maintenance");
assertEquals(line.getDebit().getString(), "20.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "930.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(1));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Filling up the car");
assertEquals(line.getFromToAccount().getName(), "Gas");
assertEquals(line.getDebit().getString(), "50.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "950.00");
getCurrentSession().getTransaction().commit();
}
@Test
public void loadLinesAccountTwo() {
getCurrentSession().beginTransaction();
Account account = new AccountDAO().getAccount(2l);
EntryDAO entryDAO = new EntryDAO();
List<LedgerLine> lines = entryDAO.getLedgerLines(account, new LedgerLinesQueryCriteria(null));
assertEquals(lines.size(), 3);
Iterator<LedgerLine> it = lines.iterator();
LedgerLine line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(7));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Converted to USD");
assertEquals(line.getFromToAccount().getName(), "My USD account");
assertEquals(line.getDebit().getString(), "37.50");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "300.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(6));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Paid gas in euros");
assertEquals(line.getFromToAccount().getName(), "Gas");
assertEquals(line.getDebit().getString(), "37.50");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "337.50");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(3));
assertEquals(line.getLedgerEntry().getClass(), Split.class);
assertEquals(line.getDescription(), "Transfering money to EUR account");
assertEquals(line.getFromToAccount().getName(), "My USD account");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "375.00");
assertEquals(line.getBalance().getString(), "375.00");
getCurrentSession().getTransaction().commit();
}
@Test
public void loadLinesAccountThree() {
getCurrentSession().beginTransaction();
Account account = new AccountDAO().getAccount(3l);
EntryDAO entryDAO = new EntryDAO();
List<LedgerLine> lines = entryDAO.getLedgerLines(account, new LedgerLinesQueryCriteria(null));
assertEquals(lines.size(), 4);
Iterator<LedgerLine> it = lines.iterator();
LedgerLine line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(9));
assertEquals(((Split) line.getLedgerEntry()).getEntry().getId(), new Long(6));
assertEquals(line.getDescription(), "Paid gas in euros");
assertEquals(line.getFromToAccount().getName(), "My other account");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "50.00");
assertEquals(line.getBalance().getString(), "150.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(7));
assertEquals(((Split) line.getLedgerEntry()).getEntry().getId(), new Long(5));
assertEquals(line.getDescription(), "Refund from the gas station");
assertEquals(line.getFromToAccount().getName(), "My USD account");
assertEquals(line.getDebit().getString(), "20.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "100.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(5));
assertEquals(((Split) line.getLedgerEntry()).getEntry().getId(), new Long(5));
assertEquals(line.getDescription(), "Stop at the gas station");
assertEquals(line.getFromToAccount().getName(), "My USD account");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "70.00");
assertEquals(line.getBalance().getString(), "120.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(1));
assertEquals(((Split) line.getLedgerEntry()).getEntry().getId(), new Long(1));
assertEquals(line.getDescription(), "Filling up the car");
assertEquals(line.getFromToAccount().getName(), "My USD account");
assertEquals(line.getDebit().getString(), "0.00");
assertEquals(line.getCredit().getString(), "50.00");
assertEquals(line.getBalance().getString(), "50.00");
getCurrentSession().getTransaction().commit();
}
@Test
public void loadLinesFiltered() {
getCurrentSession().beginTransaction();
Account account = new AccountDAO().getAccount(1l);
EntryDAO entryDAO = new EntryDAO();
LedgerLinesQueryCriteria criteria = new LedgerLinesQueryCriteria(
"car", true, null
);
List<LedgerLine> lines = entryDAO.getLedgerLines(account, criteria);
assertEquals(lines.size(), 2);
Iterator<LedgerLine> it = lines.iterator();
LedgerLine line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(5));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Mastercard Bill");
assertEquals(line.getFromToAccount(), null);
assertEquals(line.getDebit().getString(), "130.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "-180.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(1));
assertEquals(line.getLedgerEntry().getClass(), Entry.class);
assertEquals(line.getDescription(), "Filling up the car");
assertEquals(line.getFromToAccount().getName(), "Gas");
assertEquals(line.getDebit().getString(), "50.00");
assertEquals(line.getCredit().getString(), "0.00");
assertEquals(line.getBalance().getString(), "-50.00");
getCurrentSession().getTransaction().commit();
}
@Test
public void loadLinesInDateRange() throws Exception {
getCurrentSession().beginTransaction();
Account account = new AccountDAO().getAccount(1l);
EntryDAO entryDAO = new EntryDAO();
Date startDate;
Date endDate;
LedgerLinesQueryCriteria criteria;
List<LedgerLine> lines;
Iterator<LedgerLine> it;
LedgerLine line;
endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-12-31");
criteria = new LedgerLinesQueryCriteria();
criteria.setEffectiveOn(new DateRange(null, endDate));
lines = entryDAO.getLedgerLines(account, criteria);
assertEquals(lines.size(), 6);
it = lines.iterator();
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(10));
assertEquals(line.getBalance().getString(), "1050.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(5));
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(4));
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(3));
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(2));
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(1));
startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-12-22");
endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-12-25");
criteria = new LedgerLinesQueryCriteria();
criteria.setEffectiveOn(new DateRange(startDate, endDate));
lines = entryDAO.getLedgerLines(account, criteria);
assertEquals(lines.size(), 3);
it = lines.iterator();
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(4));
assertEquals(line.getBalance().getString(), "1130.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(3));
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(2));
startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2011-01-01");
criteria = new LedgerLinesQueryCriteria();
criteria.setEffectiveOn(new DateRange(startDate));
assertEquals(criteria.getEffectiveOn().getEnd(), null);
lines = entryDAO.getLedgerLines(account, criteria);
assertEquals(lines.size(), 4);
it = lines.iterator();
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(10));
assertEquals(line.getBalance().getString(), "1000.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(12));
assertEquals(line.getBalance().getString(), "1150.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(11));
assertEquals(line.getBalance().getString(), "1250.00");
line = it.next();
assertEquals(line.getLedgerEntry().getId(), new Long(8));
assertEquals(line.getBalance().getString(), "550.00");
getCurrentSession().getTransaction().commit();
}
}