- dms/ai/workflow: qa0x-Pakete nach internal/gates/<thema> verschoben, Paketname = Thema
- internal/migration{acl,audit,...} -> internal/migration/{acl,audit,...}
- Importpfade, Gate-Skripte und zwei relative Migrationspfade angepasst
- keine Logikaenderung; mail-Gates bewusst unveraendert (pfadabhaengig)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
// Package migrationverify implementiert VAL-01: den Zeilenzahl-Abgleich je
|
|
// Kerntabelle (Benutzer, Dokumente, Nachrichten) zwischen Quelle und
|
|
// migriertem Ziel, je Tenant. Reines Lese-/Zaehlwerkzeug, kein
|
|
// Migrationsschritt.
|
|
package migrationverify
|
|
|
|
import "fmt"
|
|
|
|
type TableName string
|
|
|
|
const (
|
|
TableUsers TableName = "users"
|
|
TableDocuments TableName = "documents"
|
|
TableMessages TableName = "messages"
|
|
)
|
|
|
|
// Explanation deckt eine bewusst nicht migrierte Kategorie ab (z.B.
|
|
// abgelaufene Freigabelinks, abgeschlossene Workflow-Instanzen).
|
|
type Explanation struct {
|
|
TenantSlug string
|
|
Table TableName
|
|
Count int64
|
|
Reason string
|
|
}
|
|
|
|
// TableReport ist der Zeilenzahl-Abgleich einer Kerntabelle fuer genau
|
|
// einen Tenant (Akzeptanzkriterium 1).
|
|
type TableReport struct {
|
|
TenantSlug string
|
|
Table TableName
|
|
SourceCount int64
|
|
TargetCount int64
|
|
ExplainedCount int64
|
|
ExplainedReasons []string
|
|
}
|
|
|
|
func (r TableReport) Diff() int64 {
|
|
return r.SourceCount - r.TargetCount
|
|
}
|
|
|
|
// OffenerBefund ist true, wenn die Differenz nicht vollstaendig durch
|
|
// bewusst nicht migrierte Kategorien erklaert ist (Akzeptanzkriterium 2).
|
|
func (r TableReport) OffenerBefund() bool {
|
|
return r.Diff() != r.ExplainedCount
|
|
}
|
|
|
|
func (r TableReport) String() string {
|
|
status := "OK"
|
|
if r.OffenerBefund() {
|
|
status = "OFFENER BEFUND"
|
|
}
|
|
return fmt.Sprintf("%s/%s: quelle=%d ziel=%d differenz=%d erklaert=%d status=%s",
|
|
r.TenantSlug, r.Table, r.SourceCount, r.TargetCount, r.Diff(), r.ExplainedCount, status)
|
|
}
|