diff options
Diffstat (limited to 'bank-eiffel/account.e')
| -rw-r--r-- | bank-eiffel/account.e | 151 |
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 | |||
| 10 | create | 10 | create |
| 11 | make | 11 | make |
| 12 | 12 | ||
| 13 | -- TODO | 13 | feature -- 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 | ||
| 21 | feature {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 | |||
| 30 | feature {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 | ||
| 52 | feature {NONE} -- Initialization | 44 | feature {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 | |||
| 166 | feature {NONE} -- Implementation | 138 | feature {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 | ||
| 204 | invariant | 179 | invariant |
| 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 | ||
| 215 | end | 188 | end |
