Files
meldestelle/docs/diagrams/scs-ddd-vision/ZNS_Import_ACL.puml
T
2025-07-01 23:53:29 +02:00

135 lines
4.8 KiB
Plaintext

@startuml
title "Bounded Context: ZNS-Import als Anti-Corruption Layer (ACL)"
!theme vibrant
' Der Bounded Context wird als Paket mit dem Stereotyp <<ACL>> dargestellt
package "ZNS_Import_ACL" <<ACL>> {
' Eine Komponente, die die Übersetzungslogik kapselt
component ZNS_Daten_Uebersetzer [
+ importiere_zns_zip()
+ uebersetze_Personen()
+ uebersetze_Pferde()
+ uebersetze_Vereine()
]
' Die folgenden Entitäten repräsentieren die 1:1 Abbildung der Zeilen aus den ZNS .dat-Dateien.
' Sie sind "anämisch" und enthalten keine Geschäftslogik.
package "Rohdaten-Struktur aus ZNS-Dateien" {
' Basierend auf VEREIN01.DAT
entity ZNS_VEREIN01_dat_Satz {
' VEREIN (Nummer), Stelle 1-4 [cite: 177]
+ verein_nummer : VARCHAR(4)
' VEREINSNAME, Stelle 5-54 [cite: 177]
+ vereinsname : VARCHAR(50)
}
' Basierend auf PFERDE01.DAT
entity ZNS_PFERDE01_dat_Satz {
' SATZNUMMER DES PFERDES, Stelle 202-211 [cite: 164]
+ satznummer_des_pferdes : VARCHAR(10)
' PFERDENAME, Stelle 5-34 [cite: 164]
+ pferdename : VARCHAR(30)
' LEBENSNUMMER, Stelle 35-43 [cite: 164]
+ lebensnummer : VARCHAR(9)
' GEB.JAHR, Stelle 45-48 [cite: 164]
+ geb_jahr : VARCHAR(4)
' ... (weitere Felder gemäß Pflichtenheft S.8)
}
' Basierend auf RICHT01.DAT
entity ZNS_RICHT01_dat_Satz {
' ID, Stelle 1 ('X' oder 'Y') [cite: 154, 162]
+ id_satzart : CHAR(1)
' SATZNUMMER, Stelle 2-7 [cite: 154, 162]
+ satznummer : VARCHAR(6)
' NAME, Stelle 8-82 [cite: 154, 162]
+ name_komplett : VARCHAR(75)
' QUALIFIKATIONEN, Stelle 83-112 [cite: 154, 162]
+ qualifikationen_text : VARCHAR(30)
}
' Basierend auf LIZENZ01.DAT
entity ZNS_LIZENZ01_dat_Satz {
' SATZNUMMER DES REITERS, Stelle 1-6
+ satznummer_des_reiters : VARCHAR(6)
' FAMILIENNAME, Stelle 7-56
+ familienname : VARCHAR(50)
' VORNAME, Stelle 57-81
+ vorname : VARCHAR(25)
' VEREINSNAME, Stelle 84-133
+ vereinsname_text : VARCHAR(50)
' REITERLIZENZ, Stelle 137-140
+ reiterlizenz_code : VARCHAR(4)
' FAHRLIZENZ, Stelle 142-143
+ fahrlizenz_code : VARCHAR(2)
' LIZENZINFO, Stelle 201-210
+ lizenzinfo_text : VARCHAR(10)
' GEBURTSDATUM, Stelle 182-189
+ geburtsdatum_text : VARCHAR(8)
' ... (weitere Felder gemäß Pflichtenheft S.8)
}
}
' Die Pfeile zeigen den Datenfluss: Der Übersetzer konsumiert die Rohdaten-Sätze.
ZNS_Daten_Uebersetzer ..> ZNS_VEREIN01_dat_Satz : "liest"
ZNS_Daten_Uebersetzer ..> ZNS_PFERDE01_dat_Satz : "liest"
ZNS_Daten_Uebersetzer ..> ZNS_RICHT01_dat_Satz : "liest"
ZNS_Daten_Uebersetzer ..> ZNS_LIZENZ01_dat_Satz : "liest"
}
' Außerhalb des ACLs liegt unser sauberes, internes Domänenmodell.
' Der ACL übersetzt die Rohdaten in diese Ziel-Strukturen (oder Events, die diese erzeugen).
package "Internes Domänenmodell (Ziel)" {
' Beispielhaft: das Ziel-Objekt im Personen-Context
class Personenstamm <<Aggregate Root>> {
+ oepsSatzNrPerson : VARCHAR(6)
--
+ name : FamiliennameVO
+ geburtsdatum : Date
+ hauptverein : VereinsReferenz
+ hatLizenz(lizenzTyp) : boolean
}
' Beispielhaft: das Ziel-Objekt im Lizenz-Context
class Lizenznehmer <<Aggregate Root>> {
+ oepsSatzNrPerson : VARCHAR(6)
--
+ lizenzen : List<Lizenz>
+ qualifikationen: List<Qualifikation>
}
}
' Der Übersetzer im ACL erzeugt/aktualisiert die internen Domänenobjekte.
' Dies geschieht oft über Events oder direkte Service-Aufrufe.
ZNS_Daten_Uebersetzer ..> Personenstamm : "erzeugt/aktualisiert"
ZNS_Daten_Uebersetzer ..> Lizenznehmer : "erzeugt/aktualisiert"
note right of ZNS_Import_ACL
**Anti-Corruption Layer (ACL)**
Dieser Bounded Context hat eine einzige
Verantwortlichkeit: Er schützt das
System vor den Details und der
Komplexität der externen ZNS-Schnittstelle.
1. **Einlesen:** Die `.dat`-Dateien werden 1:1 in die
`ZNS_*_dat_Satz`-Entitäten eingelesen.
2. **Übersetzen:** Die Komponente `ZNS_Daten_Uebersetzer`
transformiert diese Rohdaten. Sie löst
Codes auf (z.B. Bundesland), normalisiert
Daten (z.B. kommaseparierte Lizenzen)
und validiert die Daten.
3. **Veröffentlichen:** Das Ergebnis der Übersetzung
wird an die zuständigen internen Bounded
Contexts weitergegeben, z.B. durch das
Auslösen von Domänen-Events wie
`PersonenStammdatenAktualisiert` oder
`NeueLizenzInformationVerfügbar`.
end note
@enduml