# ============================================================================= # 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