fix: filtre DAS=DP + correction D55.9→D64.9 + enrichissement supplements CIM-10

- Filtre DAS identique au DP (violation règle PMSI) dans extracteur et fusion
- Correction automatique D55.9 → D64.9 pour "Anémie" non qualifiée (70 cas)
- 17 codes ajoutés aux supplements (K59.0, Z93.1, H92.0, A87.0, D64.9, etc.)
- 436 tests OK (+14 nouveaux)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-13 14:03:10 +01:00
parent 0d3cb83f12
commit 837bdaca76
7 changed files with 179 additions and 3 deletions

View File

@@ -73,3 +73,32 @@ class TestCim10Supplements:
is_valid, label = validate_code("e119")
assert is_valid
assert label # Label non vide
# --- Nouveaux codes ajoutés (session 2026-02-13) ---
def test_k59_0_constipation(self):
"""K59.0 (constipation) est reconnu."""
is_valid, label = validate_code("K59.0")
assert is_valid
assert "constipation" in label.lower()
def test_z93_1_gastrostomie(self):
"""Z93.1 (gastrostomie) est reconnu."""
is_valid, label = validate_code("Z93.1")
assert is_valid
assert "gastrostomie" in label.lower()
def test_h92_0_otalgie(self):
"""H92.0 (otalgie) est reconnu."""
is_valid, label = validate_code("H92.0")
assert is_valid
def test_a87_0_meningite(self):
"""A87.0 (méningite à entérovirus) est reconnu."""
is_valid, label = validate_code("A87.0")
assert is_valid
def test_d64_9_anemie(self):
"""D64.9 (anémie sans précision) est reconnu."""
is_valid, label = validate_code("D64.9")
assert is_valid
assert "anémie" in label.lower()

View File

@@ -2,7 +2,7 @@
import pytest
from src.medical.das_filter import clean_diagnostic_text, is_valid_diagnostic_text
from src.medical.das_filter import clean_diagnostic_text, is_valid_diagnostic_text, correct_known_miscodes
class TestCleanDiagnosticText:
@@ -160,3 +160,35 @@ class TestIsValidDiagnosticText:
def test_accept_long_fragment(self):
"""Un fragment long commençant par 'Dans' peut être légitime."""
assert is_valid_diagnostic_text("Dans le cadre d'une insuffisance rénale chronique terminale")
class TestCorrectKnownMiscodes:
"""Tests pour la correction des codes systématiquement mal attribués."""
def test_d55_9_anemie_simple(self):
"""D55.9 + texte 'Anémie' → D64.9."""
assert correct_known_miscodes("D55.9", "Anémie") == "D64.9"
def test_d55_9_anemie_casse(self):
"""D55.9 + texte 'anémie' (minuscule) → D64.9."""
assert correct_known_miscodes("D55.9", "anémie") == "D64.9"
def test_d55_9_anemie_spaces(self):
"""D55.9 + texte avec espaces → D64.9."""
assert correct_known_miscodes("D55.9", " Anémie ") == "D64.9"
def test_d55_9_anemie_qualifiee_pas_corrige(self):
"""D55.9 + texte qualifié → pas de correction."""
assert correct_known_miscodes("D55.9", "Anémie ferriprive") is None
def test_d55_9_anemie_hemolytique_pas_corrige(self):
"""D55.9 + texte spécifique → pas de correction."""
assert correct_known_miscodes("D55.9", "Anémie hémolytique enzymatique") is None
def test_code_inconnu_pas_corrige(self):
"""Code non listé → pas de correction."""
assert correct_known_miscodes("I10", "HTA") is None
def test_d64_9_pas_corrige(self):
"""D64.9 lui-même → pas de correction."""
assert correct_known_miscodes("D64.9", "Anémie") is None

View File

@@ -155,6 +155,37 @@ class TestSourceFilesPopulated:
assert result.source_files == ["a.pdf", "b.pdf"]
class TestDasEqualDpRemoved:
"""Vérifie que les DAS dont le code est identique au DP sont retirés après fusion."""
def test_das_same_code_as_dp_removed(self):
d1 = DossierMedical(
diagnostic_principal=Diagnostic(texte="HTA", cim10_suggestion="I10"),
diagnostics_associes=[
Diagnostic(texte="Hypertension artérielle", cim10_suggestion="I10"),
Diagnostic(texte="Diabète", cim10_suggestion="E11.9"),
],
)
d2 = DossierMedical(
diagnostic_principal=Diagnostic(texte="HTA essentielle", cim10_suggestion="I10"),
)
result = merge_dossiers([d1, d2])
das_codes = [d.cim10_suggestion for d in result.diagnostics_associes]
assert "I10" not in das_codes, "DAS=DP doit être retiré"
assert "E11.9" in das_codes
def test_das_different_code_kept(self):
d1 = DossierMedical(
diagnostic_principal=Diagnostic(texte="Cholécystite", cim10_suggestion="K81.0"),
diagnostics_associes=[
Diagnostic(texte="HTA", cim10_suggestion="I10"),
],
)
result = merge_dossiers([d1])
das_codes = [d.cim10_suggestion for d in result.diagnostics_associes]
assert "I10" in das_codes
class TestFullMergeCROTrackare:
def test_full_merge_cro_trackare(self):
"""Cas réel : fusion Trackare + CRO."""