Länderauswahl

This commit is contained in:
Bkolb 2026-04-03 09:43:57 +02:00
parent 44792dc98f
commit b221ee515a
6 changed files with 423 additions and 4 deletions

View File

@ -240,7 +240,7 @@ def home():
@login_required @login_required
def preise(): def preise():
return render_template( return render_template(
"preise.html", "preise2.html",
page_title="Preise", page_title="Preise",
active_page="preise", active_page="preise",
**get_current_user() **get_current_user()
@ -751,3 +751,14 @@ def useradmin_user_new():
form_values=form_values, form_values=form_values,
**get_current_user() **get_current_user()
) )
@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)

View File

@ -59,6 +59,8 @@ def user_is_admin():
def get_current_user(): def get_current_user():
country = session.get("country", "DE") # Default DE
return { return {
"user_id": session.get("user_id"), "user_id": session.get("user_id"),
"user_name": session.get("user_name"), "user_name": session.get("user_name"),
@ -67,6 +69,7 @@ def get_current_user():
"is_logged_in": bool(session.get("user_id")), "is_logged_in": bool(session.get("user_id")),
"is_admin": user_is_admin() if session.get("user_id") else False, "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, "is_user_admin": user_is_user_admin() if session.get("user_id") else False,
"country": country,
} }
@ -117,3 +120,4 @@ def user_admin_required(view_func):
abort(403) abort(403)
return view_func(*args, **kwargs) return view_func(*args, **kwargs)
return wrapper return wrapper

View File

@ -41,6 +41,16 @@
{% else %} {% else %}
<a href="/login" class="{% if active_page == 'login' %}active{% endif %}">Login</a> <a href="/login" class="{% if active_page == 'login' %}active{% endif %}">Login</a>
{% endif %} {% endif %}
<form class="country-switch-form" method="get" action="/set-country">
<label for="country-select" class="country-label">Land</label>
<select id="country-select" name="country" onchange="this.form.submit()">
<option value="DE" {% if country == "DE" %}selected{% endif %}>🇩🇪 DE</option>
<option value="AT" {% if country == "AT" %}selected{% endif %}>🇦🇹 AT</option>
<option value="CH" {% if country == "CH" %}selected{% endif %}>🇨🇭 CH</option>
</select>
<input type="hidden" name="next" value="{{ request.path }}">
</form>
</nav> </nav>
</div> </div>

View File

@ -61,7 +61,7 @@
</div> </div>
<div class="image-panel"> <div class="image-panel">
<img src="/images/Schulung.png" alt="Compliance Schulung"> <img src="/images/schulung.png" alt="Compliance Schulung">
</div> </div>
</div> </div>
</section> </section>

View File

@ -0,0 +1,129 @@
{% extends "base.html" %}
{% block content %}
<section class="pricing-hero">
<h1>Automatisierte Level</h1>
<p class="pricing-lead">
Die Level bauen inhaltlich aufeinander auf und erweitern den Leistungsumfang.
Ein Upgrade ist jederzeit möglich es wird nur die Differenz berechnet.
</p>
<p class="pricing-note-strong">
Alle Preise verstehen sich inklusive Mehrwertsteuer.
</p>
</section>
<section class="pricing-levels">
<article class="level-card level-a">
<div class="level-card-header">
<h2>Level A - Essential</h2>
<p>Für alle Mitarbeitenden gesetzliche Mindestanforderung / Basiswissen</p>
</div>
<div class="level-card-price">
<span class="currency"></span>
<span class="amount">9,90</span>
<span class="period">/ jährlich pro Nutzer</span>
</div>
<div class="level-card-body">
<div class="level-highlight">
Erfüllt die gesetzliche Schulungspflicht (EU AI Act)
</div>
<p class="level-meta">= 5 Module mit Pflichtinhalten</p>
<hr>
<ul class="level-module-list">
<li><strong>Modul A1 AI Governance Basics</strong><br>Grundlagen der KI-Nutzung im Unternehmen</li>
<li><strong>Modul A2 Ethical AI & Non-Discrimination</strong><br>Verantwortungsvoller KI-Einsatz</li>
<li><strong>Modul A3 AI Risk Awareness</strong><br>Risiken erkennen und bewerten</li>
<li><strong>Modul A4 Transparency & Disclosure</strong><br>Transparenzpflichten verstehen</li>
<li><strong>Modul A5 Documentation & Prozesse</strong><br>Grundlegende Dokumentation</li>
</ul>
<div class="level-actions">
<a href="#" class="btn-primary">Jetzt buchen</a>
</div>
</div>
</article>
<article class="level-card level-b featured">
<div class="level-card-header">
<h2>Level B - Compliance</h2>
<p>Für Fachbereiche rechtssichere KI-Nutzung im Unternehmen / erweitert</p>
</div>
<div class="level-card-price">
<span class="currency"></span>
<span class="amount">19,90</span>
<span class="period">/ jährlich pro Nutzer</span>
</div>
<div class="level-card-body">
<div class="level-highlight">
Alle Module aus A (Modul 15) enthalten
</div>
<p class="level-meta">= 10 Module insgesamt</p>
<hr>
<ul class="level-module-list">
<li><strong>Modul B1 Data & Privacy Compliance</strong><br>Datenschutz in der KI-Nutzung</li>
<li><strong>Modul B2 KI-Nutzung & Unternehmensrichtlinien</strong><br>Policies und Verantwortlichkeiten</li>
<li><strong>Modul B3 Copyright & AI (Basic)</strong><br>Urheberrecht und Trainingsdaten</li>
<li><strong>Modul B4 Audit Readiness</strong><br>Nachweisbarkeit und Dokumentation</li>
<li><strong>Modul B5 Organisations-Compliance</strong><br>Rollen, Zuständigkeiten und Prozesse</li>
</ul>
<div class="level-actions">
<a href="#" class="btn-primary">Jetzt buchen</a>
</div>
</div>
</article>
<article class="level-card level-c">
<div class="level-card-header">
<h2>Level C - Governance</h2>
<p>Für Unternehmen vollständige Steuerung, Kontrolle und Absicherung / vollständig</p>
</div>
<div class="level-card-price">
<span class="currency"></span>
<span class="amount">29,90</span>
<span class="period">/ jährlich pro Nutzer</span>
</div>
<div class="level-card-body">
<div class="level-highlight">
Alle Module aus A &amp; B enthalten
</div>
<p class="level-meta">= 15 Module insgesamt</p>
<hr>
<ul class="level-module-list">
<li><strong>Modul C1 Advanced Copyright & IP Strategy</strong><br>Schutz und Nutzung von Inhalten</li>
<li><strong>Modul C2 Security & Misuse Prevention</strong><br>Missbrauchs- und Sicherheitsaspekte</li>
<li><strong>Modul C3 Vendor & Tool Governance</strong><br>Prüfung und Steuerung externer Tools</li>
<li><strong>Modul C4 Risk Mapping</strong><br>Governance-Framework und Risikoklassifizierung</li>
<li><strong>Modul C5 Umsetzung & Beratung</strong><br>Individuelle Begleitung und Unternehmensintegration</li>
</ul>
<div class="level-actions">
<a href="#" class="btn-primary">Jetzt buchen</a>
</div>
</div>
</article>
</section>
<section class="pricing-bottom-note">
<div class="image-panel">
<img src="/images/TabelleUebersicht.png" alt="Paketübersicht">
</div>
</section>
{% endblock %}

View File

@ -430,3 +430,268 @@ button {
box-sizing: border-box; box-sizing: border-box;
background: #fff; 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);
}