diff --git a/CLAUDE.md b/CLAUDE.md index a1dcd79..ff18098 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -251,7 +251,7 @@ Sperrungen zentraler Einträge (`werkzeug_sperre`) führen, ohne den zentralen Katalog zu verändern. **Pflicht:** `letzte_pruefung` und `quelle` sind NOT NULL — jede -Zusicherung im Katalog (AVV verfügbar, Verarbeitungsort, Training-Opt- +Zusicherung im Katalog (AVV verfügbar, Verarbeitungsländer, Training-Opt- out, Zertifizierungen) muss belegbar sein, sonst haftet Deklarix für eine Aussage, die nicht nachweisbar ist. Beide Katalogansichten zeigen eine dreistufige Ampel zum Prüfalter (`pruefStatus()` in @@ -295,7 +295,7 @@ scheinbar EU-verarbeitetes Werkzeug die USA doch nicht ausschließt. Sowohl der zentrale Katalog (`GET /betreiber/werkzeuge`) als auch die mandantenseitige Sicht (`GET /verwaltung/werkzeuge`) zeigen den Katalog -als Tabelle (Name, Anbieter, Verarbeitungsort, AVV, Training aus, +als Tabelle (Name, Anbieter, Verarbeitungsländer, DPF, AVV, Training aus, Aufbewahrung, Zertifizierungen, Geeignete Zwecke, Zuletzt geprüft) statt als Liste — vorher waren nur Name/Anbieter/Ort auf einen Blick sichtbar, der Rest war erst nach Klick auf den Detaileintrag zu sehen. @@ -324,16 +324,33 @@ CLAUDE.md-Leitplanken für personenbezogene/vertrauliche Daten nicht geeignet, absichtlich als Negativbeispiel im Katalog, nicht weggelassen)**. -**Bekannte Schema-Lücke (2026-08-31, noch nicht behoben):** Anbieter -mit Verarbeitung außerhalb EU/USA (z. B. DeepSeek, China) lassen sich -mit dem aktuellen `verarbeitungsort`-Wertebereich (`EU`/`USA`/ -`gemischt`/`on-prem`, DB-CHECK-Constraint) nicht korrekt abbilden — -"gemischt" würde fälschlich EU-Berührung suggerieren, "USA" wäre -schlicht falsch. DeepSeek wurde deshalb bewusst NICHT angelegt statt -mit einem falschen Wert erzwungen. Vor dem nächsten Katalogeintrag -außerhalb EU/USA/on-prem-Hosting muss der Wertebereich erweitert werden -(z. B. um `drittland`) — eigene Migration nötig, Entscheidung noch -nicht getroffen. +**Schema-Lücke behoben (2026-08-31, Migration 0016):** der grobe +`verarbeitungsort`-Eimer (`EU`/`USA`/`gemischt`/`on-prem`) wurde durch +`verarbeitungslaender TEXT[]` ersetzt — echte Länder statt Buckets. +Grund: "USA" war schon immer ein Drittland im Sinne der DSGVO (Art. 44 +ff.) wie jedes andere auch, das Wort "Drittland" für einen fünften +Bucket-Wert wäre also verwirrend gewesen, nicht erhellend. Das Formular +bietet dafür eine echte Weltländerliste (`weltLaenderliste` in +`laenderliste.go`, `
- - {{$gewaehlt := .Verarbeitungsort}} -
- {{range .Verarbeitungsorte}} - + + +

Tatsächliche Länder benennen, nicht "EU"/"Drittland" — die USA sind DSGVO-rechtlich bereits ein Drittland wie jedes andere.

@@ -46,6 +46,7 @@ +
diff --git a/internal/web/templates/betreiber_werkzeuge.html b/internal/web/templates/betreiber_werkzeuge.html index c56b544..72d7b48 100644 --- a/internal/web/templates/betreiber_werkzeuge.html +++ b/internal/web/templates/betreiber_werkzeuge.html @@ -13,7 +13,7 @@ - + @@ -23,7 +23,8 @@ - + + diff --git a/internal/web/templates/mandant_werkzeuge.html b/internal/web/templates/mandant_werkzeuge.html index 0cb1d19..b52e59e 100644 --- a/internal/web/templates/mandant_werkzeuge.html +++ b/internal/web/templates/mandant_werkzeuge.html @@ -19,7 +19,7 @@
NameAnbieterVerarbeitungsortAVVNameAnbieterVerarbeitungsländerDPFAVV Training ausAufbewahrungZertifizierungenGeeignete Zwecke Zuletzt geprüft
{{.Name}} {{.Anbieter}}{{.Verarbeitungsort}}{{.Verarbeitungslaender}}{{if .DPFZertifiziert}}ja{{else}}nein{{end}} {{if .AVVVerfuegbar}}ja{{else}}nein{{end}} {{if .TrainingStandard}}ja{{else}}nein{{end}} {{.Aufbewahrung}}
- + @@ -28,7 +28,7 @@ - + @@ -65,14 +65,14 @@
NameAnbieterVerarbeitungsortAVVNameAnbieterVerarbeitungsländerAVV Training ausAufbewahrungGeeignete ZweckeZuletzt geprüftStatus
{{.Name}} {{.Anbieter}}{{.Verarbeitungsort}}{{.Verarbeitungslaender}} {{if .AVVVerfuegbar}}ja{{else}}nein{{end}} {{if .TrainingStandard}}ja{{else}}nein{{end}} {{.Aufbewahrung}}
- + {{range .EigeneWerkzeuge}} - + {{end}} diff --git a/internal/web/wiedervorlage_handlers.go b/internal/web/wiedervorlage_handlers.go index 6ff6dbd..d688f92 100644 --- a/internal/web/wiedervorlage_handlers.go +++ b/internal/web/wiedervorlage_handlers.go @@ -9,6 +9,8 @@ package web import ( "fmt" "net/http" + "slices" + "strings" "time" "github.com/netcell-it/deklarix/internal/store" @@ -30,8 +32,9 @@ func werkzeugDiff(snapshot, current store.Werkzeug) []string { if snapshot.TrainingStandard != current.TrainingStandard { diffs = append(diffs, fmt.Sprintf("Training standardmäßig aus: %v → %v", snapshot.TrainingStandard, current.TrainingStandard)) } - if snapshot.Verarbeitungsort != current.Verarbeitungsort { - diffs = append(diffs, fmt.Sprintf("Verarbeitungsort: %s → %s", snapshot.Verarbeitungsort, current.Verarbeitungsort)) + if !slices.Equal(snapshot.Verarbeitungslaender, current.Verarbeitungslaender) { + diffs = append(diffs, fmt.Sprintf("Verarbeitungsländer: %s → %s", + strings.Join(snapshot.Verarbeitungslaender, ", "), strings.Join(current.Verarbeitungslaender, ", "))) } return diffs }
NameAnbieterVerarbeitungsortZuletzt geprüft
NameAnbieterVerarbeitungsländerZuletzt geprüft
{{.Name}} {{.Anbieter}}{{.Verarbeitungsort}}{{.Verarbeitungslaender}} {{.LetztePruefung}}