Compare commits

..

No commits in common. "5f2cb6fcf59d09b9bd52c6e54de600ad6780962d" and "e3756fa442aaa13b94fe1f0affe3461b45259ee3" have entirely different histories.

6 changed files with 26 additions and 69 deletions

View File

@ -194,19 +194,19 @@ def argparser(manager: Manager) -> argparse.ArgumentParser:
p_nordigen_access.set_defaults(func=lambda args: NordigenInput(manager).token())
"""
(Re)new bank requisition ID
Access to Nordigen API
"""
p_nordigen_access = subparsers.add_parser(
"renew",
description="(Re)new the Bank requisition ID",
description="Renew the requisition ID",
parents=[help],
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
p_nordigen_access.add_argument("name", nargs=1, type=str)
p_nordigen_access.add_argument("institution", nargs=1, type=str)
p_nordigen_access.add_argument("country", nargs=1, type=str)
p_nordigen_access.set_defaults(
func=lambda args: NordigenInput(manager).requisition(
args.name[0], args.country[0]
func=lambda args: NordigenInput().requisition(
args.institution[0], args.country[0]
)
)

View File

@ -27,7 +27,7 @@ class Transaction:
self.description = " ".join(arg[1].split())
self.bank = arg[2]
if type(arg[3]) is float:
self.value = Decimal(str(arg[3]))
self.value = arg[3]
else:
self.value = Decimal(args[3])
self.category = arg[4]
@ -118,7 +118,6 @@ class Bank:
bic: str
requisition_id: str
invert: bool
offset: int
key: PrimaryKey = PrimaryKey.ID

View File

@ -50,8 +50,7 @@ CREATE TABLE IF NOT EXISTS banks (
nordigen_id TEXT,
nordigen_name TEXT,
requisition_id TEXT,
invert INTEGER,
offset INTEGER
invert INTEGER
)
"""
@ -63,8 +62,7 @@ class DbBank:
nordigen_id: str
nordigen_name: str
requisition_id: str
invert: bool = False
offset: int = 0
invert: bool
def tuple(self):
return (
@ -74,7 +72,6 @@ class DbBank:
self.nordigen_name,
self.requisition_id,
int(self.invert),
self.offset,
)

View File

@ -1,10 +1,9 @@
from datetime import date
from time import sleep
from requests import HTTPError, ReadTimeout
from requests import ReadTimeout
from dotenv import load_dotenv
from nordigen import NordigenClient
from uuid import uuid4
import json
import os
import webbrowser
@ -65,22 +64,16 @@ class NordigenInput(Input):
break
except ReadTimeout:
retries += 1
print(f"Request #{retries} timed-out, retrying in 1s")
sleep(1)
except HTTPError as e:
retries += 1
print(f"Request #{retries} failed with {e}, retrying in 1s")
print(f"Request #{retries} timed-out, waiting 1s")
sleep(1)
if not downloaded:
print(f"Couldn't download transactions for {account}")
continue
with open("json/" + bank.name + ".json", "w") as f:
json.dump(downloaded, f)
converted = [
convert(t, bank) for t in downloaded["transactions"]["booked"]
convert(t, bank.name, bank.invert)
for t in downloaded["transactions"]["booked"]
]
transactions.extend(

View File

@ -4,7 +4,7 @@ from importlib import import_module
import datetime as dt
import yaml
from pfbudget.common.types import NoBankSelected, Transaction, Transactions
from pfbudget.common.types import Transaction
from pfbudget.utils import utils
Index = namedtuple(
@ -43,7 +43,7 @@ Options = namedtuple(
)
def parse_data(filename: str, args: dict) -> Transactions:
def parse_data(filename: str, args: dict) -> None:
cfg: dict = yaml.safe_load(open("parsers.yaml"))
assert (
"Banks" in cfg
@ -57,25 +57,17 @@ def parse_data(filename: str, args: dict) -> Transactions:
bank = args["bank"][0]
creditcard = None if not args["creditcard"] else args["creditcard"][0]
try:
if not creditcard:
options: dict = cfg[bank]
except KeyError as e:
banks = cfg["Banks"]
raise NoBankSelected(f"{e} not a valid bank, try one of {banks}")
if creditcard:
try:
options = options[creditcard]
except KeyError as e:
creditcards = cfg["CreditCards"]
raise NoBankSelected(f"{e} not a valid bank, try one of {creditcards}")
else:
options: dict = cfg[bank][creditcard]
bank += creditcard
if args["category"]:
options["category"] = args["category"][0]
if options.get("additional_parser"):
parser = getattr(import_module("pfbudget.input.parsers"), bank)
parser = getattr(import_module("pfbudget.parsers"), bank)
transactions = parser(filename, bank, options).parse()
else:
transactions = Parser(filename, bank, options).parse()

View File

@ -1,4 +1,3 @@
from datetime import timedelta
from functools import singledispatch
from pfbudget.common.types import Bank, Transaction, TransactionError
@ -14,15 +13,7 @@ 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
@ -35,38 +26,23 @@ def _(db: DbTransaction) -> Transaction:
@convert.register
def _(db: DbBank, key: str = "") -> Bank:
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
return Bank(db.name, db.bic, db.requisition_id, db.invert, key=key)
@convert.register
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
def _(bank: Bank, key: str = "") -> DbBank:
return DbBank(bank.name, bank.bic, "", "", bank.requisition_id, bank.invert)
@convert.register
def _(json: dict, bank: Bank) -> Transaction:
i = -1 if bank.invert else 1
def _(json: dict, bank: str, invert: bool) -> Transaction:
i = -1 if invert else 1
try:
transaction = Transaction(
return Transaction(
json["bookingDate"],
json["remittanceInformationUnstructured"],
bank.name,
bank,
i * parse_decimal(json["transactionAmount"]["amount"]),
)
transaction.date += timedelta(days=bank.offset)
return transaction
except TransactionError:
print(f"{json} is in the wrong format")