Feat #4: Schreiben erzeugen — Word-Datei, Ablage in der Akte, Wiedervorlage #15

Merged
florian.wilde merged 1 commits from feat/4-schreiben-erzeugen into main 2026-08-23 08:18:38 +00:00
Owner

Was es tut

Neu unter /schreiben/neu: Text bearbeiten, als Word-Datei herunterladen, in die Akte legen und dabei eine Wiedervorlage setzen — in einem Zug.

Eine Seite für alle Arten und alle drei Empfängerwege, statt die Bearbeitung dreimal an Vertrag, Vorgang und Freitext nachzubauen. Die bestehenden Seiten verlinken dorthin.

Der dritte Weg ist der eigentliche Zugewinn: Schreiben an eine Stelle, zu der es noch keinen Datensatz gibt. Am Anfang einer Betreuung ist das der Normalfall — man fragt ja an, um zu erfahren, ob dort überhaupt etwas besteht. Aus der freien Anschrift entsteht mit einem Klick ein Kontakt; so wächst das Adressbuch nebenbei beim Schreiben.

Zwei Entscheidungen, die vom Issue abweichen

Die Akte bekommt ein PDF, heruntergeladen wird .docx

Der Objektspeicher nimmt nur PDF und Bilder an, geprüft an den Magic Bytes (src/lib/speicher/dateityp.ts). Eine .docx ist ein ZIP-Archiv — sie durchzulassen hieße, jedes ZIP durchzulassen. Diese Prüfung ist eine bewusste Zusage der Anwendung; sie für eine Bequemlichkeit aufzuweichen wäre der falsche Handel.

Sachlich ist PDF für den Nachweis ohnehin richtiger: Es ändert sich nicht mehr. Die .docx ist die Arbeitsfassung zum Ausdrucken und Unterschreiben.

Daraus folgt eine Einschränkung, die auch in der Oberfläche steht: Wer die Word-Datei danach noch ändert, hat in der Akte eine andere Fassung als im Briefkasten. Dann lieber dort fertig schreiben, den Text zurückkopieren und erst dann ablegen.

Der Berichtssatz wurde nicht umgebogen

Im Issue steht, docxErzeugen() müsse „nur angebunden werden". Das war falsch — von mir selbst geschrieben. Die Funktion setzt einen Bericht: Titel, Kopfzeilen mit betreuter Person und Berichtszeitraum, Unterschriftenblock. Ein Brief braucht Absender, Anschriftenfeld, Datumszeile rechts, Betreff, Grußformel.

Es gibt jetzt einen eigenen Brief-Satz auf derselben Grundlage. Beides in eine Funktion zu zwingen hätte beide Ausgaben schlechter gemacht.

Aufbau

Datei Zweck
src/lib/schreiben/arten.ts Arten, Fristen, Dateinamen — rein, testbar
src/lib/schreiben/entwurf.ts baut den Entwurf; führt die vorhandenen Erzeuger zusammen
src/lib/schreiben/docx.ts Brieflayout für Word
src/lib/schreiben/pdf.tsx Brieflayout für die Akte
src/server/actions/schreiben.ts Ablage und Kontakt aus Anschrift
src/app/(app)/schreiben/neu/ die Seite
src/app/(app)/schreiben/docx/route.ts Download (POST, damit der Text nicht in die Adresszeile gerät)

Die vorhandenen Erzeuger für Rückkaufswert, Kündigung und Sachstandsanfrage bleiben unverändert — ihr Wortlaut ist getestet und erprobt.

Geprüft

  • Zehn Einheitstests, darunter der Gleichschritt der Wiedervorlagefristen über zwei Module hinweg: Sie stehen an zwei Stellen und dürfen nicht auseinanderlaufen, sonst mahnt die Anwendung zu zwei verschiedenen Terminen.
  • Fünf End-to-End-Tests auf beiden Geräteprofilen: Entwurf mit Bestellungsabsatz, Vertragsbezug, Word-Download, Ablage samt Wiedervorlage, Kontakt aus freier Anschrift.
  • 570 Unit-Tests, 73 e2e, 0 Typfehler, Lint sauber, Produktionsbau steht.

