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)
| DataObject | FolderPath | FolderName (DB-Spalte) | Parent |
|---|---|---|---|
Eulanda.Adresse | Adresse | Match | – |
Eulanda.Angebot | Angebot | Kopfnummer | Adresse |
Eulanda.Auftrag | Auftrag | Kopfnummer | Adresse |
Eulanda.Lieferschein | Lieferschein | Kopfnummer | Adresse |
Eulanda.Rechnung | Rechnung | Kopfnummer | Adresse |
Eulanda.Kontakt | Kontakte | ID | Adresse |
Eulanda.SepaMandat | SEPAMandat | MandatsReferenz | Adresse |
Eulanda.Artikel | Artikel | ArtNummer | – |
Eulanda.ArtikelIdent | Identnummern | Nr | Artikel |
Eulanda.ServiceArtikel | ServiceArtikel | SarNummer | – |
Eulanda.Kreditor | LIEFERANTEN | Match | – |
Eulanda.KrAuftrag | Bestellung | Kopfnummer | – |
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-DmsFolderContactGet-DmsFolderArticle,Get-DmsFolderArticleIdentGet-DmsFolderServiceArticleGet-DmsFolderSupplierGet-DmsFolderQuote,Get-DmsFolderSalesOrderGet-DmsFolderDeliveryNote,Get-DmsFolderInvoiceGet-DmsFolderPurchaseOrderGet-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-EulandaDmsFolderverschiebt ihn explizit auf den neuen Pfad. In einer zukünftigen Version könnte das per SQL-Trigger automatisch werden (siehedocs/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
-DataObjecterwartet den voll qualifizierten DMS-Objektnamen (z.B.'Eulanda.Adresse','Eulanda.Artikel').-OldFolderNameist 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.