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.2.8
Date de publication : 23 septembre 2026
Légende : 🔴 = rupture sur contrat de production (
experimental = false) · 🟠 = rupture sur contrat en validation (experimental = true) · 🟢 = ajout ou assouplissement rétrocompatible
1. Identification des professionnels — Numéro de licence d'un ordre professionnel 🟢
Pour référer, dans $find/$aggregate, à un professionnel autre qu'un médecin de famille, un résident ou un IPSPL, l'identifiant peut désormais se construire à partir du numéro de licence de son ordre professionnel plutôt que du code professionnel RAMQ.
1.1 Nouveaux NamingSystem des ordres professionnels 🟢
11 nouvelles ressources NamingSystem (kind #identifier) et leurs alias associés :
| Ordre | Alias | NamingSystem |
|---|---|---|
| OCCOQ | $ns-occoq |
OCCOQ_ordreConseillersOrientation |
| OPCQ | $ns-opcq |
OPCQ_ordreCriminologues |
| OCNQ | $ns-ocnq |
OCNQ_ordreDietetistesNutritionnistes |
| OEQ | $ns-oeq |
OEQ_ordreErgotherapeutes |
| OIIQ | $ns-oiiq |
OIIQ_ordreInfirmieresInfirmiers |
| OPIQ | $ns-opiq |
OPIQ_ordreInhalotherapeutes |
| OPQ (psychologues) | $ns-opq-psychologues |
OPQ_ordrePsychologues |
| OPQ (pharmaciens) | $ns-opq-pharmaciens |
OPQ_ordrePharmaciens |
| OPPQ | $ns-oppq |
OPPQ_ordrePhysiotherapeutes |
| OPSQ | $ns-opsq |
OPSQ_ordreSexologues |
| OTSTCFQ | $ns-otstcfq |
OTSTCFQ_ordreTravailleursSociaux |
1.2 Nouveau code NoLicenceProfessionnel 🟢
| Élément | Avant | Après |
|---|---|---|
SGRDVIdentifierTypeCS (et SGRDVIdentifierTypeVS) |
— | #NoLicenceProfessionnel "Numéro de licence professionnel" (nouveau code) |
1.3 Slicing de l'identifiant du Practitioner ($find / $aggregate) 🟢
SGRDVBaseFindPractitioner.identifier figeait jusqu'ici un unique identifiant de type #CodeProfessionnel (RAMQ). Il est désormais slicé par type.coding.code, ce qui ajoute une option sans retirer l'existante :
| Élément | Avant | Après |
|---|---|---|
identifier |
1..1, type figé à #CodeProfessionnel |
1..*, slicing ouvert |
identifier[codeProfessionnel] |
(comportement précédent) | 0..1 — RAMQ, médecin de famille / résident / IPSPL (inchangé) |
identifier[noLicenceProfessionnel] |
absent | 0..1 — type.coding.code = #NoLicenceProfessionnel, system laissé ouvert (NamingSystem de l'ordre concerné), value = numéro de licence |
Un Practitioner continue de ne porter qu'un seul de ces deux identifiants. Les payloads existants (identifiant unique #CodeProfessionnel) demeurent valides sans modification.
2. OperationOutcome — ValueSets et profils dédiés par opération (surface SGRDV) 🟢
2.1 Nouveaux codes CodeSystem 🟢
32 nouveaux codes MSG_* ajoutés à SGRDVOperationOutcomeCodesExtensionCS (displays à compléter depuis le catalogue de messages applicatif).
2.2 ValueSets et profils OperationOutcome par opération 🟢
Chaque opération de la surface SGRDV dispose désormais de son propre jeu de valeurs d'outcome (façade, cf. ADR-020) et de son propre profil, dérivé de SGRDVBaseOperationOutcome, avec rebinding informatif (extensible) de issue.details :
| Opération | ValueSet | Profil |
|---|---|---|
$find |
SGRDVFindOutcomeVS |
SGRDVFindOperationOutcome |
$aggregate |
SGRDVAggregateOutcomeVS |
SGRDVAggregateOperationOutcome |
$lock |
SGRDVLockOutcomeVS |
SGRDVLockOperationOutcome |
$extend-lock |
SGRDVExtendLockOutcomeVS |
SGRDVExtendLockOperationOutcome |
$release-lock |
SGRDVReleaseLockOutcomeVS |
SGRDVReleaseLockOperationOutcome |
$book |
SGRDVBookOutcomeVS |
SGRDVBookOperationOutcome |
$cancel |
SGRDVCancelOutcomeVS |
SGRDVCancelOperationOutcome |
Le profil de base SGRDVBaseOperationOutcome et la surface Systèmes source ne sont pas affectés.
2.3 Conteneurs de réponse spécialisés 🟢
Sur $find, $aggregate, $book et $cancel, l'entrée entry[outcome].resource du Bundle de réponse pointe désormais vers le profil spécifique de l'opération plutôt que vers le profil de base :
| Élément | Avant | Après |
|---|---|---|
entry[outcome].resource ($find, $aggregate, $book, $cancel) |
only SGRDVBaseOperationOutcome (hérité) |
only SGRDV{Opération}OperationOutcome |
entry[outcome].resource ($lock, $extend-lock, $release-lock) |
only SGRDVBaseOperationOutcome |
inchangé — conteneur partagé SGRDVLockResponseBundle, le nouveau ValueSet y sert de vocabulaire de référence sans contraindre le contrat |
Le rebinding étant extensible, tout OperationOutcome valide contre SGRDVBaseOperationOutcome reste valide contre le profil spécialisé — aucune action requise.
2.4 Codes d'exemple corrigés 🟢
Les instances d'exemple $lock, $extend-lock et $release-lock sont rebranchées sur des codes sémantiquement plus justes : MSG_AUCUNE_DISPO → MSG_VERROU_IMPOSSIBLE (lock), → MSG_LOCK_EXPIRED (extend-lock), → MSG_RELEASE_BOOKED (release-lock, avec issue.code #not-found → #conflict). Changement d'exemples uniquement, sans impact sur le contrat.
3. Filtres d'exclusion sur $find / $aggregate 🟢
Trois nouveaux paramètres, symétriques aux paramètres d'inclusion existants, permettent d'exclure des résultats des professionnels, cliniques ou GMF ciblés :
| Paramètre | Surface SGRDV (portail) | Surface source (DMÉ/SIP-C) | Référence |
|---|---|---|---|
excludePractitioner |
0..* MS |
0..* MS (relayé tel quel) |
Reference(SGRDVBaseFindPractitioner) — identique à practitioner |
excludeClinic |
0..* MS |
0..* MS (relayé tel quel) |
Reference(SGRDVBaseFindOrganization) — identique à clinic |
excludeGMF |
0..1 MS |
0..0 (interdit) |
Reference(SGRDVBaseFindOrganization) — identique à gmf |
Règle métier : un même identifiant ne peut pas apparaître à la fois dans un paramètre positif et son équivalent d'exclusion (practitioner/excludePractitioner, clinic/excludeClinic, gmf/excludeGMF). excludeGMF n'est accepté que sur la surface SGRDV — SGRDV résout les cliniques membres du GMF exclu et les relaie au système source sous forme d'occurrences répétées de excludeClinic.
4. $aggregate — timeslot-category rendu obligatoire 🟠
| Élément | Avant | Après |
|---|---|---|
parameter[timeslotCategory] — SGRDVAggregateRequestParameters (api-sgrdv) |
0..1 (hérité) |
1..1 |
parameter[timeslotCategory] — SGRDVSourceAggregateRequestParameters (api-source) |
0..1 (hérité) |
1..1 |
parameter[timeslotCategory] — $find (les deux surfaces) |
0..1 |
inchangé |
$find n'est pas affecté : timeslot-category y demeure optionnel, pour continuer à permettre une recherche de rendez-vous sans catégorie.
⚠️ Action requise : tout appel à $aggregate (portail ou DMÉ/SIP-C) doit désormais toujours fournir timeslot-category ; un appel sans ce paramètre est rejeté.
5. Audit — AuditEvent auto-portant (contained), remplace le Bundle d'audit 🟠
Le pipeline d'ingestion du Lac (Fabric HDS) ne décompose pas les Bundle type=collection : le modèle d'audit en Bundle (ADR-016) n'y est pas ingérable. L'audit passe à un AuditEvent auto-portant qui embarque ses ressources compagnes en contained (ADR-024, qui remplace ADR-016).
5.1 SGRDVAuditEvent 🟠
| Élément | Avant | Après |
|---|---|---|
| Ressources compagnes (acteurs, payload) | Portées par Bundle.entry (4 entrées, profil SGRDVAuditBundle) |
contained 2..3 MS sur l'AuditEvent lui-même |
agent[source].who.reference / agent[destination].who.reference |
1..1 MS, valeur libre |
fixées à "#source" / "#destination" |
entity (payload) |
1..* MS, entity[payload] 1..1 (obligatoire) |
0..* MS, entity[payload] 0..1 (optionnel — une réponse sans corps, ex. 204, est désormais conforme) |
entity[payload].what.reference |
1..1 MS |
fixée à "#payload" |
source.observer |
référence vers un Device du Bundle |
référence vers le Device contenu (#source ou #destination selon le moment — non fixée) |
5.2 SGRDVAuditAgent 🟠
| Élément | Avant | Après |
|---|---|---|
meta.versionId / meta.lastUpdated |
non contraints | 1..1 MS (obligatoires sur chaque ressource contenue — requis par Fabric HDS pour la décomposition ; écart intentionnel et assumé à l'invariant FHIR dom-4, cf. ADR-024) |
5.3 Retrait de SGRDVAuditBundle et ingestion 🟠
| Élément | Avant | Après |
|---|---|---|
SGRDVAuditBundle (Bundle type=collection, 4 entrées) |
Publié | Retiré du guide |
| Ingestion Lac (AHDS) | POST [base]/Bundle |
POST [base]/AuditEvent |
| Regroupement par fil (discussion) | Bundle.identifier (#DiscussionId) + extension discussionId sur chaque AuditEvent |
extension sgrdv-audit-discussion-id seule, portée par l'AuditEvent |
Le CapabilityStatement de la surface Audit est refondu en conséquence (ressource AuditEvent avec interaction create directe ; Device documenté comme ressource contenue, sans interaction REST propre).
⚠️ Action requise : les systèmes qui produisent des journaux d'audit SGRDV doivent migrer de la publication d'un Bundle type=collection à 4 entrées vers la publication d'un AuditEvent auto-portant unique, avec ses ressources compagnes en contained et meta.versionId/meta.lastUpdated renseignés sur chacune.
Ces profils (
SGRDVAuditEvent,SGRDVAuditAgent, ex-SGRDVAuditBundle) portentstatus = #draftmais font l'objet d'un suivi changelog continu depuis la 1.1.1 ; le symbole 🟠 reflète leur statutexperimental = true.
6. Recommandations de migration pour les partenaires
Si vous intégrez le portail ($find / $aggregate)
$aggregate: fournissez systématiquementtimeslot-category— ce paramètre est désormais obligatoire (il reste optionnel sur$find).- Pour référer un professionnel autre qu'un médecin de famille/résident/IPSPL (via
practitionerouexcludePractitioner), utilisez un identifiant de typeNoLicenceProfessionnel(system=NamingSystemde l'ordre professionnel concerné,value= numéro de licence) plutôt queCodeProfessionnel. - De nouveaux paramètres optionnels
excludePractitioner,excludeClinicetexcludeGMFpermettent d'exclure des professionnels, cliniques ou GMF des résultats. - Les
OperationOutcomeretournés peuvent désormais porter des codes documentés dans un jeu de valeurs propre à l'opération — binding informatif, aucune action requise siissue.detailsest déjà traité de façon générique.
Si vous intégrez le DMÉ/SIP-C ($find / $aggregate)
$aggregate:timeslot-categoryest désormais obligatoire dans les demandes reçues de SGRDV.excludePractitioneretexcludeClinicpeuvent désormais être reçus dans les demandes ;excludeGMFn'est jamais relayé tel quel (SGRDV le résout en occurrences répétées deexcludeClinic).- Un identifiant
Practitionerde typeNoLicenceProfessionnelpeut désormais être reçu en plus deCodeProfessionnel.
Si vous produisez ou consommez l'audit affaire SGRDV (Lac / Fabric HDS)
- Migrez la publication des journaux d'audit d'un
Bundletype=collection(4 entrées,POST [base]/Bundle) vers unAuditEventauto-portant (POST [base]/AuditEvent) embarquant ses ressources compagnes encontained. - Fixez les références locales
agent[source].who.reference = "#source",agent[destination].who.reference = "#destination"et, lorsque présent,entity[payload].what.reference = "#payload". - Renseignez
meta.versionIdetmeta.lastUpdatedsur chaque ressourceDevicecontenue (SGRDVAuditAgent). - Une transaction sans corps de réponse (ex. 204) peut désormais produire un audit sans
entity[payload]— ne traitez plus ce cas comme une erreur de modélisation. - Le regroupement par fil repose désormais uniquement sur l'extension
sgrdv-audit-discussion-id—Bundle.identifiern'existe plus.
Toutes intégrations confondues
- Alignez vos consommations sur la version
1.2.8du paquet IG.
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 | ||
|---|---|---|---|---|
| hl7.fhir.ca.baseline | 1.2.0 | |||
| hl7.fhir.uv.extensions.r4 | 5.2.0 | |||
| hl7.fhir.r4.core | 4.0.1 | |||