budget/pfbudget/utils/utils.py
Luís Murta 9b45ee4817
Update the export operation
to work with the Manager.
Also removes the run method from the runnable.py, since everything is
done in the __main__.py file of the pfbudget module.
2023-01-08 19:41:07 +00:00

81 lines
2.1 KiB
Python

from datetime import date, datetime, timedelta
from decimal import Decimal, InvalidOperation
from pathlib import Path
class WrongFilenameError(Exception):
pass
class BankNotAvailableError(Exception):
pass
class CreditCardNotAvailableError(Exception):
pass
def parse_decimal(s: str) -> Decimal:
try:
float(s)
return Decimal(s)
except ValueError:
pass
try:
d = s.strip().replace("\xa0", "").replace(" ", "")
d = d.replace("", "").replace("+", "").replace("EUR", "").strip()
if d.rfind(",") > d.rfind("."):
d = d.replace(".", "")
i = d.rfind(",")
li = list(d)
li[i] = "."
d = "".join(li)
return Decimal(d.replace(",", ""))
except InvalidOperation:
raise InvalidOperation(f"{s} -> {d}")
def find_credit_institution(fn, banks, creditcards):
name = Path(fn).stem.split("_")
bank, cc = None, None
for i in name:
try:
int(i)
except ValueError:
if not bank:
bank = i
elif not cc:
cc = i
if not bank:
raise WrongFilenameError
if bank.lower() not in [bank.lower() for bank in banks]:
raise BankNotAvailableError(f"{fn} -> {bank}: {banks}")
if cc and cc.lower() not in [cc.lower() for cc in creditcards]:
print(f"{fn} -> {cc} not in {creditcards}, using {bank} parser")
cc = None
return bank, cc
def parse_args_period(args: dict):
start, end = date.min, date.max
if args["start"]:
start = datetime.strptime(args["start"][0], "%Y/%m/%d").date()
if args["end"]:
end = datetime.strptime(args["end"][0], "%Y/%m/%d").date()
if args["interval"]:
start = datetime.strptime(args["interval"][0], "%Y/%m/%d").date()
end = datetime.strptime(args["interval"][1], "%Y/%m/%d").date()
if args["year"]:
start = datetime.strptime(args["year"][0], "%Y").date()
end = datetime.strptime(str(int(args["year"][0]) + 1), "%Y").date() - timedelta(
days=1
)
return start, end