1
0
Files
asv-format-validator/Apply-ReviewPatches.ps1
marcus cd6e5221aa docs: Review-Korrekturen aus Peer-Review anwenden
- UNZ_0010 -> UNZ_0036 (meilensteine.md, technik-und-architektur.md)
- FEHLER_MASSNAHME -> FEHLER_MAßNAHME (meilensteine.md, technik-und-architektur.md)
- Exit-Code-Kommentar bereinigt (CLAUDE.md)
- V1-K-Nachrangigkeit ergaenzt (CLAUDE.md)
- Zielbild-Anmerkung in README
- Spec-Tippfehler DATUM_ERSTELLUNG dokumentiert (technik-und-architektur.md)
- R-CROSS-KKS-SPEZ-NACHRICHTENTYP-001 ergaenzt (fachliche-anforderungen.md)
- R-IFA-OVER-002 Quelle praezisiert, V1-V bestaetigt (fachliche-anforderungen.md)
- R-FHL-2.13-001 Feldart K, Regeltext angepasst (fachliche-anforderungen.md)
- R-GLOBAL-MIN-NACHRICHTEN-001 ergaenzt (fachliche-anforderungen.md)
- RSA-Schluessellaengen-Hinweis ergaenzt (technik-und-architektur.md)
2026-04-20 07:56:46 +02:00

198 lines
10 KiB
PowerShell

