diff --git a/app/flask-postgres/app/app.py b/app/flask-postgres/app/app.py index 93321bd..c16579e 100644 --- a/app/flask-postgres/app/app.py +++ b/app/flask-postgres/app/app.py @@ -240,7 +240,7 @@ def home(): @login_required def preise(): return render_template( - "preise.html", + "preise2.html", page_title="Preise", active_page="preise", **get_current_user() @@ -750,4 +750,15 @@ def useradmin_user_new(): form_error=form_error, form_values=form_values, **get_current_user() - ) \ No newline at end of file + ) + +@app.route("/set-country") +def set_country(): + country = request.args.get("country", "DE").upper() + allowed = {"DE", "AT", "CH"} + + if country in allowed: + session["country"] = country + + next_url = request.args.get("next") or request.referrer or url_for("home") + return redirect(next_url) \ No newline at end of file diff --git a/app/flask-postgres/app/security.py b/app/flask-postgres/app/security.py index a48cda4..bf0900d 100644 --- a/app/flask-postgres/app/security.py +++ b/app/flask-postgres/app/security.py @@ -59,6 +59,8 @@ def user_is_admin(): def get_current_user(): + country = session.get("country", "DE") # Default DE + return { "user_id": session.get("user_id"), "user_name": session.get("user_name"), @@ -67,6 +69,7 @@ def get_current_user(): "is_logged_in": bool(session.get("user_id")), "is_admin": user_is_admin() if session.get("user_id") else False, "is_user_admin": user_is_user_admin() if session.get("user_id") else False, + "country": country, } @@ -116,4 +119,5 @@ def user_admin_required(view_func): if not user_is_user_admin(): abort(403) return view_func(*args, **kwargs) - return wrapper \ No newline at end of file + return wrapper + diff --git a/app/flask-postgres/app/templates/base.html b/app/flask-postgres/app/templates/base.html index 380a6d1..19a20d1 100644 --- a/app/flask-postgres/app/templates/base.html +++ b/app/flask-postgres/app/templates/base.html @@ -41,6 +41,16 @@ {% else %} Login {% endif %} + +
+ + + +
diff --git a/app/flask-postgres/app/templates/partials/allgemein_content.html b/app/flask-postgres/app/templates/partials/allgemein_content.html index 79848f6..d5bd96d 100644 --- a/app/flask-postgres/app/templates/partials/allgemein_content.html +++ b/app/flask-postgres/app/templates/partials/allgemein_content.html @@ -61,7 +61,7 @@
- Compliance Schulung + Compliance Schulung
diff --git a/app/flask-postgres/app/templates/preise2.html b/app/flask-postgres/app/templates/preise2.html new file mode 100644 index 0000000..8e41129 --- /dev/null +++ b/app/flask-postgres/app/templates/preise2.html @@ -0,0 +1,129 @@ +{% extends "base.html" %} + +{% block content %} + +
+

Automatisierte Level

+

+ Die Level bauen inhaltlich aufeinander auf und erweitern den Leistungsumfang. + Ein Upgrade ist jederzeit möglich – es wird nur die Differenz berechnet. +

+

+ Alle Preise verstehen sich inklusive Mehrwertsteuer. +

+
+ +
+
+
+

Level A - Essential

+

Für alle Mitarbeitenden – gesetzliche Mindestanforderung / Basiswissen

+
+ +
+ € + 9,90 + / jährlich pro Nutzer +
+ +
+
+ Erfüllt die gesetzliche Schulungspflicht (EU AI Act) +
+ +

= 5 Module mit Pflichtinhalten

+ +
+ +
    +
  • Modul A1 – AI Governance Basics
    Grundlagen der KI-Nutzung im Unternehmen
  • +
  • Modul A2 – Ethical AI & Non-Discrimination
    Verantwortungsvoller KI-Einsatz
  • +
  • Modul A3 – AI Risk Awareness
    Risiken erkennen und bewerten
  • +
  • Modul A4 – Transparency & Disclosure
    Transparenzpflichten verstehen
  • +
  • Modul A5 – Documentation & Prozesse
    Grundlegende Dokumentation
  • +
+ + +
+
+ + + +
+
+

Level C - Governance

+

Für Unternehmen – vollständige Steuerung, Kontrolle und Absicherung / vollständig

+
+ +
+ € + 29,90 + / jährlich pro Nutzer +
+ +
+
+ Alle Module aus A & B enthalten +
+ +

= 15 Module insgesamt

+ +
+ +
    +
  • Modul C1 – Advanced Copyright & IP Strategy
    Schutz und Nutzung von Inhalten
  • +
  • Modul C2 – Security & Misuse Prevention
    Missbrauchs- und Sicherheitsaspekte
  • +
  • Modul C3 – Vendor & Tool Governance
    Prüfung und Steuerung externer Tools
  • +
  • Modul C4 – Risk Mapping
    Governance-Framework und Risikoklassifizierung
  • +
  • Modul C5 – Umsetzung & Beratung
    Individuelle Begleitung und Unternehmensintegration
  • +
