diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 28fd183..7674241 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -10,7 +10,8 @@ "Bash(docker logs:*)", "Bash(docker exec:*)", "Bash(python3:*)", - "Bash(docker-compose restart:*)" + "Bash(docker-compose restart:*)", + "Bash(docker-compose build:*)" ], "deny": [] } diff --git a/JOURNAL.md b/JOURNAL.md index 3f88bf2..424ac9b 100644 --- a/JOURNAL.md +++ b/JOURNAL.md @@ -120,4 +120,28 @@ Lizenzmanagement-System für Social Media Account-Erstellungssoftware mit Docker **Nächster Test:** - Container neu bauen und starten - Kundennamen mit Umlauten testen (z.B. "Müller GmbH", "Björn Schäfer") -- Email mit Umlauten testen \ No newline at end of file +- Email mit Umlauten testen + +### 2025-01-06 - Lizenzübersicht implementiert +- Neue Route `/licenses` für Lizenzübersicht +- SQL-Query mit JOIN zwischen licenses und customers +- Status-Berechnung (aktiv, läuft bald ab, abgelaufen) +- Farbcodierung für verschiedene Status +- Navigation zwischen Lizenz erstellen und Übersicht + +**Neue Features:** +- Anzeige aller Lizenzen mit Kundeninformationen +- Status-Anzeige basierend auf Ablaufdatum +- Unterscheidung zwischen Voll- und Testversion +- Responsive Tabelle mit Bootstrap +- Link von Dashboard zur Übersicht und zurück + +**Geänderte/Neue Dateien:** +- v2_adminpanel/app.py (neue Route hinzugefügt) +- v2_adminpanel/templates/licenses.html (neu erstellt) +- v2_adminpanel/templates/index.html (Navigation ergänzt) + +**Nächster Test:** +- Container neu starten +- Mehrere Lizenzen mit verschiedenen Ablaufdaten erstellen +- Lizenzübersicht unter /licenses aufrufen \ No newline at end of file diff --git a/v2_adminpanel/app.py b/v2_adminpanel/app.py index f4e801a..836a647 100644 --- a/v2_adminpanel/app.py +++ b/v2_adminpanel/app.py @@ -100,5 +100,31 @@ def dashboard(): return render_template("index.html", username=session.get('username')) +@app.route("/licenses") +@login_required +def licenses(): + conn = get_connection() + cur = conn.cursor() + + # Alle Lizenzen mit Kundeninformationen abrufen + cur.execute(""" + SELECT l.id, l.license_key, c.name, c.email, l.license_type, + l.valid_from, l.valid_until, l.is_active, + CASE + WHEN l.valid_until < CURRENT_DATE THEN 'abgelaufen' + WHEN l.valid_until < CURRENT_DATE + INTERVAL '30 days' THEN 'läuft bald ab' + ELSE 'aktiv' + END as status + FROM licenses l + JOIN customers c ON l.customer_id = c.id + ORDER BY l.valid_until DESC + """) + + licenses = cur.fetchall() + cur.close() + conn.close() + + return render_template("licenses.html", licenses=licenses, username=session.get('username')) + if __name__ == "__main__": app.run(host="0.0.0.0", port=443, ssl_context='adhoc') diff --git a/v2_adminpanel/templates/index.html b/v2_adminpanel/templates/index.html index 7727bc2..eee5257 100644 --- a/v2_adminpanel/templates/index.html +++ b/v2_adminpanel/templates/index.html @@ -17,7 +17,10 @@