Länderauswahl
This commit is contained in:
parent
44792dc98f
commit
b221ee515a
@ -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)
|
||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
129
app/flask-postgres/app/templates/preise2.html
Normal file
129
app/flask-postgres/app/templates/preise2.html
Normal 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 1–5) 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 & 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 %}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user