# =============================================================================
# Apply-ReviewPatches.ps1
# Aufruf: powershell -ExecutionPolicy Bypass -File .\Apply-ReviewPatches.ps1 -RepoRoot D:\Dev\Projects\asv-format-validator
# =============================================================================
param(
[Parameter(Mandatory=$true)]
[string]$RepoRoot
)
$ErrorActionPreference = "Stop"
if (-not (Test-Path "$RepoRoot\CLAUDE.md")) {
Write-Error "CLAUDE.md nicht gefunden in '$RepoRoot'."
exit 1
}
Write-Host "=== ASV-Format-Validator: Review-Patches ===" -ForegroundColor Cyan
Write-Host "Repo: $RepoRoot"
$enc = New-Object System.Text.UTF8Encoding $false
function Read-UTF8 { param([string]$p); $enc.GetString([System.IO.File]::ReadAllBytes($p)) }
function Write-UTF8 { param([string]$p, [string]$c); [System.IO.File]::WriteAllBytes($p, $enc.GetBytes($c)) }
function Patch {
param([string]$File, [string]$Old, [string]$New, [string]$Label)
if (-not (Test-Path $File)) { Write-Host " FEHLER: $File nicht gefunden" -ForegroundColor Red; return }
$c = Read-UTF8 $File
if ($c.Contains($Old)) {
Write-UTF8 $File $c.Replace($Old, $New)
Write-Host " OK $Label" -ForegroundColor Green
} else {
Write-Host " -- Nicht gefunden (ok?): $Label" -ForegroundColor Yellow
}
}
# Sonderzeichen als Variablen -- kein Umlaut in String-Literalen
$sz = [char]0x00DF # sz-Ligatur
$ae = [char]0x00E4 # ae
$oe = [char]0x00F6 # oe
$ue = [char]0x00FC # ue
$AE = [char]0x00C4 # Ae
$OE = [char]0x00D6 # Oe
$UE = [char]0x00DC # Ue
$arr = [char]0x2192 # ->
$darr = [char]0x2194 # <->
$lq = [char]0x201E # linkes Gaensefusschen
$rq = [char]0x201C # rechtes Gaensefusschen
$em = [char]0x2014 # em-dash
# ===========================================================================
Write-Host "`n--- CLAUDE.md ---"
$f = "$RepoRoot\CLAUDE.md"
# Befund 3: "Nicht 0/1/2/3" entfernen
Patch $f '. **Nicht** `0/1/2/3`.' '.' "Befund 3: Exit-Code-Anhang entfernt"
# Befund 14: V1-K-Nachrangigkeit ergaenzen
$b14_anker = "auch wenn sie fachlich existieren."
$b14_neu = "auch wenn sie fachlich existieren.`n`n**Wichtig:** ``V1-K``-Regeln sind bei einem direkten Konflikt mit einer eindeutigen Aussage der Technischen Anlage ASV 1.09 immer nachrangig."
$b14_check = "immer nachrangig."
$c = Read-UTF8 $f
if ($c.Contains($b14_check)) {
Write-Host " -- Befund 14: bereits vorhanden" -ForegroundColor Yellow
} else {
Patch $f $b14_anker $b14_neu "Befund 14: V1-K-Nachrangigkeit ergaenzt"
}
# ===========================================================================
Write-Host "`n--- README.md ---"
$f = "$RepoRoot\README.md"
# Befund 13: Zielbild-Anmerkung
$b13_old = "Unterst${ue}tzte Artefakte in V1:"
$b13_new = "`n*(Zielbild V1 ${em} noch nicht vollst${ae}ndig implementiert, siehe Meilensteinplan)*`n`nUnterst${ue}tzte Artefakte in V1:"
$b13_check = "*(Zielbild V1"
$c = Read-UTF8 $f
if ($c.Contains($b13_check)) {
Write-Host " -- Befund 13: bereits vorhanden" -ForegroundColor Yellow
} else {
Patch $f $b13_old $b13_new "Befund 13: Zielbild-Anmerkung eingefuegt"
}
# ===========================================================================
Write-Host "`n--- docs\specs\meilensteine.md ---"
$f = "$RepoRoot\docs\specs\meilensteine.md"
Patch $f 'UNZ_0010' 'UNZ_0036' "Befund 1+4: UNZ_0010 -> UNZ_0036"
Patch $f "FEHLER_MASSNAHME" "FEHLER_MA${sz}NAHME" "Befund 2: FEHLER_MASSNAHME -> FEHLER_MAssNAHME"
# ===========================================================================
Write-Host "`n--- docs\specs\technik-und-architektur.md ---"
$f = "$RepoRoot\docs\specs\technik-und-architektur.md"
Patch $f '- Anzahl Nachrichten in `UNZ_0010`' '- Anzahl Nachrichten in `UNZ_0036`' "Befund 1+4: UNZ_0010 -> UNZ_0036 (normativer Text)"
Patch $f '`UNZ_0010`/`UNH_0062`-Crosschecks' '`UNZ_0010`/`UNH_0062`-Crosschecks *(Tippfehler; korrekt: `UNZ_0036`; in v3 nachkorrigiert)*' "Befund 1+4: Tippfehler-Hinweis in Dokumenthistorie"
Patch $f "FEHLER_MASSNAHME" "FEHLER_MA${sz}NAHME" "Befund 2: FEHLER_MASSNAHME -> FEHLER_MAssNAHME"
# Befund 6: Spec-Tippfehler-Bullet vor "### Versichertennummer"
$b6_anker = "### Versichertennummer"
$b6_bullet = "- **Spec-Tippfehler ``DATUM_ERSTELLUNG``**: Die Technische Anlage ASV 1.09 beschreibt das Format als ``JJJJMMTTssmmss``. Das ist ein Tippfehler in der Spec (ss = Sekunde statt hh = Stunde). Korrekt ist ``JJJJMMTThhmmss`` (Jahr, Monat, Tag, Stunde, Minute, Sekunde). V1 implementiert das korrigierte Format.`n`n"
$c = Read-UTF8 $f
if ($c.Contains("Spec-Tippfehler ``DATUM_ERSTELLUNG``")) {
Write-Host " -- Befund 6: bereits vorhanden" -ForegroundColor Yellow
} else {
Patch $f $b6_anker ($b6_bullet + $b6_anker) "Befund 6: Spec-Tippfehler-Bullet eingefuegt"
}
# Befund 8: Crosscheck-Spiegelstrich
$b8_anker = "Ein nicht geliefertes oder mit Blanks (``HEX 20``) gef${ue}lltes Feld ist **kein** Befund."
$b8_zusatz = "`n- ``VERFAHREN_KENNUNG_SPEZIFIKATION`` ${darr} Nachrichtentyp in ``UNH S009_0065``: Wenn das Feld belegt ist, muss es zum tats${ae}chlichen Nachrichtentyp passen (``ASVA0`` ${arr} ``ASVREC``; ``ASVF0`` ${arr} ``ASVFEH``)."
$c = Read-UTF8 $f
if ($c.Contains("ASVA0`` ${arr} ``ASVREC``")) {
Write-Host " -- Befund 8 (T&A): bereits vorhanden" -ForegroundColor Yellow
} else {
Patch $f $b8_anker ($b8_anker + $b8_zusatz) "Befund 8 (T&A): Crosscheck-Spiegelstrich eingefuegt"
}
# Befund 12: RSA-Hinweis
$b12_anker = "aber als erkannte Abweichung gemeldet werden."
$b12_zusatz = "`n`nHinweis zur RSA-Schl${ue}ssell${ae}nge: Die Spec nennt 2048 bit als urspr${ue}nglichen Standard; die Umstellung auf 4096 bit erfolgte zum 01.05.2020. Da V1 ab Q2/2026 gilt, ist 4096 bit der verbindliche Wert."
$c = Read-UTF8 $f
if ($c.Contains("01.05.2020. Da V1 ab Q2/2026")) {
Write-Host " -- Befund 12: bereits vorhanden" -ForegroundColor Yellow
} else {
Patch $f $b12_anker ($b12_anker + $b12_zusatz) "Befund 12: RSA-Hinweis eingefuegt"
}
# ===========================================================================
Write-Host "`n--- docs\specs\fachliche-anforderungen.md ---"
$f = "$RepoRoot\docs\specs\fachliche-anforderungen.md"
# Befund 7: V1-K -> V1-V + Quelle praezisieren
$b7_vk = "IFA Hinweise | ${UE}berweiserfelder | Regel | ``1.3.1`` und ``1.3.2`` d${ue}rfen nicht gleichzeitig belegt sein. | lokale Crosscheck-Regel | V1-K |"
$b7_vv = "IFA Hinweise | ${UE}berweiserfelder | Regel | ``1.3.1`` und ``1.3.2`` d${ue}rfen nicht gleichzeitig belegt sein. | lokale Crosscheck-Regel | V1-V |"
Patch $f $b7_vk $b7_vv "Befund 7: V1-K -> V1-V korrigiert"
$b7_src_old = "IFA Hinweise | ${UE}berweiserfelder | Regel | ``1.3.1`` und ``1.3.2`` d${ue}rfen nicht gleichzeitig belegt sein. | lokale Crosscheck-Regel | V1-V |"
$b7_src_new = "Fehlerkatalog Stufe 3, ``3A035`` | ${UE}berweiserfelder | Regel | ``1.3.1`` und ``1.3.2`` d${ue}rfen nicht gleichzeitig belegt sein. | lokale Crosscheck-Regel | V1-V |"
Patch $f $b7_src_old $b7_src_new "Befund 7: Quellenangabe praezisiert"
# Befund 8: neue Crosscheck-Regel zeilenweise einfuegen
$b8_check = "R-CROSS-KKS-SPEZ-NACHRICHTENTYP-001"
$b8_zeile = "| ``R-CROSS-KKS-SPEZ-NACHRICHTENTYP-001`` | KKS ``VERFAHREN_KENNUNG_SPEZIFIKATION``, UNH S009_0065 | Wenn KKS-``VERFAHREN_KENNUNG_SPEZIFIKATION`` belegt ist (``ASVA0`` oder ``ASVF0``), muss der tats${ae}chliche Nachrichtentyp in ``UNH S009_0065`` konsistent dazu sein. ``ASVA0`` ${darr} ``ASVREC``; ``ASVF0`` ${darr} ``ASVFEH``. | V1-V | kein eindeutiger offizieller Fehlercode |"
$c = Read-UTF8 $f
if ($c.Contains($b8_check)) {
Write-Host " -- Befund 8 (FA): bereits vorhanden" -ForegroundColor Yellow
} else {
$lines = $c -split "`n"
$out = [System.Collections.Generic.List[string]]::new()
$inserted = $false
foreach ($line in $lines) {
$out.Add($line)
if (-not $inserted -and $line.Contains('R-CROSS-KASSE-001') -and $line.Contains('kein eindeutiger offizieller Fehlercode')) {
$out.Add($b8_zeile)
$inserted = $true
}
}
if ($inserted) {
Write-UTF8 $f ($out -join "`n")
Write-Host " OK Befund 8 (FA): R-CROSS-KKS-SPEZ-NACHRICHTENTYP-001 eingefuegt" -ForegroundColor Green
} else {
Write-Host " -- Befund 8 (FA): Ankerpunkt nicht gefunden" -ForegroundColor Yellow
}
}
# Befund 9: R-FHL-2.13-001 Feldart + Regeltext
Patch $f '| `R-FHL-2.13-001` | FHL 2.13 | Anforderungskennzeichen Korrektur/Storno | M |' '| `R-FHL-2.13-001` | FHL 2.13 | Anforderungskennzeichen Korrektur/Storno | K |' "Befund 9: Feldart M -> K"
Patch $f '`1` = Korrektur, `2` = Storno (nur bei Fehlern der Stufe 4 relevant).' 'Kann-Feld; `1` = Korrektur, `2` = Storno (insbesondere bei Fehlern der Stufe 4 relevant). Wird zu Muss-Datenelement, wenn der Kontext eine Ermittelbarkeit belastbar erlaubt.' "Befund 9: Regeltext angepasst"
# Befund 11: R-GLOBAL-MIN-NACHRICHTEN-001 zeilenweise einfuegen
$b11_check = "R-GLOBAL-MIN-NACHRICHTEN-001"
$b11_zeile = "| ``R-GLOBAL-MIN-NACHRICHTEN-001`` | Grunds${ae}tze Daten${ue}bermittlung, ${lq}mindestens jedoch eine ASV-Nachricht${rq} | Eine Nutzdatendatei muss mindestens ein ``UNH``/``UNT``-Paar enthalten. Eine Datei ohne jede Nachricht ist ung${ue}ltig. | V1-V | ``10003`` (UNH fehlt) |"
$c = Read-UTF8 $f
if ($c.Contains($b11_check)) {
Write-Host " -- Befund 11: bereits vorhanden" -ForegroundColor Yellow
} else {
$lines = $c -split "`n"
$out = [System.Collections.Generic.List[string]]::new()
$inserted = $false
foreach ($line in $lines) {
$out.Add($line)
if (-not $inserted -and $line.Contains('R-GLOBAL-SORTIERUNG-001') -and $line.Contains('beliebiger Reihenfolge')) {
$out.Add($b11_zeile)
$inserted = $true
}
}
if ($inserted) {
Write-UTF8 $f ($out -join "`n")
Write-Host " OK Befund 11: R-GLOBAL-MIN-NACHRICHTEN-001 eingefuegt" -ForegroundColor Green
} else {
Write-Host " -- Befund 11: Ankerpunkt nicht gefunden" -ForegroundColor Yellow
}
}
# ===========================================================================
Write-Host "`n=== Fertig. Bitte pruefen mit: git diff --stat ===" -ForegroundColor Cyan