Beim Bauen sind zwei Testfehler aufgefallen, die die Anwendung fälschlich als kaputt aussehen ließen: Die Dokumentenliste rendert Tabelle und Karten, je nach Bildschirmbreite ist eine davon versteckt. Ein .first() trifft dann die unsichtbare.

Version auf 1.4.0 angehoben.

Closes #4

## Was es tut Neu unter **`/schreiben/neu`**: Text bearbeiten, als **Word-Datei** herunterladen, **in die Akte legen** und dabei eine **Wiedervorlage** setzen — in einem Zug. Eine Seite für alle Arten und alle drei Empfängerwege, statt die Bearbeitung dreimal an Vertrag, Vorgang und Freitext nachzubauen. Die bestehenden Seiten verlinken dorthin. **Der dritte Weg ist der eigentliche Zugewinn:** Schreiben an eine Stelle, zu der es noch keinen Datensatz gibt. Am Anfang einer Betreuung ist das der Normalfall — man fragt ja an, um zu erfahren, ob dort überhaupt etwas besteht. Aus der freien Anschrift entsteht mit einem Klick ein Kontakt; so wächst das Adressbuch nebenbei beim Schreiben. ## Zwei Entscheidungen, die vom Issue abweichen ### Die Akte bekommt ein PDF, heruntergeladen wird `.docx` Der Objektspeicher nimmt **nur PDF und Bilder** an, geprüft an den Magic Bytes (`src/lib/speicher/dateityp.ts`). Eine `.docx` ist ein ZIP-Archiv — sie durchzulassen hieße, jedes ZIP durchzulassen. Diese Prüfung ist eine bewusste Zusage der Anwendung; sie für eine Bequemlichkeit aufzuweichen wäre der falsche Handel. Sachlich ist PDF für den Nachweis ohnehin richtiger: Es ändert sich nicht mehr. Die `.docx` ist die Arbeitsfassung zum Ausdrucken und Unterschreiben. Daraus folgt eine Einschränkung, die auch **in der Oberfläche steht**: Wer die Word-Datei danach noch ändert, hat in der Akte eine andere Fassung als im Briefkasten. Dann lieber dort fertig schreiben, den Text zurückkopieren und erst dann ablegen. ### Der Berichtssatz wurde nicht umgebogen Im Issue steht, `docxErzeugen()` müsse „nur angebunden werden". **Das war falsch** — von mir selbst geschrieben. Die Funktion setzt einen *Bericht*: Titel, Kopfzeilen mit betreuter Person und Berichtszeitraum, Unterschriftenblock. Ein Brief braucht Absender, Anschriftenfeld, Datumszeile rechts, Betreff, Grußformel. Es gibt jetzt einen eigenen Brief-Satz auf derselben Grundlage. Beides in eine Funktion zu zwingen hätte beide Ausgaben schlechter gemacht. ## Aufbau | Datei | Zweck | |---|---| | `src/lib/schreiben/arten.ts` | Arten, Fristen, Dateinamen — rein, testbar | | `src/lib/schreiben/entwurf.ts` | baut den Entwurf; führt die vorhandenen Erzeuger zusammen | | `src/lib/schreiben/docx.ts` | Brieflayout für Word | | `src/lib/schreiben/pdf.tsx` | Brieflayout für die Akte | | `src/server/actions/schreiben.ts` | Ablage und Kontakt aus Anschrift | | `src/app/(app)/schreiben/neu/` | die Seite | | `src/app/(app)/schreiben/docx/route.ts` | Download (POST, damit der Text nicht in die Adresszeile gerät) | Die vorhandenen Erzeuger für Rückkaufswert, Kündigung und Sachstandsanfrage bleiben **unverändert** — ihr Wortlaut ist getestet und erprobt. ## Geprüft - **Zehn Einheitstests**, darunter der Gleichschritt der Wiedervorlagefristen über zwei Module hinweg: Sie stehen an zwei Stellen und dürfen nicht auseinanderlaufen, sonst mahnt die Anwendung zu zwei verschiedenen Terminen. - **Fünf End-to-End-Tests** auf beiden Geräteprofilen: Entwurf mit Bestellungsabsatz, Vertragsbezug, Word-Download, Ablage samt Wiedervorlage, Kontakt aus freier Anschrift. - 570 Unit-Tests, 73 e2e, 0 Typfehler, Lint sauber, Produktionsbau steht. Beim Bauen sind zwei Testfehler aufgefallen, die die Anwendung fälschlich als kaputt aussehen ließen: Die Dokumentenliste rendert Tabelle **und** Karten, je nach Bildschirmbreite ist eine davon versteckt. Ein `.first()` trifft dann die unsichtbare. Version auf **1.4.0** angehoben. Closes #4
florian.wilde added 1 commit 2026-08-23 08:15:42 +00:00
Die Anschreiben gab es bisher nur als Text zum Kopieren. Danach war
Handarbeit: in Word nachbauen, ausdrucken, abschicken - und noch einmal
von Hand als Dokument in die Akte legen. Der letzte Schritt wurde am
haeufigsten vergessen, und dann fehlt der Nachweis im Bericht.

