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}