Jeder erzeugte Brief ging bisher ohne Ruecksendeadresse hinaus: Im Absenderblock stand nur der Name, in der Datumszeile fehlte der Ort. Bei einer Versicherung oder Behoerde wirkt das unserioes und macht es der Gegenstelle unnoetig schwer zu antworten. Neu unter "Mein Konto" ein Feld fuer Strasse, PLZ und Ort. Ab da stehen sie im Absenderblock jedes Schreibens, und die Datumszeile lautet "Bayreuth, den 23.08.2026". Die Anschrift haengt am Benutzer, nicht an der betreuten Person: Sie gehoert zu mir und gilt fuer alle Akten. Nicht die Logik fehlte, sondern die Datenquelle - absenderBlock() und datumsZeile() konnten die Felder schon, briefkopfBauen() hat sie mit einem Kommentar auf null gesetzt, weil es sie im Datenmodell nicht gab. Aufbau: - Drei Felder am Benutzer, Migration ueber den Wrapper aus #24. Das war sein erster echter Einsatz: erzeugte Datei ohne Handarbeit brauchbar, DROP-INDEX-Zeilen bereits heraus. - Ein Absender-Typ statt eines blossen Namens, durchgereicht bis in den Serienlauf - der hat bisher {name} gebaut und haette die Anschrift sonst still verloren. - Zwei Platzhalter fuer eigene Vorlagen: betreuer_anschrift, betreuer_ort. Was fehlt, bleibt weg: Jede der drei Angaben ist einzeln freiwillig. Nur ein Ort ergibt eine Datumszeile mit Ort und einen Absenderblock, der weiterhin nur aus dem Namen besteht. Eine halb ausgefuellte Adresse sieht nach Fehler aus, ein blosser Name nach Absicht. Geprueft: sieben Einheitstests fuer den Absenderblock inklusive jeder Teilbefuellung und der Gegenprobe, dass nie die Heimadresse der betreuten Person im Absender landet; vier End-to-End-Tests vom leeren Zustand ueber das Speichern bis zum fertigen Brief. Refs #21
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { briefkopfBauen } from '@/lib/vertraege/briefkopf'
|
|
import { absenderBlock, datumsZeile } from '@/lib/vertraege/anschreiben'
|
|
|
|
/**
|
|
* Der Absenderblock.
|
|
*
|
|
* Ein foermliches Schreiben ohne Ruecksendeadresse wirkt unserioes und
|
|
* macht es der Gegenstelle schwer zu antworten. Umgekehrt gilt: Lieber
|
|
* nur der Name als ein Block mit leeren Zeilen - eine halb ausgefuellte
|
|
* Adresse sieht nach Fehler aus, ein blosser Name nach Absicht.
|
|
*/
|
|
|
|
const BETREUTE = {
|
|
vorname: 'Erika',
|
|
nachname: 'Musterfrau',
|
|
anrede: 'Frau',
|
|
geburtsdatum: new Date(Date.UTC(1943, 3, 17)),
|
|
heimName: 'Seniorenheim Sonnenhof',
|
|
heimStrasse: 'Heimweg 3',
|
|
heimPlz: '95445',
|
|
heimOrt: 'Bayreuth',
|
|
betreuungsgericht: 'Amtsgericht Bayreuth',
|
|
aktenzeichenGericht: 'XVII 412/25',
|
|
bestellungAm: new Date(Date.UTC(2026, 1, 14)),
|
|
}
|
|
|
|
const VOLLSTAENDIG = {
|
|
name: 'Florian Wilde',
|
|
strasse: 'Cottenbacher Str. 23',
|
|
plz: '95445',
|
|
ort: 'Bayreuth',
|
|
}
|
|
|
|
describe('Absenderblock', () => {
|
|
it('nennt Name, Straße und Ort', () => {
|
|
const kopf = briefkopfBauen({ betreute: BETREUTE, benutzer: VOLLSTAENDIG })
|
|
expect(absenderBlock(kopf)).toBe('Florian Wilde\nCottenbacher Str. 23\n95445 Bayreuth')
|
|
})
|
|
|
|
it('bleibt beim Namen, wenn keine Anschrift hinterlegt ist', () => {
|
|
// Kein Block mit leeren Zeilen - das sieht nach Fehler aus.
|
|
const kopf = briefkopfBauen({ betreute: BETREUTE, benutzer: { name: 'Florian Wilde' } })
|
|
expect(absenderBlock(kopf)).toBe('Florian Wilde')
|
|
})
|
|
|
|
it('lässt die Straße weg, wenn nur der Ort bekannt ist', () => {
|
|
const kopf = briefkopfBauen({
|
|
betreute: BETREUTE,
|
|
benutzer: { name: 'Florian Wilde', plz: '95445', ort: 'Bayreuth' },
|
|
})
|
|
expect(absenderBlock(kopf)).toBe('Florian Wilde\n95445 Bayreuth')
|
|
})
|
|
|
|
it('verträgt einen Ort ohne PLZ', () => {
|
|
const kopf = briefkopfBauen({
|
|
betreute: BETREUTE,
|
|
benutzer: { name: 'Florian Wilde', ort: 'Bayreuth' },
|
|
})
|
|
expect(absenderBlock(kopf)).toBe('Florian Wilde\nBayreuth')
|
|
})
|
|
|
|
it('nimmt die Anschrift vom Betreuer, nicht vom Heim', () => {
|
|
// Die Heimadresse ist die der betreuten Person und gehört in den
|
|
// Anschriftenblock, nie in den Absender.
|
|
const kopf = briefkopfBauen({ betreute: BETREUTE, benutzer: VOLLSTAENDIG })
|
|
expect(absenderBlock(kopf)).not.toContain('Heimweg')
|
|
expect(kopf.betreuteAnschrift).toContain('Heimweg 3')
|
|
})
|
|
})
|
|
|
|
describe('Datumszeile', () => {
|
|
const heute = new Date(Date.UTC(2026, 7, 23))
|
|
|
|
it('stellt den Ort des Betreuers voran', () => {
|
|
const kopf = briefkopfBauen({ betreute: BETREUTE, benutzer: VOLLSTAENDIG })
|
|
expect(datumsZeile(kopf.betreuerOrt, heute)).toBe('Bayreuth, den 23.08.2026')
|
|
})
|
|
|
|
it('lässt ohne Ort das Komma weg', () => {
|
|
const kopf = briefkopfBauen({ betreute: BETREUTE, benutzer: { name: 'Florian Wilde' } })
|
|
expect(datumsZeile(kopf.betreuerOrt, heute)).toBe('23.08.2026')
|
|
})
|
|
})
|