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}