summaryrefslogtreecommitdiffstats
path: root/bank-eiffel/account.e
diff options
context:
space:
mode:
Diffstat (limited to 'bank-eiffel/account.e')
-rw-r--r--bank-eiffel/account.e151
1 files changed, 62 insertions, 89 deletions
diff --git a/bank-eiffel/account.e b/bank-eiffel/account.e
index 61145f0..d0a3fc4 100644
--- a/bank-eiffel/account.e
+++ b/bank-eiffel/account.e
@@ -10,32 +10,10 @@ class
10create 10create
11 make 11 make
12 12
13-- TODO 13feature -- Access
14-- interest should defined by bank (via make?)
15-- add more checks to invariant (like balance >= creditline) ?
16-- check if balance is a getter and not a setter (doesn't has an assign)
17-- + check if authorized_signers is a getter and not a setter (it doesn't has an assign)
18-- -> if not: add a getter (via Result or so..) and move them to {NONE}
19-- much other stuff to test like: lower creditline so that balance will be invalid
20 14
21feature {NONE} -- Access 15 balance: REAL_64
22 16 -- Kontostand
23 creditline_range: ARRAY[REAL_64]
24 attribute Result := ({like creditline_range}).default end --| Remove line when Void Safety is properly set
25
26 interest_debit_range: ARRAY[REAL_64]
27 attribute Result := ({like interest_debit_range}).default end --| Remove line when Void Safety is properly set
28
29 interest_deposit_range: ARRAY[REAL_64]
30 -- min/max for interest_deposit
31 attribute Result := ({like interest_deposit_range}).default end --| Remove line when Void Safety is properly set
32
33 transfer_minamount: REAL_64 assign set_transfer_minamount
34 -- Mindestbetrag für jede Einzahlung, Auszahlung und Überweisung
35
36 authorized_signers: ARRAYED_SET [PERSON]
37 -- Zeichnungsberechtigte
38 attribute Result := ({like authorized_signers}).default end --| Remove line when Void Safety is properly set
39 17
40 creditline: REAL_64 assign set_creditline 18 creditline: REAL_64 assign set_creditline
41 -- Kreditrahmen 19 -- Kreditrahmen
@@ -46,25 +24,36 @@ feature {NONE} -- Access
46 interest_debit: REAL_64 assign set_interest_debit 24 interest_debit: REAL_64 assign set_interest_debit
47 -- Sollverzinsung 25 -- Sollverzinsung
48 26
49 balance: REAL_64 27 transfer_minamount: REAL_64 assign set_transfer_minamount
50 -- Kontostand 28 -- Mindestbetrag fuer jede Einzahlung, Auszahlung und Ueberweisung
29
30feature {NONE} -- Implementation
31
32 creditline_range: TUPLE [min: like creditline; max: like creditline]
33 -- min/max for creditline
34
35 interest_deposit_range: TUPLE [min: like interest_deposit; max: like interest_deposit]
36 -- min/max for interest_deposit
37
38 interest_debit_range: TUPLE [min: like interest_debit; max: like interest_debit]
39 -- min/max for interest_debit
40
41 authorized_signers: ARRAYED_SET [PERSON]
42 -- Zeichnungsberechtigte
51 43
52feature {NONE} -- Initialization 44feature {NONE} -- Initialization
53 45
54 make (an_authorized_signer: PERSON; 46 make (an_authorized_signer: PERSON;
55 an_interest_deposit: REAL_64; 47 an_interest_deposit: like interest_deposit;
56 an_interest_debit: REAL_64; 48 an_interest_debit: like interest_debit;
57 a_credit_line: REAL_64; 49 a_credit_line: like creditline;
58 an_interest_deposit_range: ARRAY[REAL_64]; 50 an_interest_deposit_range: like interest_deposit_range;
59 an_interest_debit_range: ARRAY[REAL_64]; 51 an_interest_debit_range: like interest_debit_range;
60 a_credit_line_range: ARRAY[REAL_64]) 52 a_credit_line_range: like creditline_range)
61 require 53 require
62 a_credit_line_range.count() = 2 54 a_credit_line_range.min < a_credit_line_range.max
63 an_interest_debit_range.count() = 2 55 an_interest_debit_range.min < an_interest_debit_range.max
64 an_interest_deposit_range.count() = 2 56 an_interest_deposit_range.min < an_interest_deposit_range.max
65 a_credit_line_range.item (1) < a_credit_line_range.item (2)
66 an_interest_debit_range.item (1) < an_interest_debit_range.item (2)
67 an_interest_deposit_range.item (1) < an_interest_deposit_range.item (2)
68 do 57 do
69 create authorized_signers.make(1) 58 create authorized_signers.make(1)
70 add_authorized_signer (an_authorized_signer) 59 add_authorized_signer (an_authorized_signer)
@@ -82,9 +71,8 @@ feature -- Basic operations
82 71
83 deposit (an_amount: like transfer_minamount; an_authorized_signer: PERSON) 72 deposit (an_amount: like transfer_minamount; an_authorized_signer: PERSON)
84 require 73 require
85 an_authorized_signer_authorized: has_authorized_signer (an_authorized_signer) 74 an_authorized_signer_authorized: get_authorized_signers.has (an_authorized_signer)
86 an_amount_positive: an_amount > 0.0 75 transfer_minamount_ok: an_amount >= transfer_minamount
87 transfer_minamount_ok: an_amount >= get_transfer_minamount
88 do 76 do
89 balance := balance + an_amount 77 balance := balance + an_amount
90 ensure 78 ensure
@@ -94,71 +82,55 @@ feature -- Basic operations
94 82
95 withdraw (an_amount: like transfer_minamount; an_authorized_signer: PERSON) 83 withdraw (an_amount: like transfer_minamount; an_authorized_signer: PERSON)
96 require 84 require
97 an_authorized_signer_authorized: has_authorized_signer (an_authorized_signer) 85 an_authorized_signer_authorized: get_authorized_signers.has (an_authorized_signer)
98 an_amount_positive: an_amount > 0.0 86 transfer_minamount_ok: an_amount >= transfer_minamount
99 transfer_minamount_ok: an_amount >= get_transfer_minamount
100 do 87 do
101 balance := balance - an_amount 88 balance := balance - an_amount
102 ensure 89 ensure
103 balance_decreased: balance < old balance 90 balance_decreased: balance < old balance
104 withdrawed: balance = old balance - an_amount 91 withdrawed: balance = old balance - an_amount
105 creditline_ok: balance >= creditline 92 balance_beneath_creditline: balance >= creditline
106 end 93 end
107 94
108 transfer(an_amount: like transfer_minamount; an_authorized_signer: PERSON; an_account: like Current; another_authorized_signer: PERSON;) 95 transfer(an_amount: like transfer_minamount; an_authorized_signer: PERSON;
109 require 96 an_account: like Current; another_authorized_signer: PERSON)
110 an_account_attached: an_account /= Void
111 do 97 do
112 withdraw (an_amount, an_authorized_signer) 98 withdraw (an_amount, an_authorized_signer)
113 an_account.deposit (an_amount, another_authorized_signer) 99 an_account.deposit (an_amount, another_authorized_signer)
114 end 100 end
115 101
116 add_authorized_signer (an_authorized_signer: PERSON) 102 add_authorized_signer (an_authorized_signer: PERSON)
117 require
118 an_authorized_signer_attached: an_authorized_signer /= Void
119 an_authorized_signer_notinlist: not has_authorized_signer (an_authorized_signer)
120 do 103 do
121 authorized_signers.put (an_authorized_signer) 104 if not authorized_signers.has (an_authorized_signer) then
105 authorized_signers.put (an_authorized_signer)
106 end
122 ensure 107 ensure
123 authorized_signers_assigned: authorized_signers.has (an_authorized_signer) 108 authorized_signers_assigned: authorized_signers.has (an_authorized_signer)
124 end 109 end
125 110
126 remove_authorized_signer (an_authorized_signer: PERSON) 111 remove_authorized_signer (an_authorized_signer: PERSON)
127 require 112 require
128 an_authorized_signer_attached: an_authorized_signer /= Void 113 authorized_signers_never_empty: get_authorized_signers.count >= 2
129 an_authorized_signer_inlist: has_authorized_signer (an_authorized_signer)
130 authorized_signers_never_empty: authorized_signers_count >= 2
131 do 114 do
132 authorized_signers.prune (an_authorized_signer) 115 if authorized_signers.has (an_authorized_signer) then
116 authorized_signers.prune (an_authorized_signer)
117 end
133 ensure 118 ensure
134 authorized_signers_assigned: not authorized_signers.has (an_authorized_signer) 119 authorized_signers_assigned: not authorized_signers.has (an_authorized_signer)
135 end 120 end
136 121
137 has_authorized_signer (an_authorized_signer: PERSON) : BOOLEAN 122 get_authorized_signers: FINITE [PERSON]
138 do 123 do
139 Result := authorized_signers.has (an_authorized_signer) 124 Result := authorized_signers
140 end
141
142 authorized_signers_count : INTEGER
143 do
144 Result := authorized_signers.count
145 end
146
147 get_transfer_minamount : REAL_64
148 do
149 Result := transfer_minamount
150 end
151
152 get_balance : REAL_64
153 do
154 Result := balance
155 end 125 end
156 126
157 advance 127 advance
158 do 128 do
159 if balance < 0.0 then -- debit 129 if balance < 0.0 then
130 -- debit
160 balance := balance + (balance * interest_debit) 131 balance := balance + (balance * interest_debit)
161 else -- deposit 132 else
133 -- deposit
162 balance := balance + (balance * interest_deposit) 134 balance := balance + (balance * interest_deposit)
163 end 135 end
164 end 136 end
@@ -166,7 +138,6 @@ feature -- Basic operations
166feature {NONE} -- Implementation 138feature {NONE} -- Implementation
167 139
168 set_transfer_minamount (a_transfer_minamount: like transfer_minamount) 140 set_transfer_minamount (a_transfer_minamount: like transfer_minamount)
169 -- Assign `transfer_minamount' with `a_transfer_minamount'.
170 require 141 require
171 a_transfer_minamount_positive: a_transfer_minamount > 0.0 142 a_transfer_minamount_positive: a_transfer_minamount > 0.0
172 do 143 do
@@ -176,7 +147,9 @@ feature {NONE} -- Implementation
176 end 147 end
177 148
178 set_creditline (a_creditline: like creditline) 149 set_creditline (a_creditline: like creditline)
179 -- Assign `creditline' with `a_creditline'. 150 require
151 a_creditline_within_bounds: a_creditline >= creditline_range.min
152 and a_creditline <= creditline_range.max
180 do 153 do
181 creditline := a_creditline 154 creditline := a_creditline
182 ensure 155 ensure
@@ -184,9 +157,9 @@ feature {NONE} -- Implementation
184 end 157 end
185 158
186 set_interest_deposit (an_interest_deposit: like interest_deposit) 159 set_interest_deposit (an_interest_deposit: like interest_deposit)
187 -- Assign `interest_deposit' with `an_interest_deposit'.
188 require 160 require
189 an_interest_deposit_within_bounds: an_interest_deposit >= 0.0 and an_interest_deposit <= 1.0 161 an_interest_deposit_within_bounds: interest_deposit >= interest_deposit_range.min
162 and interest_deposit <= interest_deposit_range.max
190 do 163 do
191 interest_deposit := an_interest_deposit 164 interest_deposit := an_interest_deposit
192 ensure 165 ensure
@@ -194,7 +167,9 @@ feature {NONE} -- Implementation
194 end 167 end
195 168
196 set_interest_debit (an_interest_debit: like interest_debit) 169 set_interest_debit (an_interest_debit: like interest_debit)
197 -- Assign `interest_debit' with `an_interest_debit'. 170 require
171 an_interest_deposit_within_bounds: interest_debit >= interest_debit_range.min
172 and interest_debit <= interest_debit_range.max
198 do 173 do
199 interest_debit := an_interest_debit 174 interest_debit := an_interest_debit
200 ensure 175 ensure
@@ -202,14 +177,12 @@ feature {NONE} -- Implementation
202 end 177 end
203 178
204invariant 179invariant
205 interest_debit_within_bounds:
206 interest_debit >= interest_debit_range.item (1) and
207 interest_debit <= interest_debit_range.item (2)
208 interest_deposit_within_bounds:
209 interest_deposit >= interest_deposit_range.item (1) and
210 interest_deposit <= interest_deposit_range.item (2)
211 authorized_signers_attached: authorized_signers /= Void
212 authorized_signers_not_empty: authorized_signers.count > 0 180 authorized_signers_not_empty: authorized_signers.count > 0
213 transfer_minamount_positive: transfer_minamount > 0.0 181 transfer_minamount_positive: transfer_minamount > 0.0
214 creditline_range_correct: creditline >= creditline_range.item (1) and creditline <= creditline_range.item (2) 182 creditline_within_bounds: creditline >= creditline_range.min
183 and creditline <= creditline_range.max
184 interest_debit_within_bounds: interest_debit >= interest_debit_range.min
185 and interest_debit <= interest_debit_range.max
186 interest_deposit_within_bounds: interest_deposit >= interest_deposit_range.min
187 and interest_deposit <= interest_deposit_range.max
215end 188end