Compare commits
6 Commits
e3756fa442
...
5f2cb6fcf5
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f2cb6fcf5 | |||
| 9345530f06 | |||
| a364d7b46d | |||
| 647db5e86f | |||
| c41bfb4bdf | |||
| a0d3af715e |
@ -194,19 +194,19 @@ def argparser(manager: Manager) -> argparse.ArgumentParser:
|
||||
p_nordigen_access.set_defaults(func=lambda args: NordigenInput(manager).token())
|
||||
|
||||
"""
|
||||
Access to Nordigen API
|
||||
(Re)new bank requisition ID
|
||||
"""
|
||||
p_nordigen_access = subparsers.add_parser(
|
||||
"renew",
|
||||
description="Renew the requisition ID",
|
||||
description="(Re)new the Bank requisition ID",
|
||||
parents=[help],
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
)
|
||||
p_nordigen_access.add_argument("institution", nargs=1, type=str)
|
||||
p_nordigen_access.add_argument("name", nargs=1, type=str)
|
||||
p_nordigen_access.add_argument("country", nargs=1, type=str)
|
||||
p_nordigen_access.set_defaults(
|
||||
func=lambda args: NordigenInput().requisition(
|
||||
args.institution[0], args.country[0]
|
||||
func=lambda args: NordigenInput(manager).requisition(
|
||||
args.name[0], args.country[0]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@ class Transaction:
|
||||
self.description = " ".join(arg[1].split())
|
||||
self.bank = arg[2]
|
||||
if type(arg[3]) is float:
|
||||
self.value = arg[3]
|
||||
self.value = Decimal(str(arg[3]))
|
||||
else:
|
||||
self.value = Decimal(args[3])
|
||||
self.category = arg[4]
|
||||
@ -118,6 +118,7 @@ class Bank:
|
||||
bic: str
|
||||
requisition_id: str
|
||||
invert: bool
|
||||
offset: int
|
||||
key: PrimaryKey = PrimaryKey.ID
|
||||
|
||||
|
||||
|
||||
@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
from datetime import date
|
||||
from time import sleep
|
||||
from requests import ReadTimeout
|
||||
from requests import HTTPError, ReadTimeout
|
||||
from dotenv import load_dotenv
|
||||
from nordigen import NordigenClient
|
||||
from uuid import uuid4
|
||||
import json
|
||||
import os
|
||||
import webbrowser
|
||||
|
||||
@ -64,16 +65,22 @@ class NordigenInput(Input):
|
||||
break
|
||||
except ReadTimeout:
|
||||
retries += 1
|
||||
print(f"Request #{retries} timed-out, waiting 1s")
|
||||
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")
|
||||
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.name, bank.invert)
|
||||
for t in downloaded["transactions"]["booked"]
|
||||
convert(t, bank) for t in downloaded["transactions"]["booked"]
|
||||
]
|
||||
|
||||
transactions.extend(
|
||||
|
||||
@ -4,7 +4,7 @@ from importlib import import_module
|
||||
import datetime as dt
|
||||
import yaml
|
||||
|
||||
from pfbudget.common.types import Transaction
|
||||
from pfbudget.common.types import NoBankSelected, Transaction, Transactions
|
||||
from pfbudget.utils import utils
|
||||
|
||||
Index = namedtuple(
|
||||
@ -43,7 +43,7 @@ Options = namedtuple(
|
||||
)
|
||||
|
||||
|
||||
def parse_data(filename: str, args: dict) -> None:
|
||||
def parse_data(filename: str, args: dict) -> Transactions:
|
||||
cfg: dict = yaml.safe_load(open("parsers.yaml"))
|
||||
assert (
|
||||
"Banks" in cfg
|
||||
@ -57,17 +57,25 @@ def parse_data(filename: str, args: dict) -> None:
|
||||
bank = args["bank"][0]
|
||||
creditcard = None if not args["creditcard"] else args["creditcard"][0]
|
||||
|
||||
if not creditcard:
|
||||
try:
|
||||
options: dict = cfg[bank]
|
||||
else:
|
||||
options: dict = cfg[bank][creditcard]
|
||||
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}")
|
||||
bank += creditcard
|
||||
|
||||
if args["category"]:
|
||||
options["category"] = args["category"][0]
|
||||
|
||||
if options.get("additional_parser"):
|
||||
parser = getattr(import_module("pfbudget.parsers"), bank)
|
||||
parser = getattr(import_module("pfbudget.input.parsers"), bank)
|
||||
transactions = parser(filename, bank, options).parse()
|
||||
else:
|
||||
transactions = Parser(filename, bank, options).parse()
|
||||
|
||||
@ -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")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user