+ + +
+
+
+ +
+
+ Paketübersicht +
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/flask-postgres/styles/site.css b/app/flask-postgres/styles/site.css index cea0111..ba98114 100644 --- a/app/flask-postgres/styles/site.css +++ b/app/flask-postgres/styles/site.css @@ -429,4 +429,269 @@ button { font-size: 16px; box-sizing: border-box; background: #fff; +} +/* ========================= + PRICING PAGE +========================= */ + +.pricing-hero { + text-align: center; + margin-bottom: 36px; +} + +.pricing-hero h1 { + font-size: 52px; + margin-bottom: 18px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.pricing-lead { + max-width: 980px; + margin: 0 auto 16px; + font-size: 22px; + line-height: 1.5; + color: #526172; +} + +.pricing-note-strong { + font-size: 18px; + font-weight: 700; + color: #0d2f57; + margin-bottom: 0; +} + +.pricing-levels { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 26px; + align-items: start; + margin-bottom: 40px; +} + +.level-card { + display: flex; + flex-direction: column; + background: #ffffff; + border: 1px solid #d8e0ea; + border-radius: 18px; + overflow: hidden; + box-shadow: 0 16px 34px rgba(0, 0, 0, 0.08); +} + +.level-card.featured { + transform: translateY(-18px); + box-shadow: 0 20px 42px rgba(0, 0, 0, 0.14); +} + +.level-card-header { + min-height: 150px; + padding: 28px 24px 24px; + background: linear-gradient(180deg, #7f8793 0%, #a5acb5 100%); + color: #ffffff; + text-align: center; +} + +.level-card-header h2 { + margin: 0 0 14px; + font-size: 28px; + line-height: 1.15; +} + +.level-card-header p { + margin: 0; + color: rgba(255, 255, 255, 0.95); + font-size: 17px; + line-height: 1.35; +} + +.level-a .level-card-header h2 { + color: #1970c8; +} + +.level-b .level-card-header h2 { + color: #f2c200; +} + +.level-c .level-card-header h2 { + color: #e83a2d; +} + +.level-card-price { + display: flex; + align-items: baseline; + justify-content: center; + gap: 6px; + padding: 26px 20px 24px; + background: #f8fbff; + border-bottom: 1px solid #dce3ea; +} + +.level-card-price .currency { + font-size: 28px; + color: #7e8793; +} + +.level-card-price .amount { + font-size: 70px; + line-height: 1; + font-weight: 800; +} + +.level-card-price .period { + font-size: 18px; + color: #7e8793; +} + +.level-a .amount { + color: #1970c8; +} + +.level-b .amount { + color: #d4aa00; +} + +.level-c .amount { + color: #e83a2d; +} + +.level-card-body { + padding: 28px 28px 30px; +} + +.level-highlight { + font-size: 24px; + font-weight: 700; + line-height: 1.25; + color: #1b2430; + margin-bottom: 18px; +} + +.level-meta { + font-size: 16px; + color: #5f6c7b; + margin-bottom: 20px; +} + +.level-card-body hr { + border: 0; + border-top: 2px solid #d6dde6; + margin: 22px 0 24px; +} + +.level-module-list { + list-style: none; + padding: 0; + margin: 0; +} + +.level-module-list li { + margin-bottom: 16px; + color: #2f3b4a; + line-height: 1.5; +} + +.level-actions { + margin-top: 24px; +} + +.level-actions .btn-primary { + width: 100%; +} + +.pricing-bottom-note { + margin-top: 18px; +} + +/* ========================= + RESPONSIVE PRICING +========================= */ + +@media (max-width: 1200px) { + .pricing-levels { + grid-template-columns: 1fr; + } + + .level-card.featured { + transform: none; + } + + .pricing-hero h1 { + font-size: 40px; + } + + .pricing-lead { + font-size: 19px; + } +} + +@media (max-width: 700px) { + .level-card-header { + min-height: auto; + padding: 22px 18px; + } + + .level-card-header h2 { + font-size: 24px; + } + + .level-card-header p { + font-size: 16px; + } + + .level-card-price { + flex-wrap: wrap; + padding: 22px 18px; + } + + .level-card-price .amount { + font-size: 52px; + } + + .level-card-price .period { + width: 100%; + text-align: center; + } + + .level-card-body { + padding: 22px 18px 24px; + } + + .level-highlight { + font-size: 21px; + } +} + +/* ========================= + COUNTRY SWITCH +========================= */ + +.country-switch-form { + display: inline-flex; + align-items: center; + gap: 10px; + margin-left: 16px; +} + +.country-label { + color: #ffffff; + font-weight: 600; + font-size: 14px; +} + +.country-switch-form select { + min-height: 40px; + padding: 0 12px; + border: 1px solid rgba(255, 255, 255, 0.18); + border-radius: 12px; + background: #376da6; + color: #ffffff; + font-weight: 700; + cursor: pointer; +} + +.country-switch-form select:focus { + outline: none; + border-color: #8fb6e2; + box-shadow: 0 0 0 3px rgba(143, 182, 226, 0.2); } \ No newline at end of file