TEN-08: tenant-loeschung-unter-retention-vorbehalt-gobd (RetentionChecker-Schnittstelle gegen Archive RET-03/CMP-06, ProcessDueDeletions haelt gesperrte Tenants zurueck)

This commit is contained in:
sysops
2026-08-28 22:51:05 +02:00
parent 45bc10719a
commit c344dea218
8 changed files with 259 additions and 8 deletions
+34
View File
@@ -0,0 +1,34 @@
package tenant
import "context"
// RetentionResult ist das Ergebnis einer Pruefung gegen Archive RET-03/CMP-06
// vor einer endgueltigen Tenant-Loeschung (TEN-08).
type RetentionResult struct {
// Blocked ist true, solange GoBD-relevante Daten des Tenants unter
// Aufbewahrungspflicht oder Legal Hold stehen (Akzeptanzkriterium 1).
Blocked bool
// Reason beschreibt Aufbewahrungsklasse/Frist oder Legal-Hold-Grund,
// fuer Admins einsehbar (Akzeptanzkriterium 2). Nur aussagekraeftig, wenn Blocked true ist.
Reason string
}
// RetentionChecker ist die Schnittstelle zu Archive RET-03 (Loeschworkflow &
// Aufbewahrungssperre) / CMP-06 (Vier-Augen-Freigabe fuer Loeschungen).
// Core kennt bewusst keine Retention-Logik selbst — diese Kachel ruft nur auf,
// siehe TEN-08 "Nicht Bestandteil dieser Kachel". Solange Archive RET-03 noch
// nicht implementiert ist, wird ein no-op-Checker verwendet (siehe
// NoRetentionCheck), der niemals blockiert — Core faellt damit auf das
// TEN-04-Verhalten vor diesem Ticket zurueck, statt fehlzuschlagen.
type RetentionChecker interface {
CheckTenantRetention(ctx context.Context, tenantID string) (RetentionResult, error)
}
// NoRetentionCheck ist der Platzhalter-Checker, solange Archive RET-03 noch
// nicht angebunden ist — blockiert nie. Wird in Produktion durch den echten
// HTTP-Client gegen Archive ersetzt, sobald RET-03 existiert.
type NoRetentionCheck struct{}
func (NoRetentionCheck) CheckTenantRetention(context.Context, string) (RetentionResult, error) {
return RetentionResult{Blocked: false}, nil
}