main
1using System.Collections.Generic;
2using gorilla.utility;
3using solidware.financials.service.domain.payroll;
4
5namespace solidware.financials.service.domain.accounting
6{
7 public class DetailAccount : Account, Visitable<Entry>
8 {
9 DetailAccount(UnitOfMeasure unit_of_measure)
10 {
11 this.unit_of_measure = unit_of_measure;
12 }
13
14 static public DetailAccount New(UnitOfMeasure unit_of_measure)
15 {
16 return new DetailAccount(unit_of_measure);
17 }
18
19 public void deposit(decimal amount)
20 {
21 deposit(amount, unit_of_measure);
22 }
23
24 public void deposit(decimal amount, UnitOfMeasure units)
25 {
26 add(Entry.New<Deposit>(amount, units));
27 }
28
29 public void withdraw(decimal amount, UnitOfMeasure units)
30 {
31 add(Entry.New<Withdrawal>(amount, units));
32 }
33
34 public void add(Entry new_entry)
35 {
36 entries.Add(new_entry);
37 }
38
39 public Quantity balance()
40 {
41 return balance(Calendar.today());
42 }
43
44 public Quantity balance(Date date)
45 {
46 return balance(DateRange.up_to(date));
47 }
48
49 public Quantity balance(Range<Date> period)
50 {
51 var result = new Quantity(0, unit_of_measure);
52 accept(new AnonymousVisitor<Entry>(x =>
53 {
54 if (x.booked_in(period)) result = x.adjust(result);
55 }));
56 return result;
57 }
58
59 public void accept(Visitor<Entry> visitor)
60 {
61 foreach (var entry in entries) visitor.visit(entry);
62 }
63
64 IList<Entry> entries = new List<Entry>();
65 UnitOfMeasure unit_of_measure;
66 }
67}