Worum es geht
CRMS heißt CodamAI Reporting Management System. Es erzeugt Berichte: PDF, HTML, Word-Dateien und Tabellen. Ein Bericht entsteht immer aus zwei Teilen:
- der Vorlage: Sie legt fest, wie der Bericht aussieht. Sie ist in FreeMarker geschrieben, einer Vorlagensprache mit Platzhaltern wie
${customer.name}. - der Payload: Das sind die Daten für genau diesen einen Bericht, zum Beispiel Kunde, Datum und Positionen eines Audits.
CRMS setzt die Payload in die Vorlage ein und gibt das fertige Dokument zurück.
Ein Bericht entsteht
-
1Benutzer→Clientklickt auf „Bericht erzeugen“
-
2Client→CDMSliest die Daten, die in den Bericht sollen, und bereitet sie auf
-
3Client→CRMSschickt eine Render-Anfrage: Schlüssel der Vorlage, Format, Modus und Payload
-
4CRMS→CIASfragt, wer anfragt und in welchem Mandanten
-
5CRMSsucht die veröffentlichte Revision der Vorlage, die für diese Person gilt
-
6CRMSprüft die Payload, bevor die Vorlage sie sieht
-
7CRMSPayload verstößt gegen die Regeln → 422 mit allen Verstößen
-
8CRMSsetzt die Payload in einer abgeschotteten Umgebung ein und erzeugt das Format
-
9CRMS→Dateispeicherlegt ein endgültiges Dokument verschlüsselt ab, nur im Modus
FINAL -
10CRMS→Clientgibt das Dokument zurückErgebnis: Die Bytes des Dokuments, dazu Schlüssel, Scope, Sprache, Revision und Hash der Vorlage, aus der es entstand
Jedes Dokument sagt, aus welcher Revision der Vorlage es kommt. Eine Revision ist ein fester, nicht mehr änderbarer Stand der Vorlage. So lässt sich später nachweisen, mit welchem Text ein Bericht erzeugt wurde.
Was CRMS tut und was nicht
- verwaltet Vorlagen mit Sprachvarianten und Revisionen
- gibt Vorlagen über eine Freigabekette frei
- prüft die Payload
- rendert PDF, HTML, DOCX, XLSX, CSV und ODS
- legt endgültige Dokumente in einer Hash-Kette ab
- prüft und bewahrt sie auf, bis ihre Frist endet
- liest keine Fachdaten, auch nicht aus CDMS
- ändert keine Fachdaten
- rechnet nicht: keine Summen, keine Formeln
- entscheidet nicht, wann ein Bericht entsteht
- verwaltet keine Benutzer und Rollen, das tut CIAS
Warum die Anwendung die Daten vorbereitet
Eine Vorlage wird im laufenden System geschrieben, von Menschen mit einer Vorlagenrolle. Darum darf sie nichts außer Werte einsetzen:
- Kein Zugriff auf Java. Die Vorlage kann keine Klassen erzeugen und keine Methoden aufrufen. FreeMarker-Befehle wie
?newund?apisind abgeschaltet. - Nur vorbereitete Werte in der Payload: Text, Zahlen, Wahrheitswerte, Datum und Zeitpunkt, dazu Listen und Objekte daraus. Ein beliebiges Java-Objekt wird abgewiesen, weil es der Vorlage seine Methoden in die Hand geben würde.
- Höchstens zwei Ebenen tief:
title,customer.name,items[].amount. Was die Vorlage braucht, bereitet die Anwendung flach auf. - Keine Dateien von außen. Bilder, Schriften und Stylesheets kommen nur aus der Vorlage selbst (
asset:<name>) oder aus der Anfrage (attachment:<name>). Jede andere Adresse wird abgewiesen, bevor sie aufgerufen wird. - Keine Formeln. Auch eine Tabelle enthält nur fertige Werte. Eine Formel, die aus einem Payload-Wert zusammengesetzt wird, wäre ein Einfallstor.
Wie die Payload genau geprüft wird, steht unter Die Payload-Prüfung.
Drei Modi
Jede Render-Anfrage nennt einen Modus. Er entscheidet, ob das Dokument gespeichert wird.
| PREVIEW | FINAL | TRANSIENT | |
|---|---|---|---|
| gespeichert | nie | ja, als nächste Revision seiner Dokumentkette | nie |
| Kennzeichen | sichtbares Wasserzeichen und Merkmal crms-preview | keins, es ist das Original | nur das Merkmal crms-transient in den Metadaten |
| wofür | prüfen, wie ein Bericht aussieht | der Bericht, der zählt | eine Kopie zum Herunterladen, nur aus Systemvorlagen |
Die Einzelheiten stehen unter Vorschau, endgültig, flüchtig.