From 102c4ae31cf26993632d744a5c96553b744137c7 Mon Sep 17 00:00:00 2001 From: Pablo Martin Date: Thu, 3 Aug 2023 22:33:34 +0200 Subject: [PATCH] Reports and stuff --- camisatoshi_wordpress_reports/cli.py | 8 ++ camisatoshi_wordpress_reports/controllers.py | 135 ++++++++++++++++++- 2 files changed, 140 insertions(+), 3 deletions(-) diff --git a/camisatoshi_wordpress_reports/cli.py b/camisatoshi_wordpress_reports/cli.py index 85a63eb..dd6ea12 100644 --- a/camisatoshi_wordpress_reports/cli.py +++ b/camisatoshi_wordpress_reports/cli.py @@ -14,6 +14,14 @@ def check_health(): controllers.check_health() +@app.command() +def generate_sku_report( + start_date: Annotated[datetime.datetime, typer.Option(prompt=True)], + end_date: Annotated[datetime.datetime, typer.Option(prompt=True)], + sku: Annotated[str, typer.Option(prompt=True)] +): + controllers.generate_sku_report(start_date, end_date, sku) + @app.command() def generate_um_report( start_date: Annotated[datetime.datetime, typer.Option(prompt=True)], diff --git a/camisatoshi_wordpress_reports/controllers.py b/camisatoshi_wordpress_reports/controllers.py index cc09119..38bac4b 100644 --- a/camisatoshi_wordpress_reports/controllers.py +++ b/camisatoshi_wordpress_reports/controllers.py @@ -38,7 +38,7 @@ def check_health(): def generate_um_report( - start_date: datetime.datetime, end_date: datetime.datetime + start_date: datetime.datetime, end_date: datetime.datetime ) -> None: logger.info(f"Fetching orders between {start_date} and {end_date}.") @@ -98,7 +98,8 @@ def generate_um_report( "units_sold": order.units_of_sku(relevant_sku), "eur_income": order.sales_of_sku(relevant_sku), "sats_income": order.sats_received_for_sku(relevant_sku), - "sats_owed_to_um": order.sats_received_for_sku(relevant_sku) * um_first_agreement_percentage, + "sats_owed_to_um": order.sats_received_for_sku(relevant_sku) + * um_first_agreement_percentage, } ) logger.info("Report generated.") @@ -106,7 +107,135 @@ def generate_um_report( keys = report[0].keys() - with open('report.csv', 'w', newline='') as output_file: + with open("report.csv", "w", newline="") as output_file: + dict_writer = csv.DictWriter(output_file, keys) + dict_writer.writeheader() + dict_writer.writerows(report) + + +def generate_um_report( + start_date: datetime.datetime, end_date: datetime.datetime +) -> None: + logger.info(f"Fetching orders between {start_date} and {end_date}.") + + orders_in_date_range = WC_API.get( + endpoint="orders", + params={ + "after": start_date.isoformat(), + "before": end_date.isoformat(), + "per_page": 100, + "status": "processing,completed", + }, + ).json() + orders_in_date_range = Orders( + [ + Order.from_api_response(order_raw_data) + for order_raw_data in orders_in_date_range + ] + ) + logger.info(f"Received {len(orders_in_date_range)} orders.") + + relevant_sku = "TEE-05-BBO-BLACK" + logger.info(f"Filtering by SKU: {relevant_sku}") + relevant_orders = orders_in_date_range.filter_orders_by_sku(sku=relevant_sku) + logger.info(f"Kept {len(relevant_orders)} orders.") + + logger.info("Checking if all orders have the sats_received entry filled in.") + orders_without_sats_received = relevant_orders.filter_orders_without_sats_received() + if orders_without_sats_received: + logger.warning( + f"There are {len(orders_without_sats_received)} orders without a properly filled sats_received entry." + ) + logger.warning(f"See details below.") + logger.warning(orders_without_sats_received) + raise ValueError( + "Not all orders have sats_received. Can't compute sats owed without that." + ) + logger.info("Success, all orders have sats_received filled in.") + + logger.info("Removing settled orders.") + unsettled_orders = relevant_orders.filter_unsettled_orders() + logger.info(f"Kept {len(unsettled_orders)} unsettled orders.") + # Fetch orders: + # - Between specific dates + # - That contain the hardcoded products + # - That have been paid, hence status is either processing or completed + # - That have not been settled yet (is_settled_with_um = 0) + logger.info("Order filtering finished.") + + logger.info(f"Relevant orders: {[order['id'] for order in unsettled_orders]}.") + + report = [] + for order in unsettled_orders: + report.append( + { + "order_id": order["id"], + "sku": relevant_sku, + "units_sold": order.units_of_sku(relevant_sku), + "eur_income": order.sales_of_sku(relevant_sku), + "sats_income": order.sats_received_for_sku(relevant_sku), + "sats_owed_to_um": order.sats_received_for_sku(relevant_sku) + * um_first_agreement_percentage, + } + ) + logger.info("Report generated.") + logger.info(report) + + keys = report[0].keys() + + with open("report.csv", "w", newline="") as output_file: + dict_writer = csv.DictWriter(output_file, keys) + dict_writer.writeheader() + dict_writer.writerows(report) + + +def generate_sku_report(start_date, end_date, sku): + logger.info(f"Fetching orders between {start_date} and {end_date}.") + + orders_in_date_range = WC_API.get( + endpoint="orders", + params={ + "after": start_date.isoformat(), + "before": end_date.isoformat(), + "per_page": 100, + "status": "processing,completed", + }, + ).json() + orders_in_date_range = Orders( + [ + Order.from_api_response(order_raw_data) + for order_raw_data in orders_in_date_range + ] + ) + logger.info(f"Received {len(orders_in_date_range)} orders.") + + logger.info(f"Filtering by SKU: {sku}") + relevant_orders = orders_in_date_range.filter_orders_by_sku(sku=sku) + logger.info(f"Kept {len(relevant_orders)} orders.") + + logger.info("Removing settled orders.") + unsettled_orders = relevant_orders.filter_unsettled_orders() + logger.info(f"Kept {len(unsettled_orders)} unsettled orders.") + logger.info("Order filtering finished.") + + logger.info(f"Relevant orders: {[order['id'] for order in unsettled_orders]}.") + + report = [] + for order in unsettled_orders: + report.append( + { + "order_id": order["id"], + "sku": sku, + "units_sold": order.units_of_sku(sku), + "eur_income": order.sales_of_sku(sku), + } + ) + logger.info("Report generated.") + logger.info(report) + + keys = report[0].keys() + + with open("report.csv", "w", newline="") as output_file: dict_writer = csv.DictWriter(output_file, keys) dict_writer.writeheader() dict_writer.writerows(report)