package postingrules; /*Generated by MPS */ import java.util.List; import java.util.ArrayList; import mf.Currency; import mf.Money; import mf.MfDate; import mf.DateRange; public class Account { private List<Entry> myEntries = new ArrayList<Entry>(); private Currency myCurrency; private AccountType myType; public Account(Currency currency) { this(currency, null); } public Account(Currency currency, AccountType type) { this.myCurrency = currency; this.myType = type; } public void addEntry(Entry arg) { ensureSameCurrency(arg.getAmount()); myEntries.add(arg); arg.setAccount(this); } /*package*/ void addEntry(Money amount, MfDate date) { final Entry e = new Entry(amount, date); addEntry(e); } private void ensureSameCurrency(Money arg) { if (!(arg.currency().equals(myCurrency))) { throw new IllegalArgumentException("New item has incompatable currency"); } } public Money balance() { return balance(MfDate.today()); } /*package*/ Money balance(DateRange period) { Money result = new Money(0, myCurrency); for (Entry e : myEntries) { if (period.includes(e.getDate())) { result = result.add(e.getAmount()); } } return result; } /*package*/ Money balance(MfDate date) { return balance(DateRange.upTo(date)); } public Account copy() { Account result = new Account(myCurrency, myType); for (Entry e : myEntries) { result.addEntry(e.copy()); } return result; } /*package*/ Money deposits(DateRange period) { Money result = new Money(0, myCurrency); for (Entry each : myEntries) { if (period.includes(each.getDate()) && each.getAmount().isPositive()) { result = result.add(each.getAmount()); } } return result; } public Entry[] entries() { return myEntries.toArray(new Entry[0]); } /*package*/ boolean isValid() { return allMyEntriesReferToMe(); } /*package*/ boolean allMyEntriesReferToMe() { for (Entry e : myEntries) { if (e.getAccount() != this) { return false; } } return true; } @Override public String toString() { return "Acc: " + myType; } /*package*/ AccountType type() { return myType; } /*package*/ void withdraw(Money amount, Account target, MfDate date) { new AccountingTransaction(amount, this, target, date); } /*package*/ Money withdrawels(DateRange period) { Money result = new Money(0, myCurrency); for (Entry each : myEntries) { if (period.includes(each.getDate()) && each.getAmount().isNegative()) { result = result.add(each.getAmount()); } } return result; } }