Worum es geht
Rendert eine Anwendung einen Bericht mit mode: FINAL, gibt CRMS ihr das Dokument zurück und behält es selbst. Es wird zu einer Revision: einem unveränderlichen Stand in einer Dokumentkette. Eine Dokumentkette sammelt alle endgültigen Fassungen eines Berichts über dasselbe Fachobjekt, zum Beispiel alle Prüfberichte zum Audit audit-4711.
Wie FINAL sich von PREVIEW und TRANSIENT unterscheidet, steht unter Die drei Modi.
Was eine Kette bestimmt
Eine Kette ist durch vier Werte festgelegt. CRMS berechnet aus ihnen die Kennung der Kette. Dieselben vier Werte ergeben immer dieselbe Kette.
| Wert | Woher | Beispiel |
|---|---|---|
| Eigentümer | der Mandant aus dem Token. Ohne Mandant das System | acme |
| Vorlagenschlüssel | template aus der Anfrage | audit-report |
| Scope | der Scope der Vorlagen-Edition, die tatsächlich gerendert wurde | TENANT |
| Referenz | reference aus der Anfrage: die Kennung des Fachobjekts in deiner Anwendung | audit-4711 |
Die Referenz ist für CRMS nur ein Text. CRMS liest nicht hinein. Sie ist Pflicht bei FINAL, 1 bis 255 Zeichen lang, ohne Leerzeichen am Anfang oder Ende und ohne Steuerzeichen. Fehlt sie, lehnt CRMS die Anfrage mit einem Verstoß am Feld reference ab.
POST /crms/render
{
"template": "audit-report",
"format": "PDF",
"mode": "FINAL",
"reference": "audit-4711", ← benennt die Kette
"locale": "de-DE",
"data": { "customer": { "name": "ACME" } }
}200 OK
Content-Type: application/pdf
Crms-Document-Revision: 7c1e… ← die neue Revision
Crms-Template-Key: audit-report
Crms-Template-Scope: TENANT
Crms-Template-Revision-Hash: sha-256:9f86…
(die Bytes des Dokuments)Was beim Speichern passiert
-
1Client→CRMSschickt eine Render-Anfrage mit
mode: FINALundreference -
2CRMSprüft, ob diese Installation endgültige Dokumente speichert
-
3CRMSnein → 409
document-revisions-disabled -
4CRMSrendert das Dokument. Ein PDF bekommt danach das Siegel, wenn die Installation siegelt
-
5CRMSerzeugt einen eigenen Schlüssel nur für dieses Dokument und verschlüsselt die Bytes damit
-
6CRMS→Dateispeicherlegt die verschlüsselten Bytes gesperrt ab, bis die Aufbewahrung endet
-
7CRMS→Datenbankhängt die Revision an die Kette und schreibt einen Eintrag
document-storedins Journal -
8CRMS→Clientgibt das Dokument zurückErgebnis: Das Dokument ist gespeichert. Der Header
Crms-Document-Revisionnennt die Revision
Die Bytes kommen erst zurück, wenn sie gespeichert sind. So kann es kein endgültiges Dokument geben, das deine Anwendung hat und CRMS nicht.
Das Journal ist das zweite Protokoll neben der Kette, je Mandant eines. Mehr dazu unter Die zwei Hash-Ketten.
Was eine Revision festhält
Eine Revision trägt alles, was man später braucht, um zu zeigen, wie das Dokument entstanden ist:
| Angabe | Wofür |
|---|---|
| Nummer in der Kette | Position, ab 1, ohne Lücken |
| Vorlagenschlüssel, Scope, Sprachvariante, Vorlagen-Revision und ihr Hash | bindet das Dokument an genau einen freigegebenen Stand der Vorlage |
| Format und PDF-Profil | was erzeugt wurde |
| Inhalts-Hash (SHA-256 der Bytes) und Größe | belegt, dass die Bytes unverändert sind |
| Payload-Hash | belegt, mit welchen Daten gerendert wurde |
| ob die Payload verschlüsselt aufbewahrt wird | siehe unten |
| Kennung des Dokumentschlüssels | der Schlüssel, mit dem die Bytes verschlüsselt sind |
| Objektschlüssel und Version im Speicher | wo die Bytes liegen |
retainUntil | bis wann das Dokument aufbewahrt wird |
| Mandant, Benutzer, Zeitpunkt (UTC, auf die Mikrosekunde) | wer es wann erzeugt hat |
| Sprache und Zeitzone | wie Zahlen und Daten formatiert wurden |
| vorheriger Hash und eigener Hash | die Verkettung |
Ein Hash ist ein kurzer Fingerabdruck von Daten. Ändert sich ein einziges Bit, ändert sich der ganze Hash. CRMS schreibt Hashes immer mit Verfahren davor, zum Beispiel sha-256:9f86….
Die Payload
Die Payload sind die Daten, mit denen gerendert wurde. CRMS bringt sie vor dem Hashen in eine feste Form: kanonisches JSON, ganze Zahlen bleiben Zahlen, Dezimalzahlen und Datumswerte werden Text. So ergeben dieselben Daten immer denselben Hash.
- Der Payload-Hash wird immer gespeichert.
- Die Payload selbst wird verschlüsselt mit demselben Dokumentschlüssel aufbewahrt, solange
CODAMAI_CRMS_DOCUMENT_STORE_PAYLOADan ist (Standardtrue).
Wann FINAL angenommen wird
| Dokumentrevisionen an? | Referenz angegeben? | Anhänge dabei? | Was passiert |
|---|---|---|---|
| nein | – | – | 409 document-revisions-disabled |
| ja | nein | – | 422, Verstoß am Feld reference |
| ja | ja | ja | 422 attachments-not-for-final |
| ja | ja | nein | Dokument wird gespeichert und zurückgegeben |
Dokumentrevisionen sind standardmäßig an (CODAMAI_CRMS_DOCUMENT_REVISIONS=true). Dann braucht die Installation eine Aufbewahrungsdauer und einen Speicher, sonst startet sie nicht. Siehe Aufbewahrung und Ablage auf WORM-Speicher.
Die Revisionen einer Kette lesen
GET /crms/documents?template=audit-report&scope=TENANT&reference=audit-4711[
{
"revision": "7c1e…",
"number": 1, ← älteste zuerst
"format": "PDF",
"template": "audit-report",
"scope": "TENANT",
"variant": "de",
"templateRevision": "a2f0…",
"templateRevisionHash": "sha-256:9f86…",
"storedAt": "2026-10-17T09:12:44.123456Z",
"retainUntil": "2036-10-17T09:12:44.123456Z",
"legalHold": false,
"erased": false,
"contentHash": "sha-256:3b1d…"
}
]Alle Endpunkte für Dokumente und wer sie aufrufen darf, stehen unter Prüfen und lesen.