feat: add orders API endpoint with filtering capabilities

Added /api/orders endpoint to retrieve all orders via API with optional filters for status (open/completed/canceled) and payment status (paid/unpaid).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-10 13:12:31 +01:00
parent 832aaf2b05
commit bc00eeb526

View File

@@ -701,6 +701,20 @@ def config():
}) })
@bp.route("/api/orders", methods=["GET"])
@api_key_required
def api_orders():
"""JSON-API für alle Bestellungen (authentifiziert).
Query-Parameter:
- status: "open" (nur offene), "completed" (nur abgeschlossene), "canceled" (nur stornierte)
- payment_status: "paid" (nur bezahlt), "unpaid" (nur unbezahlt)
"""
status = request.args.get("status", "").strip().lower()
payment_status = request.args.get("payment_status", "").strip().lower()
return jsonify(build_orders(status=status, payment_status=payment_status))
def build_bestand() -> list[dict]: def build_bestand() -> list[dict]:
"""Aggregiert DBZeilen in die Struktur der LiveBestand Ansicht.""" """Aggregiert DBZeilen in die Struktur der LiveBestand Ansicht."""
rows = get_db().execute( rows = get_db().execute(
@@ -759,6 +773,91 @@ def build_bestand() -> list[dict]:
return result return result
def build_orders(status: str = "", payment_status: str = "") -> list[dict]:
"""Gibt alle Bestellungen als JSON-kompatible Liste zurück.
Args:
status: Filter nach Status ("open", "completed", "canceled")
payment_status: Filter nach Zahlungsstatus ("paid", "unpaid")
"""
where_clauses = []
params = []
# Status-Filter
if status == "open":
where_clauses.append("done = 0 AND canceled = 0")
elif status == "completed":
where_clauses.append("done = 1 AND canceled = 0")
elif status == "canceled":
where_clauses.append("canceled = 1")
# Zahlungsstatus-Filter
if payment_status == "paid":
where_clauses.append("payment_status = 'paid'")
elif payment_status == "unpaid":
where_clauses.append("payment_status = 'unpaid'")
where_sql = ""
if where_clauses:
where_sql = "WHERE " + " AND ".join(where_clauses)
sql = f"""
SELECT
id,
name,
handy,
email,
mannschaft,
artikel,
groesse,
menge,
notiz,
created_at,
done,
completed_by,
completed_at,
canceled,
canceled_by,
canceled_at,
payment_method,
payment_status,
paid_at,
paid_by
FROM orders
{where_sql}
ORDER BY id DESC
"""
rows = get_db().execute(sql, params).fetchall()
result = []
for r in rows:
result.append({
"id": r["id"],
"name": r["name"],
"handy": r["handy"],
"email": r["email"],
"mannschaft": r["mannschaft"],
"artikel": r["artikel"],
"groesse": r["groesse"],
"menge": r["menge"],
"notiz": r["notiz"],
"created_at": r["created_at"],
"done": bool(r["done"]),
"completed_by": r["completed_by"],
"completed_at": r["completed_at"],
"canceled": bool(r["canceled"]),
"canceled_by": r["canceled_by"],
"canceled_at": r["canceled_at"],
"payment_method": r["payment_method"],
"payment_status": r["payment_status"],
"paid_at": r["paid_at"],
"paid_by": r["paid_by"],
})
return result
@bp.route("/order", methods=["POST"]) @bp.route("/order", methods=["POST"])
@csrf.exempt # JSON API ohne CSRF-Schutz (nutzt API-Key stattdessen) @csrf.exempt # JSON API ohne CSRF-Schutz (nutzt API-Key stattdessen)
def order(): def order():