X-Git-Url: http://dolda2000.com/gitweb/?p=fulbank.git;a=blobdiff_plain;f=fulbank%2Ffsb.py;h=58a54dce6a2aee48c7ddd300731315e4aace902e;hp=723f61be2e25b79396c8322b0d01c49d95286a36;hb=717d54fc63dac677f3c19728e0943fdccc510d07;hpb=c526374d7861581204f40aa046002e5f3942d405 diff --git a/fulbank/fsb.py b/fulbank/fsb.py index 723f61b..58a54dc 100644 --- a/fulbank/fsb.py +++ b/fulbank/fsb.py @@ -1,7 +1,7 @@ -import json, http.cookiejar, binascii, time, datetime, pickle, hashlib +import json, http.cookiejar, binascii, time, datetime, pickle from urllib import request, parse from bs4 import BeautifulSoup as soup -from . import currency, auth +from . import currency, auth, data soupify = lambda cont: soup(cont, "html.parser") apibase = "https://online.swedbank.se/TDE_DAP_Portal_REST_WEB/api/" @@ -15,19 +15,23 @@ class autherror(Exception): pass def resolve(d, keys, default=fmterror): - def err(): + def err(key): if default is fmterror: - raise fmterror() + raise fmterror(key) return default def rec(d, keys): if len(keys) == 0: return d if isinstance(d, dict): if keys[0] not in d: - return err() + return err(keys[0]) + return rec(d[keys[0]], keys[1:]) + elif isinstance(d, list): + if not 0 <= keys[0] < len(d): + return err(keys[0]) return rec(d[keys[0]], keys[1:]) else: - return err() + return err(keys[0]) return rec(d, keys) def linkurl(ln): @@ -48,7 +52,7 @@ def getdsid(): def base64(data): return binascii.b2a_base64(data).decode("ascii").strip().rstrip("=") -class transaction(object): +class transaction(data.transaction): def __init__(self, account, data): self.account = account self._data = data @@ -64,19 +68,7 @@ class transaction(object): p = time.strptime(resolve(self._data, ("accountingDate",)), self._datefmt) return datetime.date(p.tm_year, p.tm_mon, p.tm_mday) - @property - def hash(self): - dig = hashlib.sha256() - dig.update(str(self.date.toordinal()).encode("ascii") + b"\0") - dig.update(self.message.encode("utf-8") + b"\0") - dig.update(str(self.value.amount).encode("ascii") + b"\0") - dig.update(self.value.currency.symbol.encode("ascii") + b"\0") - return dig.hexdigest() - - def __repr__(self): - return "#" % (self.value, self.message) - -class account(object): +class txnaccount(data.txnaccount): def __init__(self, sess, id, idata): self.sess = sess self.id = id @@ -112,8 +104,57 @@ class account(object): yield transaction(self, tx) page += 1 - def __repr__(self): - return "#" % (self.fullnumber, self.name) +class cardtransaction(data.transaction): + def __init__(self, account, data): + self.account = account + self._data = data + + _datefmt = "%Y-%m-%d" + + @property + def value(self): + am = resolve(self._data, ("localAmount",)) + return currency.currency.get(resolve(am, ("currencyCode",))).parse(resolve(am, ("amount",))) + @property + def message(self): return resolve(self._data, ("description",)) + @property + def date(self): + p = time.strptime(resolve(self._data, ("date",)), self._datefmt) + return datetime.date(p.tm_year, p.tm_mon, p.tm_mday) + +class cardaccount(data.cardaccount): + def __init__(self, sess, id, idata): + self.sess = sess + self.id = id + self._data = None + self._idata = idata + + @property + def data(self): + if self._data is None: + self._data = self.sess._jreq("v5/engagement/cardaccount/" + self.id) + return self._data + + @property + def number(self): return resolve(self.data, ("cardAccount", "cardNumber")) + @property + def balance(self): + cc = resolve(self.data, ("transactions", 0, "localAmount", "currencyCode")) + return currency.currency.get(cc).parse(resolve(self.data, ("cardAccount", "currentBalance"))) + @property + def name(self): return resolve(self._idata, ("name",)) + + def transactions(self): + pagesz = 50 + page = 1 + while True: + data = self.sess._jreq("v5/engagement/cardaccount/" + self.id, transactionsPerPage=pagesz, page=page) + txlist = resolve(data, ("transactions",)) + if len(txlist) < 1: + break + for tx in txlist: + yield cardtransaction(self, tx) + page += 1 class session(object): def __init__(self, dsid): @@ -206,7 +247,9 @@ class session(object): data = self._jreq("v5/engagement/overview") accounts = [] for acct in resolve(data, ("transactionAccounts",)): - accounts.append(account(self, resolve(acct, ("id",)), acct)) + accounts.append(txnaccount(self, resolve(acct, ("id",)), acct)) + for acct in resolve(data, ("cardAccounts",)): + accounts.append(cardaccount(self, resolve(acct, ("id",)), acct)) self._accounts = accounts return self._accounts