279 lines
9.9 KiB
Python
279 lines
9.9 KiB
Python
from pfbudget.cli.argparser import argparser
|
|
from pfbudget.cli.interactive import Interactive
|
|
from pfbudget.common.types import Operation
|
|
from pfbudget.core.manager import Manager
|
|
import pfbudget.db.model as type
|
|
from pfbudget.utils.utils import parse_args_period
|
|
|
|
|
|
if __name__ == "__main__":
|
|
argparser = argparser()
|
|
args = vars(argparser.parse_args())
|
|
|
|
assert "op" in args, "No Operation selected"
|
|
op: Operation = args.pop("op")
|
|
|
|
assert "database" in args, "No database selected"
|
|
db = args.pop("database")
|
|
|
|
assert "verbose" in args, "No verbose level specified"
|
|
verbosity = args.pop("verbose")
|
|
|
|
params = []
|
|
match (op):
|
|
case Operation.ManualCategorization:
|
|
Interactive(Manager(db, verbosity)).start()
|
|
exit()
|
|
|
|
case Operation.Categorize:
|
|
keys = {"no_nulls"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["no_nulls"]]
|
|
|
|
case Operation.Parse:
|
|
keys = {"path", "bank", "creditcard"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["path"], args["bank"], args["creditcard"]]
|
|
|
|
case Operation.RequisitionId:
|
|
keys = {"bank"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["bank"][0]]
|
|
|
|
case Operation.Download:
|
|
keys = {"all", "banks", "interval", "start", "end", "year", "dry_run"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
start, end = parse_args_period(args)
|
|
params = [start, end, args["dry_run"]]
|
|
|
|
if not args["all"]:
|
|
params.append(args["banks"])
|
|
else:
|
|
params.append(None)
|
|
|
|
case Operation.BankAdd:
|
|
keys = {"bank", "bic", "type"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.Bank(
|
|
args["bank"][0],
|
|
args["bic"][0],
|
|
args["type"][0],
|
|
)
|
|
]
|
|
|
|
case Operation.BankMod:
|
|
keys = {"bank", "bic", "type", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["bic", "type"]
|
|
|
|
param = {"name": args["bank"][0]}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params = [param]
|
|
|
|
case Operation.BankDel:
|
|
assert len(args["bank"]) > 0, "argparser ill defined"
|
|
params = args["bank"]
|
|
|
|
case Operation.PSD2Add:
|
|
keys = {"bank", "bank_id", "requisition_id", "invert"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.Nordigen(
|
|
args["bank"][0],
|
|
args["bank_id"][0] if args["bank_id"] else None,
|
|
args["requisition_id"][0] if args["requisition_id"] else None,
|
|
args["invert"] if args["invert"] else None,
|
|
)
|
|
]
|
|
|
|
case Operation.PSD2Mod:
|
|
keys = {"bank", "bank_id", "requisition_id", "invert", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["bank_id", "requisition_id"]
|
|
nargs_0 = ["invert"]
|
|
|
|
param = {"name": args["bank"][0]}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: v for k, v in args.items() if k in nargs_0}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params = [param]
|
|
|
|
case Operation.PSD2Del:
|
|
assert len(args["bank"]) > 0, "argparser ill defined"
|
|
params = args["bank"]
|
|
|
|
case Operation.PSD2CountryBanks:
|
|
keys = {"country"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["country"][0]]
|
|
|
|
case Operation.CategoryAdd:
|
|
keys = {"category", "group"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [type.Category(cat, args["group"]) for cat in args["category"]]
|
|
|
|
case Operation.CategoryUpdate:
|
|
keys = {"category", "group"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [{"name": cat, "group": args["group"]} for cat in args["category"]]
|
|
|
|
case Operation.CategoryRemove:
|
|
assert "category" in args, "argparser ill defined"
|
|
|
|
params = args["category"]
|
|
|
|
case Operation.CategorySchedule:
|
|
keys = {"category", "period", "frequency"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.CategorySchedule(
|
|
cat, args["period"][0], args["frequency"][0], None
|
|
)
|
|
for cat in args["category"]
|
|
]
|
|
|
|
case Operation.RuleAdd:
|
|
keys = {
|
|
"category",
|
|
"start",
|
|
"end",
|
|
"description",
|
|
"regex",
|
|
"bank",
|
|
"min",
|
|
"max",
|
|
}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = []
|
|
for cat in args["category"]:
|
|
rule = type.CategoryRule(
|
|
start=args["start"][0] if args["start"] else None,
|
|
end=args["end"][0] if args["end"] else None,
|
|
description=args["description"][0] if args["description"] else None,
|
|
regex=args["regex"][0] if args["regex"] else None,
|
|
bank=args["bank"][0] if args["bank"] else None,
|
|
min=args["min"][0] if args["min"] else None,
|
|
max=args["max"][0] if args["max"] else None,
|
|
)
|
|
# associate the rule to the category name (mapped col has init=False)
|
|
rule.name = cat
|
|
params.append(rule)
|
|
|
|
case Operation.RuleRemove | Operation.TagRuleRemove:
|
|
keys = {"id"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = args["id"]
|
|
|
|
case Operation.RuleModify:
|
|
keys = {
|
|
"id",
|
|
"category",
|
|
"date",
|
|
"description",
|
|
"bank",
|
|
"min",
|
|
"max",
|
|
"remove",
|
|
}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["category", "date", "description", "regex", "bank", "min", "max"]
|
|
params = []
|
|
for id in args["id"]:
|
|
param = {"id": id}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params.append(param)
|
|
|
|
case Operation.TagAdd:
|
|
keys = {"tag"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [type.Tag(tag) for tag in args["tag"]]
|
|
|
|
case Operation.TagRuleAdd:
|
|
keys = {"tag", "start", "end", "description", "regex", "bank", "min", "max"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = []
|
|
for tag in args["tag"]:
|
|
rule = type.TagRule(
|
|
start=args["start"][0] if args["start"] else None,
|
|
end=args["end"][0] if args["end"] else None,
|
|
description=args["description"][0] if args["description"] else None,
|
|
regex=args["regex"][0] if args["regex"] else None,
|
|
bank=args["bank"][0] if args["bank"] else None,
|
|
min=args["min"][0] if args["min"] else None,
|
|
max=args["max"][0] if args["max"] else None,
|
|
)
|
|
# associate the rule to the tag name (mapped col has init=False)
|
|
rule.tag = tag
|
|
params.append(rule)
|
|
|
|
case Operation.TagRuleModify:
|
|
keys = {"id", "tag", "date", "description", "bank", "min", "max", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["tag", "date", "description", "regex", "bank", "min", "max"]
|
|
params = []
|
|
for id in args["id"]:
|
|
param = {"id": id}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params.append(param)
|
|
|
|
case Operation.GroupAdd:
|
|
assert "group" in args, "argparser ill defined"
|
|
params = [type.CategoryGroup(group) for group in args["group"]]
|
|
|
|
case Operation.GroupRemove:
|
|
assert "group" in args, "argparser ill defined"
|
|
params = args["group"]
|
|
|
|
case Operation.Forge | Operation.Dismantle:
|
|
keys = {"original", "links"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["original"][0], args["links"]]
|
|
|
|
case (
|
|
Operation.Export
|
|
| Operation.Import
|
|
| Operation.ExportBanks
|
|
| Operation.ImportBanks
|
|
| Operation.ExportCategoryRules
|
|
| Operation.ImportCategoryRules
|
|
| Operation.ExportTagRules
|
|
| Operation.ImportTagRules
|
|
| Operation.ExportCategories
|
|
| Operation.ImportCategories
|
|
| Operation.ExportCategoryGroups
|
|
| Operation.ImportCategoryGroups
|
|
):
|
|
keys = {"file", "format"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["file"][0], args["format"][0]]
|
|
|
|
Manager(db, verbosity).action(op, params)
|