From 59e1bcc8f7ba8fdccb391da6dff90b71bea4c061 Mon Sep 17 00:00:00 2001 From: noroot Date: Mon, 31 Aug 2026 13:52:00 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Werkzeugkatalog=20nennt=20tats=C3=A4chl?= =?UTF-8?q?iche=20Verarbeitungsl=C3=A4nder=20statt=20EU/USA/gemischt-Eimer?= =?UTF-8?q?,=20plus=20DPF-Feld?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die USA sind DSGVO-rechtlich bereits ein Drittland wie jedes andere - der alte verarbeitungsort-Wertebereich (EU/USA/gemischt/on-prem) verschleierte das. Ersetzt durch verarbeitungslaender TEXT[] mit echter Weltländerliste im Formular (Mehrfachauswahl, kein JS nötig). Der harte Filter eu_verarbeitung verlangt jetzt, dass ALLE genannten Länder EU/EWR sind. Neues Feld dpf_zertifiziert macht die EU-US Data Privacy Framework-Zertifizierung strukturiert statt nur Fließtext. Öffnet nebenbei den Weg für Katalogeinträge außerhalb EU/USA (z. B. DeepSeek), die vorher am alten Wertebereich scheiterten. Zusätzlich Typografie-Nachbesserung nach Nutzer-Feedback: Formular- Abschnittsüberschriften () saßen zu dicht am Kartenrand, weil das Padding des umschließenden
ignoriert - jetzt mit eigenem Padding und größerer Schrift, h2/h3 einheitlich gesetzt. --- CLAUDE.md | 60 +++++-- internal/rules/evaluate.go | 48 +++++- internal/rules/evaluate_test.go | 19 ++- ...016_werkzeug_verarbeitungslaender.down.sql | 20 +++ .../0016_werkzeug_verarbeitungslaender.up.sql | 29 ++++ internal/store/werkzeug.go | 94 ++++++----- internal/store/werkzeug_test.go | 30 ++-- internal/web/antrag_handlers.go | 2 +- internal/web/betreiber_werkzeug_handlers.go | 148 ++++++++++-------- .../web/betreiber_werkzeug_handlers_test.go | 2 +- internal/web/laenderliste.go | 53 +++++++ internal/web/mandant_werkzeug_handlers.go | 41 ++--- internal/web/server_test.go | 12 +- internal/web/static/app.css | 24 ++- .../templates/betreiber_werkzeug_form.html | 15 +- .../web/templates/betreiber_werkzeuge.html | 5 +- internal/web/templates/mandant_werkzeuge.html | 8 +- internal/web/wiedervorlage_handlers.go | 7 +- 18 files changed, 425 insertions(+), 192 deletions(-) create mode 100644 internal/store/migrations/0016_werkzeug_verarbeitungslaender.down.sql create mode 100644 internal/store/migrations/0016_werkzeug_verarbeitungslaender.up.sql create mode 100644 internal/web/laenderliste.go 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}}