{% extends "base.html" %} {% from "ui/segmented_toggle.html" import segmented_toggle %} {% from "ui/collapsible_section.html" import collapsible_section %} {% block title %}Einstellungen{% endblock %} {% block body_class %}settings-theme{% endblock %} {% block page_class %}settings-page{% endblock %} {% block content %}

Einstellungen

{% if is_admin %} {{ segmented_toggle([ {'href': '/settings?tab=settings', 'label': 'Einstellungen', 'active': active_settings_tab != 'admin'}, {'href': '/settings?tab=admin', 'label': 'Admin', 'active': active_settings_tab == 'admin'} ], 'Einstellungsbereiche', 'settings-tabs') }} {% endif %}
{% if not is_admin or active_settings_tab != 'admin' %} {% call collapsible_section('Urlaub', 'settings-vacation') %}

Lege hier deine Gesamturlaubstage pro Kalenderjahr fest. Im Header siehst du danach Resturlaub/Gesamturlaub.

Definierte Urlaubstage reduzieren automatisch das Wochen-Soll für die betroffenen Wochen.

{% for vacation in vacation_ranges %}
{{ vacation.start_date.strftime("%d.%m.%Y") }} - {{ vacation.end_date.strftime("%d.%m.%Y") }}

Effektive Urlaubstage unter Berücksichtigung deiner Arbeitstage.

{% else %}

Noch keine Urlaubszeiträume angelegt.

{% endfor %}
{% endcall %} {% call collapsible_section('Wochenstunden', 'settings-weekly-target') %}

Lege fest, wie viele Stunden du generell pro Woche arbeiten möchtest (Standard-Soll).

Dieser Wert wird für neue reguläre Arbeitszeiteinträge und automatische Einträge verwendet, solange die gesetzliche Pausenregel nicht aktiv ist.

{% endcall %} {% call collapsible_section('Standardansicht', 'settings-preferences') %}
{% endcall %} {% call collapsible_section('Überstunden-Regeln', 'settings-overtime') %}

Optionales Startdatum und Verfall für die kumulierte Überstunden-Berechnung.

Saldoaufbau gesamt

{{ minutes_to_hhmm(overtime_adjustment_total_positive) }}

Saldoabbau gesamt

{{ minutes_to_hhmm(overtime_adjustment_total_negative) }}

Ganze Tage

{{ overtime_adjustment_full_day_count }}

{% for adjustment in overtime_adjustments %}
{{ adjustment.date.strftime("%d.%m.%Y") }}

{{ adjustment.notes or "Stundenausgleich" }}

{{ '+' if adjustment.minutes > 0 else '' }}{{ minutes_to_hhmm(adjustment.minutes) }} Bearbeiten
{% else %}

Noch keine Ausgleichsstunden eingetragen.

{% endfor %}
{% endcall %} {% call collapsible_section('Arbeitsstunden-Counter', 'settings-workhours-counter') %}

Hier kannst du einen Zeitraum festlegen und sehen, wie viele Stunden du darin insgesamt gesammelt hast. Das ist zum Beispiel hilfreich für Praxisstunden im Anerkennungsjahr.

Urlaub, Feiertage und Krankheit werden nur dann mitgezählt, wenn du das unter „Relevante Arbeitstage“ aktiviert hast.

Zum Beispiel bereits geleistete Praxis- oder Praktikumsstunden, die nicht im Tracker erfasst wurden.

{% if not mail_settings_available %}

Diese Funktion ist erst verfügbar, wenn ein E-Mail-Server eingerichtet wurde.

{% endif %}

Beispiel: So kannst du deine Praxisstunden im Anerkennungsjahr im Blick behalten.

{% if user.workhours_counter_enabled %}

{% if workhours_counter_minutes is not none %} Aktueller Stand im gewählten Zeitraum: {% else %} Bitte gültigen Zeitraum setzen, um den Counter zu berechnen. {% endif %}

{% endif %} {% if workhours_counter_warning %}
Bisher {% if workhours_counter_minutes is not none %} {{ minutes_to_hhmm(workhours_counter_minutes) }} {% else %} -- {% endif %} Ziel {{ minutes_to_hhmm(workhours_counter_warning.target_minutes) }} Prognose {{ minutes_to_hhmm(workhours_counter_warning.projected_minutes) }}
{% if workhours_counter_warning.at_risk %}

Bis zum Ziel fehlen voraussichtlich noch {{ minutes_to_hhmm(workhours_counter_warning.missing_minutes) }}

{% endif %} {% endif %}
{% endcall %} {% call collapsible_section('Relevante Arbeitstage', 'settings-workdays') %}

Diese Tage werden für Soll-/Delta-Berechnung verwendet (z. B. 4-Tage-Woche Mo-Do).

Arbeitstage
{% for weekday in weekday_options %} {% endfor %}
{% endcall %} {% call collapsible_section('Sicherheit (2FA)', 'settings-mfa') %} {% set mfa_totp_pending = mfa_setup_secret and user.mfa_method == 'none' %} {% set mfa_selected_method = 'totp' if mfa_totp_pending else user.mfa_method %}

Status: {% if mfa_totp_pending %} TOTP-Einrichtung läuft {% else %} {{ mfa_method_labels.get(user.mfa_method, 'Unbekannt') }} {% endif %}

{% if mfa_totp_pending %}

2FA wird aktiviert, sobald du den aktuellen 6-stelligen Code aus deiner Authenticator-App bestätigst.

{% endif %}
{% if mfa_setup_secret %}

TOTP-Setup aktiv: Hinterlege den folgenden Schlüssel oder die URI in deiner Authenticator-App und bestätige danach den Code.

