Files
nexarch/archive/migrations/0011_dsgvo_decision_log.up.sql
T
sysops af892e1536 CMP-07: dsgvo-loeschantrag-recht-auf-loeschung
- dpreport.SubjectRecord additiv um RetentionObjectID erweitert (CMP-02,
  bestehendes Verhalten unveraendert)
- migrations/0011_dsgvo_decision_log: vollstaendiges Protokoll jeder
  Einzelentscheidung
- archive/internal/dsgvorequest.ProcessDeletionRequest: ruft
  ausschliesslich CMP-02 (Suche), RET-03 (Sperrpruefung), CMP-06
  (Freigabe) auf - keine zweite Aufbewahrungs-/Freigabelogik (vermeidet
  den im Ticket dokumentierten archivmail-Fehler)
- 3 Tests real bestanden: gemischter Datenbestand (1 Loeschung + 1
  Ablehnung, Loeschung vollstaendig bis zur tatsaechlichen Vernichtung
  durchgefuehrt), Legal Hold blockiert trotz abgelaufener Frist,
  Mandantentrennung real ueber zwei physisch getrennte Tenant-DBs
- Migration real auf dms_tenant_test angewendet

Pruefungen siehe archive/docs/CMP-07-PRUEFPROTOKOLL.md
2026-08-30 22:16:53 +02:00

16 lines
895 B
SQL

-- CMP-07: vollständiges, dauerhaftes Protokoll JEDER Einzelentscheidung
-- eines DSGVO-Löschantrags (Akzeptanzkriterium 4) - gelöscht UND
-- abgelehnt, je Objekt einzeln, nicht nur eine Sammelentscheidung.
CREATE TABLE IF NOT EXISTS dsgvo_decision_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
data_subject_ref TEXT NOT NULL,
retention_object_id UUID NOT NULL REFERENCES retention_objects(id) ON DELETE RESTRICT,
object_type TEXT NOT NULL,
object_reference TEXT NOT NULL,
outcome TEXT NOT NULL CHECK (outcome IN ('deletion_requested', 'rejected', 'already_deleted')),
reason TEXT NOT NULL,
decided_at TIMESTAMPTZ NOT NULL DEFAULT now(),
decided_by TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_dsgvo_decision_log_subject ON dsgvo_decision_log (data_subject_ref);