Zum Hauptinhalt springen

Dokumente und Anhänge

Zweck

In SpeamCore ist jedes hochgeladene Dokument ein Document-Datensatz, dessen Datei in MinIO (S3-kompatibel) liegt. Dokumente werden über das polymorphe Modell DocumentParent an Domain-Entitaeten gehaengt — ein Dokument kann gleichzeitig an mehreren Parents haengen.

Die Sicht-Routen sind:

  • Document-Center — globale Browse-Sicht über alle Dokumente.
  • Documents Detail — pro Dokument: Tabs Stammdaten, ZIP-Inhalte, Versionen, Aktivitäten, Public-Links, Parents.

Diese Grundlage erklaert das Persistenz- und Verknuepfungs-Modell, damit du in jeder Modul-Doku nicht jedes Detail wiederholen musst.

Modell-Aufbau

Document (Datei + Metadaten)

FeldBedeutung
documentTypeKlassifizierung (image, signature, scorm, pdf, csv, ...)
fileName, bucketNameMinIO-Lokation
originalFileNameName beim Upload
thumbnailFileName, mediumFileName, largeFileName, xlargeFileNameAuto-erzeugte Bild-Varianten
etag, fileHash, fileSizeIntegritaets- und Größen-Daten
currentVersion, versionCountVersions-Tracking
isPublic, publicAccessKey, publicExpiresAtPublic-Link-Konfiguration
sharedByEmployeeIdwer das Dokument freigegeben hat
contentAnalyzedwurde der Inhalt automatisch analysiert (OCR/AI)
parentId, parentTypeoptionaler Direkt-Parent (selten, meist via DocumentParent)

DocumentParent (polymorphe Verknuepfung)

DocumentParent {
documentId: UUID
parentId: UUID
parentType: string // z.B. "Customer", "SalesDocument", "Workorder", "Mail", "Expense"
title?: string // optional Anzeigename am Parent
description?: string
}

Mehrfach-Verknuepfung: Ein Dokument kann an N Entitaeten gleichzeitig haengen. Beispiel: eine Vertrags-PDF haengt an Customer + SalesDocument + Project.

DocumentVersion

Jede neue Datei-Version legt einen DocumentVersion-Eintrag an. currentVersion zeigt auf die aktive. Frueheres Wiederherstellen über /documents/:id/versions.

DocumentActivity

Audit-Log pro Dokument: öffnen, herunterladen, ändern, public-Link erzeugen.

Anonymer Download-Link mit Token (publicAccessKey) und optionalem Ablaufdatum (publicExpiresAt).

Pattern in Modul-Doku

Wenn ein Modul „Dokumente" als Sub-Liste hat (z. B. /customers/:id/documents, /expenses/:id/documents, /employees/:id/documents), gilt:

  1. DataGrid mit DocumentParent-Einträgen, gefiltert auf parentType = aktuelles Modell und parentId = aktueller Datensatz.
  2. Upload-Button — legt Document + DocumentParent in einem Zug an.
  3. Klick auf Zeile → Drilldown auf /documents/:id.

Felder am Anhang-Punkt (typisch)

Die folgenden Felder sind in den meisten Modul-Listen sichtbar:

FeldQuelleBedeutung
originalFileNameDocumentDatei-Name.
documentTypeDocumentKlassifizierung.
titleDocumentParentOptionaler Anzeige-Titel am Parent.
uploadedAtDocumentUpload-Zeitpunkt.
fileSizeDocumentDatei-Größe.
versionDocumentaktuelle Version.
sharedByEmployeeDocumentwer hat geteilt.

Berechtigungen

ActionSubjectWirkungKeycloak-Rolle
viewDocumentListe/Detail aufrufbarAPP_SPEAMCORE_VIEW_DOCUMENT
createDocumentUploadAPP_SPEAMCORE_CREATE_DOCUMENT
updateDocumentMetadaten/Version ändernAPP_SPEAMCORE_UPDATE_DOCUMENT
deleteDocumentSoft-DeleteAPP_SPEAMCORE_DELETE_DOCUMENT
view/create/deleteDocumentParentVerknuepfung pflegenAPP_SPEAMCORE_VIEW/CREATE/DELETE_DOCUMENT_PARENT
view/createDocumentPublicLinkPublic-Link verwaltenAPP_SPEAMCORE_VIEW/CREATE_DOCUMENT_PUBLIC_LINK
viewDocumentActivityAudit-LogAPP_SPEAMCORE_VIEW_DOCUMENT_ACTIVITY

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

Praktisch jedes Modul, das eine documents-Sub-Route hat, baut auf diesem Pattern auf:

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung als Querschnitts-Grundlage.