NAV

Version : 1.7

Introduction

Synapse développe une solution d'aide à la prescription, incluant les fonctionnalités suivantes :

Ces fonctionnalités sont mises à disposition au travers d'APIs et/ou widgets pour être intégrés dans une application web.

Demo

Les différents widgets sont testables sur une interface de démo :
https://v1-7-widget.synapse-medicine.com/demo.html

Des exemples de personnalisation des widgets sont proposés sur les pages suivantes :

Authentification

Principe

L’authentification auprès du back-end Synapse se fait à l’aide de jetons JWT

Avant appel d’API ou initialisation d’un widget Synapse, le back-end du site client génère un jeton JWT signé. La génération se fait à partir d’un couple de clefs asymétriques RSA (R256) dont la clef publique est partagée avec le back-end de Synapse lors de la mise en place du service.

La durée de vie (TTL) de chaque token généré est limité à 1 heure de sorte à réduire l’exposition non souhaitée en dehors du contexte de l'application client.

Un token signé sera transmis à chaque appel de l’API de l’autocomplétion à travers l’en-tête : Authorization: Bearer <jwtToken>

Un token signé sera transmis à la création de chaque instance de widget.

Procédure de mise en place du système d’authentification

Le back-end client génère un couple de clefs asymétriques RSA (R256) de 2048 bits.

Pour générer un couple de clefs asymétriques :

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem

Le client envoie la clé publique public_key.pem au format PEM à Synapse.

Synapse transmet en retour une clé d’issuer issuer_key au client. Cette clé sera insérée dans les claims des jetons JWT.

Utilisation du système d’authentification

Pour générer un jeton JWT avec un back-end Node.js :

const fs = require('fs');
const jwt = require('jsonwebtoken');

// Chargement de la clef privée
const private_key = fs.readFileSync('private_key.pem');

// Définition des claims
const payload = {
  iss: <issuer_key>,
  exp: (new Date().getTime() / 1000) + 3600,
  user_id: <user_id>,
  session_id: <session_id>
};

const options = {
  algorithm: 'RS256',
};

// Génération du token
const token = jwt.sign(payload, private_key, options);

Le back-end du client génère un token JWT à partir de la clef privée private_key.pem en utilisant l’algorithme R256.

Ce jeton doit inclure les claims suivants :

Claim Description
iss Clé d'issuer : identifiant du client auprès de Synapse
exp Expiration time : date d'expiration du token au format spécifié dans la RFC 7519.
La durée d'expiration doit être inférieure à 1 heure.
user_id Identifiant utilisateur : hash d'un identifiant de l'utilisateur de l'application client
session_id Id de session : identifiant de la session en cours

Le token généré est utilisable pour appel aux APIs ou l'initialisation des widgets.

Dans le cas d’une session longue, le token d’un widget peut expirer en cours d’utilisation du widget. La callback de widget onnTokenExpiration est alors appelée. Elle permet de réaliser un nouvelle demande de token au back-end de l'application client.

APIs

Autocompletion

En cherchant 2 molécules à partir de la chaîne de caractères “ibu” :

curl -X POST https://api.synapse-medicine.com/prescription-autocomplete/v1/autocomplete \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <token>' \
  -d '{
    "text": "ibu",
    "type": "pharmaceutical-ingredient",
    "size": 2
}'

La réponse obtenue est :

[
  {
    "entity": {
      "label": "ibuprofène",
      "type": "pharmaceutical-ingredient",
      "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/a296a3f7964b5aa84e42b85549d60eb3b54cf858"
    },
    "score": 41.16
  },
  {
    "entity": {
      "label": "ibuprofène (lysinate d')",
      "type": "pharmaceutical-ingredient",
      "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/890232a27d7c4398ee1138205f17a87e25dc13fc"
    },
    "score": 36.33
  }
]

En cherchant 1 spécialité médicamenteuse contenant la molécule “ébastine” :

curl -X POST https://api.synapse-medicine.com/prescription-autocomplete/v1/autocomplete \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <token>' \
  -d '{
    "text": "ébastine",
    "type": "branded-drug",
    "size": 1,
    "field": "moieties"
  }'

La réponse obtenue est :

