From a6d9369439837a1f753a30f64800982bc90ac5eb Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Fri, 28 Aug 2026 14:50:37 +0200 Subject: [PATCH] changes --- Website/main.py | 42 ++++++++++++++++++++++++--- Website/templates/admin_invoices.html | 30 ++++++++++++++++--- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/Website/main.py b/Website/main.py index 46eeffb..4986ea3 100644 --- a/Website/main.py +++ b/Website/main.py @@ -3236,13 +3236,48 @@ def admin_invoices(): } ) flash("Rechnung angelegt.", "success") + + # NEU HINZUGEFÜGT: Die Logik für das Update (Aktualisieren) Formular + elif action == "update" and invoice_id: + invoice_number = _sanitize_text(request.form.get("invoice_number") or "", 120) + period = _sanitize_text(request.form.get("period") or "", 20) + due_date = _sanitize_text(request.form.get("due_date") or "", 20) + status = _sanitize_text(request.form.get("status") or "Zu prüfen", 40) + amount_text = _sanitize_text(request.form.get("amount_eur") or "0", 20) + + try: + amount = float(amount_text.replace(',', '.')) + except ValueError: + amount = 0.0 + + update_data = { + "invoice_number": invoice_number, + "period": period, + "amount_eur": amount, + "status": status, + "due_date": due_date + } + + # PDF nur überschreiben, wenn auch ein neues hochgeladen wurde + pdf_file = request.files.get("invoice_pdf") + if pdf_file and pdf_file.filename: + pdf_path = _save_invoice_pdf(pdf_file, invoice_number) + if pdf_path: + update_data["pdf_path"] = pdf_path + + col.update_one( + {"_id": ObjectId(invoice_id)}, + {"$set": update_data} + ) + flash("Rechnung erfolgreich aktualisiert.", "success") elif action == "delete" and invoice_id: col.delete_one({"_id": ObjectId(invoice_id)}) flash("Rechnung gelöscht.", "success") else: flash("Ungültige Aktion.", "error") - except Exception: + except Exception as e: + print(f"Fehler bei admin_invoices: {e}") # Ins Log schreiben flash("Rechnungsverwaltung fehlgeschlagen.", "error") finally: if client: @@ -3268,7 +3303,7 @@ def admin_invoices(): if not isinstance(item.get("booking_data"), dict): item["booking_data"] = {} - except PyMongoError: + except Exception: # Geändert von PyMongoError zu general Exception für Sicherheit flash("Rechnungen konnten nicht geladen werden.", "error") finally: if client: @@ -3284,7 +3319,7 @@ def admin_invoices(): if not isinstance(prov.get("booking_data"), dict): prov["booking_data"] = {} - except PyMongoError: + except Exception: flash("Instanz-Anfragen konnten nicht geladen werden.", "error") finally: if 'req_client' in locals() and req_client: @@ -3293,7 +3328,6 @@ def admin_invoices(): users = _list_users_for_admin() return render_template("admin_invoices.html", invoices=invoices, users=users, provision_requests=instance_requests) - @app.route('/datenschutz') def datenschutz(): return render_template("datenschutz.html") diff --git a/Website/templates/admin_invoices.html b/Website/templates/admin_invoices.html index efb12f6..44a4846 100644 --- a/Website/templates/admin_invoices.html +++ b/Website/templates/admin_invoices.html @@ -27,7 +27,16 @@ - + + + + @@ -38,12 +47,14 @@

{{ item.invoice_number }}

Nutzer: {{ item.username }} | Zeitraum: {{ item.period }}

Betrag: {{ '%.2f'|format(item.amount_eur) }} EUR | Status: {{ item.status }} | Fälligkeit: {{ item.due_date }}

+ {% if item.source == 'booking_payment' %}

Buchung: {{ item.booking_package_label or item.booking_package }} | Flow: {{ item.booking_flow }}

Zugewiesener Admin: {{ item.assigned_admin_display_name or item.assigned_admin_username or 'Nicht gesetzt' }}{% if item.assigned_admin_email %} | E-Mail: {{ item.assigned_admin_email }}{% endif %}

Unterlagen: {{ item.paperwork_status or 'Offen' }}{% if item.consent_accepted %} | Einwilligung bestätigt{% endif %}

Kontaktdaten: {{ item.booking_data.get('contact_person', '-') }} | {{ item.booking_data.get('contact_email', '-') }} | {{ item.booking_data.get('billing_city', '-') }}

{% endif %} +
{% if item.pdf_path %}

Rechnungs-PDF: @@ -61,6 +72,7 @@

Hauptvertrag: Noch nicht in MongoDB hochgeladen

{% endif %}
+
@@ -68,10 +80,20 @@ - + + + +
+
@@ -93,8 +115,8 @@ .inline-form { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 0.45rem; margin-top: 0.6rem; } input, select { width: 100%; border: 1px solid #c9d8e3; border-radius: 10px; padding: 0.52rem; font: inherit; background: #fff; } a { color: #0a4c74; font-weight: 700; } -button { border: 1px solid #0a4c74; background: linear-gradient(120deg, #0c5a86 0%, #08486c 100%); color: #fff; padding: 0.45rem 0.8rem; border-radius: 999px; font-weight: 700; } +button { border: 1px solid #0a4c74; background: linear-gradient(120deg, #0c5a86 0%, #08486c 100%); color: #fff; padding: 0.45rem 0.8rem; border-radius: 999px; font-weight: 700; cursor: pointer; } button.danger { border-color: #d04a49; background: #fff; color: #922e2e; margin-top: 0.55rem; } @media (max-width: 980px) { .layout { grid-template-columns: 1fr; } .inline-form { grid-template-columns: 1fr; } } -{% endblock %} +{% endblock %} \ No newline at end of file