diff --git a/finary_uapi/__main__.py b/finary_uapi/__main__.py index 1410231..a556ca4 100644 --- a/finary_uapi/__main__.py +++ b/finary_uapi/__main__.py @@ -8,6 +8,9 @@ finary_uapi timeseries finary_uapi checking_accounts transactions [--page=] [--perpage=] [--account=] [--institution=] [--query=] [--start-date=] [--end-date=] [--marked=] finary_uapi fonds_euro [--org-id=] + finary_uapi fonds_euro add + finary_uapi fonds_euro update + finary_uapi fonds_euro delete finary_uapi startups finary_uapi investments [--org-id=] finary_uapi investments dividends @@ -59,6 +62,7 @@ finary_uapi import crypto_csv FILENAME [(--new=NAME | --edit=account_id | --add=account_id)] finary_uapi import stocks_csv FILENAME [(--new=NAME | --edit=account_id | --add=account_id)] [-d] finary_uapi import stocks_json FILENAME [(--new=NAME | --edit=account_id | --add=account_id)] [-d] + finary_uapi import fonds_euro_json FILENAME [(--new=NAME | --edit=account_id | --add=account_id)] [-d] Options: @@ -142,7 +146,13 @@ get_user_cryptos, update_user_crypto_by_code, ) -from .user_fonds_euro import get_user_fonds_euro +from .user_fonds_euro import ( + add_imported_fonds_euro_to_account, + add_user_fonds_euro, + delete_user_fonds_euro, + get_user_fonds_euro, + update_user_fonds_euro, +) from .user_me import ( get_family_org_id, get_user_me, @@ -213,11 +223,6 @@ def main() -> int: # pragma: nocover end_date=args["--end-date"], marked=args["--marked"], ) - elif args["fonds_euro"]: - if org_id: - result = get_organization_fonds_euro(session, org_id) - else: - result = get_user_fonds_euro(session) elif args["startups"]: result = get_user_startups(session) elif args["search"]: @@ -259,6 +264,20 @@ def main() -> int: # pragma: nocover args[""], args[""], ) + elif args["fonds_euro"]: + account = get_holdings_account_per_name_or_id(session, args[""]) + if not account: + print( + "Error: no account by that name", + file=sys.stderr, + ) + return 1 + result = add_user_fonds_euro( + session, + account["bank"], + args[""], + args[""], + ) elif args["generic_assets"]: result = add_user_generic_asset( session, @@ -324,6 +343,12 @@ def main() -> int: # pragma: nocover args[""], args[""], ) + elif args["fonds_euro"]: + result = update_user_fonds_euro( + session, + { 'id': args[""] }, + args[""], + ) elif args["generic_assets"]: result = update_user_generic_asset( session, @@ -365,6 +390,8 @@ def main() -> int: # pragma: nocover delete_user_generic_asset(session, args[""]) elif args["real_estates"]: delete_user_real_estates(session, args[""]) + elif args["fonds_euro"]: + result = delete_user_fonds_euro(session, args[""]) elif args["holdings_accounts"]: result = delete_holdings_account(session, args[""]) elif args["precious_metals"]: @@ -385,6 +412,11 @@ def main() -> int: # pragma: nocover result = get_organization_cryptos(session, org_id) else: result = get_user_cryptos(session) + elif args["fonds_euro"]: + if org_id: + result = get_organization_fonds_euro(session, org_id) + else: + result = get_user_fonds_euro(session) elif args["investments"]: if args["dividends"]: result = get_portfolio_investments_dividends(session) @@ -466,7 +498,7 @@ def main() -> int: # pragma: nocover to_be_imported = import_crypto_generic_csv(args["FILENAME"]) elif args["stocks_csv"]: to_be_imported = import_stocks_generic_csv(args["FILENAME"]) - elif args["stocks_json"]: + elif args["stocks_json"] or args["fonds_euro_json"]: with open(args["FILENAME"], "r") as input_file: to_be_imported = json.loads(input_file.read()) @@ -520,6 +552,23 @@ def main() -> int: # pragma: nocover add_imported_securities_to_account( session, args["--add"], to_be_imported, dry_run=args["-d"] ) + elif args["fonds_euro_json"]: # fonds_euro import + if args["--new"]: + add_imported_fonds_euro_to_account( + session, args["--new"], to_be_imported, dry_run=args["-d"] + ) + elif args["--edit"]: + add_imported_fonds_euro_to_account( + session, + args["--edit"], + to_be_imported, + edit=True, + dry_run=args["-d"], + ) + elif args["--add"]: + add_imported_fonds_euro_to_account( + session, args["--add"], to_be_imported, dry_run=args["-d"] + ) else: # crowdlending add_imported_user_crowdlendings( session, to_be_imported, dry_run=args["-d"], clean=args["-f"] diff --git a/finary_uapi/user_fonds_euro.py b/finary_uapi/user_fonds_euro.py index 092f33e..9a0ec6a 100644 --- a/finary_uapi/user_fonds_euro.py +++ b/finary_uapi/user_fonds_euro.py @@ -1,9 +1,115 @@ +import json +import logging from .constants import API_ROOT from curl_cffi import requests from .utils import get_and_print - -fe_url = f"{API_ROOT}/users/me/fonds_euro" - +from .user_holdings_accounts import ( + get_holdings_account_per_name_or_id, + add_holdings_account, +) def get_user_fonds_euro(session: requests.Session): + fe_url = f"{API_ROOT}/users/me/fonds_euro" return get_and_print(session, fe_url) + + +def add_user_fonds_euro(session: requests.Session, bank, name, buying_price): + url = f"{API_ROOT}/users/me/fonds_euro" + data = {} + #data["annual_yield"] = annual_yield + data["bank"] = bank + data["current_price"] = buying_price + data["buying_price"] = buying_price + data["name"] = name + data_json = json.dumps(data) + headers = {} + headers["Content-Length"] = str(len(data_json)) + headers["Content-Type"] = "application/json" + x = session.post(url, data=data_json, headers=headers) + logging.debug(x.status_code) + logging.debug(json.dumps(x.json(), indent=4)) + return x.json() + +def update_user_fonds_euro(session: requests.Session, fond, current_price): + url = f"{API_ROOT}/users/me/fonds_euro/{fond['id']}" + data = {} + #data["annual_yield"] = annual_yield + data["current_price"] = current_price + #data["buying_price"] = buying_price + data_json = json.dumps(data) + headers = {} + headers["Content-Length"] = str(len(data_json)) + headers["Content-Type"] = "application/json" + x = session.put(url, data=data_json, headers=headers) + logging.debug(x.status_code) + logging.debug(json.dumps(x.json(), indent=4)) + return x.json() + +def delete_user_fonds_euro(session: requests.Session, fond_id): + url = f"{API_ROOT}/users/me/fonds_euro/{fond_id}" + x = session.delete(url) + logging.debug(x.status_code) + return x.status_code + +def add_imported_fonds_euro_to_account(session: requests.Session, account_name_id: str, to_be_imported, edit=False, delete=False, dry_run=False): + account = get_holdings_account_per_name_or_id(session, account_name_id) + if not account: + account = add_holdings_account(session, account_name_id, "stocks") + account = account["result"] + + if edit: + for fonds_euro in account["fonds_euro"]: + found = False + for line in to_be_imported: + if fonds_euro["name"] == line["description"]: + found = True + break + if not found: + logging.info(f'-- Delete {fonds_euro["name"]}') + if not dry_run: + delete_user_fonds_euro(session, fonds_euro["id"]) + + for line in to_be_imported: + if edit: + found = False + for fonds_euro in account["fonds_euro"]: + if ( + line["description"] + == fonds_euro["name"] + ): + if ( + line["price"] != fonds_euro["current_price"] + ): + logging.info( + f'** Update [{line["description"]}]: [{fonds_euro["current_price"]} -> {line["price"]}]' # noqa + ) + if not dry_run: + update_user_fonds_euro( + session, + fonds_euro, + line["price"], + ) + found = True + break + if not found: + logging.info( + f'++ Add [{line["description"]}]: {line["price"]}' # noqa + ) + if not dry_run: + add_user_fonds_euro( + session, + account["bank"], + line["description"], + line["price"], + ) + else: + logging.info( + f'+ Add [{line["description"]}]: {line["price"]}' + ) + if not dry_run: + add_user_fonds_euro( + session, + account["bank"], + line["description"], + line["price"], + ) \ No newline at end of file diff --git a/tests/data/fond_euros.json b/tests/data/fond_euros.json new file mode 100644 index 0000000..ca58361 --- /dev/null +++ b/tests/data/fond_euros.json @@ -0,0 +1,10 @@ +[ + { + "description": "FG Bonus +2.6", + "price": 48.05 + }, + { + "description": "FG Bonus +3", + "price": 50.3 + } +]