Files
beh-rde-brief/src/types.ts
T
JUSNandClaude Opus 5.5 cf188af080 App: QR-Uebergabe mit dem Beratungs-PC
- Brief -> "Am Computer zeigen": schickt den Brief verschluesselt auf den
  Bildschirm der Beratung (zweisprachig, wenn eine Uebersetzung da ist)
- Archiv -> "Vom Computer uebernehmen": holt das Ergebnis vom PC ins
  verschluesselte Archiv, mit Erinnerungen
- Gleiches Paeckchen-Format wie die Webseite (expo-crypto combined =
  IV||Chiffrat||Tag); Test prueft beide Richtungen gegen WebCrypto
- Link-Einfuegen als Ersatz, wenn keine Kamera da ist

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:46:29 +02:00

151 lines
5.3 KiB
TypeScript

/**
* Zentrale Typdefinitionen für BehördenKlar.
* Die Feldnamen entsprechen exakt dem JSON-Schema, das die Claude API
* per Structured Output garantiert zurückliefert (siehe services/analyse.ts).
*/
/** Ampel-Stufen für die Dringlichkeit eines Briefs. */
export type Dringlichkeit = 'rot' | 'gelb' | 'gruen';
/** Vorlagen-Typen für den Antwort-Generator. */
export type AntwortTyp =
| 'terminbestaetigung'
| 'terminverschiebung'
| 'widerspruch'
| 'unterlagen_nachreichen'
| 'rueckfrage';
export const ANTWORT_TYP_LABEL: Record<AntwortTyp, string> = {
terminbestaetigung: 'Termin bestätigen',
terminverschiebung: 'Termin verschieben',
widerspruch: 'Widerspruch einlegen',
unterlagen_nachreichen: 'Unterlagen nachreichen',
rueckfrage: 'Rückfrage stellen',
};
/** Ein im Brief gefundener Fachbegriff mit einfacher Erklärung. */
export interface Fachbegriff {
begriff: string;
erklaerung: string;
}
/** Eine erkannte Frist ("Antwort bis TT.MM.JJJJ"). Datum ist ISO (JJJJ-MM-TT). */
export interface Frist {
datum: string;
aktion: string;
}
/** Ein erkannter Termin (z. B. Vorsprache beim Amt). Datum ist ISO. */
export interface Termin {
datum: string;
uhrzeit: string | null;
ort: string | null;
}
/** Das strukturierte Analyse-Ergebnis eines gescannten Briefs. */
export interface BriefAnalyse {
brieftyp: string;
absender: string;
/** "Was will das Amt von mir?" — 2-3 Sätze, A2-Niveau. */
kernaussage: string;
/** Ausführlichere Erklärung in einfacher Sprache (A2/B1). */
erklaerung_einfach: string;
fachbegriffe: Fachbegriff[];
frist: Frist | null;
termin: Termin | null;
/** To-do-Liste: was der Nutzer tun / mitbringen muss. */
checkliste: string[];
antwort_noetig: boolean;
antwort_optionen: AntwortTyp[];
}
/** Übersetzung der wichtigsten Analyse-Teile in eine Zielsprache. */
export interface Uebersetzung {
kernaussage: string;
erklaerung_einfach: string;
checkliste: string[];
fachbegriffe: Fachbegriff[];
}
/** Ein gespeicherter Brief im lokalen Archiv. */
export interface BriefEintrag {
id: string;
/** ISO-Zeitstempel der Erstellung. */
erstelltAm: string;
analyse: BriefAnalyse;
/** Cache: Sprachcode -> fertige Übersetzung (spart API-Kosten). */
uebersetzungen: Record<string, Uebersetzung>;
antwortEntwurf?: {
typ: AntwortTyp;
betreff: string;
text: string;
};
}
/** Eine unterstützte Zielsprache für die Übersetzung. */
export interface Sprache {
/** ISO-Code, wird an die KI übergeben. */
code: string;
/** Deutscher Name (für die UI). */
name: string;
/** Name in der Sprache selbst (damit Nutzer ihre Sprache erkennen). */
eigenname: string;
/** Schrift läuft von rechts nach links (Arabisch, Farsi, Urdu, Paschtu). */
rtl?: boolean;
}
/**
* Zielsprachen für die Übersetzung — grob nach Größe der jeweiligen
* Sprachgemeinschaft in Deutschland sortiert, damit die häufigsten oben
* stehen und man nicht lange scrollen muss.
*/
export const SPRACHEN: Sprache[] = [
{ code: 'tr', name: 'Türkisch', eigenname: 'Türkçe' },
{ code: 'ar', name: 'Arabisch', eigenname: 'العربية', rtl: true },
{ code: 'ru', name: 'Russisch', eigenname: 'Русский' },
{ code: 'uk', name: 'Ukrainisch', eigenname: 'Українська' },
{ code: 'pl', name: 'Polnisch', eigenname: 'Polski' },
{ code: 'ro', name: 'Rumänisch', eigenname: 'Română' },
{ code: 'en', name: 'Englisch', eigenname: 'English' },
{ code: 'fa', name: 'Farsi / Dari', eigenname: 'فارسی', rtl: true },
{ code: 'ku', name: 'Kurdisch (Kurmancî)', eigenname: 'Kurdî' },
{ code: 'bg', name: 'Bulgarisch', eigenname: 'Български' },
{ code: 'hr', name: 'Kroatisch', eigenname: 'Hrvatski' },
{ code: 'sr', name: 'Serbisch', eigenname: 'Српски' },
{ code: 'bs', name: 'Bosnisch', eigenname: 'Bosanski' },
{ code: 'sq', name: 'Albanisch', eigenname: 'Shqip' },
{ code: 'it', name: 'Italienisch', eigenname: 'Italiano' },
{ code: 'el', name: 'Griechisch', eigenname: 'Ελληνικά' },
{ code: 'es', name: 'Spanisch', eigenname: 'Español' },
{ code: 'pt', name: 'Portugiesisch', eigenname: 'Português' },
{ code: 'fr', name: 'Französisch', eigenname: 'Français' },
{ code: 'hu', name: 'Ungarisch', eigenname: 'Magyar' },
{ code: 'vi', name: 'Vietnamesisch', eigenname: 'Tiếng Việt' },
{ code: 'hi', name: 'Hindi', eigenname: 'हिन्दी' },
{ code: 'ur', name: 'Urdu', eigenname: 'اردو', rtl: true },
{ code: 'ps', name: 'Paschtu', eigenname: 'پښتو', rtl: true },
{ code: 'ti', name: 'Tigrinya', eigenname: 'ትግርኛ' },
{ code: 'so', name: 'Somali', eigenname: 'Soomaali' },
{ code: 'zh', name: 'Chinesisch', eigenname: '中文' },
];
/** Untere Tab-Leiste: Fristen-Übersicht · Scannen · Archiv. */
export type HauptTabParamList = {
Fristen: undefined;
ScanTab: undefined;
Archiv: undefined;
};
/** Navigation: Root-Stack mit Tab-Leiste + darüber liegenden Detail-Screens. */
export type RootStackParamList = {
Tabs: undefined;
Consent: undefined;
Scan: undefined;
Analyse: { briefId: string };
Antwort: { briefId: string };
Glossar: undefined;
Einstellungen: undefined;
/** QR-Code vom Beratungs-PC: Brief hinschicken oder Ergebnis übernehmen. */
Verbinden: { modus: 'senden'; briefId: string } | { modus: 'empfangen' };
};