Neu unter /schreiben/neu: bearbeiten, als Word-Datei herunterladen, in
die Akte legen, Wiedervorlage setzen - in einem Zug. Eine Seite fuer alle
Arten und alle drei Empfaengerwege, statt die Bearbeitung dreimal an
Vertrag, Vorgang und Freitext nachzubauen.

Der dritte Weg ist der eigentliche Zugewinn: Schreiben an eine Stelle,
zu der es noch keinen Datensatz gibt. Am Anfang einer Betreuung ist das
der Normalfall - man fragt ja an, um zu erfahren, ob dort ueberhaupt
etwas besteht. Aus der freien Anschrift laesst sich mit einem Klick ein
Kontakt anlegen.

Zwei Entscheidungen, die erklaert gehoeren:

Die Akte bekommt ein PDF, heruntergeladen wird .docx. Der
Objektspeicher nimmt nur PDF und Bilder an, geprueft an den Magic Bytes.
Eine .docx ist ein ZIP-Archiv; sie durchzulassen hiesse jedes ZIP
durchzulassen, und diese Pruefung ist eine bewusste Zusage der
Anwendung. Sachlich ist PDF fuer den Nachweis ohnehin richtiger: Es
aendert sich nicht mehr. Die Oberflaeche sagt dazu, dass eine spaeter in
Word geaenderte Fassung von der Akte abweicht.

Der Berichtssatz in berichte/docx.ts bleibt unangetastet. Er setzt einen
Bericht mit Kopfzeilen und Unterschriftenblock; ein Brief braucht
Absender, Anschriftenfeld, Datumszeile und Grussformel. Beides in eine
Funktion zu zwingen haette beide Ausgaben schlechter gemacht. Der
Umsetzungshinweis im Issue ("muss nur angebunden werden") war insoweit
falsch - von mir selbst geschrieben.

Die vorhandenen Erzeuger (Rueckkaufswert, Kuendigung, Sachstandsanfrage)
bleiben unveraendert; ihr Wortlaut ist getestet und erprobt.

Geprueft: zehn Einheitstests, darunter der Gleichschritt der
Wiedervorlagefristen ueber zwei Module hinweg. Fuenf End-to-End-Tests
auf beiden Geraeteprofilen: Entwurf, Vertragsbezug, Word-Download,
Ablage samt Wiedervorlage, Kontakt aus freier Anschrift.

Refs #4
florian.wilde merged commit a52523fc97 into main 2026-08-23 08:18:38 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/betreuungs-cockpit#15