FQL is a query language that allows you to retrieve, filter and project data from any data source containing FHIR Resources. It brings the power of three existing languages together: SQL, JSON and FhirPath. It allows you to create tables and is useful for gaining insight and perform quality control.
Changelog SGRDV — release 1.0.4
Date de publication : 8 mai 2026
Légende : 🔴 = rupture sur contrat de production (
experimental = false) · 🟠 = rupture sur contrat en validation (experimental = true) · 🟢 = ajout rétrocompatible
1. Versionnement et statut
1.1 Bump 1.0.3 → 1.0.4 🟠
Cette release applique un bump PATCH portant deux blocs structurants :
- La migration des notifications de cycle de vie d'un verrou de la surface
api-sourcevers le pattern FHIR Messaging R4. TroisOperationDefinitiondistinctes ($lock,$extend-lock,$release-lock) côté source sont remplacées par une opération système unique$process-message, l'événement métier étant discriminé parMessageHeader.eventCoding. - La refonte du payload des opérations
$extend-locket$release-lockcôtéapi-sgrdv. La ressourceAppointmentrématérialisée est remplacée par deux paramètres en logical references (appointmentReference1..1+slotReference1..*), alignant le payload entrant sur le patternMessageHeader.focusdu canal Messaging et éliminant les attributs non consommés.
L'opération $lock côté api-sgrdv reste inchangée : elle continue de recevoir une liste ordonnée d'Appointment candidates avec leurs slots embarqués (besoin métier de SGRDV pour décider quel candidat verrouiller).
Cette release introduit également, en ajouts rétrocompatibles 🟢, deux nouveaux contrats publiés à l'état status = draft, experimental = true :
- une nouvelle opération
$book(réservation de rendez-vous) sur les deux surfaces — voir §4 ; - un nouveau endpoint de recherche
GET [base]/Organization(liste des cliniques desservies par un DMÉ) sur la surfaceapi-source— voir §8.
Tous les artefacts versionnés (config IG, OperationDefinition, CapabilityStatement) sont alignés sur la version 1.0.4. L'attribut experimental = true est conservé sur tous les artefacts.
Le bump est conforme à la politique de versionnement publiée en 1.0.2 : ruptures sur des artefacts experimental = true → bump PATCH.
2. Migration vers FHIR Messaging — surface api-source 🟠
S'applique uniquement à la surface api-source (SGRDV → DMÉ/SIP-C).
2.1 Opération système unique $process-message 🟠
| Élément | Avant (1.0.3) | Après (1.0.4) |
|---|---|---|
| Endpoints | 3 endpoints distincts : POST [base]/Appointment/$lock, $extend-lock, $release-lock |
1 seul endpoint : POST [base]/$process-message (niveau système) |
OperationDefinition côté source |
SGRDVSourceAppointmentLockOperation, SGRDVSourceAppointmentExtendLockOperation, SGRDVSourceAppointmentReleaseLockOperation (type = true, code = #lock / #extend-lock / #release-lock) |
SGRDVSourceProcessMessageOperation (system = true, code = #process-message) |
| Discrimination de l'événement | par l'URL et le code de l'OperationDefinition |
par MessageHeader.eventCoding (codes lock-create, lock-extend, lock-release) |
| Payload d'entrée | Parameters (profils SGRDV*Source*Notification*Parameters) |
Bundle de type message (profil SGRDVSourceLockNotificationBundle) |
| Réponse succès | HTTP 204 sans corps | inchangé — HTTP 204 sans corps |
| Réponse erreur | HTTP 4xx/5xx + OperationOutcome |
inchangé — HTTP 4xx/5xx + OperationOutcome (profil SGRDVBaseOperationOutcome) |
2.2 Nouveaux artefacts FSH 🟢 (par rapport à l'absence d'équivalent en 1.0.3)
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVLockEventsCS |
CodeSystem |
http://sante.quebec/fhir/CodeSystem/sgrdv-lock-events |
Inventaire fermé des 3 codes du cycle de vie d'un verrou (lock-create, lock-extend, lock-release) |
SGRDVSourceNotificationEventsVS |
ValueSet (façade SGRDV) |
http://sante.quebec/fhir/ValueSet/sgrdv-source-notification-events-vs |
Façade des événements transitant sur le canal SGRDV → DMÉ/SIP-C ; agrège aujourd'hui SGRDVLockEventsCS, extensible demain |
SGRDVLockEndTimeExtension |
Extension (MessageHeader) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-lock-end-time |
Porte l'heure de fin du verrou côté MessageHeader (faute de Parameters dans le Bundle message) |
SGRDVSourceLockNotificationMessageHeader |
Profile (MessageHeader) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-source-lock-notification-message-header |
MessageHeader des notifications de verrou — eventCoding requis, focus slicé appointment 1..1 + slot 1..*, extension lockEndTime 1..1 |
SGRDVSourceLockNotificationBundle |
Profile (Bundle) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-source-lock-notification-bundle |
Bundle de type message ; entry slicé messageHeader 1..1 + provenance 1..1 |
SGRDVSourceProcessMessageOperation |
OperationDefinition |
http://sante.quebec/fhir/OperationDefinition/sgrdv-source-process-message |
Définition de l'opération système $process-message côté source |
Trois instances d'exemple (une par événement) accompagnent le profil Bundle : SGRDVSourceProcessMessageExampleCreate, SGRDVSourceProcessMessageExampleExtend, SGRDVSourceProcessMessageExampleRelease.
2.3 Artefacts retirés 🟠
| Artefact | Type | Disposition |
|---|---|---|
SGRDVSourceAppointmentLockOperation |
OperationDefinition |
supprimé |
SGRDVSourceAppointmentExtendLockOperation |
OperationDefinition |
supprimé |
SGRDVSourceAppointmentReleaseLockOperation |
OperationDefinition |
supprimé |
SGRDVSourceLockNotificationParameters |
Profile (Parameters) |
supprimé |
SGRDVSourceExtendLockNotificationParameters |
Profile (Parameters) |
supprimé |
SGRDVSourceReleaseLockNotificationParameters |
Profile (Parameters) |
supprimé |
Définitions FSH des opérations $lock, $extend-lock, $release-lock côté source |
jeu d'artefacts | supprimées (remplacées par les artefacts $process-message) |
Les profils communs SGRDVBaseLockPayloadParameters et SGRDVBaseLockCandidateAppointment restent définis : ils continuent de typer le payload de l'opération $lock côté api-sgrdv. Les opérations $extend-lock et $release-lock côté api-sgrdv migrent quant à elles vers un nouveau parent neutre SGRDVBaseLockReferenceParameters (cf. §3 ci-dessous).
2.4 Ressources concernées portées en logical reference dans MessageHeader.focus 🟠
L'Appointment et le ou les Slot concernés par l'événement de verrou ne sont pas matérialisés dans le Bundle de notification — le DMÉ étant leur autorité d'origine, les rematérialiser serait redondant et créerait un risque de désynchronisation. Ils sont transmis en logical references dans MessageHeader.focus, discriminées par Reference.type :
| Slice | Cardinalité | Reference.type |
identifier.type.coding.code |
identifier.system |
identifier.value |
|---|---|---|---|---|---|
focus[appointment] |
1..1 |
fixé "Appointment" |
fixé #IdDispoDME |
NamingSystem du DMÉ via alias $ns-<x> |
identifiant local DMÉ |
focus[slot] |
1..* |
fixé "Slot" |
fixé #IdSlotDME |
NamingSystem du DMÉ via alias $ns-<x> |
identifiant local DMÉ |
Les codes de type d'identifiant (IdDispoDME, IdSlotDME) du CodeSystem sgrdv-identifier-type et les NamingSystems DMÉ existent depuis 1.0.0 — aucun nouvel artefact d'identification n'est introduit. Toutes les Reference interdisent Reference.reference (0..0) conformément au pattern logical reference déjà appliqué dans Provenance.agent, Appointment.slot, etc.
2.5 Contenu effectif du Bundle de notification 🟠
| Entry | Cardinalité | Profil cible | Notes |
|---|---|---|---|
entry[messageHeader] |
1..1 (position 1, FHIR Messaging) |
SGRDVSourceLockNotificationMessageHeader |
Porte eventCoding, source, destination, focus, extension lockEndTime |
entry[provenance] |
1..1 |
SGRDVBaseRequestProvenance (commun, inchangé depuis 1.0.3) |
Provenance émise par SGRDV — non connue du DMÉ par avance, donc matérialisée |
Bundle.type est fixé à #message, Bundle.timestamp est 1..1. manualSliceOrdering: true étant activé sur le projet, l'ordre de définition des slices est respecté par SUSHI — le MessageHeader est garanti en première position du Bundle.
2.6 Identification de l'émetteur, du destinataire et des canaux
Élément MessageHeader |
Choix 1.0.4 |
|---|---|
source.name |
fixé à "SGRDV" |
source.endpoint |
fixé à http://sante.quebec/fhir/source/sgrdv (alias $sgrdv-messaging-source-endpoint) — URL logique d'identification de l'émetteur |
destination.endpoint |
1..1 libre — URL technique du DMÉ destinataire (variable selon déploiement) |
destination.receiver |
0..0 — l'identité logique du DMÉ n'est pas véhiculée par MessageHeader.destination dans ce flux ; le routage est porté par l'URL technique |
id |
1..1 — identifiant FHIR-natif du message particulier (cf. §2.7) |
extension lockEndTime |
1..1 (uniforme sur les 3 événements ; pour lock-release, l'attribut reste présent à titre informatif et homogène) |
Note FHIR R4 :
MessageHeaderne possède pas de champtimestampnatif en R4 — le moment de l'événement est porté parBundle.timestamp(1..1sur le profilSGRDVSourceLockNotificationBundle).
2.7 Corrélation : X-Correlation-Id HTTP et MessageHeader.id FHIR — complémentaires
Règle générale du projet : le X-Correlation-Id est un mécanisme de transport HTTP et n'est jamais représenté dans le payload FHIR. Cette règle reste en vigueur et n'est pas relâchée.
Le MessageHeader.id requis sur ce flux n'est pas une copie du X-Correlation-Id, mais un identifiant FHIR-natif distinct désignant un message particulier :
| Mécanisme | Granularité | Émetteur | Rôle |
|---|---|---|---|
X-Correlation-Id (HTTP header) |
Transaction métier de bout-en-bout | Portail à l'initiation | Tracer une transaction à travers tous les sauts (portail → SGRDV → DMÉ) |
MessageHeader.id (payload FHIR) |
Message FHIR particulier | SGRDV à l'émission de chaque notification | Tracer/acker un message individuel — un même X-Correlation-Id peut englober N messages successifs (lock-create puis lock-extend puis lock-release) |
La documentation d'accueil du IG est ajustée en conséquence pour expliciter cette distinction.
3. Refonte du payload $extend-lock et $release-lock — surface api-sgrdv 🟠
S'applique uniquement à la surface api-sgrdv (Portail → SGRDV).
3.1 Logical references à la place de la ressource Appointment 🟠
Le payload entrant de $extend-lock et $release-lock ne ré-embarque plus la ressource Appointment complète : il transmet désormais la disponibilité concernée et ses slots en logical references séparées (Reference.identifier peuplé, Reference.reference interdit), conformément au pattern déjà appliqué dans MessageHeader.focus (cf. §2) et dans tous les autres Reference SGRDV.
| Élément | Avant (1.0.3) | Après (1.0.4) |
|---|---|---|
Slice parameter[appointment] |
1..1 (extend) / 1..* (release) — Resource typée SGRDVBaseLockCandidateAppointment (status, participants, slots embarqués) |
supprimé |
Slice parameter[appointmentReference] |
absent | 1..1 — Reference(Appointment) ; Reference.reference 0..0 ; Reference.type = "Appointment" ; identifier.type.coding.code = #IdDispoDME ; identifier.system = NamingSystem du DMÉ via alias $ns-<x> ; identifier.value = identifiant local DMÉ |
Slice parameter[slotReference] |
absent (slots imbriqués dans Appointment.slot[]) |
1..* — Reference(Slot) ; mêmes contraintes (type = "Slot", identifier.type.coding.code = #IdSlotDME) |
Slice parameter[lockIdentifier] |
1..1 |
inchangé — 1..1 |
Slice parameter[lockRequestedDuration] (extend) |
1..1 |
inchangé — 1..1 |
Slice parameter[provenance] |
1..1 |
inchangé — 1..1 |
$lock (api-sgrdv) n'est pas modifié : il continue de recevoir une liste ordonnée de candidates avec leurs slots embarqués — SGRDV doit, à ce moment-là, connaître l'association appointment ↔ slots pour décider quel candidat verrouiller.
3.2 Nouveau profil parent neutre SGRDVBaseLockReferenceParameters 🟢
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVBaseLockReferenceParameters |
Profile (Parameters) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-lock-reference-parameters |
Parent neutre des opérations $extend-lock et $release-lock (api-sgrdv). Définit les slices appointmentReference, slotReference, lockIdentifier, lockRequestedDuration, provenance. |
Les profils enfants SGRDVExtendLockRequestParameters et SGRDVReleaseLockRequestParameters sont refactorés pour hériter de ce nouveau parent (au lieu de SGRDVBaseLockPayloadParameters).
3.3 Justification SGRDV stateless
SGRDV n'a pas conservé l'association lock ↔ appointment ↔ slots posée lors du $lock initial. Le portail doit donc re-fournir ces identifiants à chaque appel $extend-lock / $release-lock afin que SGRDV puisse propager l'événement au DMÉ aval via la notification FHIR Messaging (cf. §2). Les attributs status, participants, etc. de la ressource Appointment rématérialisée n'étaient pas consommés — leur retrait simplifie le payload sans perte fonctionnelle.
4. Nouvelle opération $book (draft, expérimental) — surfaces api-sgrdv et api-source 🟢
S'applique aux deux surfaces (Portail → SGRDV et SGRDV → DMÉ/SIP-C). Opération introduite à l'état status = draft, experimental = true et déclarée dans les CapabilityStatement des deux surfaces (cf. §5.1) afin de la rendre visible aux partenaires pour anticipation et retour.
Conforme à la Spécification API — Réserver RV v0.1 (2026-05-05). L'opération réserve un rendez-vous sur une disponibilité préalablement verrouillée via $lock. Création uniquement — pas de modification ni d'annulation.
4.1 Diagramme d'enchaînement
| Acteur émetteur | Endpoint | Acteur récepteur |
|---|---|---|
| Portail | POST [base]/Appointment/$book (api-sgrdv) |
SGRDV |
| SGRDV (après vérification + conservation du verrou) | POST [base]/Appointment/$book (api-source) |
DMÉ/SIP-C |
Si SGRDV ne retrouve pas le verrou attaché au lockIdentifier (verrou expiré ou inconnu), la demande est refusée et n'est pas transmise au DMÉ — le Bundle de réponse contient alors un OperationOutcome seul.
4.2 Nouveaux artefacts FSH 🟢
Artefacts communs aux deux surfaces
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVTuilePortailREOCS |
CodeSystem |
http://sante.quebec/fhir/CodeSystem/sgrdv-tuile-portail-reo |
Codes des tuiles du portail REO (911, 811, GAP, REO_HOPITAL, REO_CLINIQUE, MAGROSSESSE) |
SGRDVTuilePortailREOVS |
ValueSet (façade SGRDV) |
http://sante.quebec/fhir/ValueSet/sgrdv-tuile-portail-reo-vs |
Façade SGRDV du CodeSystem ci-dessus |
SGRDVDevicePropertyTypeCS |
CodeSystem |
http://sante.quebec/fhir/CodeSystem/sgrdv-device-property-type |
Codes typant Device.property.type pour SGRDV (actuellement tuilePortail) |
SGRDVRegionAdministrativeCS |
CodeSystem |
http://sante.quebec/fhir/CodeSystem/sgrdv-region-administrative |
Codes des 18 régions socio-sanitaires (RSS) du Québec (01 à 18) tels que définis par le MSSS |
SGRDVRegionAdministrativeVS |
ValueSet (façade SGRDV) |
http://sante.quebec/fhir/ValueSet/sgrdv-region-administrative-vs |
Façade SGRDV du CodeSystem ci-dessus |
SGRDVNamingSystemRegionAdmin |
NamingSystem |
http://sante.quebec/fhir/NamingSystem/REGIONADMIN |
NamingSystem du domaine d'identification des régions socio-sanitaires du Québec |
SGRDVBaseBookSourceDevice |
Profile (Device) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-source-device |
Device portail spécialisé $book ; porte la tuile REO via property[tuilePortail] et le lieu Clinique d'origine via owner |
SGRDVBaseBookOrienteurRelatedPerson |
Profile (RelatedPerson) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-orienteur-related-person |
Agent de réorientation REO contenu dans la Provenance — administratif, pas soignant |
SGRDVBaseBookRequestProvenance |
Profile (Provenance) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-request-provenance |
Provenance multi-agents (portail + orienteur? ; hôpital d'origine porté par agent[professionnelREO].onBehalfOf en cas de réorientation) + région administrative |
SGRDVBaseBookPatient |
Profile (Patient) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-patient |
Patient enrichi : slice telecom[sms] + telecom.rank (préférences de communication) |
SGRDVBaseBookResponseAppointment |
Profile (Appointment) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-response-appointment |
Type cible de la Reference logique vers la disponibilité réservée — status figé à #booked. Jamais matérialisé dans le Bundle de réponse |
SGRDVBaseBookPayloadParameters |
Profile (Parameters) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-payload-parameters |
Parent neutre du payload $book |
SGRDVBaseBookResultParameters |
Profile (Parameters) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-result-parameters |
Paramètres de résultat retournés en cas de succès — exposent la disponibilité réservée en logical reference via parameter[bookedAppointment] (Reference.identifier seul) |
SGRDVBaseBookResponseBundle |
Profile (Bundle) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-book-response-bundle |
Parent neutre du Bundle de réponse $book (type collection) |
Artefacts de la surface api-sgrdv (Portail → SGRDV)
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVAppointmentBookOperation |
OperationDefinition |
http://sante.quebec/fhir/OperationDefinition/sgrdv-appointment-book |
Définition de l'opération $book côté portail → SGRDV |
SGRDVBookRequestParameters |
Profile (Parameters) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-book-request-parameters |
Paramètres de la requête portail — lockIdentifier 1..1 (secret porteur) |
SGRDVBookResponseBundle |
Profile (Bundle) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-book-response-bundle |
Bundle de réponse côté portail |
Artefacts de la surface api-source (SGRDV → DMÉ/SIP-C)
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVSourceAppointmentBookOperation |
OperationDefinition |
http://sante.quebec/fhir/OperationDefinition/sgrdv-source-appointment-book |
Définition de l'opération $book côté SGRDV → DMÉ |
SGRDVSourceBookNotificationParameters |
Profile (Parameters) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-source-book-notification-parameters |
Paramètres relayés au DMÉ — lockIdentifier 0..0 (jamais transmis au DMÉ) |
SGRDVSourceBookResponseBundle |
Profile (Bundle) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-source-book-response-bundle |
Bundle de réponse côté DMÉ |
4.3 Paramètres d'entrée
| Paramètre | Cardinalité | Type | Notes |
|---|---|---|---|
appointment |
1..1 |
Reference(Appointment) logical reference |
Reference.identifier portant l'identifiant local DMÉ (type.coding.code = #IdDispoDME, system = NamingSystem du DMÉ via alias $ns-<x>) ; Reference.reference 0..0 |
slot |
1..* |
Reference(Slot) logical reference |
Mêmes contraintes (type = "Slot", identifier.type.coding.code = #IdSlotDME) |
orientation-id |
0..1 |
integer |
Identifiant de récit Vitrai. Transmis tel quel au DMÉ |
patient |
1..1 |
Resource (SGRDVBaseBookPatient) |
Patient enrichi (NAM, name, birthDate, birthGender, admisGap, telecom phone/sms + rank, contact father/mother, generalPractitioner inchangé vs $find) |
encounter-reason |
0..1 |
string |
Raison de consultation texte libre. Transmis au DMÉ |
location-string |
0..1 |
string |
Code postal de recherche (mêmes contraintes que $find) |
lockIdentifier |
api-sgrdv 1..1 / api-source 0..0 |
string |
Secret porteur du portail — jamais transmis au DMÉ |
provenance |
1..1 |
Resource (SGRDVBaseBookRequestProvenance) |
Provenance multi-agents (cf. §4.4) |
4.4 Modèle de Provenance multi-agents
SGRDVBaseBookRequestProvenance hérite directement de Provenance (pas de SGRDVBaseRequestProvenance) car la cardinalité de agent passe de 1..1 à 1..*. Le slicing de agent est discriminé par who.type :
| Slice | Cardinalité | who.type |
Cible | Matérialisation |
|---|---|---|---|---|
agent[portail] |
1..1 |
"Device" |
SGRDVBaseBookSourceDevice |
Contained (#portail) — porte deviceName, property[tuilePortail] (valueCode bindé required au VS façade SGRDV), owner (logical ref Organization du lieu Clinique) |
agent[professionnelREO] |
0..1 |
"RelatedPerson" |
SGRDVBaseBookOrienteurRelatedPerson |
Contained (#orienteur) — agent administratif d'orientation (pas un soignant). patient en logical reference NAM. onBehalfOf 0..1 porte l'hôpital d'origine (cas de réorientation hôpital→clinique) en logical reference vers une Organization (type.coding.code = #CodeEtablissement, identifier RAMQ d'hôpital) — jamais matérialisée |
Provenance.location (0..1) porte la région socio-sanitaire du Québec en logical reference (Reference.type = "Location", identifier.system = $ns-region-admin, identifier.type.coding.code = #regionAdmin, identifier.value = code de région 01 à 18 ∈ SGRDVRegionAdministrativeCS). Règle métier : la région DOIT être fournie lorsque Device.property[tuilePortail].valueCode vaut 811, 911 ou MAGROSSESSE ; elle reste optionnelle pour les autres tuiles.
4.5 Bundle de réponse — disponibilité réservée en logical reference
Bundle.type = #collection, slicing entry par type de ressource :
| Entry | Cardinalité | Profil cible | Notes |
|---|---|---|---|
resultParameters |
0..1 |
SGRDVBaseBookResultParameters |
Présent en cas de succès. Porte la disponibilité réservée en logical reference via parameter[bookedAppointment] (Reference.identifier seul, Reference.reference 0..0, type.coding.code = #IdDispoDME, system = NamingSystem du DMÉ via alias $ns-<x>) |
outcome |
0..* |
SGRDVBaseOperationOutcome |
Présent en cas de refus (verrou expiré, refus DMÉ) ou en complément informationnel d'un succès |
En cas de refus (verrou expiré ou refus du DMÉ), le Bundle ne contient que des entry[outcome].
L'Appointment réservé n'est PAS rématérialisé dans le Bundle de réponse, et les ressources contextuelles (Practitioner, PractitionerRole, Location, Organization, Encounter, Patient enrichi) ne sont pas non plus retournées — le portail dispose déjà de l'ensemble de cette information matérialisée lors de l'appel $find initial. Seule la confirmation de la réservation (identifiant logique de la disponibilité, statut implicite #booked documenté par le profil cible SGRDVBaseBookResponseAppointment) circule dans la réponse. Pattern aligné sur la réponse $lock (SGRDVLockResultParameters.parameter[lockedAppointment]).
4.6 Notes de conception
- Réponse en logical reference, pas de rematérialisation — l'
Appointmentréservé et les ressources contextuelles (Practitioner, Location, Encounter, Patient enrichi) ne sont pas rematérialisés dans le Bundle de réponse. Le portail dispose déjà de cette information matérialisée via l'appel$findinitial — la rematérialiser introduirait redondance et risque de désynchronisation entre le DMÉ (autorité d'origine) et la réponse SGRDV. Seule la confirmation de la réservation (identifiant logique de la disponibilité) circule dans la réponse. Pattern symétrique de$lock(SGRDVLockResultParameters.parameter[lockedAppointment]). Device.propertyest valide en FHIR R4 (cardinalité0..*, typeBackboneElementavectype+valueCode/valueQuantity). Le code tuile REO est porté parDevice.property[tuilePortail].valueCode; aucune extension n'est introduite.- Le lieu Clinique d'origine est porté par
Device.owner(logical reference Organization) — pattern aligné sur l'usage SGRDV existant (le Device n'est jamais matérialisé pour les agents deSGRDVBaseRequestProvenance, mais il l'est ici encontainedcar il porte du contexte applicatif additionnel). professionnelREOtypéRelatedPerson(pasPractitioner) : la spec décrit un agent administratif de réorientation, pas un soignant ;RelatedPersonreste le type FHIR R4 le moins inapproprié dans la liste autorisée pourProvenance.agent.who. Lepatientrequis est porté en logical reference NAM.- Le
lockIdentifierdemeure un secret connu du seul portail appelant — strictement absent côté api-source (0..0). orientationIdest typéinteger; il est relayé tel quel par SGRDV au DMÉ pour la traçabilité Vitrai.
4.7 Exemples publiés
Plusieurs instances d'exemple accompagnent les profils :
- api-sgrdv :
SGRDVBookExamplePatient,SGRDVBookExampleRequestProvenance,SGRDVBookExampleRequest,SGRDVBookExampleResultParametersSuccess,SGRDVBookExampleResponseSuccess(Bundle contenant la logical reference de l'Appointment réservé),SGRDVBookExampleResponseLockExpired - api-source : symétriques avec préfixe
SGRDVSourceBook*(incluant un Bundle de refus DMÉSGRDVSourceBookExampleResponseRefused)
5. CapabilityStatement — refactorisation surface source + ajout $book sur les deux surfaces 🟠
5.1 Restructuration SGRDVCapabilityStatementSource
Le CapabilityStatement SGRDVCapabilityStatementSource est restructuré pour refléter le nouveau modèle de surface :
| Bloc | Avant (1.0.3) | Après (1.0.4) |
|---|---|---|
rest[0].resource[Appointment].operation[] |
5 opérations : find, aggregate, lock, extend-lock, release-lock |
3 opérations : find, aggregate, book |
rest[0].operation[] (système) |
absent | process-message (canal FHIR Messaging) |
rest[0].resource[Appointment].supportedProfile[] |
7 profils (find, aggregate + 3 lock) | 6 profils (find, aggregate, book) |
rest[0].resource[MessageHeader] |
absent | ajouté — supportedProfile[] = SGRDVSourceLockNotificationMessageHeader |
rest[0].resource[Bundle] |
absent | ajouté — supportedProfile[] = SGRDVSourceLockNotificationBundle |
messaging[] |
absent | ajouté — supportedMessage mode = #receiver, definition = profil MessageHeader |
5.2 Ajout de $book à SGRDVCapabilityStatement (api-sgrdv)
Le CapabilityStatement SGRDVCapabilityStatement est étendu pour déclarer la nouvelle opération $book :
| Bloc | Avant (1.0.3) | Après (1.0.4) |
|---|---|---|
rest[0].resource[Appointment].operation[] |
5 opérations : find, aggregate, lock, extend-lock, release-lock |
6 opérations : ajout de book |
rest[0].resource[Appointment].supportedProfile[] |
8 profils | 10 profils (ajout du request + response bundle de $book) |
La documentation rest[0] mentionne explicitement que le contrat $book est actuellement en status = draft et susceptible d'évoluer avant stabilisation.
5.3 Bump de version sur tous les artefacts versionnés
| Artefact | version |
|---|---|
5 OperationDefinition côté api-sgrdv ($find, $aggregate, $lock, $extend-lock, $release-lock) |
1.0.4 |
2 OperationDefinition côté api-source restantes ($find, $aggregate) |
1.0.4 |
1 nouvelle OperationDefinition côté api-source ($process-message) |
1.0.4 |
1 nouvelle OperationDefinition côté api-sgrdv ($book, draft) |
1.0.4 |
1 nouvelle OperationDefinition côté api-source ($book, draft) |
1.0.4 |
SGRDVCapabilityStatement (api-sgrdv) |
1.0.4 |
SGRDVCapabilityStatementSource |
1.0.4 |
| Métadonnées du paquet IG | 1.0.4 |
6. Documentation publiée enrichie 🟢
La page d'accueil du guide d'implémentation inclut désormais une section « Notifications de verrou — canal FHIR Messaging (api-source) » décrivant le flux et ses contraintes. La note d'introduction sur le X-Correlation-Id est nuancée pour expliciter sa distinction avec MessageHeader.id (cf. §2.7).
7. Recommandations de migration pour les partenaires
7.1 Si vous êtes un portail (api-sgrdv)
Action requise sur $extend-lock et $release-lock (cf. §3). L'opération $lock reste inchangée.
À l'appel $extend-lock ou $release-lock, fournir désormais :
parameter[appointmentReference](1..1) —Reference.identifierportant l'identifiant local DMÉ de la disponibilité (type.coding.code = #IdDispoDME,system= NamingSystem du DMÉ via alias$ns-<x>,value= identifiant local).Reference.typefixé à"Appointment". Ne PAS peuplerReference.reference.parameter[slotReference](1..*) — unReferencepar slot, mêmes contraintes (type = "Slot",identifier.type.coding.code = #IdSlotDME).parameter[lockIdentifier]— inchangé (le secret reçu lors du$lockinitial).parameter[lockRequestedDuration](extend uniquement) — inchangé.parameter[provenance]— inchangé.
Ne plus envoyer de ressource Appointment rématérialisée dans parameter[appointment] (slice supprimée). Les valeurs des identifiants (disponibilité + slots) sont les mêmes que celles reçues dans le Bundle de réponse $lock initial — il suffit de les mémoriser côté portail entre $lock et l'appel $extend-lock / $release-lock.
Mettre à jour la référence de version du IG à 1.0.4 lors de votre prochaine intégration.
7.2 Si vous êtes un DMÉ/SIP-C (api-source)
Côté serveur, vous devez :
Exposer un nouvel endpoint
POST [base]/$process-message(niveau système, pas rattaché àAppointment). Conserver l'authentification existante.Décommissionner les 3 endpoints précédents :
POST [base]/Appointment/$lockPOST [base]/Appointment/$extend-lockPOST [base]/Appointment/$release-lock
Implémenter la dispatch sur
MessageHeader.eventCoding:system = http://sante.quebec/fhir/CodeSystem/sgrdv-lock-events,codeparmilock-create/lock-extend/lock-release.- Tout autre code doit retourner HTTP 400 +
OperationOutcome.
Résoudre les ressources concernées localement : l'
Appointmentet lesSlotne sont plus poussés dans le payload. Ils sont transmis en logical reference dansMessageHeader.focus[appointment].identifier.value(avecsystem= votreNamingSystemDMÉ) etMessageHeader.focus[slot][].identifier.value(idem). Vous devez les retrouver dans votre propre référentiel.Lire l'heure de fin du verrou depuis
MessageHeader.extension[lock-end-time].valueDateTime(et non plus depuis unParameters.parameter[lock-endTime]).Lire la
Provenancedepuis la deuxièmeentrydu Bundle (profilSGRDVBaseRequestProvenanceinchangé depuis1.0.3).Conserver les comportements existants :
- HTTP 204 en cas de succès, HTTP 4xx/5xx +
OperationOutcomeen cas d'erreur. - Retry avec backoff exponentiel sur 5xx (à la charge de SGRDV) — pas de retry sur 4xx.
- Journalisation du
X-Correlation-IdHTTP — comportement strictement identique à1.0.3. - Journalisation supplémentaire recommandée du
MessageHeader.idpour faciliter le rapprochement des messages individuels.
- HTTP 204 en cas de succès, HTTP 4xx/5xx +
7.3 Si vous validez vos instances avec un validateur FHIR
Les exemples publiés pour le canal $process-message (3 messages, un par événement lock-create / lock-extend / lock-release) sont conformes aux profils. Aucun warning de validation attendu au-delà de ceux déjà documentés en 1.0.3 (notamment ident-1 sur agent.who.identifier sans value).
7.4 Si vous voulez anticiper $book
Aucune action n'est requise en 1.0.4 — les nouveaux artefacts $book sont publiés en status = draft, experimental = true. La stabilisation de l'opération est attendue dans une release ultérieure ; le contrat peut évoluer d'ici là. Les partenaires intéressés peuvent consulter les CapabilityStatement (SGRDVCapabilityStatement côté portail, SGRDVCapabilityStatementSource côté DMÉ), étudier les profils publiés (§4) et formuler des retours.
7.5 Si vous voulez anticiper GET /Organization (DMÉ)
Aucune action n'est requise en 1.0.4 — le contrat est publié en status = draft, experimental = true. Les DMÉ peuvent consulter SGRDVCapabilityStatementSource (déclaration de l'interaction search-type sur la ressource Organization), étudier les profils publiés (§8) et formuler des retours d'ici la stabilisation.
7.6 Toutes intégrations confondues
- Mettre à jour les références internes (validation, documentation, dépendances de paquet) à la version
1.0.4des artefacts. L'attributexperimental = trueest conservé sur tous les artefacts ; le statut des artefacts existants (#active) ne change pas par rapport à1.0.3. Les nouveaux artefacts$book(§4) etGET /Organization(§8) sont introduits en#draft. - Conserver la politique de versionnement et de stabilité publiée en
1.0.2: tant qu'un artefact estexperimental = true, ses ruptures n'entraînent qu'un bump PATCH du paquet — c'est ce qui s'applique à cette release.
8. Nouveau endpoint GET [base]/Organization (draft, expérimental) — surface api-source 🟢
S'applique uniquement à la surface api-source (SGRDV → DMÉ/SIP-C). Endpoint introduit à l'état status = draft, experimental = true et déclaré dans SGRDVCapabilityStatementSource (cf. §5) afin de le rendre visible aux partenaires pour anticipation et retour.
Conforme à la Spécification API — Obtenir Cliniques v0.1 (2026-05-05). Le service permet à SGRDV d'obtenir, à fréquence régulière (typiquement nocturne quotidienne), la liste à jour des cliniques publiques de 1ère ligne présentement desservies par chaque DMÉ et susceptibles d'être impliquées dans le processus de prise de RV via les portails VotreSanté et REO. Les cliniques privées sont exclues.
8.1 Interaction FHIR
| Élément | Choix 1.0.4 |
|---|---|
| Verbe HTTP requis | GET |
| URL | [base]/Organization |
Variante POST /Organization/_search |
Optionnelle, non requise — un DMÉ peut la supporter en plus, mais SGRDV invoque exclusivement GET. Un DMÉ qui ne supporte que GET est conforme. |
| Type d'interaction FHIR | Type-level search (search-type) déclarée sur rest[0].resource[Organization].interaction[] |
| Paramètres de recherche | AUCUN — le filtrage (cliniques publiques de 1ère ligne, présentement desservies, non privées) est côté serveur (responsabilité DMÉ) |
| Réponse succès | Bundle searchset conforme au profil SGRDVSourceListClinicsResponseBundle |
| Réponse erreur | HTTP 4xx/5xx + OperationOutcome (profil SGRDVBaseOperationOutcome) |
L'endpoint est modélisé comme une recherche FHIR type-level, pas comme une opération $xxx — aucun OperationDefinition n'est introduit. Le détail du contrat (verbe HTTP, filtrage serveur, structure de réponse, sémantique de indRvPublies, fréquence d'invocation, X-Correlation-Id) est porté par rest[0].resource[Organization].interaction[search-type].documentation du SGRDVCapabilityStatementSource.
8.2 Nouveaux artefacts FSH 🟢
Artefacts communs
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVOrganizationIndRvPubliesExtension |
Extension (Organization) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-organization-ind-rv-publies |
Indicateur booléen de publication des disponibilités aux portails. Si absent, valeur par défaut TRUE dans la table de référence SGRDV |
SGRDVBaseListClinicsOrganization |
Profile (Organization) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-base-list-clinics-organization |
Profil d'une clinique retournée par la recherche. Hérite de SGRDVBaseFindOrganization (mêmes contraintes identifier CodeEtablissement RAMQ + name) et ajoute l'extension indRvPublies |
Artefacts de la surface api-source
| Artefact | Type | URL canonique | Rôle |
|---|---|---|---|
SGRDVSourceListClinicsResponseBundle |
Profile (Bundle) |
http://sante.quebec/fhir/StructureDefinition/sgrdv-source-list-clinics-response-bundle |
Bundle searchset retourné par le DMÉ ; entry slicé organization 1..* + outcome 0..1 |
8.3 Structure du Bundle de réponse
| Entry | Cardinalité | Profil cible | Notes |
|---|---|---|---|
entry[organization] |
1..* |
SGRDVBaseListClinicsOrganization |
Une entry par clinique desservie ; search.mode = #match recommandé |
entry[outcome] |
0..1 |
SGRDVBaseOperationOutcome |
Permet par exemple d'indiquer l'horodatage de la liste retournée ; search.mode = #outcome recommandé |
Bundle.type est fixé à #searchset, Bundle.total est 1..1 (compte les entries match).
8.4 Profil Organization retourné
Hérite de SGRDVBaseFindOrganization — donc :
identifier1..1:systempointant vers le NamingSystem RAMQ ($ns-ramq),type.coding.code = #CodeEtablissement,value= code d'établissement RAMQ tel que retourné par GRL.name0..1: nom de la clinique, optionnel — utilisé uniquement pour faciliter la lecture des données de référence.type0..*: libre — non figé par le profil.
Et ajoute :
extension[indRvPublies]0..1:valueBoolean. Sifalse, le DMÉ signale que la clinique ne publiera jamais de disponibilités pour les portails — SGRDV n'interrogera plus le DMÉ pour cette clinique lors des recherches de disponibilités. Si l'extension est absente, SGRDV applique la valeur par défaut TRUE.
8.5 X-Correlation-Id
Mécanisme HTTP inchangé — règle générale api-source (cf. §2.7) : X-Correlation-Id requis sur tous les appels, journalisé par le DMÉ et retourné en écho, jamais représenté dans le payload FHIR.
8.6 Exemples publiés
Quatre instances d'exemple accompagnent les profils côté api-source :
SGRDVSourceListClinicsExampleOrganization1— clinique avec nom etindRvPublies = trueSGRDVSourceListClinicsExampleOrganization2— clinique minimale (identifiant RAMQ seul, sans nom, sans extension)SGRDVSourceListClinicsExampleOrganization3— clinique avecindRvPublies = falseSGRDVSourceListClinicsExampleOutcomeInformation—OperationOutcomeinformationnel horodatant la listeSGRDVSourceListClinicsExampleResponseSuccess— Bundle complet agrégeant les exemples ci-dessus
8.7 Notes de conception
- Recherche FHIR vs opération
$xxx— le contrat décrit unGETsans paramètre retournant unBundle. Une recherche type-level est l'idiome FHIR R4 adapté ; introduire uneOperationDefinitionaurait été plus lourd sans bénéfice fonctionnel. - Pas d'enfant
SGRDVSourceListClinicsOrganization— le profilOrganizationretourné ne diffère pas selon la surface ; on réutilise directementSGRDVBaseListClinicsOrganizationcôtéapi-source(même pattern queSGRDVBaseFindOrganization, qui n'a pas d'enfant Source). - Pas de parent
Basepour le Bundle de réponse — le contrat n'existe que sur la surfaceapi-source; introduire un parent commun aurait été spéculatif. - Filtrage côté serveur (cliniques publiques de 1ère ligne, non privées, présentement desservies) — non exprimé dans le profil FHIR. C'est une règle métier du DMÉ documentée dans la
Descriptiondu profil et la documentation REST duCapabilityStatement.
Canonical claims
| http://sante.quebec/fhir/ | Claimed |
| http://sante.quebec/fhir/StructureDefinition/ | Claimed |
| http://sante.quebec/fhir/ImplementationGuide/ | Claimed |
| http://sante.quebec/fhir/OperationDefinition/ | Claimed |
| http://sante.quebec/fhir/CodeSystem/ | Claimed |
| http://sante.quebec/fhir/ValueSet/ | Claimed |
| http://sante.quebec/fhir/CapabilityStatement/ | Claimed |
| http://sante.quebec/ | Claimed |
| http://sante.quebec/fhir/NamingSystem/ | Claimed |
| Name | Version | Release date | ||
|---|---|---|---|---|
| ca.qc.sq.sgrdv | 1.0.5 | latest | ||
| ca.qc.sq.sgrdv | 1.0.4 | |||
| ca.qc.sq.sgrdv | 1.0.3 | |||
| ca.qc.sq.sgrdv | 1.0.2 | |||
| ca.qc.sq.sgrdv | 1.0.0 |