feat: Phase 4 — viewer enrichi, non-cumul CCAM, fusion multi-PDFs + rebuild FAISS (21 141 vecteurs)

- Viewer : badges compteurs (DAS, actes, alertes, CMA), raisonnement LLM pliable, regroupement CCAM, navigation patient, alertes NON-CUMUL en rouge
- Non-cumul CCAM : 3 règles heuristiques (même base, même regroupement/jour, paires incompatibles)
- Fusion multi-PDFs : merge_dossiers() avec priorité Trackare, spécificité CIM-10, déduplication, champ source_files
- Index FAISS reconstruit : 21 141 vecteurs (CCAM dict 8 257 + CIM-10 alpha 306)
- 192 tests unitaires passent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-11 12:43:34 +01:00
parent 7e69f994b0
commit 9d07894c6f
12 changed files with 1013 additions and 26 deletions

View File

@@ -123,6 +123,9 @@ def extract_medical_info(
# Post-processing : enrichissement sévérité (CMA/CMS heuristique)
_apply_severity_rules(dossier)
# Post-processing : détection non-cumul actes CCAM
_apply_noncumul_rules(dossier)
return dossier
@@ -702,6 +705,16 @@ def _apply_severity_rules(dossier: DossierMedical) -> None:
logger.warning("Erreur lors de l'évaluation de sévérité", exc_info=True)
def _apply_noncumul_rules(dossier: DossierMedical) -> None:
"""Détecte les incompatibilités de non-cumul entre actes CCAM."""
try:
from .ccam_noncumul import check_noncumul
alertes = check_noncumul(dossier.actes_ccam)
dossier.alertes_codage.extend(alertes)
except Exception:
logger.warning("Erreur lors de la vérification du non-cumul CCAM", exc_info=True)
def _lookup_cim10(text: str) -> str | None:
"""Cherche un code CIM-10 pour un texte donné.