import { z } from 'zod' import { optionalerBetrag, optionalerText, optionaleZahl, optionalesDatum, pflichtDatum, pflichtText, } from '@/lib/validierung/substanz' /** * Eingabepruefung fuer Heim, Pflege und Gesundheitsverlauf. * * Freitexte zu Gesundheitsereignissen sind besondere Kategorien nach * Art. 9 DSGVO. Sie werden hier nur geprueft; verschluesselt werden sie in * der Server Action ueber sealen('Gesundheitsereignis', ...). */ export const GESUNDHEITS_ARTEN = [ 'ARZTBESUCH', 'KRANKENHAUS', 'EXAZERBATION', 'STURZ', 'MEDIKATIONSAENDERUNG', 'SAUERSTOFFVERSORGUNG', 'INHALATION', 'HILFSMITTEL', 'IMPFUNG', 'REHA', 'PFLEGEBEGUTACHTUNG', 'HEILMITTEL', 'SONSTIGES', ] as const export const HeimvertragSchema = z .object({ einrichtung: pflichtText(150, 'Bitte den Namen der Einrichtung angeben.'), traeger: optionalerText(150), strasse: optionalerText(150), plz: optionalerText(10), ort: optionalerText(100), vertragAm: optionalesDatum, einzugAm: optionalesDatum, auszugAm: optionalesDatum, kuendigungsfristTage: optionaleZahl( 0, 365, 'Bitte die Kündigungsfrist in ganzen Tagen angeben.', ), pflegeEigenanteil: optionalerBetrag, unterkunftVerpflegung: optionalerBetrag, investitionskosten: optionalerBetrag, ausbildungsumlage: optionalerBetrag, notizen: optionalerText(4000), }) .superRefine((daten, kontext) => { if (daten.einzugAm && daten.auszugAm && daten.auszugAm.getTime() < daten.einzugAm.getTime()) { kontext.addIssue({ code: z.ZodIssueCode.custom, path: ['auszugAm'], message: 'Der Auszug liegt vor dem Einzug.', }) } }) export type HeimvertragEingabe = z.infer /** * Gesundheitsereignis. Die Zusatzangaben der Schnellerfassung werden nicht * hier geprueft, sondern in der Server Action zu einem Beschreibungstext * zusammengesetzt (src/lib/pflege/ereignis-details.ts) - sonst braeuchte * jedes Detailfeld ein eigenes Schema. */ export const GesundheitsereignisSchema = z .object({ datum: pflichtDatum, bisDatum: optionalesDatum, art: z.enum(GESUNDHEITS_ARTEN), titel: pflichtText(200, 'Bitte einen kurzen Titel angeben.'), behandler: optionalerText(150), einrichtung: optionalerText(150), abwesenheitstage: optionaleZahl(0, 366, 'Bitte eine Zahl zwischen 0 und 366.'), beschreibung: optionalerText(4000), }) .superRefine((daten, kontext) => { if (daten.bisDatum && daten.bisDatum.getTime() < daten.datum.getTime()) { kontext.addIssue({ code: z.ZodIssueCode.custom, path: ['bisDatum'], message: 'Das Ende liegt vor dem Beginn.', }) } if (daten.art === 'KRANKENHAUS' && !daten.bisDatum && daten.abwesenheitstage === null) { kontext.addIssue({ code: z.ZodIssueCode.custom, path: ['bisDatum'], message: 'Bitte das Entlassdatum eintragen — oder, solange der Aufenthalt noch läuft, ' + 'die bisherigen Abwesenheitstage. Ohne eine der beiden Angaben werden die ' + 'Tage nicht gezählt, und die Minderung des Eigenanteils fällt unter den Tisch.', }) } }) export type GesundheitsereignisEingabe = z.infer /** Der nach § 1821 BGB ermittelte Wille - verschlüsselt gespeichert. */ export const ErmittelterWilleSchema = z.object({ ermittelterWille: optionalerText(8000), }) export type ErmittelterWilleEingabe = z.infer /** Termin für die Überprüfung des Pflegegrades. */ export const HoeherstufungSchema = z.object({ pruefungAm: pflichtDatum, begruendung: optionalerText(2000), }) export type HoeherstufungEingabe = z.infer