Medica Studio
Backend

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

Node.jspdf-parseFirebase FirestoreFirebase Admin SDKRegular Expressions (Regex)Chalk (CLI)Yargs (CLI args)fs-extradotenv
Parser Node.js robuste qui extrait automatiquement les actes paramédicaux (infirmiers, kinésithérapeutes, podologues, orthophonistes, orthoptistes, pédicures-podologues, diététiciens, psychomotriciens, ergothérapeutes) depuis le PDF NGAP officiel et génère une base de données structurée avec coefficients, tarifs, majorations, indemnités et règles de cumul. Utilise pdf-parse pour extraction de texte, regex avancées pour parsing des tableaux NGAP complexes (gestion césures, multi-lignes, références croisées), catégorisation automatique par heuristiques, calcul des tarifs (coefficient × valeur de base), et upload batch vers Firebase Firestore. Le système gère 37+ actes AMI/AIS/BSI, détecte les majorations (MAU, MCI, MIE, MN, MD, MF), indemnités (IFD, IFI, IK), et règles métier (Article 11B cumuls). Architecture extensible à toutes les professions paramédicales avec adaptation des regex par spécialité.

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

< 10s parsing complet
Latence
37 actes extraits (NGAP infirmiers)
Throughput
100% (script local)
Uptime
31
Actes AMI extraits
3
Actes AIS extraits
3 (BSA, BSB, BSC)
Forfaits BSI
9 spécialités
Professions paramédicales supportées

Exemples de code

javascript
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}
84

Informations

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