Composants embarqués
Les composants embarqués posent dans votre page les écrans de la facture électronique : la carte lue, le patient et ses droits, les actes tarifés à chaque geste, les parts, la signature par la CPS du poste, puis la chronologie de la feuille. Vous gardez vos écrans autour ; nous portons les évolutions des règles.
Ce sont des custom elements, en Shadow DOM, sans framework imposé, avec des enveloppes React et Vue. Ils s’appuient sur le composant navigateur : la page ne parle jamais à l’agent, l’agent n’ouvre aucun port, et le code porteur se saisit dans la fenêtre de l’agent.
Le paquet @ophelix/elements est en préversion et n’est pas encore publié.
Je veux…
| Je veux… | Appel |
|---|---|
| Ouvrir la session de la page avec ses composants | POST /v1/browser-sessions, avec components |
| Nommer le praticien qui facture | practitioner à l’ouverture de la session |
| Montrer la chronologie d’une feuille déjà faite | claims à l’ouverture de la session, puis <ophelix-claim-timeline claim="clm_…"> |
| Lire la carte Vitale, la CPS | <ophelix-card-reader> |
| Montrer le patient et ses droits | <ophelix-patient> |
| Saisir les actes | <ophelix-acts> |
| Montrer les parts et faire signer | <ophelix-claim-summary> |
| Activer un praticien | <ophelix-practitioner-onboarding> |
| Montrer le poste et ses lecteurs | <ophelix-readers> |
| Relire depuis mon serveur ce que la page a fait | GET /v1/claims/{id}, avec l’identifiant d’un événement |
| Savoir ce que la page peut lire | GET /v1/browser-sessions/{id} : components et claims |
Ouvrir une session
L’origine de la page doit être autorisée, comme pour toute page web. Votre serveur ouvre ensuite la session avec sa clé secrète, et dit ce que la page peut afficher :
curl
curl -X POST https://api.ophelix.fr/v1/browser-sessions \
-H "Authorization: Bearer sk_test_…" \
-d origin=https://app.exemple.fr \
-d "components[]=patient" \
-d "components[]=acts" \
-d "components[]=claim_summary" \
-d "components[]=claim_timeline"Donnez session.client_secret à la page. Une session sans components lit les cartes et fait signer, rien de plus. Chaque composant n’ouvre que les objets de la session :
| Composant | La page peut |
|---|---|
patient | Lire la couverture et le patient d’une carte Vitale qu’elle a lue |
acts | Chercher un acte, ouvrir le brouillon de la facture du patient qu’elle a lu, y poser ou retirer des actes, dire le parcours de soins et l’accident |
claim_summary | Lire, contrôler et valider une facture qu’elle a créée |
claim_timeline | Lire une facture qu’elle a créée ou que vous nommez par claims, et ses rejets |
practitioner_onboarding | Lire le praticien qu’elle a lu sur sa CPS, ou que vous nommez par practitioner |
Tout autre objet répond 404, comme s’il n’existait pas. La page ne peut ni nommer un patient, ni imposer un prix : elle facture ce qu’elle a lu, et l’API tarife. Chaque lecture d’une donnée de santé est tracée au nom de la session, dans le journal d’audit.
Poser les éléments
HTML
<script src="ophelix-elements.global.js"></script>
<ophelix-card-reader></ophelix-card-reader>
<ophelix-patient></ophelix-patient>
<ophelix-acts></ophelix-acts>
<ophelix-claim-summary></ophelix-claim-summary>
<ophelix-claim-timeline></ophelix-claim-timeline>
<script>
OphelixElements.load({
fetchClientSecret: async () => (await (await fetch('/ophelix/session', { method: 'POST' })).json()).client_secret,
})
</script>Les éléments d’une page partagent la session et se suivent : la carte lue devient le patient, le premier acte ouvre la facture, le récapitulatif la fait signer et la chronologie la suit. Un attribut coverage ou claim montre un autre objet de la session.
| Élément | Attributs |
|---|---|
<ophelix-card-reader> | scenario et cps-scenario en mode test, hide-cps |
<ophelix-patient> | coverage |
<ophelix-acts> | aucun |
<ophelix-claim-summary> | claim |
<ophelix-claim-timeline> | claim |
<ophelix-practitioner-onboarding> | pairing-code, agent-download-url, cps-scenario |
<ophelix-readers> | aucun |
Tous prennent theme="light" ou theme="dark" pour forcer un thème.
Le praticien
La facture se fait au nom du praticien qui facture depuis la page : celui que vous nommez par practitioner à l’ouverture de la session, sinon le dernier lu sur une CPS par cette page. Sans l’un ni l’autre, le premier acte répond browser_practitioner_missing. <ophelix-card-reader> et <ophelix-practitioner-onboarding> lisent la CPS.
Pour activer un praticien, <ophelix-practitioner-onboarding> va du poste (l’agent installé, la page associée par le code de l’agent) à l’identité lue sur la CPS, puis aux lecteurs. Un poste à appairer se fait par un code que votre serveur obtient par POST /v1/workstation-pairing-codes, passé dans pairing-code.
Le thème
Le thème passe par des propriétés CSS, posées sur :root ou sur un élément : elles traversent le Shadow DOM, et le code des éléments n’a pas à changer. Sans elles, les éléments prennent les couleurs d’Ophelix, claires ou sombres selon le réglage du poste (prefers-color-scheme).
:root {
--ophelix-color-accent: #0f766e;
--ophelix-color-accent-hover: #115e59;
--ophelix-color-on-accent: #ffffff;
--ophelix-font-family: Georgia, serif;
--ophelix-radius-control: 999px;
--ophelix-radius-card: 18px;
}
@media (prefers-color-scheme: dark) {
:root {
--ophelix-color-accent: #5eead4;
--ophelix-color-on-accent: #042f2e;
}
}| Propriété | Rôle |
|---|---|
--ophelix-color-accent, -accent-hover, -on-accent | Le bouton principal, son survol, son texte |
--ophelix-color-accent-soft, -accent-text | Une étiquette d’action et son texte |
--ophelix-color-text, -text-soft, -text-muted, -text-disabled | Les textes |
--ophelix-color-background, -surface, -surface-strong, -raised | Les fonds : carte, zone, chargement, liste qui flotte |
--ophelix-color-line, -border | Les traits et les bords des champs |
--ophelix-color-success, -warning, -danger, et leurs -soft et -line | Les états |
--ophelix-font-family, --ophelix-font-family-mono, --ophelix-font-size | Les polices et la taille du texte |
--ophelix-radius-tag, -control, -field, -card | Les rayons : étiquette, bouton, champ, carte |
Une valeur que vous posez vaut pour les deux thèmes : redéfinissez-la dans votre bloc sombre. Gardez au moins 4,5:1 entre un texte et son fond, dans les deux.
Événements JavaScript
Les éléments émettent des CustomEvent qui remontent le DOM et sortent du Shadow DOM : un écouteur sur document les entend tous. Ils ne portent que des identifiants, jamais de nom, de NIR ni d’acte. Votre serveur relit l’objet avec sa clé.
| Événement | detail | Quand |
|---|---|---|
ophelix:ready | session, workstation | La session est ouverte |
ophelix:workstation-linked | workstation | La page vient d’être associée au poste |
ophelix:workstation-forgotten | workstation | Le navigateur a oublié son poste |
ophelix:card-inserted, ophelix:card-removed | kind | Une carte entre ou sort d’un lecteur |
ophelix:card-read | action, type, coverage, patient, practitioner | Une carte a été lue |
ophelix:practitioner-identified | practitioner | La CPS désigne le praticien |
ophelix:claim-created | claim | Le brouillon est ouvert |
ophelix:claim-updated | claim | Un acte ou le contexte a changé, la facture est retarifée |
ophelix:claim-finalized | claim | La facture est prête à signer |
ophelix:claim-secured | claim, action | La CPS du poste a signé la FSE |
ophelix:onboarding-completed | practitioner, workstation | Le praticien est activé |
ophelix:error | code, message, request_id | Quelque chose a échoué ; code se compare |
Côté serveur, les webhooks disent la même chose : workstation_action.succeeded, coverage.retrieved, claim.created, claim.secured.
Accessibilité
Les éléments se parcourent au clavier : / mène à la recherche d’actes, ↑ ↓ y choisissent, Entrée pose l’acte, Échap ferme la liste. Le focus reste sur le champ d’un rendu à l’autre, les étapes de l’activation se suivent au clavier, et une région annonce aux lecteurs d’écran la lecture d’une carte et la signature. Les couleurs par défaut gardent 4,5:1 en clair comme en sombre.
En mode test
Avec une clé de test, le simulateur lit les cartes : scenario="vitale_exempted" sur <ophelix-card-reader> choisit le scénario d’une carte Vitale, cps-scenario celui d’une CPS. Voir Cartes et scénarios de test.
Pièges
- Un composant non ouvert répond
browser_component_disabled: ajoutez-le àcomponents. Une session vit trente minutes ; le composant en redemande une parfetchClientSecret, avec les mêmes composants si votre serveur les redonne. - Ne croyez pas un identifiant venu de la page. Un événement dit ce qui s’est passé, votre serveur le vérifie : relisez la facture avec votre clé avant d’en tirer une conséquence.
- Une nouvelle session ne voit pas les factures de la précédente. Nommez-les par
claimspour les montrer. - La politique de sécurité de votre page doit laisser
connect-srcvers l’API. Les éléments n’écrivent aucun style dans un attribut : une politique stricte sur les styles ne les gêne pas. - Le code porteur reste dans l’agent. Aucun élément ne le demande, et votre page ne doit pas le demander non plus.