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