{# Das Dashboard nach der Anmeldung (Spec §7, Entwurf 2026-09-04 Richtung A). **Es beantwortet drei Fragen, ohne dass man klickt oder scrollt:** Muss ich etwas tun (Lagezeile)? Was sagt die Verwaltung (Angeheftetes)? Und dann, je Bereich eine Karte: was liegt dort. Bis zum 04.09.2026 stand hier eine ganze Seite für eine einzige Frage — zwei Kacheln von je 800 px, fünf Meldungskarten à 90 px, und die halbe rechte Spalte leer (der Auftraggeber: «Das Dashboard hat auch die Funktion einen Überblick über alles zu erhalten. Das macht es nicht»). **Die Unterzeile nennt Rolle und Liegenschaft.** «Guten Tag Anna» allein sagt nicht, in welchem Haus man gerade steht — und wer in zweien eine Rolle hat, sieht sonst zwei gleich aussehende Startseiten. **Die Karte «Seit Ihrem letzten Besuch» mischt drei Quellen**, darum trägt jede Zeile ihr Wort der Herkunft. Ohne das Wort ist «Reinigung neu vergeben» nicht einzuordnen: Mitteilung, Antwort der Verwaltung oder Dokument. **Beim ersten Besuch steht dort ein Satz statt einer Null.** Es gibt keine vorletzte Sitzung, also auch keinen Bezugspunkt; «0 neue» wäre eine Aussage über einen Zeitraum, den es nicht gibt. #} {% import "bausteine/bausatz.html" as b %} {% import "bausteine/symbol.html" as s %}

{{ anrede }}

{#- ── Die Links der Demo (U24g) ── Nur in der Demo-Instanz: `demo_links` füllt allein `_demo_links_holen`, und das fragt die API nur mit `UNTERHALT_DEMO=1`, die ohne Marke und Gegenprobe nichts herausgibt. Oben, weil ein Besucher die drei anderen Sichten sonst nicht findet; sie haben im Portal keinen anderen Weg. Ein Link, der heute nicht gilt, fehlt; fehlen alle, fehlt der Kasten. -#} {%- if demo_links %}
{%- call b.kasten("Weitere Ansichten der Demo", klasse="auskunft", icon="pin") %} {#- Wortlaut nach der Laienprüfung vom 19.10.2026 (eigener Agent): Ohne den zweiten Satz hielt man «Schaden melden» für eine echte Meldung. -#}

So sieht das Portal für andere Beteiligte aus. Sie öffnen diese Seiten über einen Link und ohne Anmeldung. In der Demo sehen Sie die Seiten nur an, absenden lässt sich nichts.

{%- if demo_links.get("melden") %}

Schaden melden: So meldet jemand über den QR-Aushang im Treppenhaus einen Schaden.

{%- endif %} {%- if demo_links.get("verfolgen") %}

Meldung verfolgen: So sieht die meldende Person, wie weit ihre Meldung ist.

{%- endif %} {%- if demo_links.get("auftrag") %}

Auftrag als Handwerker: So sieht ein Handwerksbetrieb einen Auftrag der Verwaltung.

{%- endif %} {%- endcall %}
{%- endif %} {#- **Rolle und Haus stehen seit dem 04.09.2026 in der Seitenleiste** — der Hausname in der Marke, die Rolle darunter (Vorgabe des Auftraggebers). Sie hier zu wiederholen hiesse, dieselbe Auskunft zweimal zu geben, und zwar auf der einzigen Seite, die sie ohnehin am wenigsten braucht: Wer gerade angekommen ist, hat die Leiste im Blick. -#} {%- if nur_unterlagen %} {#- **Die frühere Eigentümerin (U27b)** sieht nur noch, was über ihre Kennung beim Immotool kommt. Der Absatz sagt warum, wo es steht und wohin sie sich sonst wendet; Laienprüfung vom 16.10.2026 (`quellen/pruefung/zu-pruefen-2026-10-16-unterhalt-u27b-fruehere-eigentuemerin.md`). Die Karten darunter entfallen: Meldungen und Mitteilungen hat sie nicht mehr, und die Leiste führt zu dem, was bleibt. -#}

Sie sind nicht mehr als Eigentümerin oder Eigentümer eingetragen. Ihre Dokumente und Abrechnungen aus dieser Zeit finden Sie weiterhin unter «Dokumente» und «Zahlungen». Für alles andere wenden Sie sich bitte an Ihre Verwaltung.

{%- elif not liegenschaften %} {#- **Ohne Liegenschaft sagt die Seite, warum sie leer ist.** Vier Kacheln mit Null und leere Karten sind sonst zwei Aussagen über dieselbe Sache, und die eine davon irrefuehrend: Es kommt nichts, solange keine Rolle hinterlegt ist. Dieselbe Regel wie in den Listen. -#}

Zu Ihrer Adresse ist derzeit keine Liegenschaft hinterlegt. Bitte wenden Sie sich an Ihre Verwaltung.

{%- else %}{{ unvollstaendig }} {#- **Keine Lagezeile mehr** (Vorgabe des Auftraggebers, 04.09.2026: «Die Badges braucht es nicht mehr»). Sie zeigte vier Zahlen, die einen Zentimeter tiefer noch einmal standen: «Offene Meldungen 22» über einer Karte «Meine Meldungen (22 offen von 22)». Jede Karte trägt ihren Stand und den Weg in ihren Bereich; die Zeile war eine zweite Aussage über dieselbe Sache. Der Kopfzähler der Meldungen ist am 05.09.2026 aus demselben Grund gefallen (Vorgabe des Auftraggebers): Die Statusleiste eine Zeile tiefer zählt jeden Zustand einzeln. -#} {{ banner }} {#- ── Der Zustand «nur Neues» ── Die Schaltzeile steht über allem und gilt für die ganze Seite; die Karten darunter zeigen dann je ihre neue Teilmenge. Der Weg heraus ist die Adresse ohne Parameter. -#} {%- if nur_neu %}
{#- `zustandswort` und nicht `was`: `.marke .was` ist die Zeile unter dem Hausnamen und setzt 11 px und Deckkraft 0.75. -#}

{{ s.symbol("kalender", 16) }} Neu seit Ihrem letzten Besuch{% if neues_zaehler %} ({{ neues_zaehler }}){% endif %}

Alles zeigen

{%- endif %} {#- ── Nächste Termine ── **Unter dem Angehefteten und der Schaltzeile, über den Karten** (Entscheid des Auftraggebers, 06.09.2026; Reihenfolge korrigiert im `/code-review` desselben Tages). Der erste Anlauf setzte sie noch über die Schaltzeile — dann stand unter `/b?neu=1` eine UNGEFILTERTE Karte über dem Hinweis «Sie sehen nur Neues», und der Weg zurück lag darunter. Wer sich anmeldet, soll ohne Scrollen sehen, was ansteht: «Kommt der Kaminfeger diese Woche?» ist die Frage, mit der jemand das Portal öffnet, und sie stand bis heute nirgends — ein Termin lag im Titel einer Mitteilung («Heizungsrevision 12.09.») und war damit weder sortierbar noch von einem vergangenen zu unterscheiden. **Der Block fehlt ganz, wenn nichts ansteht.** Ein leerer Kasten «Keine Termine» wäre eine Zeile, die jeden Tag dasteht und nie etwas sagt; die Startseite ist ohnehin dicht. Anders als bei den Meldungen gibt es hier auch nichts zu tun, was ein Leerzustand anbieten könnte. Die Zeilen bauen sich in `_termine_html`, weil sie dieselbe Datumsformatierung brauchen wie die Ablage und die Zahlungen. -#} {%- if termine_html %} {%- call b.kasten("Nächste Termine", klasse="terminkarte", icon="kalender") %} {%- endcall %} {%- endif %}
{#- ── Meine Meldungen ── Die breite Karte, weil sie die Arbeit trägt: Statusleiste, bis fünf offene Meldungen, und der Weg in die Liste. **Kein zweiter Knopf «Meldung erfassen» im Kopf**, obwohl der Entwurf ihn zeigte: Die Werkzeugleiste trägt ihn schon, und «genau EIN Hauptknopf je Ansicht» ist eine Regel des Bausatzes (`docs/gestaltung.md`). Zwei gleiche Knöpfe auf einem Bildschirm sind keine zwei Wege, sondern eine Frage, welcher der richtige ist. Im Leerzustand steht er trotzdem — dort gibt es keinen anderen Inhalt, und der Leerzustand IST der Wegweiser (Code-Review 2026-09-04). -#} {%- call b.kasten("Meine Meldungen", meldungen_zaehler, "bereichskarte", icon="sprechblase", weg_href=meldungen_pfad, weg_wort="Alle Meldungen") %} {%- if statusleiste %}

{% for s in statusleiste %}{{ b.kapsel(s.wort ~ ' ' ~ s.zahl, s.ton) }}{% endfor %}

{%- endif %} {%- if meldungen_html %} {#- Die Beschriftung benennt, was in der Tabelle steht. «Meine offenen Meldungen» über neuen Antworten sagt einem Screenreader genau das, was die sichtbare Seite vermeidet (Code-Review 04.09.2026). -#} {{ meldungen_html }}
{% if nur_neu %}Meldungen mit neuer Antwort{% else %}Meine offenen Meldungen{% endif %}
MeldungZuletztStatus
{%- if mehr_meldungen %}

{{ mehr_meldungen_wort }}

{% endif %} {#- **Der Leerzustand sagt, welcher Zustand gerade gilt.** «Sie haben zurzeit keine offene Meldung» wäre im Neu-Zustand falsch: Es kann zehn offene geben, nur keine mit neuer Antwort. Und der Knopf «Meldung erfassen» gehoert dorthin, wo wirklich nichts ist. -#} {%- elif meldungen_ausfall %}

Was seit Ihrem letzten Besuch dazugekommen ist, lässt sich gerade nicht abrufen. Das liegt nicht an Ihnen.

{%- elif nur_neu %}{{ b.leerzustand("bestand", "Seit Ihrem letzten Besuch hat die Verwaltung auf keine Ihrer Meldungen geantwortet.") }} {%- else %}{{ b.leerzustand("bestand", "Sie haben zurzeit keine offene Meldung.", aktion_href="/b/melden", aktion_wort="Meldung erfassen") }} {%- endif %} {%- endcall %} {#- ── Seit Ihrem letzten Besuch ── **Eine Karte für alles Neue, und die Mitteilungskarte ist weggefallen** (Vorgabe des Auftraggebers, 04.09.2026: «Ich hätte dort, wo Mitteilungen sind, die Kachel ‹Neu seit dem letzten Besuch› hingesetzt und die Kachel Mitteilungen aufgehoben. Neue Mitteilungen, Dokumente und sonstiges sind in dieser Kachel. So wird das Ganze schlanker»). Sie kennt drei Zustände; welcher gilt, entscheidet `neues_art` in `main.py`, und die Vorlage fragt nicht nach: - **neu** — es gibt einen letzten Besuch und etwas Neues. - **zuletzt** — es gibt einen Besuch, aber nichts Neues: dann die letzten Mitteilungen, damit die Spalte nicht leer steht. - **erstmals** — kein Besuch: die letzten Mitteilungen, und NUR wenn es auch die nicht gibt, der Erklärsatz. **Der Weg im Kopf führt dorthin, wo die Zeilen herkommen.** Im Zustand «neu» in den Neu-Zustand der Seite, sonst in die Mitteilungen — ein Verweis auf eine Liste, deren Zeilen gerade nicht dastehen, wäre einer ins Ungefähre. -#} {#- **Im Neu-Zustand steht hier die Mitteilungskarte.** Die Zusammenstellung ist dann die ganze Seite, und die Schaltzeile oben sagt das; eine Karte «Seit Ihrem letzten Besuch» daneben zeigte dieselben Zeilen ein zweites Mal. Jede Quelle zeigt in diesem Zustand ihre eigene neue Teilmenge. -#} {%- if nur_neu %} {%- call b.kasten("Mitteilungen", klasse="bereichskarte", icon="pin", weg_href=(mitteilungen_pfad if mitteilungen_verweis else ""), weg_wort=("Alle Mitteilungen" if mitteilungen_verweis else "")) %} {%- if mitteilungen_ausfall %}

Was seit Ihrem letzten Besuch dazugekommen ist, lässt sich gerade nicht abrufen. Das liegt nicht an Ihnen.

{%- elif mitteilungen_html %} {{ mitteilungen_html }}
Neue Mitteilungen
MitteilungVeröffentlichtStand
{%- if mehr_mitteilungen %}

Noch {{ mehr_mitteilungen }} weitere

{% endif %} {%- else %}{{ b.leerzustand("bestand", "Seit Ihrem letzten Besuch ist keine Mitteilung dazugekommen.") }} {%- endif %} {%- endcall %} {%- elif neues_art == 'neu' %} {%- call b.kasten("Seit Ihrem letzten Besuch", neues_zaehler, klasse="bereichskarte", icon="kalender", weg_href=(neu_pfad if neu_moeglich else ""), weg_wort=("Nur Neues zeigen" if neu_moeglich else "")) %} {#- Die erste und die dritte Spalte tragen nur ein Symbol (`aria-hidden`); ihre Beschriftung sagt darum, dass dort nichts zu lesen ist, statt «Art» und «Weg» zu versprechen. Was die Zeile IST, steht im Text der zweiten Spalte (Code-Review 04.09.2026). -#} {{ neu_html }}
Neu seit Ihrem letzten Besuch
SymbolEintragWeg
{#- **Was ueber dem Deckel liegt, wird gesagt.** Fuenf Zeilen je Karte, und bei sieben neuen Mitteilungen standen zwei nirgends mehr, seit die zweite Karte weg ist (Code-Review 04.09.2026). Der Weg fuehrt in den Bereich: Dort steht alles. -#} {#- **Der Weg fuehrt in den Neu-Zustand, nicht in die Mitteilungen.** Der Ueberlauf kann aus allen drei Quellen kommen — Mitteilungen, Antworten, Dokumente —, und `/b/mitteilungen` fuehrte an zweien davon vorbei (Sicherheitsdurchgang 04.09.2026, als Korrektheit gemeldet). Der Neu-Zustand zeigt jede Quelle einzeln. -#} {%- if mehr_neu %}

Noch {{ mehr_neu }} weitere

{% endif %} {%- endcall %} {%- else %} {#- **Der Erklärsatz steht NUR im Leerfall** (Rückmeldung des Auftraggebers, 04.09.2026: «Muss bei ‹Neues› der Einleitungstext stehen? Der müsste eigentlich nur stehen, wenn kein Eintrag vorhanden ist»). Über einer Liste mit fünf Zeilen erklärte er, was hier künftig erscheint — und darunter stand es schon. **Und die Karte heisst dann «Zuletzt», nicht «Neues».** Beim ersten Besuch gibt es kein «seit», also auch nichts Neues; was dasteht, sind die letzten Mitteilungen. Der Titel «Neues» über ihnen war eine Behauptung über ihren Zeitpunkt. -#} {%- call b.kasten("Zuletzt", ("" if neues_art == 'erstmals' else neues_zaehler), klasse="bereichskarte", icon="kalender", weg_href=(mitteilungen_pfad if mitteilungen_verweis else ""), weg_wort=("Alle Mitteilungen" if mitteilungen_verweis else "")) %} {%- if mitteilungen_ausfall %}

Mitteilungen sind zurzeit nicht abrufbar. Das liegt nicht an Ihnen.

{%- elif mitteilungen_html %} {{ mitteilungen_html }}
Letzte Mitteilungen
MitteilungVeröffentlichtStand
{#- **Der Leersatz sagt, was der Fall ist, und nennt beides.** Wer nur «nichts dazugekommen» liest, weiss nicht, ob es überhaupt Mitteilungen gibt. Beim ERSTEN Besuch gibt es kein «seit»: Dann sagt der Satz, was hier künftig erscheint — das ist der Erklärsatz, und er steht genau hier und nirgends sonst. -#} {%- elif neues_art == 'erstmals' %}{{ b.leerzustand("bestand", "Hier ist noch nichts eingetragen.", hinweis="Künftig steht hier, was seit Ihrem letzten Besuch dazukam: Mitteilungen, Antworten der Verwaltung und freigegebene Dokumente.") }} {%- else %}{{ b.leerzustand("bestand", "Seit Ihrem letzten Besuch ist nichts dazugekommen.", hinweis="Es liegt auch keine ältere Mitteilung vor.") }} {%- endif %} {%- endcall %} {%- endif %}
{#- ── Ihre Dokumente ── **Ein eigener Abschnitt über die volle Breite, mit Vorschaublatt** — die Form aus dem abgenommenen Entwurf (Design-Canvas vom 02.09.2026, siehe `docs/gestaltung.md`). Sie stand am Vormittag als Karte mit drei Tabellenzeilen im Raster, weil drei Kacheln in einer 24rem-Karte die halbe Seitenhöhe füllten. Das Problem war die Karte, nicht die Kachel: Über die ganze Breite stehen die Blätter nebeneinander und kosten eine Zeile. **Warum überhaupt Bilder.** Ein Protokoll sieht aus wie ein Protokoll. Für jemanden, der zweimal im Jahr hereinschaut, ist der Briefkopf der schnellere Weg als Titel und Kategorie in einer Textzeile. **«Ihre Dokumente» und nicht «Zuletzt freigegeben»** (Spec §7 nennt es so): Von 1031 Dokumenten im Dev-Bestand tragen zwei ein Freigabedatum; danach sortiert stünde eines von 2019 vor einem von 2026. Sortiert wird wie in der Ablage, und die Überschrift sagt, was dasteht. Ohne Konto gibt es den Bereich nicht, und dann auch den Abschnitt nicht: `zuletzt_html` bleibt leer und `ablage_da` ist falsch. -#} {%- if zuletzt_html or (nur_neu and ablage_da) %}

{{ s.symbol("klammer", 16) }}{% if nur_neu %}Neu freigegebene Dokumente{% else %}Ihre Dokumente{% endif %}Zur Ablage

{%- if zuletzt_html %}{{ zuletzt_html }} {%- if mehr_dokumente %}

Alle Dokumente

{% endif %} {#- **Der Ausfall der Ablage, nicht der der `seit`-Aufrufe.** Diese Menge kommt aus `_dokumente_holen` und wird lokal gerechnet; die seit-Aufrufe sagen über sie nichts (Code-Review 04.09.2026). -#} {%- elif dokumente_ausfall %}

Ihre Dokumente sind zurzeit nicht abrufbar. Das liegt nicht an Ihnen.

{%- else %}{{ b.leerzustand("bestand", "Seit Ihrem letzten Besuch wurde kein Dokument freigegeben.") }} {%- endif %}
{%- endif %} {%- endif %} {#- ── Revision und Liegenschaft ── **Leiser als die Karten darüber, und nebeneinander.** Beide sind Auskünfte, keine Arbeit: «wann läuft die Freigabe ab» und «wen rufe ich an». Als gleich grosse Karten im Raster standen sie neben Meldungen und Mitteilungen, als wären sie dasselbe — sechs gleichwertige Kästen, die den Blick zwingen, jeden einzeln zu prüfen (Vergleich mit dem abgenommenen Entwurf, 04.09.2026). **Die Revision nur mit offener Freigabe.** Ohne eine zeigt der Bereich in der Leiste abgeschlossene Jahre oder eine Störung; hier zählt, was noch Arbeit ist. **Die Liegenschaft ist die einzige Auskunft ohne Bereich dahinter.** Sie beantwortet «wen rufe ich an», und die Antwort stand bis zum 04.09.2026 in 11 px im Fuss der Seitenleiste. Im Neu-Zustand entfallen beide: Sie beantworten «was ist neu» nicht, und ihr Bestand als Neues dazustehen wäre eine falsche Auskunft. -#} {#- **Ausserhalb der Verzweigung oben** (U27b, Code-Review 16.10.2026): Auch die frühere Eigentümerin kann Revisorin sein, und ihre ablaufende Frist gehört auf den Start wie bei allen anderen. Ohne Liegenschaft und ohne Merkmal gibt es keine Freigabe zu zeigen. -#} {%- if revision_html and (liegenschaften or nur_unterlagen) %}
{%- call b.kasten("Jahresrechnung", revision_zaehler, klasse="auskunft", icon="haken", weg_href=revision_pfad, weg_wort="Zur Jahresrechnung") %} {{- revision_html }} {%- endcall %}
{%- endif %}