[
  {
    "entity": {
      "label": "KESTINLYO 10 mg, lyophilisat oral",
      "cis": "64579019",
      "dci_label": "ébastine",
      "moieties": [
        {
          "label": "ébastine",
          "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/69d8226331044441a0a3e378d1d6b36886fed6ee"
        }
      ],
      "type": "branded-drug",
      "uri": "http://frnorm.graph.synapse-medicine.com#BrandedDrug/64579019"
    },
    "score": 93.673416
  }
]

L’API d’autocomplétion permet la recherche d'entités médicamenteuses (spécialité, molécule ou classe thérapeutique) à partir d’une chaîne de caractères. La recherche se fait sur le label de l'entité.

Dans le cas de spécialités médicamenteuses, la recherche peut également se faire sur les labels des substances actives du médicament.

Requête HTTP

POST https://api.synapse-medicine.com/prescription-autocomplete/v1/autocomplete

Body

Parametre Requis Type Description
text true string Chaîne de caractères à autocompléter
type true EntityType Type d’entités recherchées
size true int Nombre maximal d’entités à retourner
field false enum Champs à autocompléter.
Les valeurs possibles sont
- label (défaut)
- moieties (pour type="branded-drug" uniquement)

Réponse

Liste d'objets au format suivant :

Champ Type Description
entity Entity Entité thérapeutique
score float Score de pertinence de l'entité thérapeutique

Information sur une spécialité médicamenteuse

Récupération de la spécialité médicamenteuse ayant pour code CIS 69309629 :

curl -X GET https://api.synapse-medicine.com/drug-information/v1/branded-drug/fr/69309629 \
     -H 'Authorization: Bearer <token>'

La réponse obtenue est :

{
    "label": "DOLIPRANE 1000 mg, gélule",
    "cis": "69309629",
    "ingredients": [
        {
            "dose": "1000 mg",
            "label": "paracétamol",
            "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/7fe0342fcdef507a3066831e939cccb6aee60e46"
        }
    ],
    "moieties": [
        {
            "dose": "1000 mg",
            "label": "paracétamol",
            "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/7fe0342fcdef507a3066831e939cccb6aee60e46"
        }
    ],
    "type": "branded-drug",
    "uri": "http://frnorm.graph.synapse-medicine.com#BrandedDrug/69309629"
}

L'API d'information sur les spécialités médicamenteuses permet de récupérer une spécialité à partir de son code CIS.

Requête HTTP

GET https://api.synapse-medicine.com/drug-information/v1/branded-drug/fr/{cis}

Parametre Type Description
cis string Code CIS de la spécialité médicamenteuse souhaitée

Réponse

La réponse est un document de type Entity correspondant à la spécialité médicamenseuse demandée.

Widgets

Setup

Exemple de header pour chargement des widgets Synapse :

<head>
  <meta charset="UTF-8">
  <script type="text/javascript" src="https://v1-7-widget.synapse-medicine.com/bundle.js"></script>
</head>

L'utilisation des widgets se fait par chargement d'une librairie Synapse depuis le navigateur sur le site web client :
<script type="text/javascript" src="https://v1-7-widget.synapse-medicine.com/bundle.js"></script>

Cette librairie donne accès au namespace Synapse, regroupant les classes suivantes :

Chaque widget est instancié côté client par : var widget = new Synapse.XxxWidget(jwtToken)

AdverseEffectWidget

Ce widget extrait l'ensemble des effets indésirables d'une ordonnance par fréquence. Il permet la recherche d'un effet indésirable specifique.

Initialisation du widget à partir de premiers résultats d'autocomplétion :

var adverseEffectWidget = new Synapse.AdverseEffectWidget(jwtToken);

var data = {"entities": [autocompleteResult1] };
adverseEffectWidget.init(document.getElementById("adverseEffectPlaceholder"), data);

Mise à jour du widget lors de l'ajout de nouveaux médicaments :

data.entities.push(autocompleteResult2);
adverseEffectWidget.update(data);

Mise à jour du jeton JWT :