{% endif %}
{% endcall %}
{% call collapsible_section('Account', 'settings-account', 'settings-auth-card', 'account-security') %}

Gesetzliche Feiertage deines Bundeslands werden automatisch als Feiertag markiert, sofern an diesen Tagen keine Arbeitszeit eingetragen ist.

{% endcall %} {% call collapsible_section('Passwort ändern', 'settings-password', 'settings-auth-card', 'account-security') %}
{% endcall %}
{% call collapsible_section('Datenexport', 'settings-export') %}

Lade hier alle bisher eingetragenen Daten herunter. Für Excel und PDF wird dein kompletter erfasster Zeitraum exportiert. Die Backup-Datei ist für Sicherung und späteren Import gedacht.

Die Backup-Datei enthält deine Einstellungen, Arbeitszeiteinträge, Urlaub, Sondertage, Soll-Historie und Stundenausgleich in einem strukturierten Format. Sicherheits- und Kontodaten sind nicht enthalten.

{% endcall %} {% call collapsible_section('Backup importieren', 'settings-import') %}

Du kannst eine zuvor exportierte Backup-Datei wieder einspielen. Dein Konto, dein Passwort und deine Sicherheitsdaten bleiben dabei unverändert.

Zusammenführen behält bestehende Tagesdaten bei und ergänzt nur konfliktfreie Inhalte. Ersetzen löscht zuerst alle importierbaren Arbeits- und Einstellungsdaten deines Kontos.

{% if import_preview %}

Importvorschau

Backup v{{ import_preview.backup_version }} {% if import_preview.source_app_version %}• exportiert mit {{ import_preview.source_app_version }}{% endif %} {% if import_preview.exported_at %}• {{ import_preview.exported_at }}{% endif %}

{{ import_preview.mode_label }}
{{ import_preview.counts.time_entries }} Arbeitszeiteinträge
{{ import_preview.counts.weekly_target_rules }} Wochenziele
{{ import_preview.counts.vacation_periods }} Urlaubszeiträume
{{ import_preview.counts.special_day_statuses }} Sondertage
{{ import_preview.counts.overtime_adjustments }} Stundenausgleich

Übernommen werden auch fachliche Einstellungen wie Wochenstunden, relevante Arbeitstage, Überstunden-Regeln, Arbeitsstunden-Counter und das Bundesland.

  • Konflikte Arbeitszeiteinträge: {{ import_preview.conflicts.time_entries }}
  • Konflikte Wochenziele: {{ import_preview.conflicts.weekly_target_rules }}
  • Konflikte Urlaubszeiträume: {{ import_preview.conflicts.vacation_periods }}
  • Konflikte Sondertage: {{ import_preview.conflicts.special_day_statuses }}
  • Konflikte Stundenausgleich: {{ import_preview.conflicts.overtime_adjustments }}
{% if import_preview.mode == 'replace_user_data' %} {% endif %}
{% endif %} {% endcall %} {% call collapsible_section('Konto löschen', 'settings-delete-account', 'danger-card') %}

Wenn du dein Konto löschst, werden alle zugehörigen Daten dauerhaft entfernt: Arbeitszeiten, Urlaub, Sondertage, Stundenausgleich, Soll-Historie und persönliche Einstellungen.

{% endcall %} {% endif %} {% if is_admin and active_settings_tab == 'admin' %} {% call collapsible_section('Benutzerverwaltung', 'settings-admin-users', 'admin-card') %}

Aktive Admins: {{ admin_user_count }}

{% for managed in managed_users %} {% set disable_delete = managed.id == user.id or (managed.role == 'admin' and managed.is_active and admin_user_count <= 1) %}
{{ managed.email }} erstellt: {{ managed.created_at.strftime("%d.%m.%Y") }}
{% endfor %}
{% endcall %} {% call collapsible_section('E-Mail-Server', 'settings-admin-email', 'admin-card') %}

Wird für Passwort-Reset, E-Mail-MFA und Registrierungsmails verwendet.

Empfänger für Registrierungs-Infomails (aktive Admins)

{% if admin_recipients %}
{% for admin_recipient in admin_recipients %} {% endfor %}
{% else %}

Keine aktiven Admins gefunden.

{% endif %} {% if email_server.registration_notify_fallback_email %}

Wenn keine Admins ausgewählt sind, wird die Fallback-Adresse {{ email_server.registration_notify_fallback_email }} genutzt.

{% endif %}
{% endcall %} {% call collapsible_section('Rechtliches', 'settings-admin-legal', 'admin-card') %}

Diese Inhalte werden öffentlich über den Footer unter Impressum und Datenschutz angezeigt. Markdown ist erlaubt und wird beim Anzeigen sicher bereinigt.

{% endcall %} {% call collapsible_section('Kontakt & Tickets', 'settings-admin-tickets', 'admin-card') %}

Neue Nachrichten aus dem Kontaktformular werden hier als Tickets gesammelt. Für Benachrichtigungen werden dieselben Admin-Empfänger wie bei Registrierungs-Infomails verwendet.

{% for ticket in support_tickets %}

{{ ticket.subject }}

{{ ticket_category_label(ticket.category) }} · {{ ticket_status_label(ticket.status) }} · {{ ticket.created_at.strftime("%d.%m.%Y %H:%M") }} UTC

{{ ticket.email }} {{ ticket.name or 'Ohne Namen' }} {% if ticket.user_id %}Angemeldeter Nutzer{% endif %}
{{ ticket.message }}
{% else %}

Aktuell liegen keine Kontakt-Tickets vor.

{% endfor %}
{% endcall %} {% endif %}
{% endblock %}