From 3ad649a402ba999adb20f6b34058c3b7aee85a3d Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Fri, 11 Aug 2023 14:34:57 +0200 Subject: [PATCH] Add /inventory/report route --- py/jon/db/get_inventory_report.sql | 37 +++++++++++++++++++++ py/jon/inventory.py | 14 +++++++- py/jon/templates/inventory/read_report.html | 28 ++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 py/jon/db/get_inventory_report.sql create mode 100644 py/jon/templates/inventory/read_report.html diff --git a/py/jon/db/get_inventory_report.sql b/py/jon/db/get_inventory_report.sql new file mode 100644 index 0000000..1a21f6d --- /dev/null +++ b/py/jon/db/get_inventory_report.sql @@ -0,0 +1,37 @@ +WITH +most_recent_sales AS ( + SELECT DISTINCT ON (inventory_line) + inventory_line, snack_sales_log_id, snack_sales_log_timestamp AS most_recent_sale + FROM garfield.snack_sales_log + ORDER BY inventory_line ASC, snack_sales_log_timestamp DESC +), +enhanced_overview AS ( + SELECT + inventory_items.item_id, + inventory_items.item_barcode, + inventory_items.name, + units_left, + location_name, + location, + CASE + WHEN snack_sales_log_id IS NULL THEN 0 + ELSE sales / (EXTRACT(EPOCH FROM most_recent_sale) - EXTRACT(EPOCH FROM bought)) * 24 * 3600 + END AS per_day + FROM garfield.inventory_item_overview + LEFT JOIN garfield.inventory_items USING (item_id) + LEFT JOIN most_recent_sales ON item_id = inventory_line +) + +SELECT + *, + CASE + WHEN per_day = 0 THEN NULL + ELSE GREATEST(0, units_left / per_day) + END AS days_left, + CASE + WHEN per_day = 0 THEN NULL + ELSE GREATEST(0, (60 - GREATEST(0, units_left / per_day)) * per_day) + END AS for_two_months +FROM enhanced_overview +WHERE (%(location_id)s IS NULL OR location = %(location_id)s) +ORDER BY days_left ASC, per_day DESC diff --git a/py/jon/inventory.py b/py/jon/inventory.py index a451049..43aafad 100644 --- a/py/jon/inventory.py +++ b/py/jon/inventory.py @@ -6,7 +6,7 @@ from . import db bp = Blueprint("inventory", __name__, url_prefix="/inventory") -@bp.route("/") +@bp.get("/") def index(): location = session.get("location", None) items = db.run_query("get_inventory_overview.sql", { @@ -18,6 +18,18 @@ def index(): }) +@bp.get("/report") +def read_report(): + location = session.get("location", None) + items = db.run_query("get_inventory_report.sql", { + "location_id": None if location is None else location["location_id"] + }).fetchall() + + return render_template("inventory/read_report.html", **{ + "items": items + }) + + @bp.get("/item/") def read_item(item_id: int): item = db.run_query("get_item_by_id.sql", { diff --git a/py/jon/templates/inventory/read_report.html b/py/jon/templates/inventory/read_report.html new file mode 100644 index 0000000..c907991 --- /dev/null +++ b/py/jon/templates/inventory/read_report.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block content %} + + + + + + + + + + + +{% for item in items %} + + + + + + + + + + +{% endfor %} +
IDBarcodeNameInventarRaumVerbrauch [1/d]ETUE [d]Für 2m
{{ item.item_id }}{{ item.item_barcode }}{{ item.name }}{{ item.units_left }}{{ item.location_name }}{{ item.per_day|round(2) }}{% if item.days_left != None %}{{ item.days_left|round(1) }}{% endif %}{% if item.for_two_months %}{{ item.for_two_months|round(1) }}{% endif %}
+{% endblock %}