Parser NGAP - Nomenclature Paramédicale Automatisé
Système d'extraction automatique et de structuration de la nomenclature NGAP (Nomenclature Générale des Actes Professionnels) depuis PDF officiel vers base de données exploitable
Stack Technique
Caractéristiques
Extraction PDF automatisée
Parser robuste avec pdf-parse qui extrait le texte du PDF NGAP officiel (version 01/07/2025), gère les en-têtes/pieds de page, supprime les césures en fin de ligne, normalise les espaces, et découpe par Titre XVI (Soins infirmiers).
Parsing structuré multi-niveaux
Extraction par chapitres (I, II, III), articles (1er, 2, 3, etc.), détection des actes avec regex avancées : codes (AMI 1.5, AIS 3.1), coefficients (1, 1.5, 2.5, 3.05), lettres-clés (AMI, AMX, AIS, SFI), descriptions multi-lignes.
Catégorisation automatique intelligente
Heuristiques par mots-clés pour 6 catégories : prélèvements (ponction, prise de sang), injections (vaccination, IV, IM), pansements (plaie, stomie), surveillance (perfusion, dialyse), appareil digestif/urinaire, suivis pathologies chroniques.
Calcul tarifaire précis
Application des coefficients sur valeur de base AMI (3.15€), support décimaux (1,5 / 3,9), détection majorations (MIE, MAU, MCI, MN, MD, MF), indemnités kilométriques (IFD, IFI, IK), règles de cumul Article 11B.
Upload Firestore optimisé
Script d'upload batch avec Firebase Admin SDK, chunking configurable (450 ops/batch), gestion limite 500 opérations Firestore, logs détaillés, support variables d'environnement (service account, collection, DB URL).
Extensibilité paramédicale complète
Architecture adaptable à 9 professions paramédicales : infirmiers, kinésithérapeutes, podologues, orthophonistes, orthoptistes, pédicures-podologues, diététiciens, psychomotriciens, ergothérapeutes. Champs HAD-compatible détectés automatiquement.
Performance
Exemples de code
1const fs = require("fs");
2const pdfParse = require("pdf-parse");
3require("dotenv").config();
4
5const AMI_VALUE = parseFloat(process.env.AMI_VALUE || "3.15");
6const PDF_PATH = process.env.PDF_PATH || "./NGAP 01.07.2025.pdf";
7
8// Nettoyage du texte PDF
9function dehyphenate(input) {
10 // Supprime les césures en fin de ligne: "décom-\nposé" -> "décomposé"
11 return input.replace(/-\n/g, "");
12}
13
14function normalizeSpaces(input) {
15 return input.replace(/[ \t]+/g, " ");
16}
17
18function stripHeadersFooters(input) {
19 const lines = input.split("\n");
20 const kept = [];
21 for (const raw of lines) {
22 const line = raw.trim();
23
24 // Headers/footers typiques
25 if (/^Version en vigueur du \d{2}\/\d{2}\/\d{4}/i.test(line)) continue;
26 if (/^(Première|Deuxième|Troisième|Quatrième|Cinquième) partie/i.test(line)) continue;
27 if (/^\d+$/.test(line)) continue; // numéros de page isolés
28
29 kept.push(raw);
30 }
31 return kept.join("\n");
32}
33
34function sliceTitreXVI(input) {
35 const startIdx = input.indexOf("TITRE XVI. - SOINS INFIRMIERS");
36 if (startIdx === -1) return "";
37 let endIdx = input.indexOf("Annexes", startIdx);
38 if (endIdx === -1) endIdx = input.length;
39 return input.slice(startIdx, endIdx);
40}
41
42// Parsing des actes
43async function parseNGAP() {
44 const dataBuffer = fs.readFileSync(PDF_PATH);
45 const pdfData = await pdfParse(dataBuffer);
46
47 // Nettoyage du texte
48 let text = pdfData.text;
49 text = dehyphenate(text);
50 text = normalizeSpaces(text);
51 text = stripHeadersFooters(text);
52
53 // Extraction Titre XVI
54 const titreXVI = sliceTitreXVI(text);
55
56 // Extraction des actes
57 const actes = [];
58 const acteRegex = /(?:AMI|AIS|AMX|SFI)\s+([\d,\.]+)/g;
59
60 let match;
61 while ((match = acteRegex.exec(titreXVI)) !== null) {
62 const coefficient = parseFloat(match[1].replace(",", "."));
63 const tarifBase = (coefficient * AMI_VALUE).toFixed(2);
64
65 actes.push({
66 code: match[0],
67 coefficient: coefficient,
68 tarifBase: parseFloat(tarifBase),
69 lettres: [match[0].split(" ")[0]],
70 category: detectCategory(match.input)
71 });
72 }
73
74 return {
75 metadata: {
76 source: PDF_PATH,
77 parsedAt: new Date().toISOString(),
78 version: "NGAP_2025_07_01",
79 totalActes: actes.length
80 },
81 actes: actes
82 };
83}
84Informations
- Année
- 2024-2025
- Version
- v1.0
Intéressé par ce projet ?
Discutons de vos besoins et voyons comment nous pouvons vous aider.
Nous contacter