{% extends "base.html" %} {% from "_macros.html" import avatar %} {% block title %}Urlaubsplaner{% endblock %} {% block heading %}Urlaubsplaner {{ "" if not status_filter else "· " + status_filter }}{% endblock %} {% block topbar_actions %}
Alle Offen Genehmigt Abgelehnt
+ Antrag stellen {% endblock %} {% block content %} {# ---------- KONTOSTAND PRO MITARBEITER ---------- #}

Urlaubskonten {{ "%d"|format(2026) }}

Anspruch · Genommen · Beantragt · Rest

{% for b in balances %} {% set remaining = b.entitled - b.used %} {% set available = b.entitled - b.used - b.requested %} {% set pct = (b.used * 100 / b.entitled) if b.entitled else 0 %} {% endfor %}
Mitarbeiter Position Anspruch Genommen Beantragt Verfügbar Stand
{{ avatar(b.first_name, b.last_name) }}{{ b.first_name }} {{ b.last_name }}
{{ b.position or '—' }} {{ b.entitled }} T {{ b.used }} T {% if b.requested %}{{ b.requested }} T{% else %}—{% endif %} {{ available }} T

{{ pct|round(0, 'common')|int }} % verbraucht

{# ---------- ANTRÄGE ---------- #}

{{ requests|length }} Anträge

Offene zuerst, dann genehmigte

{% if requests %} {% for r in requests %} {% endfor %}
Mitarbeiter Status Von Bis Tage Notiz Entschieden
{{ avatar(r.first_name, r.last_name) }}{{ r.first_name }} {{ r.last_name }}
{% if r.status == 'requested' %}Offen {% elif r.status == 'approved' %}Genehmigt {% elif r.status == 'rejected' %}Abgelehnt {% else %}Storniert{% endif %} {{ r.start_date }} {{ r.end_date }} {{ r.days }} T {{ r.note or '—' }} {% if r.decided_by_first %}{{ r.decided_by_first }} {{ r.decided_by_last }}
{{ r.decided_at[:10] if r.decided_at else '' }} {% else %}—{% endif %}
{% if r.status == 'requested' %} {% if can(current_user, 'approve_vacation') %}
{% else %} Genehmigung erforderlich {% endif %} {% elif r.status == 'approved' %} {% if can(current_user, 'approve_vacation') %}
{% endif %} {% endif %}
{% else %}
Keine Anträge in dieser Auswahl.
{% endif %}
{# ---------- KALENDER-TIMELINE — wer ist wann weg? ---------- #}

Urlaubskalender · {{ cal.month_name }} {{ cal.year }}

Wer ist wann weg? Überschneidungen für die Auftragsplanung erkennen

{# Legende #}
Genehmigt
Beantragt
Wochenende
Feiertag
2 Mitarbeiter parallel im Urlaub
{# --- Kopfzeile: Tagesnummern + Wochentag-Initialen --- #}
Mitarbeiter
{% for d in cal.days %}
{{ ['M','D','M','D','F','S','S'][d.weekday] }}
{{ d.day }}
{% if d.count_total >= 2 %}
{{ d.count_total }}
{% endif %}
{% endfor %}
{# --- Mitarbeiter-Zeilen --- #} {% for r in cal.rows %}
{{ avatar(r.first_name, r.last_name) }}
{{ r.first_name }} {{ r.last_name }}
{% if r.position %}
{{ r.position }}
{% endif %}
{# Hintergrund-Zellen: ein Element pro Tag, zur Markierung WE/Feiertag/Heute #} {% for d in cal.days %}
{% endfor %} {# Urlaubsbalken — überlappen die Tageszellen via grid-column #} {% for s in r.segments %}
{% if s.status == 'approved' %}{{ s.days }} T{% else %}beantragt · {{ s.days }} T{% endif %}
{% endfor %}
{% endfor %} {% if not cal.any_segments %}
Keine Urlaube in {{ cal.month_name }} {{ cal.year }}.
{% endif %}
{% endblock %}