# Devlog Entwicklungstagebuch mit Zeiterfassung. Jeder Arbeitsabschnitt bekommt einen Eintrag: wann, wie lange, was entstanden ist, und was dabei schiefging. Die aufgewendete Zeit wandert nach jedem Abschnitt in die Spalte „tatsächlich" der [Aufwandsschätzung](AUFWANDSSCHAETZUNG.md). ## Zeitübersicht | Phase | Sitzungszeit | Sitzungen | abgeschlossen | |---|---:|---:|---| | Phase 0 — Fundament | 1:00 h | 1 | 03.09.2026 | | Phase 1 — Stammdaten | 1:15 h | 1 | 03.09.2026 | | Phase 1 — Nachtrag Geräteformular | 0:50 h | 1 | 03.09.2026 | | **Summe** | **3:05 h** | **3** | | --- ## 2026-09-03 · Phase 1 — Nachtrag: Geräteformular **08:30 – 09:20 · 0:50 h** ### Was entstanden ist Die letzte offene Lücke aus Phase 1: ein Formular zum Anlegen und Bearbeiten eines einzelnen Geräts. Bis dahin konnte man Geräte nur über den Import erfassen — für einen Bestand richtig, für den einen nachbeschafften Gerät umständlich. | Datei | Inhalt | |---|---| | `components/stammdaten/geraet-formular.tsx` | das Formular, geteilt von Anlegen und Bearbeiten | | `components/stammdaten/geraet-formular-werte.ts` | Typ und Vorgabewerte, bewusst ohne `"use client"` | | `components/ui/textarea.tsx` | fehlender Baustein | | `app/(app)/geraete/neu/page.tsx` | Anlegen | | `app/(app)/geraete/[id]/bearbeiten/page.tsx` | Bearbeiten | | `tests/e2e/geraet-formular.spec.ts` | 7 Tests | ### Entscheidungen **Die Lagerung ist ein Umschalter, keine zwei Auswahlfelder.** Standort und Fahrzeug schließen sich aus. Zwei nebeneinanderstehende Felder laden dazu ein, beide zu füllen; die Datenbank weist das ab, aber eine Fehlermeldung nach dem Absenden ist schlechter als ein Formular, in dem der Fehler gar nicht möglich ist. Beim Wechsel des Fahrzeugs wird der Geräteraum geleert — er gehört zum Fahrzeug. **Die Fristen werden schon beim Tippen vorgerechnet.** Wer ein Prüfintervall einträgt, sieht sofort, wann die nächste Prüfung fällig wird. Gerechnet wird mit denselben Funktionen wie auf dem Server; beim Speichern rechnet der Server erneut und behält das letzte Wort. Die Vorschau ist Anzeige, keine Quelle. **Bei nur einem Standort wird er vorbelegt.** Das ist bei den meisten Wehren der Fall, und ein Pflichtfeld weniger ist ein Klick weniger. ### Wo es gehakt hat | Problem | Ursache | Lösung | |---|---|---| | Formular stürzte beim ersten Rechnen ab | `LEERES_GERAET` lag im `"use client"`-Modul; eine Server-Komponente bekommt beim Import nur eine Client-Referenz, das Spreaden ergibt `undefined` | Werte in ein eigenes Modul ohne `"use client"` | | E2E fand die Felder nicht | `getByLabel` vergleicht den Text des `