diff --git a/py/jon/db/create_correction.sql b/py/jon/db/create_correction.sql new file mode 100644 index 0000000..161a0e4 --- /dev/null +++ b/py/jon/db/create_correction.sql @@ -0,0 +1,3 @@ +INSERT INTO garfield.inventory_correction (item_id, delta, correction_comment) +VALUES (%(item_id)s, %(correction_delta)s, %(correction_comment)s) + diff --git a/py/jon/db/deactivate_item.sql b/py/jon/db/deactivate_item.sql new file mode 100644 index 0000000..25d6d32 --- /dev/null +++ b/py/jon/db/deactivate_item.sql @@ -0,0 +1,9 @@ +UPDATE garfield.inventory_items +SET available = FALSE +WHERE item_id = %(item_id)s; + +-- Call garfield.snack_delete for every snack entry associated with this item. +SELECT snack_id +FROM garfield.inventory_map, + LATERAL garfield.snack_delete(snack_id::integer) +WHERE inventory_id = %(item_id)s diff --git a/py/jon/inventory.py b/py/jon/inventory.py index 42ad120..de47720 100644 --- a/py/jon/inventory.py +++ b/py/jon/inventory.py @@ -1,4 +1,4 @@ -from flask import Blueprint, render_template, session +from flask import Blueprint, redirect, render_template, request, session from . import db @@ -18,7 +18,7 @@ def index(): }) -@bp.get("/<item_id>") +@bp.get("/item/<item_id>") def read_item(item_id: int): item = db.run_query("get_item_by_id.sql", { "item_id": item_id @@ -38,3 +38,45 @@ def read_item(item_id: int): "snacks": snacks, "same_barcode_items": same_barcode_items }) + + +@bp.post("/item/<item_id>/deactivate") +def deactivate_item(item_id: int): + item = db.run_query("get_item_by_id.sql", { + "item_id": item_id + }).fetchone() + + if item["units_left"] != 0: + return "Only items without stock can be deactivated", 400 + + db.run_query("deactivate_item.sql", { + "item_id": item_id + }) + db.get_db().commit() + + return redirect(request.referrer) + + +@bp.post("/correction") +def create_correction(): + try: + item_id = int(request.form.get("item_id")) + correction_delta = int(request.form.get("correction_delta")) + correction_comment = request.form.get("correction_comment") + except: + return "Incomplete or mistyped form", 400 + + if correction_delta == 0: + return "Correction delta may not be 0", 400 + + if correction_comment == "": + return "Correction comment may not be empty", 400 + + db.run_query("create_correction.sql", { + "item_id": item_id, + "correction_delta": correction_delta, + "correction_comment": correction_comment + }) + db.get_db().commit() + + return redirect(request.referrer) diff --git a/py/jon/templates/inventory/index.html b/py/jon/templates/inventory/index.html index bbcfd52..f87e979 100644 --- a/py/jon/templates/inventory/index.html +++ b/py/jon/templates/inventory/index.html @@ -17,7 +17,7 @@ </tr> {% for item in items %} <tr> - <td><a href="/inventory/{{ item.item_id }}">{{ item.item_id }}</a></td> + <td><a href="/inventory/item/{{ item.item_id }}">{{ item.item_id }}</a></td> <td><code>{{ item.item_barcode }}</code></td> <td>{{ item.name }}</td> <td class="--align-right">{{ format_currency(item.unit_price) }}</td> diff --git a/py/jon/templates/inventory/read_item.html b/py/jon/templates/inventory/read_item.html index 8170309..a545199 100644 --- a/py/jon/templates/inventory/read_item.html +++ b/py/jon/templates/inventory/read_item.html @@ -53,6 +53,28 @@ </table> </fieldset> +<fieldset> + <legend>Aktionen</legend> + + <form method="POST" action="/inventory/correction"> + <input name="item_id" type="hidden" value="{{ item.item_id }}"> + <input name="correction_comment" type="hidden" value="Verlust"> + <input name="correction_delta" type="hidden" value="{{ -item.units_left }}"> + <button{% if item.units_left == 0 %} disabled{% endif %}>Inventar zu 0 korrigieren</button> + </form> + + <form method="POST" action="/inventory/correction"> + <input name="item_id" type="hidden" value="{{ item.item_id }}"> + <input name="correction_comment" type="text" value="" placeholder="Kommentar"> + <input name="correction_delta" type="number" value="" placeholder="Delta"> + <button>Inventar korrigieren</button> + </form> + + <form method="POST" action="/inventory/item/{{ item.item_id }}/deactivate"> + <button{% if item.units_left != 0 %} disabled{% endif %}>Inventar- und Snackeintrag deaktivieren</button> + </form> +</fieldset> + <fieldset> <legend>Snackeinträge für {{ item.item_id }}</legend> @@ -101,7 +123,7 @@ </tr> {% for item in same_barcode_items %} <tr> - <td><a href="/inventory/{{ item.item_id }}">{{ item.item_id }}</a></td> + <td><a href="/inventory/item/{{ item.item_id }}">{{ item.item_id }}</a></td> <td><code>{{ item.item_barcode }}</code></td> <td>{{ item.name }}</td> <td class="--align-right">{{ format_currency(item.unit_price) }}</td>