Aktualisiert ARCHITECTURE.md, REFACTORING.md, TESTPLAN.md, FORTSCHRITT.md, README.md und improvements.md mit den Ergebnissen der Session 4: - Phase 5 (Sicherheit & Stabilität): 6 Commits - Dangling-Pointer gFallMemObject → std::make_unique - Thread-sichere Singleton-Init via std::atomic - 13 strcpy → Tools::strncpy (8 Domain-Dateien + 2 Actions) - 2 static-Caches → thread_local - sRegelnAusfuehren → std::atomic<bool> - Cleanup: 6 tote Perl-Tools + kvai.ini gelöscht (266 Zeilen) - Tests: 12 neue Test Cases (Ist_Gueltiges_Datum, Ist_Gueltige_Uhrzeit) - Build: 23/23 Tests grün Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
7.4 KiB
Regelwerk (RW) — Expertensystem zur Abrechnungspruefung
Regelwerk ist ein C++ Expertensystem zur automatisierten Pruefung von kassenaerztlichen Abrechnungsdaten (GOAE/EBM) im deutschen Gesundheitssystem. Es wird als DLL in das uebergeordnete KVAI-System (KV-Abrechnungs-Interface) eingebettet und fuehrt quartalsweise Regelpruefungen auf Arztabrechnungen durch.
- Zeitraum: 2006–2010 (Autor: Martin Richardt, ms management systems GmbH)
- Sprache: C++17 (Phasen 0–5 abgeschlossen)
- Umfang: ca. 230 .cpp / 450 .hpp, 18.000+ Symbole, 300+ Ausfuehrungsfluesse
- Kritikalitaet: Medizinische Abrechnungspruefung — Fehler haben finanzielle/regulatorische Folgen
Uebersicht
flowchart LR
KVAI["KVAI <br/>(Host-System)"] -->|"XML-Auftrag (Abrechnungsdaten)"| RW["Regelwerk DLL<br/><code>rw_core</code>"]
RW -->|"XML-Ergebnis (regulierte Daten)"| KVAI
subgraph RW["Regelwerk"]
Init["Konfiguration +<br/>LE-Daten + Stammdaten"]
Load["PaketLader:<br/>DB → Entity-Graph"]
Engine["RegelMaschine:<br/>2-Stufen-Pipeline"]
Serial["Serialisierung:<br/>Entity-Graph → XML"]
Init --> Load --> Engine --> Serial
end
style KVAI fill:#f0f0f0,stroke:#666,color:#333
style RW fill:#1a1a2e,stroke:#e94560,color:#fff
Das Regelwerk erhaelt Abrechnungsdaten (Patientenfaelle, Krankenscheine, Leistungen) als XML-Struktur, fuehrt regelbasierte Pruefungen durch und gibt die regulierten Daten (mit Loeschungen, Aenderungen, Beanstandungen) zurueck.
Architektur-Highlights
| Konzept | Beschreibung |
|---|---|
| 2-Stufen-Pipeline | Stufe 1: Zaehler aufbauen (BILDUNG). Stufe 2: Zaehler-abhaengige Regeln erneut ausfuehren (AUSWERTUNG) |
| 87 Praedikate, 30+ Aktionen | Funktor-basierte Regel-Bausteine, kombiniert zu UML-aehnlichen Mustern |
| 50+ Methoden | Komplexe Verfahrensanweisungen (UR1–UR601, SB20–SB414) |
| Arena-Allokator | Per-Fall 1 MB Stack-Allokator, placement-new, string-interning |
| Intrusive Listen | dlink/List<T> zur Entity-Verkettung ohne Heap-Allokation |
| XML-Schnittstelle | Ein-/Ausgabe als XML-Streams via proprietäre Serialisierung |
Projektstruktur
regelwerk/
├── CMakeLists.txt # Build-System (CMake 3.16+, Ninja)
├── sources.cmake # Source-Dateiliste (ausgelagert)
├── devbox.json # Reproduzierbare Dev-Umgebung
├── AGENTS.md # Agent-Verhaltensregeln (Coding Guidelines)
├── docs/ # Dokumentation
│ ├── ARCHITECTURE.md # Architektur-Detail
│ ├── DOMAIN.md # Domänen-Glossar
│ ├── REFACTORING.md # Refactoring-Fortschritt
│ ├── SB414_*.md # Fachbeschreibung SB414
│ └── sb414_flow.md # SB414 Ausfuehrungsfluss
├── src/
│ ├── core/ # RegelMaschine, Config, Init, exportierte API (rw_dll.cpp)
│ ├── domain/ # Entity-Klassen (Paket, Patientenfall, Leistung, …)
│ ├── datatypes/ # Container: Menge, Map, List, IntMenge (Flyweight)
│ ├── db/ # Datenbank-Anbindung (MSDBConnection, DummyDB)
│ ├── interface/ # IRWLeistung, IRWSchein (Interface-Abstraktion)
│ ├── methods/ # 50+ Methoden (ab, ak, eb, fl, gs, ha, ma, sb, …)
│ ├── ur_meth/ # 25+ Ur-Methoden (komplexe Verfahren)
│ ├── sb_meth/ # 6 SB-Methoden (Sonderbedingungen)
│ ├── rw_predicates/ # 87 Praedikate (Bedingungen)
│ ├── rw_actions/ # 59 Aktionen (eine pro File, Beanstanden, Streichen, Ersetzen)
│ ├── json/ # JSON-Parser + C++-Deserialisierung
│ ├── le/ # Leistungserbringer-Subsystem (LANR, BSNR, Arztgruppen)
│ ├── goae/ # GOAE-Katalog-Subsystem (Farben, GOP-Vergleich, …)
│ ├── statistik/ # Statistik und Logging
│ ├── taetigkeitort/ # Taetigkeit-Ort-Berechnung
│ ├── xml/ # XML-Serialisierung (rw_smallxml)
│ ├── rest/ # Host-Wrapper, Konstanten, Makros, Templates
│ ├── util/ # Tools: Datumsberechnung, Speicher, Kompression (Zlib-Wrapper), …
│ └── aktsource/ # ⚠️ Generierte Stammdaten (~100MB, niemals lesen!)
├── rw-interface/ # XML-Schema (RW-Auftrag.xsd, RW-Ergebnis.xsd)
├── tests/ # 23 Unit-Tests (CTest + Catch2) + SB414-Testdaten
├── Testpakete/ # 46 XML-Testdatensaetze (DbExport)
├── refactorings/ # Refactoring-Ideen und Fortschritt
└── config/ # kvai.ini
Build
# Konfiguration
cmake -B build -G Ninja -DBUILD_TESTS=ON
# Build
cmake --build build -j$(sysctl -n hw.logicalcpu)
# Tests ausfuehren
ctest --test-dir build # alle Tests
ctest --test-dir build -R datecalc # einzelner Test
./build/datecalc_test # direktes Binary
Optionen
| Option | Standard | Beschreibung |
|---|---|---|
BUILD_TESTS |
OFF | Unit-Tests bauen |
BUILD_HOSTRW |
OFF | HostRW-Executable bauen (benoetigt Oracle/Sybase) |
Hinweis:
rw_coreist eine statische Bibliothek. Fuer den Produktivbetrieb wird sie als DLL in das KVAI-Host-System eingebunden. Die Test-Executables linken gegenrw_coreund nutzenDummyDBConnection(No-Op-DB).
Tech-Stack
| Bereich | Technologie |
|---|---|
| Sprache | C++17 (Phasen 0–4 abgeschlossen) |
| Build | CMake 3.16+, Ninja |
| Container | Eigenbau (Menge, Map, List, IntMenge) |
| DB | Oracle/Sybase (Produktion) → MSDBConnection-Interface → DummyDBConnection (Test) |
| XML | Eigenbau-Serialisierung (rw_smallxml), kein Xerces/libxml |
| Kompression | ZLIB (System, via find_package) |
| Test-Framework | CTest + Catch2 v2.13.10 |
Key Concepts
Entity-Hierarchie
Paket → Patientenfall → Behandlungsfall (BHF)
→ Patientenfall → Behandlungsfall (BHF)
...
Behandlungsfall → Krankenschein → Tag → Leistung
→ BHD (BehandlungZeitraumDatum)
→ KHF (Krankheitsfall)
Zustandsautomat
- Paket: R00 → RVF → RWF → RNF → R01 (Vorbereitung → Regelung → Abschluss)
- Schein: AII (OK), RW0 (Fehler), RFS (Stop, hoechste Prioritaet)
- Leistung: Status 0/2/3/4/5 + Flags (unsichtbar, plausibel, hinweis, loeschend_wirksam)
2-Stufen-Regelprozess
1. BILDUNG: RegelMaschine::regelFaelle() — Zaehler deklarieren+inkrementieren
2. AUSWERTUNG: RegelMaschine::zaehlerAbhaengigeFaelleRegeln() — mit fertigen Zaehlerstaenden
Dokumentation
| Dokument | Inhalt |
|---|---|
| ARCHITECTURE.md | Architektur, Entity-Hierarchie, Zustandsautomat, Speichermodell, Regel-Pipeline |
| DOMAIN.md | Domänen-Glossar (GOP, BHF, LUG, KHF, LANR, …) |
| REFACTORING.md | Refactoring-Fortschritt und naechste Schritte |
| improvements.md | Verbesserungsvorschläge + Status (Session 4) |
| AGENTS.md | Verhaltensregeln fuer Coding Agents |
License
Proprietaer. Copyright 2006–2010 Martin Richardt, ms management systems GmbH.