Consentement et accès limité
Un Health ID indique au clinicien qui est le patient, pas le contenu de son dossier. Lire le dossier exige un fondement ; à défaut, le clinicien demande et le patient décide.
Le flux
Faites défiler les étapes sous le diagramme, ou survolez-en une, pour la mettre en évidence.
- Recherche du Health ID Le clinicien scanne le QR du patient ou saisit son Health ID.
- Identité seule, pas de dossier Sans rendez-vous, lien d’équipe de soins ou accord, le dossier reste fermé.
- Demande : portée + motif La demande précise ce qui sera lu et pourquoi.
- Notification au patient La demande apparaît dans l’application du patient avec une notification.
- Approuver (ou refuser) Le patient décide. Un refus met fin au flux.
- Accord : portée, expires_at Un accord de consentement est enregistré avec sa portée et sa date d’expiration.
- Ouvrir le dossier Le clinicien consulte le dossier.
- Contrôle du fondement Le contrôle de relation clinique n’autorise que ce que couvre l’accord.
- Accès journalisé Qui a lu quoi, quand et sur quel fondement est inscrit au journal visible par le patient.
- Données limitées renvoyées Seule la partie autorisée du dossier est renvoyée.
- Révocation ou expiration Le patient peut révoquer à tout moment ; sinon l’accord expire à son échéance.
- Demande refusée Si le patient refuse la demande, aucun accord n'est créé et le dossier reste fermé.
Comment ce diagramme est vérifié 21 contrôles sur 21 réussis
L'image, les étapes, le PDF et le JSON sont générés à partir d'une seule spécification. Un test automatisé démontre le graphe et vérifie chaque référence ci-dessous dans l'application en fonctionnement.
- Chaque carte a un identifiant unique
- Chaque carte a un type connu
- Chaque flèche relie deux cartes existantes
- Un seul point de départ (personne, appareil ou partenaire)
- Chaque carte est atteignable depuis le départ
- Chaque carte mène à une issue (aucune impasse)
- Aucun cycle sauf les boucles de nouvel essai déclarées
- Chaque étape numérotée suit de vraies flèches
- Les issues terminent le flux
- Deux cartes ne partagent jamais une case
- Chaque carte cite sa preuve
- Chaque route, classe, méthode et réglage existe
- Chaque icône vient du jeu Lucide
- Chaque icône correspond au type de sa carte
- Chaque libellé existe en anglais et en français
- Chaque libellé tient dans sa carte
- Aucune flèche ne traverse une carte
- Deux flèches sans rapport ne se superposent jamais
- Aucune étiquette de flèche ne couvre une carte ou une autre étiquette
- Chaque pointe de flèche est visible
- Deux cartes reliées de types différents ne partagent jamais une couleur
| Carte | Preuve dans le code |
|---|---|
| Clinicien | config:staff_capabilities.capabilities.identify_patient route:portals.chart.consent_request |
| Recherche du Health ID | uri:POST api/mobile/doctor/patients/scan method:App\Http\Controllers\Api\Mobile\MobileProviderScanController::scan |
| Base pour lire ? | method:App\Support\ClinicalRelationshipGate::evaluate method:App\Support\ClinicalRelationshipGate::holds |
| Demande : portée + motif | uri:POST api/mobile/doctor/consent-requests method:App\Http\Controllers\Api\Mobile\MobileConsentRequestController::store config:staff_capabilities.capabilities.request_access |
| Données limitées renvoyées | uri:GET api/mobile/doctor/patients/{patient} method:App\Http\Controllers\Api\Mobile\MobileDoctorChartController::show |
| Accès journalisé | class:App\Models\AccessLog uri:GET api/mobile/access-logs |
| Contrôle du fondement | method:App\Support\ClinicalRelationshipGate::hasActiveConsentGrant method:App\Support\ClinicalRelationshipGate::coversFullRecord |
| Notification au patient | uri:GET api/mobile/consent-requests uri:GET api/mobile/consent-requests/pending-count |
| Lectures suivantes refusées | uri:POST api/mobile/consents/{id}/revoke method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::revokeConsent |
| Accord : portée, expires_at | class:App\Models\ConsentGrant method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::approveConsent |
| Approuver (ou refuser) | uri:POST api/mobile/consent-requests/{id}/approve uri:POST api/mobile/consent-requests/{id}/deny |
| Demande refusée | method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::denyConsent |
Ce que cela garantit
- Sans fondement, pas de dossier : la recherche d’un Health ID n’ouvre jamais un dossier à elle seule.
- L’accès est limité à la portée accordée et prend fin à l’expiration ou à la révocation.
- Chaque lecture est journalisée et visible par le patient.
Où cela se trouve dans le code
config:staff_capabilities.capabilities.identify_patientroute:portals.chart.consent_requesturi:POST api/mobile/doctor/patients/scanmethod:App\Http\Controllers\Api\Mobile\MobileProviderScanController::scanmethod:App\Support\ClinicalRelationshipGate::evaluatemethod:App\Support\ClinicalRelationshipGate::holdsuri:POST api/mobile/doctor/consent-requestsmethod:App\Http\Controllers\Api\Mobile\MobileConsentRequestController::storeconfig:staff_capabilities.capabilities.request_accessuri:GET api/mobile/doctor/patients/{patient}method:App\Http\Controllers\Api\Mobile\MobileDoctorChartController::showclass:App\Models\AccessLoguri:GET api/mobile/access-logsmethod:App\Support\ClinicalRelationshipGate::hasActiveConsentGrantmethod:App\Support\ClinicalRelationshipGate::coversFullRecorduri:GET api/mobile/consent-requestsuri:GET api/mobile/consent-requests/pending-counturi:POST api/mobile/consents/{id}/revokemethod:App\Http\Controllers\Api\Mobile\MobileGovernanceController::revokeConsentclass:App\Models\ConsentGrantmethod:App\Http\Controllers\Api\Mobile\MobileGovernanceController::approveConsenturi:POST api/mobile/consent-requests/{id}/approveuri:POST api/mobile/consent-requests/{id}/denymethod:App\Http\Controllers\Api\Mobile\MobileGovernanceController::denyConsent