From c41bfb4bdfb01e914b7942927b4b498a818bf25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Tue, 22 Nov 2022 21:58:26 +0000 Subject: [PATCH] Add offset option to bank A bank had an offset on the date of the transactions... It also passes the interal Bank type to the converter, to access it's additional options before converting. --- pfbudget/common/types.py | 1 + pfbudget/db/schema.py | 7 +++++-- pfbudget/input/nordigen.py | 3 +-- pfbudget/utils/converters.py | 40 ++++++++++++++++++++++++++++-------- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/pfbudget/common/types.py b/pfbudget/common/types.py index ac10d66..a6641a9 100644 --- a/pfbudget/common/types.py +++ b/pfbudget/common/types.py @@ -118,6 +118,7 @@ class Bank: bic: str requisition_id: str invert: bool + offset: int key: PrimaryKey = PrimaryKey.ID diff --git a/pfbudget/db/schema.py b/pfbudget/db/schema.py index 1b5eb24..e212994 100644 --- a/pfbudget/db/schema.py +++ b/pfbudget/db/schema.py @@ -50,7 +50,8 @@ CREATE TABLE IF NOT EXISTS banks ( nordigen_id TEXT, nordigen_name TEXT, requisition_id TEXT, - invert INTEGER + invert INTEGER, + offset INTEGER ) """ @@ -62,7 +63,8 @@ class DbBank: nordigen_id: str nordigen_name: str requisition_id: str - invert: bool + invert: bool = False + offset: int = 0 def tuple(self): return ( @@ -72,6 +74,7 @@ class DbBank: self.nordigen_name, self.requisition_id, int(self.invert), + self.offset, ) diff --git a/pfbudget/input/nordigen.py b/pfbudget/input/nordigen.py index 541fce8..b52a9cd 100644 --- a/pfbudget/input/nordigen.py +++ b/pfbudget/input/nordigen.py @@ -72,8 +72,7 @@ class NordigenInput(Input): continue converted = [ - convert(t, bank.name, bank.invert) - for t in downloaded["transactions"]["booked"] + convert(t, bank) for t in downloaded["transactions"]["booked"] ] transactions.extend( diff --git a/pfbudget/utils/converters.py b/pfbudget/utils/converters.py index 106b65d..b3f27df 100644 --- a/pfbudget/utils/converters.py +++ b/pfbudget/utils/converters.py @@ -1,3 +1,4 @@ +from datetime import timedelta from functools import singledispatch from pfbudget.common.types import Bank, Transaction, TransactionError @@ -13,7 +14,15 @@ def convert(t): @convert.register def _(t: Transaction) -> DbTransaction: - return DbTransaction(t.date, t.description, t.bank, t.value, t.category, t.original, t.additional_comment) + return DbTransaction( + t.date, + t.description, + t.bank, + t.value, + t.category, + t.original, + t.additional_comment, + ) @convert.register @@ -26,23 +35,38 @@ def _(db: DbTransaction) -> Transaction: @convert.register def _(db: DbBank, key: str = "") -> Bank: - return Bank(db.name, db.bic, db.requisition_id, db.invert, key=key) + bank = Bank(db.name, db.bic, db.requisition_id, db.invert, db.offset, key=key) + if not bank.invert: + bank.invert = False + if not bank.offset: + bank.offset = 0 + return bank @convert.register -def _(bank: Bank, key: str = "") -> DbBank: - return DbBank(bank.name, bank.bic, "", "", bank.requisition_id, bank.invert) +def _(bank: Bank) -> DbBank: + bank = DbBank( + bank.name, bank.bic, "", "", bank.requisition_id, bank.invert, bank.offset + ) + if not bank.invert: + bank.invert = False + if not bank.offset: + bank.offset = 0 + return bank @convert.register -def _(json: dict, bank: str, invert: bool) -> Transaction: - i = -1 if invert else 1 +def _(json: dict, bank: Bank) -> Transaction: + i = -1 if bank.invert else 1 try: - return Transaction( + transaction = Transaction( json["bookingDate"], json["remittanceInformationUnstructured"], - bank, + bank.name, i * parse_decimal(json["transactionAmount"]["amount"]), ) + transaction.date += timedelta(days=bank.offset) + return transaction + except TransactionError: print(f"{json} is in the wrong format")