CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package migrationverify
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// RenderBericht erzeugt den deutschsprachigen Zeilenzahl-Abgleich-Bericht
|
|
// als Markdown-Tabelle, sortiert nach Tenant und Tabelle.
|
|
func RenderBericht(reports []TableReport) string {
|
|
sorted := append([]TableReport(nil), reports...)
|
|
sort.Slice(sorted, func(i, j int) bool {
|
|
if sorted[i].TenantSlug != sorted[j].TenantSlug {
|
|
return sorted[i].TenantSlug < sorted[j].TenantSlug
|
|
}
|
|
return sorted[i].Table < sorted[j].Table
|
|
})
|
|
|
|
var b strings.Builder
|
|
b.WriteString("# Zeilenzahl-Abgleich je Kerntabelle\n\n")
|
|
b.WriteString("| Tenant | Tabelle | Quelle | Ziel | Differenz | Erklaert | Status | Begruendung |\n")
|
|
b.WriteString("|---|---|---|---|---|---|---|---|\n")
|
|
for _, r := range sorted {
|
|
status := "OK"
|
|
if r.OffenerBefund() {
|
|
status = "OFFENER BEFUND"
|
|
}
|
|
reason := strings.Join(r.ExplainedReasons, "; ")
|
|
if reason == "" {
|
|
reason = "-"
|
|
}
|
|
fmt.Fprintf(&b, "| %s | %s | %d | %d | %d | %d | %s | %s |\n",
|
|
r.TenantSlug, r.Table, r.SourceCount, r.TargetCount, r.Diff(), r.ExplainedCount, status, reason)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// OffeneBefunde filtert alle Reports mit ungeklaerter Abweichung.
|
|
func OffeneBefunde(reports []TableReport) []TableReport {
|
|
var out []TableReport
|
|
for _, r := range reports {
|
|
if r.OffenerBefund() {
|
|
out = append(out, r)
|
|
}
|
|
}
|
|
return out
|
|
}
|