Aller au contenu
OpesCare Développeurs

Architecture et flux

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.

Consentement et accès limité Un clinicien demande, le patient approuve dans l’application, l’accès est limité et temporaire, chaque lecture est journalisée et le patient peut révoquer. Clinicien web ou application Recherche du Health ID API OpesCare Base pour lire ? relation ou accord Demande : portée + motif API OpesCare Données limitées renvoyées Clinicien Accès journalisé Dossier clinique Contrôle du fondement API OpesCare Notification au patient Patient Lectures suivantes refusées révoqué ou expiré Accord : portée, expires_at Dossier clinique Approuver (ou refuser) Patient Demande refusée le dossier reste fermé sans base base valide accepter refuser ouvrir admis Personne ou appareil Service OpesCare Données stockées Contrôle Décision Issue : réussie Issue : refusée Requête Réponse En file / asynchrone Refus ou échec
  1. Recherche du Health ID Le clinicien scanne le QR du patient ou saisit son Health ID.
  2. Identité seule, pas de dossier Sans rendez-vous, lien d’équipe de soins ou accord, le dossier reste fermé.
  3. Demande : portée + motif La demande précise ce qui sera lu et pourquoi.
  4. Notification au patient La demande apparaît dans l’application du patient avec une notification.
  5. Approuver (ou refuser) Le patient décide. Un refus met fin au flux.
  6. Accord : portée, expires_at Un accord de consentement est enregistré avec sa portée et sa date d’expiration.
  7. Ouvrir le dossier Le clinicien consulte le dossier.
  8. Contrôle du fondement Le contrôle de relation clinique n’autorise que ce que couvre l’accord.
  9. Accès journalisé Qui a lu quoi, quand et sur quel fondement est inscrit au journal visible par le patient.
  10. Données limitées renvoyées Seule la partie autorisée du dossier est renvoyée.
  11. Révocation ou expiration Le patient peut révoquer à tout moment ; sinon l’accord expire à son échéance.
  12. 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
CartePreuve 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

Tous les flux en JSON

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_patient
  • route:portals.chart.consent_request
  • uri:POST api/mobile/doctor/patients/scan
  • method:App\Http\Controllers\Api\Mobile\MobileProviderScanController::scan
  • method:App\Support\ClinicalRelationshipGate::evaluate
  • method:App\Support\ClinicalRelationshipGate::holds
  • uri:POST api/mobile/doctor/consent-requests
  • method:App\Http\Controllers\Api\Mobile\MobileConsentRequestController::store
  • config:staff_capabilities.capabilities.request_access
  • uri:GET api/mobile/doctor/patients/{patient}
  • method:App\Http\Controllers\Api\Mobile\MobileDoctorChartController::show
  • class:App\Models\AccessLog
  • uri:GET api/mobile/access-logs
  • method:App\Support\ClinicalRelationshipGate::hasActiveConsentGrant
  • method:App\Support\ClinicalRelationshipGate::coversFullRecord
  • uri:GET api/mobile/consent-requests
  • uri:GET api/mobile/consent-requests/pending-count
  • uri:POST api/mobile/consents/{id}/revoke
  • method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::revokeConsent
  • class:App\Models\ConsentGrant
  • method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::approveConsent
  • uri:POST api/mobile/consent-requests/{id}/approve
  • uri:POST api/mobile/consent-requests/{id}/deny
  • method:App\Http\Controllers\Api\Mobile\MobileGovernanceController::denyConsent