Phase 9: Kassenverwaltung. Ergänzt am 03.09.2026. Die Rolle KASSIER ist seit Phase 0 angelegt, ein Modul dazu fehlte in der ursprünglichen Planung. Modelle: Kassenkonto (Bezeichnung, Art: bar | bank | ruecklage, IBAN, Anfangsbestand, aktiv), Buchungskategorie (Name, Art: einnahme | ausgabe, Oberkategorie, Konto im Kontenrahmen), Buchung (Konto, Kategorie, Datum, Betrag, Verwendungszweck, Belegnummer, Gegenkonto, Person ODER Lieferant, Beleg als Datei, festgeschrieben), Beitragssatz (Bezeichnung, Betrag je Jahr, gilt für Abteilung), Beitrag (Person, Jahr, Satz, Betrag, Status: offen | bezahlt | erlassen | gemahnt, bezahlt_am), Rechnung (Empfänger, Positionen, Betrag, Datum, faellig_am, Status), Kassenabschluss (Zeitraum, Kassenbestand laut Buch, gezählter Bestand, Differenz, Prüfer, geprueft_am, Bericht als PDF). Funktionen: - Buchungsmaske mit Kategorievorschlag aus dem Verwendungszweck - Beleg als Foto oder PDF anhängen, Ablage in MinIO - Beitragslauf: erzeugt für ein Jahr alle Beiträge nach Abteilung, Mahnstufen mit Vorlage, Zahlungseingang manuell oder per CSV-Abgleich aus dem Bankkonto (CAMT.053 oder MT940) - Rechnungen an Dritte (Fehlalarm, Öleinsatz, Vereinsveranstaltung) mit Nummernkreis und PDF über Gotenberg - Kassenabschluss: Zeitraum wählen, Bestand zählen, Differenz erklären, Kassenprüfbericht als PDF mit Unterschriftsfeldern - Auswertungen: Einnahmen/Ausgaben nach Kategorie und Monat, Jahresvergleich, offene Posten, Beitragsrückstände - Export für den Steuerberater und für die Kassenprüfung der Gemeinde Wichtig: - Eine festgeschriebene Buchung ist unveränderbar. Korrekturen erfolgen über eine Gegenbuchung mit Verweis, nie durch Ändern. - Der Kassenabschluss friert den Zeitraum ein: danach sind Buchungen mit Datum in diesem Zeitraum nicht mehr möglich. - Beträge als DECIMAL(12,2), niemals als Fließkommazahl. - Der Kassier sieht keine Geräte- oder Atemschutzdaten, der Gerätewart keine Buchungen. Die Trennung ist in lib/authz.ts bereits angelegt.