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.
73 lines
1.7 KiB
Python
73 lines
1.7 KiB
Python
from datetime import timedelta
|
|
from functools import singledispatch
|
|
|
|
from pfbudget.common.types import Bank, Transaction, TransactionError
|
|
from pfbudget.db.schema import DbBank, DbTransaction
|
|
from .utils import parse_decimal
|
|
|
|
|
|
@singledispatch
|
|
def convert(t):
|
|
print("No converter as been found")
|
|
pass
|
|
|
|
|
|
@convert.register
|
|
def _(t: Transaction) -> DbTransaction:
|
|
return DbTransaction(
|
|
t.date,
|
|
t.description,
|
|
t.bank,
|
|
t.value,
|
|
t.category,
|
|
t.original,
|
|
t.additional_comment,
|
|
)
|
|
|
|
|
|
@convert.register
|
|
def _(db: DbTransaction) -> Transaction:
|
|
try:
|
|
return Transaction(db)
|
|
except TransactionError:
|
|
print(f"{db} is in the wrong format")
|
|
|
|
|
|
@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
|
|
|
|
|
|
@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
|
|
|
|
|
|
@convert.register
|
|
def _(json: dict, bank: Bank) -> Transaction:
|
|
i = -1 if bank.invert else 1
|
|
try:
|
|
transaction = Transaction(
|
|
json["bookingDate"],
|
|
json["remittanceInformationUnstructured"],
|
|
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")
|