feat(schema): module de nettoyage des JSONs pour consommation aval

Le pipeline produit un JSON riche pendant l'exécution (ratios
checkbox, OCR raw, flags _parse_error/_truncated_loop/_crop_recodage,
_source, _elapsed_s…). Utile en audit, mais pollue quand on veut
exposer le résultat à un consommateur aval (Excel, dashboard, API).

pipeline/schema.py :
- SCHEMA_VERSION "2.0"
- clean_dossier(raw) : retourne une copie propre avec structure stable
  (en-tête → codage → GHM/GHS → décisions) et validation ATIH en
  format compact (summary + cross_checks + flags par champ).
- CLEAN_FIELDS_RECUEIL / CLEAN_FIELDS_CONCERTATION_{1,2} / CLEAN_FIELDS_PREUVES
  documentent les champs stables par type de page.
- CLI : `python -m pipeline.schema` → nettoie `output/v2/*.json` vers
  `output/v2_clean/`.

Séparation claire : `output/v2/` reste le JSON raw (audit), `output/v2_clean/`
est la sortie propre et stable pour livrables.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-24 15:54:50 +02:00
parent 3f2e2ee9f4
commit b47f5c47e0
19 changed files with 4795 additions and 0 deletions

286
output/v2_clean/OGC 18.json Normal file
View File

@@ -0,0 +1,286 @@
{
"fichier": "OGC 18",
"pdf_hash": "0e7a44525007199c",
"schema_version": "2.0",
"extraction": {
"recueil": {
"etablissement": "CLINIQUE D'ARCACHON",
"finess": "330780206",
"date_debut_controle": "13/02/2018",
"n_ogc": "18",
"n_champ": "1",
"dates_sejour": "08/03/2016 au 21/03/2016",
"sejour_etab": {
"age": "66",
"sexe": "1",
"duree_sejour": "13 8",
"mode_entree": "",
"provenance": "",
"mode_sortie": "8",
"destination": ""
},
"sejour_reco": {
"age": "66",
"sexe": "1",
"duree_sejour": "13 8",
"mode_entree": "",
"provenance": "",
"mode_sortie": "8",
"destination": ""
},
"rum_etab": {
"um": "UM",
"igs": "IGS II",
"duree": "13",
"dates": "du 08/03/2016 au 21/03/2016"
},
"codage_etab": {
"dp": "E43",
"dp_libelle": "MALNUTRITION PROTEINO-ENERGETIQUE GRAVE, SAI",
"dr": "J860 4 PYOTHORAX AVEC FISTULE",
"das": [
{
"code": "T858",
"position": "2",
"libelle": "COMPLIC. DE PROTH., IMPL., GREF. INT., NCA"
},
{
"code": "Z511",
"position": "3",
"libelle": "SEANCE DE CHIMIOTHERAPIE POUR TUM."
}
]
},
"codage_reco": {
"dp": "",
"dr": "",
"das": []
},
"actes_etab": [],
"actes_reco": [],
"ghm_etab": "10M184",
"ghs_etab": "3970",
"ghm_reco": "10M183",
"ghs_reco": "3969",
"recodage_impactant": "1",
"ghs_injustifie": "0",
"accord_desaccord": "désaccord",
"praticien_conseil": "DR VIGNAU",
"_validation": {
"summary": {
"valid": 7,
"invalid": 1,
"empty": 2,
"total_codes": 8,
"ghm_ghs_incoherents": 0
},
"codage_etab": {
"dp": {
"valid": true,
"libelle_ref": "Malnutrition protéinoénergétique grave, sans précision"
},
"dr": {
"valid": false
},
"das": [
{
"valid": true,
"libelle_ref": "Autres complications de prothèses, implants et greffes internes, non classées ailleurs"
},
{
"valid": true,
"libelle_ref": "Séance de chimiothérapie pour tumeur"
}
]
},
"codage_reco": {
"dp": {
"valid": null
},
"dr": {
"valid": null
},
"das": []
},
"ghm_etab": {
"valid": true
},
"ghs_etab": {
"valid": true
},
"ghm_reco": {
"valid": true
},
"ghs_reco": {
"valid": true
},
"cross_checks": {
"etab_ghm_ghs_coherent": true,
"reco_ghm_ghs_coherent": true
}
}
},
"concertation_2": {
"ghs_initial": "3970",
"ghs_avant_concertation": "3969",
"ghs_final": "3969",
"decision": "",
"date_concertation": "2.3.18",
"praticien_controleur": "DR VIGNAU",
"medecin_dim": "DR ETTORCHI-TARDY",
"_validation": {
"ghs_initial": {
"code": "3970",
"valid": true
},
"ghs_avant_concertation": {
"code": "3969",
"valid": true
},
"ghs_final": {
"code": "3969",
"valid": true
}
}
},
"concertation_1": {
"date_concertation": "2.3.18",
"argumentaire": "105 : La facturation du GHS par l'établissement n'est pas conforme à l'article 1 de l'arrêté du 19 février 2015 modifié du fait d'un non-respect des règles de codage édictées dans l'annexe II de l'arrêté du 21 décembre 2015 modifiant l'arrêté du 22 février 2008. Le non-respect des règles porte sur un diagnostic associé significatif (DAS) codé par l'établissement dans le résumé d'unité médicale (RUM). Ce DAS n'est pas conforme aux règles de codage des diagnostics rappelées par l'annexe II, chapitre IV, paragraphe 2.1 : « Lorsqu'un patient atteint d'une maladie chronique ou de longue durée en cours de traitement est hospitalisé pour un autre motif, la maladie chronique ou de longue durée est naturellement un DAS, à moins qu'elle n'ait pas bénéficié d'une surveillance et que son traitement ait été interrompu pendant le séjour. (...) Les informations attestant de la majoration de l'effort de soins devant figurer dans le dossier médical. » Au vu des éléments du dossier du patient, la maladie chronique ou de longue durée codée en DAS par l'établissement n'a bénéficié d'aucune prise en charge diagnostique ou thérapeutique, ni majoré l'effort de prise en charge d'une autre affection."
},
"preuves": {
"date": "2018-03-13",
"praticien_controleur": [
"Dr RADZIKOWSKI",
"Dr DELAYE-PHULPIN",
"Dr TURBAN"
],
"medecin_dim": "Dr ETTORCHI-TARDY",
"pieces": [
{
"intitule": "Compte-rendu d'acte",
"present": true,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Compte-rendu opératoire",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Compte-rendu d'accouchement",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Compte-rendu d'examen complémentaire",
"present": true,
"photocopie": true,
"absent_date": "1ère demande",
"date_obtention": ""
},
{
"intitule": "Compte-rendu d'imagerie",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Compte-rendu d'anatomopathologie",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Observations médicales",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Dossier de transfusion",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Dossier d'anesthésie",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Administration thérapeutique",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Compte-rendu d'hospitalisation",
"present": true,
"photocopie": true,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Lettre de sortie",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Eléments de surveillance du dossier infirmier",
"present": true,
"photocopie": true,
"absent_date": "1 à 4",
"date_obtention": ""
},
{
"intitule": "Prise en charge psychologique",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Prise en charge kinésithérapeute",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Prise en charge diététique",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
},
{
"intitule": "Autre",
"present": false,
"photocopie": false,
"absent_date": "",
"date_obtention": ""
}
]
}
},
"_meta": {
"pipeline_version": "v1",
"ocr_model": "zai-org/GLM-OCR",
"generated_at": "2026-04-24T12:10:41+00:00"
}
}