adverseEffectWidget.setCallback("onTokenExpiration", function (err, data) {
  var jwtToken = fetchNewToken();
  adverseEffectWidget.setToken(jwtToken);
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

update(data)

Mise à jour du widget à partir de nouvelles données d’ordonnance.

Parametre Requis Type Description
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

GroundsWidget

Ce widget remonte des alertes de vigilance ou de contre-indication sur l'ordonnance liées au profil clinique du patient.

Initialisation du widget :

var groundsWidget = new Synapse.GroundsWidget(jwtToken);

var data = {
  "entities": [autocompleteResult1],
  "profile": patientProfile
 };

groundsWidget.init(document.getElementById("groundsPlaceholder"), data);

Mise à jour du widget lors de l'ajout de nouveaux médicaments :

data.entities.push(autocompleteResult2);
groundsWidget.update(data);

Mise à jour du widget lors de la modification du profil patient :

patientProfile.isPregnant = true;
groundsWidget.update({"profile": patientProfile});

Mise à jour du jeton JWT :

groundsWidget.setCallback("onTokenExpiration", function (err, data) {
  var jwtToken = fetchNewToken();
  groundsWidget.setToken(jwtToken);
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.entities false [Entity] Liste des médicaments de l'ordonnance à analyser
data.profile false [Profile] Valeur initiale du profil patient

update(data)

Mise à jour du widget à partir de nouvelles données d'ordonnance ou de profil.

Parametre Requis Type Description
data true Object Données de mise à jour
data.profile false [Profile] Profil mis à jour
data.entities false [Entity] Liste des médicaments de l'ordonnance à analyser

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

InteractionWidget

Ce widget analyse les interactions médicamenteuses d'une ordonnance et les restitue sous la forme d'un diagramme de synthèse.

Initialisation du widget à partir de premiers résultats d'autocomplétion :

var interactionWidget = new Synapse.InteractionWidget(jwtToken);

var data = {"entities": [autocompleteResult1] };
interactionWidget.init(document.getElementById("interactionPlaceholder"), data);

Mise à jour du widget lors de l'ajout de nouveaux médicaments :

data.entities.push(autocompleteResult2);
interactionWidget.update(data);

Mise à jour du jeton JWT :

interactionWidget.setCallback("onTokenExpiration", function (err, data) {
  var jwtToken = fetchNewToken();
  interactionWidget.setToken(jwtToken);
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

update(data)

Mise à jour du widget à partir de nouvelles données d’ordonnance.

Parametre Requis Type Description
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

PosologyCheckerWidget

Ce widget analyse les posologies saisies pour les spécialités d'une ordonnance et lève des alertes en cas de dépassement de posologie maximum.

Initialisation du widget à partir de premiers résultats d'autocomplétion :

var posologyCheckerWidget = new Synapse.PosologyCheckerWidget(jwtToken);

var entity = autocompleteResult1;
entity["posology"] = {
  "text": document.getElementById("#posology-input-0").value
};

var data = {"entities": [entity], "mode": "compact" };
posologyCheckerWidget.init(document.getElementById("posologyPlaceholder"), data);

Mise à jour du widget lors d'une modification de la posologie :

data.entities[0].posology = {
  "text": document.getElementById("#posology-input-0").value;
};
posologyCheckerWidget.update(data);

Mise à jour du widget lors de l'ajout de nouveaux médicaments :

var new_entity = autocompleteResult2;
new_entity.posology = {
  "text": document.getElementById("#posology-input-1").value
}
data.entities.push(new_entity);
posologyCheckerWidget.update(data);

Mise à jour du jeton JWT :

posologyCheckerWidget.setCallback("onTokenExpiration", function (err, data) {
  var jwtToken = fetchNewToken();
  posologyCheckerWidget.setToken(jwtToken);
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser
data.mode false string Mode d'affichage du widget : default ou compact

update(data)

Mise à jour du widget à partir de nouvelles données d’ordonnance.

Parametre Requis Type Description
data true Object Données d'initialisation
data.entities false [Entity] Liste des médicaments de l'ordonnance à analyser
data.mode false string Mode d'affichage du widget : default ou compact

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

ProfileWidget

Ce widget permet la saisie par l'utilisateur d'un profil patient. La liste des champs de saisie est paramétrable parmi :

Initialisation du widget :

var profileWidget = new Synapse.ProfileWidget(jwtToken);

var initialProfile = {
  cardiac: Synapse.Profile.CardiacProfile.MODERATE,
  kidney: Synapse.Profile.KidneyProfile.LIGHT,
  ageRange: Synapse.ProfileType.AgeRange.LESS_65,
  isPregnant: false
}

var data = {"profile": initialProfile, "isDisplayHepatic": false };
profileWidget.init(document.getElementById("profilePlaceholder"), data);

Récuparation du profil lors d'une modification de l'utilisateur :

profileWidget.setCallback("onProfileUpdate", function (err, data) {
  var updatedProfile = data.profile;

  saveProfile(updatedProfile);
  groundsWidget.update({"profile": updatedProfile})
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.profile false [Profile] Valeur initiale du profil patient
data.isDisplayCardiac false boolean Spécifie si le champ de saisie du profil cardiaque est affiché
data.isDisplayHepatic false boolean Spécifie si le champ de saisie du profil hépatique est affiché
data.isDisplayKidney false boolean Spécifie si le champ de saisie du profil rénal est affiché
data.isDisplayAge false boolean Spécifie si le champ de saisie de l'âge est affiché
data.isDisplayPregnant false boolean Spécifie si le champ de saisie de la grossesse est affiché

update(data)

Mise à jour du widget à partir de nouvelles données de profil.

Parametre Requis Type Description
data true Object Données de mise à jour
data.profile true [Profile] Profil mis à jour

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onProfileUpdate”, callback)

Spécification d'une callback à appeler lors de la modification du profil patient par l'utilisateur.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)data.profile de type Profile] est le profil est mis à jour

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

StartStoppWidget

Ce widget recherche les critères STOPP (Dalleur et al.) associés à une ordonnance.

Initialisation du widget à partir de premiers résultats d'autocomplétion :

var startStoppWidget = new Synapse.StartStoppWidget(jwtToken);

var data = {"entities": [autocompleteResult1] };
startStoppWidget.init(document.getElementById("startStoppPlaceholder"), data);

Mise à jour du widget lors de l'ajout de nouveaux médicaments :

data.entities.push(autocompleteResult2);
startStoppWidget.update(data);

Mise à jour du jeton JWT :

startStoppWidget.setCallback("onTokenExpiration", function (err, data) {
  var jwtToken = fetchNewToken();
  startStoppWidget.setToken(jwtToken);
});

init(element, data)

Initialisation du widget dans un élément du DOM.

Parametre Requis Type Description
element true Element Objet spécifiant l’élément du DOM dans lequel sera inséré le widget
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

update(data)

Mise à jour du widget à partir de nouvelles données d’ordonnance.

Parametre Requis Type Description
data true Object Données d'initialisation
data.entities true [Entity] Liste des médicaments de l'ordonnance à analyser

setToken(jwtToken)

Définition du jeton JWT à utiliser par le widget.

Parametre Requis Type Description
jwtToken true string Jeton JWT à utiliser par le widget

setCallback(“onTokenExpiration”, callback)

Spécification d'une callback à appeler lors de l'expiration du jeton JWT.
Cette callback est mutualisée entre tous les widgets.

Parametre Requis Type Description
callback true function Fonction à appeler prenant en paramètres (err, data)

Format de données

Entity (object)

Exemple de spécialité médicamenteuse :

{
  "brandname": "IBUPROFENE MYLAN CONSEIL",
  "cis": "64594722",
  "ingredients": [
    {
      "dose": "684 mg",
      "label": "ibuprofène (lysinate d')",
      "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/890232a27d7c4398ee1138205f17a87e25dc13fc"
    }
  ],
  "label": "IBUPROFENE MYLAN CONSEIL 400 mg, comprimé pelliculé",
  "moieties": [
    {
      "dose": "0,4 g",
      "label": "ibuprofène",
      "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/a296a3f7964b5aa84e42b85549d60eb3b54cf858"
    }
  ],
  "shortname": "IBUPROFENE",
  "type": "branded-drug",
  "uri": "http://frnorm.graph.synapse-medicine.com#BrandedDrug/64594722"
}

Exemple de molécule active :

{
  "label": "paracétamol",
  "type": "pharmaceutical-ingredient",
  "uri": "http://frnorm.graph.synapse-medicine.com#PharmaceuticalIngredient/7fe0342fcdef507a3066831e939cccb6aee60e46"
}

Entité thérapeutique définie par les champs suivants :

Champ Type Description
label string Nom de l'entité
uri string Identifiant Synapse unique de l'entité
type EntityType Type d'entité thérapeutique
cis string Code CIS
(pour les spécialités uniquement)
shortname string Nom court de spécialité
(pour les spécialités uniquement)
brandname string Nom de marque de spécialité
(pour les spécialités uniquement)
ingredients [Entity] Liste des substances actives de la spécialité
(pour les spécialités uniquement)
moieties [Entity] Liste des fractions thérapeutiques de la spécialité
(pour les spécialités uniquement)
posology Posology Posologie de la spécialité

EntityType (string)

Type d'entité thérapeutique

Valeur Description
'branded-drug' Spécialité médicamenteuse
ex: DOLIPRANE 500mg, comprimé
'pharmaceutical-ingredient' Molécule active (DCI)
ex: paracetamol
'therapeutic-class' Classe thérapeutique
ex: hyperkaliémiants

Posology (object)

Exemple de posologie :

{
  "posology": "2 cp 3 fois par jour"
}

Posologie d'un médicament :

Champ Type Description
text string Descriptif textuel de la posologie

Profile (object)

Exemple de profil clinique patient :

var profile = {
  cardiac: Synapse.ProfileType.CardiacProfile.MODERATE,
  hepatic: Synapse.ProfileType.HepaticProfile.NONE,
  kidney: Synapse.ProfileType.KidneyProfile.LIGHT,
  ageRange: Synapse.ProfileType.AgeRange.LESS_65,
  isPregnant: false,
}

Profil clinique du patient

Champ Type Description
cardiac CardiacProfileType Profil cardiaque du patient
hepatic HepaticProfileType Profil hépatique du patient
kidney KidneyProfileType Profil rénal du patient
ageRange AgeRange Age du patient
isPregnant boolean Spécifie si la patiente est enceinte

AgeRange (enum)

Exemple de profils de tranche d'âge :

  var old = Synapse.ProfileType.AgeRange.MORE_EQUAL_75;
  var young = Synapse.ProfileType.AgeRange.LESS_65;

Type de tranche d'âge

Namespace Synapse.ProfileType.AgeRange

Valeur Description
LESS_65 Age < 65 ans
MORE_EQUAL_65_LESS_75 Age entre 65 et 75 ans
MORE_EQUAL_75 Age >= 75 ans

CardiacProfileType (enum)

Exemple de profils cardiaques :

  var cardiacLight = Synapse.ProfileType.CardiacProfile.LIGHT;
  var cardiacHeavy = Synapse.ProfileType.CardiacProfile.HEAVY;

Type de profil cardiaque

Namespace Synapse.ProfileType.CardiacProfile

Valeur Description
NONE Profil inconnu ou pas de problème cardiaque
LIGHT Insuffisance cardiaque légère
MODERATE Insuffisance cardiaque modérée
HEAVY Insuffisance cardiaque importante

HepaticProfileType (enum)

Exemple de profils hépatiques :

  var hepaticLight = Synapse.ProfileType.HepaticProfile.LIGHT;
  var hepaticHeavy = Synapse.ProfileType.HepaticProfile.HEAVY;

Type de profil hépatique

Namespace Synapse.ProfileType.HepaticProfile

Valeur Description
NONE Profil inconnu ou pas de problème hépatique
LIGHT Insuffisance hépatique légère
MODERATE Insuffisance hépatique modérée
HEAVY Insuffisance hépatique importante

KidneyProfileType (enum)

Exemple de profils d'insuffisance rénale :

  var renalNone = Synapse.ProfileType.KidneyProfile.NONE;
  var renalTerminal = Synapse.ProfileType.KidneyProfile.TERMINAL;

Type de profil d'insuffisance rénale

Namespace Synapse.ProfileType.KidneyProfile

Valeur Description
NONE Profil inconnu ou pas de problème rénal
LIGHT Insuffisance rénale légère
MODERATE Insuffisance rénale modérée
HEAVY Insuffisance rénale importante
TERMINAL Insuffisance rénale terminale