Kontinuitaetsabgleich (Anzahl, aeltester/neuester Zeitstempel) je Tenant zwischen legacy_audit_log_staging und audit_events, jede Luecke oder Zeitverschiebung ist ein blockierender Befund. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
package migrationauditcontinuity
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// RenderBericht erzeugt den deutschsprachigen Kontinuitaetsbericht je
|
|
// Tenant als Markdown-Tabelle, sortiert nach Tenant.
|
|
func RenderBericht(reports []ContinuityReport) string {
|
|
sorted := append([]ContinuityReport(nil), reports...)
|
|
sort.Slice(sorted, func(i, j int) bool { return sorted[i].TenantSlug < sorted[j].TenantSlug })
|
|
|
|
var b strings.Builder
|
|
b.WriteString("# Audit-Log-Kontinuitaetspruefung je Tenant\n\n")
|
|
b.WriteString("| Tenant | Anzahl Quelle | Anzahl Ziel | Aeltester (Quelle) | Aeltester (Ziel) | Neuester (Quelle) | Neuester (Ziel) | Status |\n")
|
|
b.WriteString("|---|---|---|---|---|---|---|---|\n")
|
|
for _, r := range sorted {
|
|
status := "OK"
|
|
if r.OffenerBefund() {
|
|
status = "OFFENER BEFUND"
|
|
}
|
|
fmt.Fprintf(&b, "| %s | %d | %d | %s | %s | %s | %s | %s |\n",
|
|
r.TenantSlug, r.SourceCount, r.TargetCount,
|
|
r.SourceOldest.Format(timeLayout), r.TargetOldest.Format(timeLayout),
|
|
r.SourceNewest.Format(timeLayout), r.TargetNewest.Format(timeLayout),
|
|
status)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
const timeLayout = "2006-01-02T15:04:05Z07:00"
|
|
|
|
// OffeneBefunde filtert alle Reports mit Luecke oder Zeitverschiebung.
|
|
func OffeneBefunde(reports []ContinuityReport) []ContinuityReport {
|
|
var out []ContinuityReport
|
|
for _, r := range reports {
|
|
if r.OffenerBefund() {
|
|
out = append(out, r)
|
|
}
|
|
}
|
|
return out
|
|
}
|