.. _fhir_surveillance_sbec: ===================================================== Documentation FHIR R4 — Système de Surveillance SBE ===================================================== .. _selection-ressources: 1. Sélection des ressources ============================ .. _contexte-objectifs: 1.1 Contexte et objectifs -------------------------- Ce document décrit l'implémentation **FHIR R4** pour le système de surveillance épidémiologique basé sur les 4 piliers **(SBEc)** de PIVOT Madagascar, couvrant le district sanitaire d'**Ifanadiana**. La sélection des ressources FHIR a été guidée par les objectifs suivants : - **Surveillance épidémiologique** : détection et suivi des signaux sanitaires - **Gestion de la hiérarchie géographique** : District > Commune > CSB > Fokontany - **Évaluation des risques sanitaires** (SBEc_Evaluation) - **Communication des alertes** entre les niveaux du système de santé - **Suivi des substances** et agents pathogènes - **Regroupement des cas** et populations à risque .. _ressources-selectionnees: 1.2 Ressources FHIR sélectionnées ----------------------------------- .. list-table:: Ressources FHIR R4 sélectionnées pour le système SBEc :header-rows: 1 :widths: 20 40 40 * - Ressource FHIR - Usage dans SBEc - Référence HL7 * - **Location** - Hiérarchie géographique (District, Commune, CSB, Fokontany) - `hl7.org/fhir/R4/location.html `_ * - **Observation** - Signaux épidémiologiques (date détection, survenue, nb cas/décès) - `hl7.org/fhir/R4/observation.html `_ * - **Group** - Regroupement de cas, populations à risque - `hl7.org/fhir/R4/group.html `_ * - **RiskAssessment** - SBEc_Evaluation — Évaluation des risques - `hl7.org/fhir/R4/riskassessment.html `_ * - **Substance** - Agents pathogènes, substances dangereuses - `hl7.org/fhir/R4/substance.html `_ * - **Communication** - Alertes et communications entre acteurs - `hl7.org/fhir/R4/communication.html `_ * - **Patient** - Identification des patients - `hl7.org/fhir/R4/patient.html `_ * - **Encounter** - Consultations et visites - `hl7.org/fhir/R4/encounter.html `_ * - **Condition** - Diagnostics (ICD-10) - `hl7.org/fhir/R4/condition.html `_ * - **MedicationRequest** - Prescriptions médicamenteuses - `hl7.org/fhir/R4/medicationrequest.html `_ .. _relations-ressources: 1.3 Relations entre ressources -------------------------------- .. list-table:: Relations clés entre ressources FHIR :header-rows: 1 :widths: 25 20 25 30 * - Ressource source - Champ - Ressource cible - Description * - Observation (Signal) - ``subject`` - Location - Lieu de survenue du signal * - Observation (Signal) - ``focus`` - Group - Groupe de cas associé * - RiskAssessment - ``basis`` - Observation (Signal) - Signal évalué * - RiskAssessment - ``subject`` - Group - Population/groupe évalué * - Communication - ``payload/reference`` - RiskAssessment - Évaluation communiquée * - Communication - ``about`` - Observation (Signal) - Signal concerné * - Group - ``member`` - Patient - Patients du groupe * - Substance - *(référencé par)* - Observation - Agent pathogène identifié .. _flux-donnees: 1.4 Flux de données SBEc -------------------------- L'architecture SBEc repose sur une pyramide de ressources FHIR interconnectées. Voici l'ordre logique du flux de données : .. code-block:: text 1. Location ──► Définit la hiérarchie géographique District → Commune → CSB → Fokontany 2. Observation ──► Signal épidémiologique détecté à un lieu donné (Signal) 3. Group ──► Les cas sont regroupés par événement/localisation 4. RiskAssessment ──► L'évaluation SBEc est réalisée sur le signal 5. Substance ──► Identification de l'agent causal (si applicable) 6. Communication ──► Alerte et notification aux autorités sanitaires ---- .. _endpoints-api: 2. Endpoints des API REST =========================== .. note:: Toutes les URL sont relatives à la base URL : ``http://[serveur]/fhir/`` .. _ep-location: 2.1 Location — Hiérarchie géographique ---------------------------------------- .. list-table:: Endpoints REST — Location :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Lister les districts - ``GET`` - ``/Location?type=district`` - Tous les districts * - Communes d'un district - ``GET`` - ``/Location?type=commune&partof=Location/district-ifanadiana`` - Communes du district Ifanadiana * - CSB d'une commune - ``GET`` - ``/Location?type=csb&partof=Location/commune-kelilalina`` - CSB de la commune Kelilalina * - Fokontany d'une commune - ``GET`` - ``/Location?type=fokontany&partof=Location/commune-kelilalina`` - Fokontany de Kelilalina * - Lire un lieu - ``GET`` - ``/Location/{id}`` - Détail d'un lieu par son ID * - Créer un lieu - ``POST`` - ``/Location`` *(body JSON)* - Création d'un nouveau lieu * - Modifier un lieu - ``PUT`` - ``/Location/{id}`` *(body JSON)* - Mise à jour complète .. _ep-observation: 2.2 Observation — Signaux épidémiologiques ------------------------------------------- .. list-table:: Endpoints REST — Observation (Signaux) :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Tous les signaux - ``GET`` - ``/Observation?category=signal-epidemiologique`` - Liste de tous les signaux * - Signaux immédiats - ``GET`` - ``/Observation?category=signal-epidemiologique&signal-type=SIGNAL_IMMEDIAT`` - Signaux nécessitant une alerte immédiate * - Signaux d'un fokontany - ``GET`` - ``/Observation?category=signal-epidemiologique&subject=Location/fokontany-tsaratanana`` - Signaux d'un lieu donné * - Signaux sur une période - ``GET`` - ``/Observation?category=signal-epidemiologique&date=ge2026-05-01&date=le2026-05-31`` - Signaux dans un intervalle de dates * - Lire un signal - ``GET`` - ``/Observation/{id}`` - Détail d'un signal par son ID * - Créer un signal - ``POST`` - ``/Observation`` *(body JSON)* - Création d'un nouveau signal * - Modifier un signal - ``PUT`` - ``/Observation/{id}`` *(body JSON)* - Mise à jour d'un signal .. _ep-group: 2.3 Group — Regroupement ------------------------- .. list-table:: Endpoints REST — Group :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Tous les groupes - ``GET`` - ``/Group`` - Liste de tous les groupes * - Groupes actifs - ``GET`` - ``/Group?active=true`` - Groupes actuellement actifs * - Lire un groupe - ``GET`` - ``/Group/{id}`` - Détail d'un groupe par son ID * - Créer un groupe - ``POST`` - ``/Group`` *(body JSON)* - Création d'un nouveau groupe * - Modifier un groupe - ``PUT`` - ``/Group/{id}`` *(body JSON)* - Mise à jour d'un groupe .. _ep-riskassessment: 2.4 RiskAssessment — SBEc_Evaluation -------------------------------------- .. list-table:: Endpoints REST — RiskAssessment :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Toutes les évaluations - ``GET`` - ``/RiskAssessment`` - Liste de toutes les évaluations SBEc * - Évaluations à risque élevé - ``GET`` - ``/RiskAssessment?risk-level=high`` - Évaluations avec risque élevé * - Évaluation d'un signal - ``GET`` - ``/RiskAssessment?basis=Observation/signal-palu-001`` - Évaluation liée à un signal * - Lire une évaluation - ``GET`` - ``/RiskAssessment/{id}`` - Détail d'une évaluation * - Créer une évaluation - ``POST`` - ``/RiskAssessment`` *(body JSON)* - Création d'une évaluation SBEc .. _ep-substance: 2.5 Substance -------------- .. list-table:: Endpoints REST — Substance :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Toutes les substances - ``GET`` - ``/Substance`` - Liste de toutes les substances/agents * - Substances biologiques - ``GET`` - ``/Substance?category=biological`` - Agents pathogènes uniquement * - Lire une substance - ``GET`` - ``/Substance/{id}`` - Détail d'une substance * - Créer une substance - ``POST`` - ``/Substance`` *(body JSON)* - Ajout d'un nouvel agent pathogène .. _ep-communication: 2.6 Communication — Alertes ----------------------------- .. list-table:: Endpoints REST — Communication :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Toutes les alertes - ``GET`` - ``/Communication?category=alert`` - Liste de toutes les alertes * - Alertes urgentes - ``GET`` - ``/Communication?category=alert&priority=urgent`` - Alertes de priorité urgente * - Alertes d'un praticien - ``GET`` - ``/Communication?sender=Practitioner/med-district-001`` - Alertes envoyées par un praticien * - Lire une communication - ``GET`` - ``/Communication/{id}`` - Détail d'une communication * - Envoyer une alerte - ``POST`` - ``/Communication`` *(body JSON)* - Création d'une nouvelle alerte .. _ep-cliniques: 2.7 Ressources cliniques — Patient, Encounter, Condition, MedicationRequest ---------------------------------------------------------------------------- .. list-table:: Endpoints REST — Ressources cliniques (4 piliers) :header-rows: 1 :widths: 30 10 40 20 * - Opération - Méthode - URL - Description * - Patient par identifiant PIVOT - ``GET`` - ``/Patient?identifier=http://pivot.mg/fhir/identifiant-sanitaire|PIVOT-IFA-2026-00142`` - Recherche par identifiant sanitaire * - Patients d'un fokontany - ``GET`` - ``/Patient?fokontany=Tsaratanana`` - Patients d'un fokontany donné * - Patients d'un ASC - ``GET`` - ``/Patient?agent-communautaire=Practitioner/asc-017`` - Patients suivis par un ASC * - Consultations d'un patient - ``GET`` - ``/Encounter?patient=Patient/pivot-002`` - Visites d'un patient * - Observations d'une consultation - ``GET`` - ``/Observation?encounter=Encounter/enc-001`` - Mesures cliniques d'une consultation * - Diagnostics paludisme - ``GET`` - ``/Condition?code=http://hl7.org/fhir/sid/icd-10|B50`` - Conditions diagnostiquées paludisme * - Prescriptions ACT - ``GET`` - ``/MedicationRequest?medication=ACT`` - Prescriptions d'ACT .. _parametres-recherche: 2.8 Paramètres de recherche ----------------------------- **Paramètres existants — 4 piliers cliniques :** .. list-table:: Paramètres de recherche — Piliers cliniques :header-rows: 1 :widths: 20 25 15 40 * - Ressource - Paramètre - Type - Expression * - Patient - ``fokontany`` - String - ``Patient.extension.where(url='...pivot-fokontany').value`` * - Patient - ``agent-communautaire`` - Reference - ``Patient.extension.where(url='...pivot-agent-communautaire').value`` * - Patient - ``district`` - String - ``Patient.address.district`` * - Patient - ``commune`` - String - ``Patient.address.city`` * - Encounter - ``type-visite`` - Token - ``Encounter.class`` * - Condition - ``diagnostic-icd10`` - Token - ``Condition.code.coding.where(system='...icd-10')`` * - MedicationRequest - ``medicament-pivot`` - Token - ``MedicationRequest.medication...where(system='...pivot-medicaments')`` **Nouveaux paramètres de recherche SBEc :** .. list-table:: Paramètres de recherche — SBEc :header-rows: 1 :widths: 25 25 15 35 * - Ressource - Paramètre - Type - Description * - Observation (Signal) - ``signal-type`` - Token - Recherche par type de signal (SIGNAL_IMMEDIAT, etc.) * - Observation (Signal) - ``signal-location`` - Reference - Recherche par lieu de survenue * - Observation (Signal) - ``signal-date-survenue`` - Date - Recherche par date de survenue * - RiskAssessment - ``risk-level`` - Token - Recherche par niveau de risque * - RiskAssessment - ``evaluation-date`` - Date - Recherche par date d'évaluation * - Communication - ``alert-priority`` - Token - Recherche par priorité d'alerte * - Communication - ``alert-sender`` - Reference - Recherche par expéditeur * - Location - ``location-type`` - Token - Recherche par type (district, commune, csb, fokontany) * - Location - ``location-parent`` - Reference - Recherche par lieu parent (partOf) ---- .. _formats: 3. Format ========== .. _formats-donnees-fhir: 3.1 Formats de données FHIR ----------------------------- **Types de contenu (Content-Type) :** Le serveur FHIR PIVOT supporte deux formats de représentation des ressources : .. list-table:: Formats de données supportés :header-rows: 1 :widths: 15 35 25 25 * - Format - Content-Type - Paramètre ``_format`` - Usage * - **JSON** - ``application/fhir+json`` - ``_format=json`` - Format principal (recommandé) * - **XML** - ``application/fhir+xml`` - ``_format=xml`` - Format alternatif **En-têtes HTTP requis :** .. list-table:: En-têtes HTTP :header-rows: 1 :widths: 25 40 35 * - En-tête - Valeur - Description * - ``Content-Type`` - ``application/fhir+json; charset=utf-8`` - Format du corps de requête (POST/PUT) * - ``Accept`` - ``application/fhir+json`` - Format de réponse souhaité * - ``Authorization`` - ``Bearer {token}`` - Token OAuth2 (en production) * - ``If-Match`` - ``W/"{versionId}"`` - Contrôle de concurrence (PUT conditionnel) .. _format-bundle: 3.2 Format Bundle — lot de ressources --------------------------------------- Le Bundle FHIR permet d'envoyer ou recevoir plusieurs ressources en une seule requête. .. list-table:: Types de Bundle utilisés dans SBEc :header-rows: 1 :widths: 20 40 25 15 * - Type Bundle - Usage SBEc - Méthode HTTP - Atomique * - ``transaction`` - Créer plusieurs ressources liées en une opération atomique - ``POST /`` - ✅ Oui * - ``batch`` - Envoyer plusieurs opérations indépendantes - ``POST /`` - ❌ Non * - ``searchset`` - Résultat d'une recherche (retourné par le serveur) - ``GET`` (réponse) - — * - ``collection`` - Export de données, rapport - N/A - — **Exemple de Bundle transaction :** .. code-block:: json :caption: Bundle transaction — Signal + Group { "resourceType": "Bundle", "type": "transaction", "entry": [ { "fullUrl": "urn:uuid:signal-001", "resource": { "resourceType": "Observation", "id": "signal-palu-001", "status": "final", "category": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-observation-category", "code": "signal-epidemiologique"}]}], "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "B54"}]} }, "request": {"method": "PUT", "url": "Observation/signal-palu-001"} }, { "fullUrl": "urn:uuid:group-001", "resource": { "resourceType": "Group", "id": "cas-palu-001", "type": "person", "actual": true }, "request": {"method": "PUT", "url": "Group/cas-palu-001"} } ] } .. _format-searchset: 3.3 Format searchset — réponse de recherche --------------------------------------------- **Exemple de réponse paginée à une recherche :** .. code-block:: json :caption: Bundle searchset — réponse paginée { "resourceType": "Bundle", "type": "searchset", "total": 42, "link": [ {"relation": "self", "url": "http://[serveur]/fhir/Observation?category=signal-epidemiologique&_count=10"}, {"relation": "next", "url": "http://[serveur]/fhir/Observation?category=signal-epidemiologique&_count=10&_offset=10"} ], "entry": [ { "fullUrl": "http://[serveur]/fhir/Observation/signal-palu-001", "resource": {"resourceType": "Observation", "id": "signal-palu-001"}, "search": {"mode": "match"} } ] } .. _format-operationoutcome: 3.4 Format OperationOutcome — erreurs et avertissements --------------------------------------------------------- Lorsqu'une requête échoue ou génère un avertissement, le serveur retourne une ressource ``OperationOutcome`` : .. list-table:: Codes de réponse HTTP :header-rows: 1 :widths: 15 25 60 * - Code HTTP - Signification - Quand * - ``200 OK`` - Succès (lecture, recherche) - GET réussi * - ``201 Created`` - Ressource créée - POST réussi * - ``400 Bad Request`` - Requête mal formée - JSON invalide, champ obligatoire manquant * - ``401 Unauthorized`` - Non authentifié - Token manquant ou expiré * - ``404 Not Found`` - Ressource inexistante - ID inconnu * - ``409 Conflict`` - Conflit de version - Mise à jour concurrente * - ``422 Unprocessable`` - Validation échouée - Non conforme au profil FHIR **Exemple d'OperationOutcome (erreur 422) :** .. code-block:: json :caption: OperationOutcome — erreur de validation { "resourceType": "OperationOutcome", "issue": [ { "severity": "error", "code": "required", "details": { "text": "Observation.category est obligatoire pour un signal epidemiologique" }, "diagnostics": "Le champ 'category' avec le code 'signal-epidemiologique' est requis par le profil PivotObservationSignal", "expression": ["Observation.category"] } ] } .. _format-pagination: 3.5 Format de pagination ------------------------- .. list-table:: Paramètres de pagination :header-rows: 1 :widths: 15 35 20 30 * - Paramètre - Description - Valeur par défaut - Exemple * - ``_count`` - Nombre de résultats par page - 20 - ``?_count=50`` * - ``_offset`` - Position de départ - 0 - ``?_offset=20`` * - ``_sort`` - Tri des résultats - non trié - ``?_sort=-date`` *(décroissant)* * - ``_total`` - Inclure le total - accurate - ``?_total=none`` *(désactiver le comptage)* * - ``_include`` - Inclure les ressources référencées - aucune - ``?_include=Observation:subject`` ---- .. _profils: 4. Profils =========== .. _profil-location: 4.1 Profil PivotLocation ------------------------- La ressource `Location `_ modélise la hiérarchie administrative de Madagascar : **District → Commune → CSB → Fokontany**. .. list-table:: Profil PivotLocation — Champs :header-rows: 1 :widths: 30 10 15 30 15 * - Champ FHIR - Card. - Type - Description - Exemple * - ``Location.identifier`` - 1..* - Identifier - Identifiant unique du lieu - ``LOC-IFA-001`` * - ``Location.status`` - 1..1 - Code - Statut du lieu (active | inactive) - ``active`` * - ``Location.name`` - 1..1 - String - Nom du lieu - District Ifanadiana * - ``Location.mode`` - 1..1 - Code - instance | kind - ``instance`` * - ``Location.type`` - 1..1 - CodeableConcept - Type de lieu (district, commune, csb, fokontany) - ``district`` * - ``Location.address`` - 0..1 - Address - Adresse (district, city) - ``{"district":"Ifanadiana"}`` * - ``Location.address.district`` - 1..1 - String - District sanitaire - Ifanadiana * - ``Location.address.city`` - 0..1 - String - Commune - Kelilalina * - ``Location.physicalType`` - 0..1 - CodeableConcept - Type physique du lieu - ``bu`` (Building) / ``area`` * - ``Location.partOf`` - 0..1 - Reference(Location) - Lieu parent dans la hiérarchie - ``Location/district-ifanadiana`` * - ``Location.managingOrganization`` - 0..1 - Reference(Organization) - Organisation gestionnaire - ``Organization/csb-kelilalina`` **Hiérarchie géographique via** ``partOf`` **:** .. list-table:: Niveaux hiérarchiques — Location :header-rows: 1 :widths: 15 15 30 40 * - Niveau - ``Location.type`` - ``partOf`` - Exemple * - District - ``district`` - *(aucun — niveau racine)* - District Ifanadiana * - Commune - ``commune`` - Reference → Location (District) - Commune Kelilalina → District Ifanadiana * - CSB - ``csb`` - Reference → Location (Commune) - CSB II Kelilalina → Commune Kelilalina * - Fokontany - ``fokontany`` - Reference → Location (Commune) - Fokontany Tsaratanana → Commune Kelilalina **Exemple JSON — Hiérarchie complète :** .. code-block:: json :caption: District Ifanadiana { "resourceType": "Location", "id": "district-ifanadiana", "identifier": [{"system": "http://[serveur]/fhir/location", "value": "LOC-DIST-IFA"}], "status": "active", "name": "District Ifanadiana", "mode": "instance", "type": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-location-type", "code": "district", "display": "District sanitaire"}]}], "address": {"district": "Ifanadiana"} } .. code-block:: json :caption: Commune Kelilalina { "resourceType": "Location", "id": "commune-kelilalina", "status": "active", "name": "Commune Kelilalina", "mode": "instance", "type": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-location-type", "code": "commune", "display": "Commune"}]}], "address": {"district": "Ifanadiana", "city": "Kelilalina"}, "partOf": {"reference": "Location/district-ifanadiana", "display": "District Ifanadiana"} } .. code-block:: json :caption: CSB II Kelilalina { "resourceType": "Location", "id": "csb2-kelilalina", "status": "active", "name": "CSB II Kelilalina", "mode": "instance", "type": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-location-type", "code": "csb", "display": "Centre de Santé de Base"}]}], "address": {"district": "Ifanadiana", "city": "Kelilalina"}, "physicalType": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/location-physical-type", "code": "bu", "display": "Building"}]}, "partOf": {"reference": "Location/commune-kelilalina", "display": "Commune Kelilalina"}, "managingOrganization": {"reference": "Organization/csb-kelilalina"} } .. code-block:: json :caption: Fokontany Tsaratanana { "resourceType": "Location", "id": "fokontany-tsaratanana", "status": "active", "name": "Fokontany Tsaratanana", "mode": "instance", "type": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-location-type", "code": "fokontany", "display": "Fokontany"}]}], "address": {"district": "Ifanadiana", "city": "Kelilalina"}, "partOf": {"reference": "Location/commune-kelilalina", "display": "Commune Kelilalina"} } .. _profil-observation-signal: 4.2 Profil PivotObservationSignal ----------------------------------- La ressource `Observation `_ est réutilisée pour les **signaux épidémiologiques** du système SBEc. Chaque signal est une Observation avec la catégorie spéciale ``signal-epidemiologique``. .. list-table:: Profil PivotObservationSignal — Champs :header-rows: 1 :widths: 38 10 15 22 15 * - Champ FHIR - Card. - Type - Description SBEc - Mapping * - ``Observation.status`` - 1..1 - code - Statut du signal - registered | preliminary | final * - ``Observation.category`` - 1..1 - CodeableConcept - Catégorie = ``signal-epidemiologique`` - Code: ``signal-epidemiologique`` * - ``Observation.code`` - 1..1 - CodeableConcept - Nature du signal (maladie/événement) - Ex: Paludisme, Rougeole, Diarrhée * - ``Observation.subject`` - 0..1 - Reference(Location) - Lieu de survenue du signal - → Location (Fokontany/Commune/CSB) * - ``Observation.focus`` - 0..* - Reference(Group) - Groupe de cas associé - → Group (cas regroupés) * - ``Observation.effectiveDateTime`` - 1..1 - dateTime - Date de détection du signal - Date détection * - ``Observation.issued`` - 0..1 - instant - Date de notification/rapport - Date rapport * - ``Observation.performer`` - 0..* - Reference(Practitioner) - Qui a détecté le signal - ASC / Médecin CSB * - ``component[0]`` *(date_survenue)* - 1..1 - component - Date de survenue effective - ``pivot-signal-date-survenue`` * - ``component[1]`` *(nb_cas)* - 1..1 - component - Nombre de cas détectés - ``pivot-signal-nb-cas`` * - ``component[2]`` *(nb_deces)* - 0..1 - component - Nombre de décès - ``pivot-signal-nb-deces`` * - ``Extension: type-signal`` - 1..1 - Extension - Type de signal (3 types) - Voir ci-dessous **Extension — Type de signaux :** .. list-table:: Extension pivot-type-signal :header-rows: 1 :widths: 25 75 * - Propriété - Valeur * - URL - ``http://[serveur]/StructureDefinition/pivot-type-signal`` * - Contexte - Observation (catégorie signal-epidemiologique) * - Type de valeur - CodeableConcept * - Cardinalité - 1..1 (obligatoire) * - Binding - ``http://pivot.mg/fhir/ValueSet/pivot-type-signal`` (required) **Les 3 types de signaux :** .. list-table:: Types de signaux épidémiologiques :header-rows: 1 :widths: 22 23 55 * - Code - Display - Définition * - ``SIGNAL_IMMEDIAT`` - Signal immédiat - Événement sanitaire nécessitant une alerte immédiate (épidémie confirmée, maladie à déclaration obligatoire, mortalité anormale) * - ``SIGNAL_INHABITUEL`` - Signal inhabituel - Événement sanitaire inhabituel nécessitant une investigation (augmentation anormale de cas, apparition d'une pathologie rare, cluster géographique) * - ``SIGNAL_TENDANCE`` - Signal de tendance - Tendance épidémiologique observée sur une période (augmentation progressive, saisonnalité anormale, dépassement de seuil) **Exemple JSON — Signal épidémiologique :** .. code-block:: json :caption: Observation — Signal paludisme (SIGNAL_IMMEDIAT) { "resourceType": "Observation", "id": "signal-palu-001", "meta": { "profile": ["http://[serveur]/fhir/StructureDefinition/pivot-observation-signal"] }, "extension": [{ "url": "http://[serveur]/fhir/StructureDefinition/pivot-type-signal", "valueCodeableConcept": { "coding": [{ "system": "http://[serveur]/fhir/CodeSystem/pivot-type-signal", "code": "SIGNAL_IMMEDIAT", "display": "Signal immédiat" }] } }], "status": "final", "category": [{"coding": [{ "system": "http://[serveur]/fhir/CodeSystem/pivot-observation-category", "code": "signal-epidemiologique", "display": "Signal épidémiologique" }]}], "code": {"coding": [{ "system": "http://hl7.org/fhir/sid/icd-10", "code": "B54", "display": "Paludisme, sans précision" }]}, "subject": {"reference": "Location/fokontany-tsaratanana", "display": "Fokontany Tsaratanana"}, "focus": [{"reference": "Group/cas-palu-tsaratanana-202605"}], "effectiveDateTime": "2026-05-28T08:00:00+03:00", "issued": "2026-05-28T10:00:00+03:00", "performer": [{"reference": "Practitioner/asc-017", "display": "Rasoa Vola (ASC)"}], "component": [ { "code": {"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-signal-component", "code": "date-survenue", "display": "Date de survenue"}]}, "valueDateTime": "2026-05-25" }, { "code": {"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-signal-component", "code": "nombre-cas", "display": "Nombre de cas"}]}, "valueInteger": 15 }, { "code": {"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-signal-component", "code": "nombre-deces", "display": "Nombre de décès"}]}, "valueInteger": 2 } ] } .. _profil-group: 4.3 Profil PivotGroup ---------------------- La ressource `Group `_ permet de regrouper les cas liés à un même signal épidémiologique ou une même zone géographique. .. list-table:: Profil PivotGroup — Champs :header-rows: 1 :widths: 28 10 18 29 15 * - Champ FHIR - Card. - Type - Description - Exemple * - ``Group.identifier`` - 0..* - Identifier - Identifiant du groupe - ``GRP-PALU-IFA-202605`` * - ``Group.active`` - 1..1 - boolean - Groupe actif ou non - ``true`` * - ``Group.type`` - 1..1 - code - Type de groupe - ``person`` * - ``Group.actual`` - 1..1 - boolean - Groupe réel (pas théorique) - ``true`` * - ``Group.code`` - 0..1 - CodeableConcept - Nature du regroupement - Cas de paludisme * - ``Group.name`` - 0..1 - string - Nom descriptif du groupe - Cas paludisme Tsaratanana Mai 2026 * - ``Group.quantity`` - 0..1 - unsignedInt - Nombre de membres - ``15`` * - ``Group.managingEntity`` - 0..1 - Reference(Organization) - Organisation responsable - ``Organization/csb-kelilalina`` * - ``Group.member`` - 0..* - BackboneElement - Membres du groupe - Voir ci-dessous * - ``Group.member.entity`` - 1..1 - Reference(Patient) - Patient membre - ``Patient/pivot-002`` * - ``Group.member.period`` - 0..1 - Period - Période d'appartenance - 2026-05-25 → (en cours) **Exemple JSON — Group :** .. code-block:: json :caption: Group — Cas paludisme Tsaratanana Mai 2026 { "resourceType": "Group", "id": "cas-palu-tsaratanana-202605", "identifier": [{"system": "http://[serveur]/fhir/group", "value": "GRP-PALU-IFA-202605-001"}], "active": true, "type": "person", "actual": true, "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "B54", "display": "Paludisme, sans précision"}]}, "name": "Cas paludisme Fokontany Tsaratanana - Mai 2026", "quantity": 15, "managingEntity": {"reference": "Organization/csb-kelilalina", "display": "CSB II Kelilalina"}, "member": [ { "entity": {"reference": "Patient/pivot-002", "display": "Rasoa Nirina"}, "period": {"start": "2026-05-25"} }, { "entity": {"reference": "Patient/pivot-001", "display": "Rakoto Hery"}, "period": {"start": "2026-05-26"} } ] } .. _profil-riskassessment: 4.4 Profil PivotRiskAssessment — SBEc_Evaluation -------------------------------------------------- La ressource `RiskAssessment `_ modélise l'**évaluation SBEc** (Surveillance Basée sur les Événements communautaires). Elle permet d'évaluer le risque associé à un signal épidémiologique détecté. .. list-table:: Profil PivotRiskAssessment — Champs :header-rows: 1 :widths: 38 10 18 22 12 * - Champ FHIR - Card. - Type - Description SBEc - Exemple * - ``RiskAssessment.identifier`` - 0..* - Identifier - Identifiant de l'évaluation - ``EVAL-SBEc-001`` * - ``RiskAssessment.status`` - 1..1 - code - Statut de l'évaluation - final | preliminary | amended * - ``RiskAssessment.method`` - 0..1 - CodeableConcept - Méthode d'évaluation - SBEc - Évaluation communautaire * - ``RiskAssessment.subject`` - 1..1 - Reference(Group) - Groupe/population évalué - ``Group/cas-palu-tsaratanana`` * - ``RiskAssessment.encounter`` - 0..1 - Reference(Encounter) - Consultation associée - ``Encounter/enc-eval-001`` * - ``RiskAssessment.occurrenceDateTime`` - 1..1 - dateTime - Date de l'évaluation - ``2026-05-29`` * - ``RiskAssessment.condition`` - 0..1 - Reference(Condition) - Condition évaluée - Condition (paludisme) * - ``RiskAssessment.performer`` - 0..1 - Reference(Practitioner) - Évaluateur - Médecin district * - ``RiskAssessment.basis`` - 0..* - Reference(Observation) - Signal(aux) de base - ``Observation/signal-palu-001`` * - ``prediction.outcome`` - 0..1 - CodeableConcept - Résultat prévu - Épidémie confirmée * - ``prediction.probabilityDecimal`` - 0..1 - decimal - Probabilité (0-1) - ``0.85`` * - ``prediction.qualitativeRisk`` - 0..1 - CodeableConcept - Niveau de risque - high | moderate | low * - ``prediction.rationale`` - 0..1 - string - Justification - Augmentation rapide des cas... * - ``RiskAssessment.mitigation`` - 0..1 - string - Actions d'atténuation recommandées - Distribution ACT + pulvérisation * - ``RiskAssessment.note`` - 0..* - Annotation - Notes complémentaires - Recommandation d'investigation **Exemple JSON — SBEc_Evaluation :** .. code-block:: json :caption: RiskAssessment — Évaluation SBEc paludisme { "resourceType": "RiskAssessment", "id": "sbec-eval-001", "identifier": [{"system": "http://[serveur]/fhir/evaluation", "value": "EVAL-SBEc-IFA-202605-001"}], "status": "final", "method": {"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-evaluation-method", "code": "SBEc", "display": "Surveillance Basée sur les Événements communautaires"}]}, "subject": { "reference": "Group/cas-palu-tsaratanana-202605", "display": "Cas paludisme Tsaratanana Mai 2026" }, "occurrenceDateTime": "2026-05-29T14:00:00+03:00", "performer": { "reference": "Practitioner/med-district-001", "display": "Dr Andriamanalina (Médecin district)" }, "basis": [{"reference": "Observation/signal-palu-001", "display": "Signal paludisme Tsaratanana"}], "prediction": [{ "outcome": {"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-risk-outcome", "code": "EPIDEMIE_CONFIRMEE", "display": "Épidémie confirmée"}]}, "probabilityDecimal": 0.85, "qualitativeRisk": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/risk-probability", "code": "high", "display": "High likelihood"}]}, "rationale": "15 cas en 3 jours dans un fokontany de 200 habitants. Taux d'attaque > 5%. TDR positif chez 90% des cas testés." }], "mitigation": "1) Distribution immédiate d'ACT. 2) Pulvérisation intra-domiciliaire. 3) Distribution de moustiquaires. 4) Renforcement du dépistage actif par les ASC.", "note": [{"text": "Investigation de terrain recommandée sous 24h. Notification au niveau régional."}] } .. _profil-substance: 4.5 Profil PivotSubstance -------------------------- La ressource `Substance `_ identifie les agents pathogènes, toxines ou substances impliquées dans un événement sanitaire. .. list-table:: Profil PivotSubstance — Champs :header-rows: 1 :widths: 28 10 18 29 15 * - Champ FHIR - Card. - Type - Description - Exemple * - ``Substance.identifier`` - 0..* - Identifier - Identifiant de la substance - ``SUB-PFAL-001`` * - ``Substance.status`` - 0..1 - code - active | inactive | entered-in-error - ``active`` * - ``Substance.category`` - 0..* - CodeableConcept - Catégorie de substance - ``biological`` (agent biologique) * - ``Substance.code`` - 1..1 - CodeableConcept - Code de la substance - Plasmodium falciparum * - ``Substance.description`` - 0..1 - string - Description - Parasite responsable du paludisme grave * - ``Substance.instance`` - 0..* - BackboneElement - Instance spécifique - *(si échantillon)* * - ``Substance.ingredient`` - 0..* - BackboneElement - Composants - *(si substance composée)* **Exemple JSON — Substance :** .. code-block:: json :caption: Substance — Plasmodium falciparum { "resourceType": "Substance", "id": "pathogene-pfalciparum", "identifier": [{"system": "http://[serveur]/fhir/substance", "value": "SUB-PFAL-001"}], "status": "active", "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/substance-category", "code": "biological", "display": "Biological Substance"}]}], "code": { "coding": [{"system": "http://snomed.info/sct", "code": "30020004", "display": "Plasmodium falciparum"}], "text": "Plasmodium falciparum - agent du paludisme grave" }, "description": "Parasite protozoaire responsable de la forme la plus grave du paludisme. Principal agent identifié dans le district d'Ifanadiana." } .. _profil-communication: 4.6 Profil PivotCommunication ------------------------------- La ressource `Communication `_ modélise les **alertes, notifications et échanges d'information** entre les différents niveaux du système de santé suite à la détection d'un signal épidémiologique. .. list-table:: Profil PivotCommunication — Champs :header-rows: 1 :widths: 32 10 20 38 * - Champ FHIR - Card. - Type - Description * - ``Communication.identifier`` - 0..* - Identifier - Identifiant de la communication * - ``Communication.status`` - 1..1 - code - completed | in-progress | preparation * - ``Communication.category`` - 0..* - CodeableConcept - ``alert`` (alerte sanitaire) * - ``Communication.priority`` - 0..1 - code - routine | urgent | asap | stat * - ``Communication.subject`` - 0..1 - Reference(Group) - Sujet — groupe de cas * - ``Communication.about`` - 0..* - Reference(Observation) - Signal(aux) concerné(s) * - ``Communication.sent`` - 0..1 - dateTime - Date d'envoi * - ``Communication.received`` - 0..1 - dateTime - Date de réception * - ``Communication.sender`` - 0..1 - Reference(Practitioner|Organization) - Expéditeur * - ``Communication.recipient`` - 0..* - Reference(Practitioner|Organization) - Destinataire(s) * - ``Communication.payload.contentString`` - 0..1 - string - Texte du message * - ``Communication.payload.contentReference`` - 0..1 - Reference - Référence à l'évaluation (RiskAssessment) * - ``Communication.reasonReference`` - 0..* - Reference(Observation) - Signal déclencheur **Exemple JSON — Communication (Alerte) :** .. code-block:: json :caption: Communication — Alerte paludisme urgente { "resourceType": "Communication", "id": "alert-palu-001", "identifier": [{"system": "http://[serveur]/fhir/communication", "value": "COM-ALERT-IFA-202605-001"}], "status": "completed", "category": [{"coding": [{"system": "http://[serveur]/fhir/CodeSystem/pivot-communication-category", "code": "alert", "display": "Alerte sanitaire"}]}], "priority": "urgent", "subject": {"reference": "Group/cas-palu-tsaratanana-202605", "display": "Cas paludisme Tsaratanana Mai 2026"}, "about": [{"reference": "Observation/signal-palu-001", "display": "Signal paludisme Tsaratanana"}], "sent": "2026-05-29T15:00:00+03:00", "received": "2026-05-29T15:05:00+03:00", "sender": { "reference": "Practitioner/med-district-001", "display": "Dr Andriamanalina (Médecin district Ifanadiana)" }, "recipient": [{"reference": "Organization/drsp-vatovavy", "display": "DRSP Vatovavy-Fitovinany (Direction Régionale)"}], "payload": [ { "contentString": "ALERTE - Paludisme\n\nDistrict: Ifanadiana\nFokontany: Tsaratanana\nNombre de cas: 15\nNombre de décès: 2\nDate de survenue: 25/05/2026\nDate de détection: 28/05/2026\n\nÉvaluation SBEc: Risque ÉLEVÉ (probabilité 85%)\nActions en cours: Distribution ACT, pulvérisation, dépistage actif.\n\nInvestigation de terrain recommandée sous 24h." }, { "contentReference": { "reference": "RiskAssessment/sbec-eval-001", "display": "Évaluation SBEc - Paludisme Tsaratanana" } } ], "reasonReference": [{"reference": "Observation/signal-palu-001"}] } .. _profils-cliniques: 4.7 Profils cliniques existants — 4 Piliers -------------------------------------------- Ces ressources constituent le **socle clinique** du système PIVOT, déjà défini dans les profils FHIR existants (``profils-fhir-pivot.json``). .. rubric:: Patient — PivotPatient **Profil :** ``http://[serveur]/fhir/StructureDefinition/pivot-patient`` .. list-table:: :header-rows: 1 :widths: 35 10 20 35 * - Champ - Card. - Type - Description * - ``identifier`` *(identifiantSanitaire)* - 1..1 - Identifier - Identifiant sanitaire PIVOT (``system: http://[serveur]/fhir/identifiant-sanitaire``) * - ``name.family`` - 1..1 - string - Nom de famille * - ``name.given`` - 1..* - string - Prénom(s) * - ``gender`` - 1..1 - code - Sexe (male | female) * - ``birthDate`` - 1..1 - date - Date de naissance * - ``telecom`` - 0..* - ContactPoint - Téléphone (si disponible) * - ``address.district`` - 1..1 - string - District sanitaire * - ``address.city`` - 1..1 - string - Commune * - ``extension:fokontany`` - 0..1 - Extension(string) - Fokontany du patient * - ``extension:agentCommunautaire`` - 0..1 - Extension(Reference) - ASC référent .. rubric:: Encounter — PivotEncounter **Profil :** ``http://[serveur]/fhir/StructureDefinition/pivot-encounter`` .. list-table:: :header-rows: 1 :widths: 30 10 20 40 * - Champ - Card. - Type - Description * - ``status`` - 1..1 - code - planned | arrived | in-progress | finished | cancelled * - ``class`` - 1..1 - Coding - Type de visite (AMB, HH, FLD, IMP, EMER, REF) * - ``subject`` - 1..1 - Reference(Patient) - Patient concerné * - ``participant`` - 1..* - BackboneElement - Praticien ou ASC responsable * - ``period.start`` - 1..1 - dateTime - Début de consultation * - ``serviceProvider`` - 1..1 - Reference(Organization) - Structure de santé (CSB, hôpital) * - ``location`` - 1..* - BackboneElement - Lieu physique .. rubric:: Observation clinique — PivotObservation **Profil :** ``http://[serveur]/fhir/StructureDefinition/pivot-observation`` .. list-table:: :header-rows: 1 :widths: 30 10 25 35 * - Champ - Card. - Type - Description * - ``status`` - 1..1 - code - final | amended | cancelled * - ``category`` - 1..1 - CodeableConcept - vital-signs, laboratory, etc. * - ``code`` - 1..1 - CodeableConcept - Code LOINC (poids, température, TDR, MUAC...) * - ``subject`` - 1..1 - Reference(Patient) - Patient mesuré * - ``encounter`` - 0..1 - Reference(Encounter) - Consultation associée * - ``effectiveDateTime`` - 1..1 - dateTime - Date/heure de la mesure * - ``performer`` - 0..* - Reference(Practitioner) - Praticien/ASC * - ``value[x]`` - 0..1 - Quantity|string|CodeableConcept - Résultat de la mesure .. rubric:: Condition — PivotCondition **Profil :** ``http://[serveur]/fhir/StructureDefinition/pivot-condition`` .. list-table:: :header-rows: 1 :widths: 30 10 20 40 * - Champ - Card. - Type - Description * - ``clinicalStatus`` - 1..1 - CodeableConcept - active | recurrence | inactive | resolved * - ``verificationStatus`` - 1..1 - CodeableConcept - confirmed | provisional | refuted * - ``category`` - 1..1 - CodeableConcept - encounter-diagnosis | problem-list-item * - ``code`` - 1..1 - CodeableConcept - Code ICD-10 du diagnostic * - ``subject`` - 1..1 - Reference(Patient) - Patient diagnostiqué * - ``encounter`` - 1..1 - Reference(Encounter) - Consultation du diagnostic * - ``onsetDateTime`` - 0..1 - dateTime - Date d'apparition des symptômes * - ``recordedDate`` - 1..1 - date - Date d'enregistrement .. rubric:: MedicationRequest — PivotMedicationRequest **Profil :** ``http://[serveur]/fhir/StructureDefinition/pivot-medication-request`` .. list-table:: :header-rows: 1 :widths: 30 10 20 40 * - Champ - Card. - Type - Description * - ``status`` - 1..1 - code - active | completed | cancelled * - ``intent`` - 1..1 - code - ``order`` (fixé) * - ``medicationCodeableConcept`` - 1..1 - CodeableConcept - Médicament (ACT, Amoxicilline, SRO...) * - ``subject`` - 1..1 - Reference(Patient) - Patient * - ``encounter`` - 1..1 - Reference(Encounter) - Consultation * - ``authoredOn`` - 1..1 - dateTime - Date de prescription * - ``requester`` - 1..1 - Reference(Practitioner) - Prescripteur * - ``reasonReference`` - 0..* - Reference(Condition) - Diagnostic justifiant * - ``dosageInstruction.text`` - 1..1 - string - Posologie en texte libre .. _extensions-pivot: 4.8 Extensions PIVOT --------------------- .. list-table:: Extensions FHIR personnalisées PIVOT :header-rows: 1 :widths: 20 38 15 12 15 * - Extension - URL - Contexte - Type valeur - Description * - Fokontany - ``http://[serveur]/fhir/StructureDefinition/pivot-fokontany`` - Patient - string - Plus petite division administrative de Madagascar * - Agent Communautaire - ``http://[serveur]/fhir/StructureDefinition/pivot-agent-communautaire`` - Patient - Reference(Practitioner) - ASC référent du patient * - Type Signal - ``http://[serveur]/fhir/StructureDefinition/pivot-type-signal`` - Observation (signal) - CodeableConcept - Type : SIGNAL_IMMEDIAT, SIGNAL_INHABITUEL, SIGNAL_TENDANCE .. _terminologies-valuesets: 4.9 Terminologies et ValueSets -------------------------------- **ValueSets existants — 4 piliers cliniques :** .. list-table:: :header-rows: 1 :widths: 25 45 30 * - ValueSet - URL - Contenu * - Observations PIVOT - ``http://[serveur]/fhir/ValueSet/pivot-observations-codes`` - Codes LOINC : poids, taille, température, MUAC, TDR, FC, FR, PA, PC, symptômes * - Diagnostics PIVOT - ``http://[serveur]/fhir/ValueSet/pivot-diagnostics-codes`` - Codes ICD-10 : paludisme, malnutrition, IRA, pneumonie, diarrhée, anémie, dermatite, infection urinaire, grossesse * - Types de visites - ``http://[serveur]/fhir/ValueSet/pivot-type-visite`` - AMB, IMP, HH, FLD, EMER, REF * - Médicaments PIVOT - ``http://[serveur]/fhir/ValueSet/pivot-medicaments`` - ACT, AMOX, PARA, SRO, ZINC, FERFS, VITA, ALBZ, COTRI, METRO, RUTF **Nouveaux ValueSets SBEc :** .. list-table:: :header-rows: 1 :widths: 25 45 30 * - ValueSet - URL - Contenu * - Type de signal - ``http://[serveur]/fhir/ValueSet/pivot-type-signal`` - SIGNAL_IMMEDIAT, SIGNAL_INHABITUEL, SIGNAL_TENDANCE * - Type de lieu - ``http://[serveur]/fhir/ValueSet/pivot-location-type`` - district, commune, csb, fokontany * - Catégorie communication - ``http://[serveur]/fhir/ValueSet/pivot-communication-category`` - alert, notification, report, request * - Méthode évaluation - ``http://[serveur]/fhir/ValueSet/pivot-evaluation-method`` - SBEc (Surveillance Basée sur les Événements communautaires) * - Issue évaluation (outcome) - ``http://[serveur]/fhir/ValueSet/pivot-risk-outcome`` - EPIDEMIE_CONFIRMEE, EPIDEMIE_SUSPECTEE, FAUSSE_ALERTE, EN_INVESTIGATION * - Composants signal - ``http://[serveur]/fhir/ValueSet/pivot-signal-component`` - date-survenue, nombre-cas, nombre-deces **CodeSystem — Type de signal (détail) :** .. code-block:: json :caption: CodeSystem pivot-type-signal { "resourceType": "CodeSystem", "id": "pivot-type-signal", "url": "http://[serveur]/fhir/CodeSystem/pivot-type-signal", "version": "1.0.0", "name": "PivotTypeSignal", "title": "Types de signaux épidémiologiques PIVOT", "status": "draft", "content": "complete", "concept": [ {"code": "SIGNAL_IMMEDIAT", "display": "Signal immédiat", "definition": "Événement sanitaire nécessitant une alerte immédiate"}, {"code": "SIGNAL_INHABITUEL", "display": "Signal inhabituel", "definition": "Événement sanitaire inhabituel nécessitant une investigation"}, {"code": "SIGNAL_TENDANCE", "display": "Signal de tendance", "definition": "Tendance épidémiologique observée sur une période"} ] } ---- .. _scenario-complet: 4.10 Exemples JSON — Scénario complet SBEc ------------------------------------------- .. note:: **Scénario :** Détection d'une flambée de paludisme au Fokontany Tsaratanana. L'ASC détecte **15 cas en 3 jours**, dont **2 décès**. Le signal est créé, les cas regroupés, une évaluation SBEc est réalisée, et une alerte est envoyée au niveau régional. **Ordre de création des ressources :** .. list-table:: Ordre de création — Scénario SBEc complet :header-rows: 1 :widths: 10 25 65 * - Étape - Ressource - Action * - 1 - **Location** - Hiérarchie déjà en place : District → Commune → Fokontany * - 2 - **Patient** - Enregistrement des patients concernés * - 3 - **Group** - Regroupement des cas de paludisme du fokontany * - 4 - **Substance** - Identification de l'agent (*Plasmodium falciparum*) * - 5 - **Observation** *(Signal)* - Création du signal épidémiologique ``SIGNAL_IMMEDIAT`` * - 6 - **RiskAssessment** - Évaluation SBEc — risque élevé (probabilité 85%) * - 7 - **Communication** - Alerte urgente envoyée à la DRSP Vatovavy-Fitovinany