Files
AfiS-Aktensystem/web/lib/i18n/documents.ts
T
Harlekin 42dbf0f6b1
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Anhaenge zurueckziehen statt sie liegen zu lassen
Bisher gab es ueberhaupt keinen Weg, einen Anhang wieder loszuwerden. Wer
die falsche Datei hochlud, musste damit leben. Das ist keine Strenge,
sondern eine Luecke: die Regel des Hauses lautet nicht "nichts geht wieder
weg", sondern "nichts geht unbemerkt weg".

Also derselbe Weg wie beim Verlaufseintrag und beim Dokument. Zurueckziehen
mit Pflichtbegruendung, der Anhang bleibt als Grabstein an seiner Stelle
stehen - durchgestrichen, mit Zeitpunkt und Grund, fuer jeden sichtbar, der
ihn sehen darf. Aufheben laesst es sich, beides steht im Protokoll.

Aus dem Umlauf heisst wirklich aus dem Umlauf: die Auslieferung verweigert
die Datei, sie verschwindet aus Lichtbildfeldern, und das Vorschaubild
faellt weg. Ein Grabstein, unter dem der Download weiterlaeuft, waere eine
Beschriftung und keine Ruecknahme. Fuer `audit.read` bleibt sie abrufbar -
wie der Text eines zurueckgezogenen Eintrags, sonst waere es doch ein
Loeschen.

Im Ausdruck steht der Anhang weiter im Verzeichnis, mit dem Grund daneben.
Ihn dort wegzulassen hiesse, den Ausdruck sauberer zu machen als die Akte.

Die Datei auf der Platte bleibt liegen. Sie zu entfernen waere das
Loeschen, das hier gerade nicht stattfindet - und ein Anhang, dessen
Pruefsumme nicht mehr nachrechenbar ist, waere als Beweismittel wertlos.
Dazu eine Regel in der Datenbank, die DELETE auf Attachment verbietet, und
eine Bedingung, die einen Grabstein ohne Begruendung ausschliesst.

Zuruecknehmen darf, wer die Datei hochgeladen hat - der haeufige Fall, und
ohne das bliebe jeder Fehlgriff liegen, weil dafuer die Leitung zu rufen
waere - sowie jeder, der am Besitzer schreiben darf.
2026-09-04 16:18:33 +02:00

101 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Dokumente und Anhänge.
*
* Nach Bereichen getrennt, weil eine **Client-Komponente die ganze Datei ins
* Bündel zieht**, in der ihr Text steht. Lägen alle Texte in einer, trüge jede
* Ansicht die der ganzen Anwendung mit sich herum - das Budget aus
* docs/09-performance-und-ux.md wäre nach wenigen Phasen aufgebraucht.
*
* Serverkomponenten nehmen weiter `de` aus `lib/i18n/de.ts`: was dorthin
* gezogen wird, verlässt den Server nicht.
*/
export const documentText = {
saveAll: 'Dokument speichern',
one: 'Dokument',
many: 'Dokumente',
number: 'Dokumentnummer',
title: 'Titel',
kind: 'Dokumentart',
heading: 'Dokumente',
empty: 'Noch kein Dokument.',
create: 'Dokument anlegen',
createTitle: 'Neues Dokument',
createHint: 'Die Vorlage bestimmt Aufbau und Aussehen. Der Titel lässt sich später ändern.',
open: 'Öffnen',
finalize: 'Ausfertigen',
finalizeHint: 'Danach sind Änderungen nur noch mit eigenem Recht möglich.',
retract: 'Zurückziehen',
retractReason: 'Begründung der Zurücknahme',
reclassify: 'Klassifizierung ändern',
retracted: (date: string, person: string, reason: string) =>
`Dokument zurückgezogen am ${date} durch ${person} · Begründung: ${reason}`,
finalized: (date: string, person: string) => `Ausgefertigt am ${date} durch ${person}`,
sheet: 'Aktenblatt',
edit: 'Bearbeiten',
print: 'Drucken',
issuedAt: 'Ausgestellt',
signedOn: 'Datum',
unclassified: 'Ohne Klassifikation',
photoEmpty: 'Lichtbild 3×4 cm',
photoLater: 'Lichtbilder kommen mit der Dateiprüfung.',
footerNote: 'Dieses Dokument ist klassifiziert. Nur für autorisiertes Personal.',
ownerCase: 'Zur Fallakte',
ownerPersonnel: 'Zur Personalakte',
ownerNone: 'Ohne Besitzer',
statusNames: {
DRAFT: 'Entwurf',
FINAL: 'Ausgefertigt',
RETRACTED: 'Zurückgezogen',
} as Record<string, string>,
layoutNames: {
FORM: 'Formular',
PROSE: 'Vertragstext',
NOTE: 'Vermerk',
DOSSIER: 'Aktenblatt',
} as Record<string, string>,
} as const
export const attachmentText = {
one: 'Anhang',
many: 'Anhänge',
heading: 'Anhänge',
empty: 'Keine Anhänge.',
add: 'Datei anhängen',
choose: 'Datei wählen',
dropHint: 'Datei hierher ziehen oder auswählen',
allowed: 'PNG, JPEG, WebP, PDF oder Text, bis 25 MB',
uploading: 'Wird übertragen',
checking: 'Wird geprüft',
download: 'Herunterladen',
release: 'Trotzdem freigeben',
retract: 'Zurückziehen',
retracting: 'Wird zurückgezogen',
restore: 'Rücknahme aufheben',
retractPrompt:
'Warum wird dieser Anhang zurückgezogen? Die Begründung steht für alle an der Datei, mindestens 10 Zeichen.',
retractedBy: (datum: string, grund: string) =>
`Zurückgezogen am ${datum} · Begründung: ${grund}`,
retractedHint:
'Die Datei wird nicht mehr ausgeliefert und verschwindet aus Lichtbildfeldern. Gelöscht ist sie nicht.',
releaseHint:
'Die Datei wurde nicht auf Schadsoftware geprüft. Sie wird beim Freigeben neu kodiert, soweit das geht.',
quotaUsed: (used: string, total: string) => `${used} von ${total} belegt`,
statusNames: {
PENDING: 'Wird geprüft',
CLEAN: 'Geprüft',
BLOCKED: 'Abgelehnt',
FAILED: 'Prüfung unvollständig',
} as Record<string, string>,
errors: {
'file-empty': 'Die Datei ist leer.',
'file-too-large': 'Die Datei ist größer als 25 MB.',
'quota-exceeded': 'Dein Kontingent von 500 MB ist ausgeschöpft.',
'rate-limited': 'Zu viele Uploads. In einer Minute erneut versuchen.',
'release-not-possible': 'Nur eine unvollständige Prüfung lässt sich freigeben.',
'already-retracted': 'Dieser Anhang ist bereits zurückgezogen.',
'reason-required': 'Begründung nötig, mindestens 10 Zeichen.',
transfer: 'Übertragung fehlgeschlagen. Erneut versuchen.',
} as Record<string, string>,
} as const