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.2
Date de publication : 4 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.0 → 1.0.2 🟢
Cette release applique un bump PATCH cumulant les changements de §2 et §3 depuis la version 1.0.0 publiée précédemment. Tous les artefacts versionnés (config IG, OperationDefinition, CapabilityStatement) sont alignés sur la version 1.0.2 ; les nouvelles opérations $extend-lock et $release-lock (voir §3.1) sont publiées au statut #draft alors que les autres artefacts demeurent au statut #active introduit en 1.0.0. L'attribut experimental = true est conservé sur tous les artefacts tant que la phase de validation se poursuit.
Le bump est conforme à la politique de versionnement (voir §1.2) : ruptures sur des artefacts experimental = true → bump PATCH.
1.2 Politique de versionnement formalisée 🟢
Une politique explicite de versionnement et de stabilité est désormais publiée. Elle précise :
- la sémantique des bumps
MAJOR/MINOR/PATCHselon le type de changement ET le statutexperimentalde l'artefact concerné ; - les engagements de stabilité de SGRDV pour les artefacts
experimental = false(production) vsexperimental = true(validation) ; - la légende des changelogs partenaires (🔴 / 🟠 / 🟢).
À retenir : tant qu'un artefact est experimental = true, ses ruptures n'entraînent qu'un bump PATCH du paquet. Les partenaires en intégration anticipée doivent suivre activement les changelogs.
2. Opérations $find et $aggregate
S'applique aux deux surfaces (api-sgrdv et api-source), via le profil parent commun SGRDVBaseFindPayloadParameters.
2.1 Paramètres practitioner / clinic / gmf — logical references contraintes 🟠
Les paramètres de filtrage practitioner, clinic et gmf étaient typés Reference(...) mais aucune contrainte ne précisait la modalité d'identification — le payload Parameters n'embarque pas la ressource cible, donc une référence littérale ("PractitionerRole/abc") pointait dans le vide.
Le contrat est désormais explicite : ces trois paramètres sont des logical references (identifier-only).
| Élément | Avant | Après |
|---|---|---|
valueReference.reference |
accepté | 0..0 — référence littérale interdite |
valueReference.identifier |
optionnel | 1..1 — logical reference obligatoire |
valueReference.identifier.type.coding.system |
libre | fixé à $sgrdv-ident-type |
valueReference.identifier.type.coding.code |
libre | selon le paramètre : practitioner → #CodeProfessionnel · clinic → #CodeEtablissement · gmf → #GMF |
valueReference.identifier.system / .value |
libres | 1..1 chacun |
⚠️ Action requise : remplacer toute Reference littérale (reference = "...") par une logical reference (identifier.system + identifier.value + identifier.type.coding) dans parameter[practitioner | clinic | gmf]. Le DMÉ résoudra le filtre par identifiant local (CodeProfessionnel / CodeEtablissement / GMF).
2.2 Patient.generalPractitioner — embarquement par contained 🟢
Le profil partagé SGRDVBaseFindPatient reçoit un slicing explicite de Patient.contained[], permettant d'embarquer le médecin de famille (PractitionerRole, Practitioner) et l'organisation/GMF du patient directement dans le payload Patient. Patient.generalPractitioner les référence alors via fragment #id.
Slice contained |
Cardinalité | Profil |
|---|---|---|
gpPractitionerRole |
0..* |
SGRDVBaseFindPractitionerRole |
gpPractitioner |
0..* |
SGRDVBaseFindPractitioner |
gpOrganization |
0..* |
SGRDVBaseFindOrganization |
Ce pattern résout la situation où Patient.generalPractitioner.reference pointait vers une instance externe absente du payload : le DMÉ peut désormais matérialiser le nom du médecin (name.family / name.given) sans appel externe.
Le PractitionerRole contained porte à la fois practitioner.identifier (sémantique métier — CodeProfessionnel) et practitioner.reference = "#<id>" (exigence FHIR dom-3 sur les ressources contained, pour qu'une ressource embarquée soit considérée référencée).
Slicing #open : les références externes restent permises pour les implémentations qui ne souhaitent pas embarquer. Aucune action requise pour les partenaires existants — pattern additif.
3. Opérations de verrou ($lock, $extend-lock, $release-lock)
S'applique aux deux surfaces (api-sgrdv et api-source).
3.1 Nouvelles opérations $extend-lock et $release-lock 🟢
Le cycle de vie du verrou est désormais complet : prolongation et retrait s'ajoutent à la pose initiale.
| Opération | Surface portail (api-sgrdv) | Surface systèmes source (api-source) |
|---|---|---|
$extend-lock |
Demande de prolongation portant le lockIdentifier du $lock initial. Réponse avec nouveau lockEndTime (le lockIdentifier est conservé). |
Notification SGRDV → DMÉ/SIP-C portant le nouveau lockEndTime (sans lockIdentifier). |
$release-lock |
Demande de retrait portant le lockIdentifier du $lock initial. Réponse nominale HTTP 204. |
Notification SGRDV → DMÉ/SIP-C (sans lockIdentifier). |
Les deux opérations sont publiées au statut #draft dans cette release ; leur structure de paramètres est stabilisée mais le contrat reste susceptible d'évoluer pendant la phase de validation. Les CapabilityStatement des deux surfaces sont enrichis en conséquence.
3.2 lockIdentifier — secret du portail appelant 🟢
Un nouveau slice parameter[lockIdentifier] (string 1..1) est introduit sur le profil parent commun SGRDVBaseLockPayloadParameters. Sa sémantique :
| Surface | $lock |
$extend-lock |
$release-lock |
|---|---|---|---|
| Portail (api-sgrdv) — entrée | 0..0 (interdit — généré par SGRDV) |
1..1 (le portail rejoue le secret reçu) |
1..1 (idem) |
| Portail (api-sgrdv) — réponse | 1..1 (retourné par SGRDV) |
1..1 (retourné inchangé) |
n/a (réponse HTTP 204) |
| Source (api-source) — entrée | 0..0 (interdit — secret du portail, jamais transmis au DMÉ/SIP-C) |
0..0 (idem) |
0..0 (idem) |
Règle de sécurité fondamentale : le lockIdentifier est un secret connu uniquement du portail appelant initial. SGRDV ne le propage jamais vers les systèmes source. Les notifications SGRDV → DMÉ portent uniquement l'appointment, le lockEndTime (le cas échéant) et la provenance.
3.3 Appointment.slot — logical reference contrainte 🟠
Sur le profil parent commun SGRDVBaseLockCandidateAppointment (utilisé en entrée par $lock, $extend-lock et $release-lock sur les deux surfaces), le champ slot était typé Reference(SGRDVBaseDmeSlot) mais le Slot n'est pas embarqué dans le payload de verrou — une référence littérale ("Slot/abc") pointait dans le vide.
Le contrat est désormais explicite : Appointment.slot est une logical reference (identifier-only).
| Élément | Avant | Après |
|---|---|---|
slot.reference |
accepté | 0..0 — référence littérale interdite |
slot.identifier |
optionnel | 1..1 — logical reference obligatoire |
slot.identifier.type.coding.system |
libre | fixé à $sgrdv-ident-type |
slot.identifier.type.coding.code |
libre | fixé à #IdSlotDME |
slot.identifier.system / .value |
libres | 1..1 chacun |
⚠️ Action requise : remplacer toute référence littérale slot[i].reference = "Slot/..." par une logical reference (slot[i].identifier.system + slot[i].identifier.value + slot[i].identifier.type.coding = $sgrdv-ident-type#IdSlotDME).
Note : sur les réponses de
$find(entréeentry[slot]du Bundle searchset), la ressourceSlotreste matérialisée comme entry du Bundle ; la référence littéraleslot[i].referencey demeure valide. Cette règle de logical reference s'applique uniquement aux opérations de verrou.
4. Recommandations de migration pour les partenaires
Si vous émettez parameter[practitioner | clinic | gmf] dans $find ou $aggregate
- Remplacer
valueReference.reference = "..."par un logical reference :valueReference.identifier.system(NamingSystem applicable, p. ex.$ns-ramq)valueReference.identifier.value(valeur métier — code professionnel, code établissement ou code GMF)valueReference.identifier.type.coding=$sgrdv-ident-type#CodeProfessionnel·#CodeEtablissement·#GMFselon le paramètre concerné.
Si vous renseignez Patient.generalPractitioner dans $find ou $aggregate
- Optionnel — matérialiser les ressources cibles dans
Patient.contained[]avec unidlocal et faire pointergeneralPractitioner.referencevers"#<id>". Recommandé si le destinataire (DMÉ/SIP-C) a besoin du nom du médecin (name.family/name.given) et n'a pas la connaissance interne duPractitionerRole/Practitionerréférencé. Si la matérialisation est utilisée, lePractitionerRoledoit renseigner à la foispractitioner.identifieretpractitioner.reference = "#<id>"(contrainte FHIRdom-3).
Si vous appelez $lock, $extend-lock ou $release-lock
- Sur
Appointment.slot[i], remplacer toutereference = "Slot/..."par une logical reference (identifier.system+identifier.value+identifier.type.coding=$sgrdv-ident-type#IdSlotDME). - Pour
$extend-lock/$release-lock(portail) : rejouer lelockIdentifierreçu en réponse du$lockinitial dansparameter[lockIdentifier].valueString. Ce secret n'est pas transmis aux systèmes source. - Côté systèmes source (DMÉ/SIP-C) : ne jamais s'attendre à recevoir le
lockIdentifier; les notifications SGRDV portent uniquement l'appointment, lelockEndTime(le cas échéant) et laprovenance.
Toutes intégrations confondues
- Mettre à jour les références internes (validation, documentation, dépendances de paquet) à la version
1.0.2des artefacts (les opérations$extend-locket$release-locksont publiées au statut#draft; les autres artefacts demeurent au statut#activeintroduit en1.0.0). - Prendre connaissance de la politique de versionnement et de stabilité publiée avec cette release : elle précise les règles de bump (
MAJOR/MINOR/PATCH) selon le type de changement et le statutexperimentalde chaque artefact, ainsi que les engagements de stabilité de SGRDV.
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.3 | latest | ||
| ca.qc.sq.sgrdv | 1.0.2 | |||
| ca.qc.sq.sgrdv | 1.0.0 |