DMS (Dokumentenmanagement)
Zuletzt geändert: 19.04.2026 04:42

DMS #

Das DMS (“Dokumentenmanagement”) ist ein EULANDA-Plugin (esol.DMS), das Dokumente strukturiert an Stammdaten und Belege anhängt – z.B. den Lieferanten-Zertifikats-PDF an den Lieferanten, die unterschriebene Auftragsbestätigung an den Auftrag, einen Scan der Eingangsrechnung an die Rechnung.

EulandaXtools stellt dünne Wrapper bereit, um den physischen Pfad zu einem DMS-Ordner für ein bestimmtes Objekt zu berechnen und optional auch anzulegen.

Grundaufbau #

Alle DMS-Inhalte liegen unter einem BaseFolder. Der Pfad dorthin steht in der SQL-Registry:

\VENDOR\esol\MODULES\DMS\BaseFolder

Typischer Wert: %env.EULANDA_DMS% – das ist EULANDA-eigene Syntax und wird auf die Umgebungsvariable EULANDA_DMS aufgelöst.

Die tatsaechliche Struktur im Dateisystem – Belege liegen unter der zugehoerigen Adresse, nicht in einem eigenen DOCUMENTS-Subtree:

<BaseFolder>\
├── Adresse\<Match>\                  (Kunde)
│   ├── Angebot\<Kopfnummer>\
│   ├── Auftrag\<Kopfnummer>\
│   ├── Lieferschein\<Kopfnummer>\
│   ├── Rechnung\<Kopfnummer>\
│   ├── Kontakte\<Id>\
│   └── SEPAMandat\<MandatsReferenz>\
├── Artikel\<ArtNummer>\
│   └── Identnummern\<Nr>\
├── ServiceArtikel\<SarNummer>\
├── LIEFERANTEN\<Match>\               (Kreditor)
└── Bestellung\<Kopfnummer>\           (KrAuftrag)
DataObjectFolderPathFolderName (DB-Spalte)Parent
Eulanda.AdresseAdresseMatch
Eulanda.AngebotAngebotKopfnummerAdresse
Eulanda.AuftragAuftragKopfnummerAdresse
Eulanda.LieferscheinLieferscheinKopfnummerAdresse
Eulanda.RechnungRechnungKopfnummerAdresse
Eulanda.KontaktKontakteIDAdresse
Eulanda.SepaMandatSEPAMandatMandatsReferenzAdresse
Eulanda.ArtikelArtikelArtNummer
Eulanda.ArtikelIdentIdentnummernNrArtikel
Eulanda.ServiceArtikelServiceArtikelSarNummer
Eulanda.KreditorLIEFERANTENMatch
Eulanda.KrAuftragBestellungKopfnummer

Der Wert für FolderName kommt aus einer konfigurierbaren DB-Spalte (z.B. Match bei Adressen, ArtNummer bei Artikeln, Kopfnummer bei Belegen). Pro Datensatz entsteht ein eigener Ordner, bei Objekten mit Parent wird rekursiv der Parent-Pfad vorangestellt.

Prüfen, ob DMS verfügbar ist #

Plugin-Check vor dem ersten Zugriff. Das DMS-Plugin ist optional – nicht jeder Mandant hat es installiert. Vor dem Aufruf eines Get-DmsFolder*-Cmdlets lohnt sich die Prüfung, ob das Plugin aktiv ist. Sonst wirft der erste DMS-Call einen unklaren Fehler.
Import-Module EulandaXtools
$udl = 'C:\Eulanda\mandant.udl'

if (-not (Test-EulandaDmsPlugin -Udl $udl)) {
  Write-Host "DMS-Plugin ist im Mandanten nicht aktiviert."
  return
}

Get-EulandaDmsBaseFolder -Udl $udl
# Ergebnis z.B.: C:\Daten\EulandaDMS

Pfad zu einem Beleg-Ordner berechnen #

Für eine konkrete Rechnung den DMS-Ordner bestimmen:

$pfad = Get-DmsFolderInvoice -Udl $udl -InvoiceNo 20214925
# Ergebnis: C:\Daten\EulandaDMS\DOCUMENTS\Rechnungen\20214925

Analog gibt es Wrapper für alle Objekt-Typen:

  • Get-DmsFolderAddress, Get-DmsFolderContact
  • Get-DmsFolderArticle, Get-DmsFolderArticleIdent
  • Get-DmsFolderServiceArticle
  • Get-DmsFolderSupplier
  • Get-DmsFolderQuote, Get-DmsFolderSalesOrder
  • Get-DmsFolderDeliveryNote, Get-DmsFolderInvoice
  • Get-DmsFolderPurchaseOrder
  • Get-DmsFolderSepaMandate

Ordner bei Bedarf anlegen #

Per -CreateFolder wird der Pfad nicht nur berechnet, sondern der Ordner auch physisch im Dateisystem erzeugt, falls er noch nicht existiert:

$pfad = Get-DmsFolderInvoice -Udl $udl -InvoiceNo 20214925 -CreateFolder
Copy-Item 'C:\Scans\re-20214925.pdf' -Destination $pfad

Umbenennen nach Stammdaten-Änderung #

Ordner wandern nicht automatisch mit. Wenn sich das namensgebende Feld ändert (z.B. MATCH einer Adresse wird korrigiert), bleibt der alte DMS-Ordner unter dem alten Namen liegen. Rename-EulandaDmsFolder verschiebt ihn explizit auf den neuen Pfad. In einer zukünftigen Version könnte das per SQL-Trigger automatisch werden (siehe docs/internal/dms-structure.md).
# Beispiel: Adresse 42 -- MATCH wird von "Meier GmbH" auf "Meyer GmbH"
# geaendert, und der alte DMS-Ordner wandert mit.
$id       = 42
$oldMatch = (Get-AddressData -Conn $conn -AddressId $id).ADRESSE[0].MATCH
# ... hier die eigentliche Aenderung in der Adresse durchfuehren ...
Rename-EulandaDmsFolder -Conn $conn `
  -DataObject 'Eulanda.Adresse' `
  -Id $id `
  -OldFolderName $oldMatch
-DataObject erwartet den voll qualifizierten DMS-Objektnamen (z.B. 'Eulanda.Adresse', 'Eulanda.Artikel'). -OldFolderName ist der Wert vor der Aenderung – in der DB steht zum Zeitpunkt des Aufrufs bereits der neue Wert, daher muss der alte Name explizit mitgegeben werden.

Die Funktion erkennt selbst, ob der alte Ordner noch existiert, und liefert einen Status-Wert zurück (NoChange, NothingToDo, AlreadyMoved, Moved).

Interna #

Wer sich die interne Struktur (12 DataObjects, FolderName-Mapping, ParentObject-Ketten, Sonderfälle) ansehen möchte, findet die vollständige Dokumentation im Repository unter docs/internal/dms-structure.md.