| 1 | import hashlib |
| 2 | |
| 3 | def _localname(type): |
| 4 | mod = type.__module__ |
| 5 | if mod.startswith("fulbank."): |
| 6 | mod = mod[8:] |
| 7 | return "%s.%s" % (mod, type.__name__) |
| 8 | |
| 9 | class account(object): |
| 10 | @property |
| 11 | def number(self): raise NotImplementedError("account.number") |
| 12 | @property |
| 13 | def name(self): raise NotImplementedError("account.name") |
| 14 | def transactions(self): raise NotImplementedError("account.transactions") |
| 15 | |
| 16 | def __repr__(self): |
| 17 | return "#<%s %s: %r>" % (_localname(type(self)), self.number, self.name) |
| 18 | |
| 19 | class txnaccount(account): |
| 20 | @property |
| 21 | def balance(self): raise NotImplementedError("txnaccount.balance") |
| 22 | @property |
| 23 | def clearing(self): raise NotImplementedError("txnaccount.clearing") |
| 24 | @property |
| 25 | def fullnumber(self): raise NotImplementedError("txnaccount.fullnumber") |
| 26 | |
| 27 | class cardaccount(account): |
| 28 | pass |
| 29 | |
| 30 | class transaction(object): |
| 31 | @property |
| 32 | def value(self): raise NotImplementedError("transaction.value") |
| 33 | @property |
| 34 | def message(self): raise NotImplementedError("transaction.message") |
| 35 | @property |
| 36 | def date(self): raise NotImplementedError("transaction.date") |
| 37 | |
| 38 | @property |
| 39 | def hash(self): |
| 40 | dig = hashlib.sha256() |
| 41 | dig.update(str(self.date.toordinal()).encode("ascii") + b"\0") |
| 42 | dig.update(self.message.encode("utf-8") + b"\0") |
| 43 | dig.update(str(self.value.amount).encode("ascii") + b"\0") |
| 44 | dig.update(self.value.currency.symbol.encode("ascii") + b"\0") |
| 45 | return dig.hexdigest() |
| 46 | |
| 47 | def __repr__(self): |
| 48 | return "#<%s %s: %r>" % (_localname(type(self)), self.value, self.message) |