Écran 4 — Saisie Visite (Texte + Dictée vocale + Photos) ODOO Studio
5.3. Module C — Saisie de visite
Champs :
- Date / heure (auto)
- Type de visite (soin, contrôle, pansement, suivi post-op…)
-
Mode de saisie :
- dictée vocale (transcription STT), > WebRTC + openAI audio real time > @Antonio
- texte tapé,> Bcp plus rare > je pense que l'espace au dessus serait le résumé automatique provenant du résumé après d la reconnaissance de la parole > @Antonio peux tu prendre cela
- ajout de photos (plaies, matériel, environnement),
- Niveau de douleur / échelle (0–10),> champs a rajouter qui n'apparait pas dans l'UX ci-contre
- Observations libres.
Fonctions IA :
-
Bouton “Proposer un résumé” → le LLM :
- nettoie + reformule la saisie,
- met en forme (anamnèse / soins réalisés / évolution / recommandations),
- Bouton “Générer transmission médecin”.
👍 On va faire la même formalisation que pour la “Liste des patients”, mais cette fois pour :
Écran 4 – Saisie de visite (texte + dictée vocale + photos + actions IA)
Je sépare bien :
- Ce qui vient d’Odoo Online “classique”
- Ce qui est à créer avec Odoo Studio (modèles & champs)
1️⃣ Côté Odoo Online “classique” (modules & objets réutilisés)
| Module Odoo | Objet / modèle | Rôle pour l’écran “Saisie visite” |
|---|---|---|
| Contacts | res.partner | Identité du patient senior (nom, âge, adresse) et éventuellement de l’infirmier si on le modélise en partner. |
| Utilisateurs | res.users | Identité de l’utilisateur connecté qui saisit la visite (l’infirmier dans Odoo). |
| Documents | ir.attachment | Stockage des photos (plaies, pansements, docs) associées à la visite. |
| (Optionnel) Discussion / Mail | mail.message | Si tu veux loguer des messages de type “journal de bord” ou l’envoi de transmissions. |
| (Optionnel) Projet / Tâches | project.task | Si tu veux que “Actions rapides” créent directement des tâches internes (rappels, TODO). |
👉 Aucun écran standard Odoo ne correspond exactement à “Saisie visite” :
on crée donc un modèle métier dédié x_synergia_visit via Odoo Studio, qui se branche sur ces objets.
2️⃣ Modèle métier à créer avec Odoo Studio : x_synergia_visit (Visite infirmière)
2.1. Tableau “prêt à saisir” pour Odoo Studio
C’est la partie Formulaire “Saisie visite” de ton écran HD.
| Modèle Odoo | Nom fonctionnel sur le formulaire | Nom technique Odoo | Type de champ | Obligatoire | Commentaire |
|---|---|---|---|---|---|
| x_synergia_visit | Dossier Senior | dossier_id | Many2one → x_synergia_senior_dossier | ✅ Oui | Lien principal vers le dossier du patient. Sert à remonter la visite dans l’historique de la Fiche Senior. |
| x_synergia_visit | Patient (lecture seule) | senior_id | Many2one (related) | Non | Related : dossier_id.senior_id. Utile pour filtres & vues mais pas obligatoire sur le formulaire. |
| x_synergia_visit | Infirmier(e) | infirmier_id | Many2one → res.users ou res.partner | ✅ Oui (recommandé) | Qui réalise la visite. Domaine = utilisateurs du groupe “Infirmier”. |
| x_synergia_visit | Date et heure de la visite | date_visit | Datetime | ✅ Oui | Prérempli à “maintenant” à la création depuis la webapp. |
| x_synergia_visit | Type de visite | type_visit | Selection | ✅ Oui (avec défaut) | Valeurs typiques : ('soin','Soin'), ('pansement','Pansement'), ('suivi_chronique','Suivi chronique'), ('post_op','Post-opératoire'), ('bsi','BSI'), ('autre','Autre'). |
| x_synergia_visit | Notes de visite (texte brut / dictée vocale) | note_brute | Text | Non | Zone dans laquelle la webapp colle la dictée vocale transcrite ou le texte saisi. C’est ce que voit l’infirmier dans “Notes de visite”. |
| x_synergia_visit | Résumé IA (version propre pour l’historique) | resume_ia | Text | Non | Généré par le bouton “Générer un résumé”. C’est ce texte qui sera affiché dans “Historique des visites” sur la Fiche Senior. |
| x_synergia_visit | Tag de visite (affiché en badge : SOIN / BSI …) | tag_visite | Selection | Non | Valeurs ex : ('soin','Soin'), ('bsi','BSI'), ('transmission_medecin','Transmission médecin'). Permet les petits labels dans l’historique. |
| x_synergia_visit | Niveau de priorité (gravité de la situation) | priority | Selection (ou Integer) | Non | Ex : ('0','Normal'), ('1','Important'), ('2','Urgent'). Utile pour l’écran Alertes & priorités. |
| x_synergia_visit | Lien vers la transmission générée | transmission_id | Many2one → x_synergia_transmission | Non | Rempli quand l’action IA “Transmission médecin” crée un message. Facilite la navigation visite ↔ transmission. |
| x_synergia_visit | Photos de la visite | documents_ids | Many2many → ir.attachment | Non | Support du bloc “Photos” de l’écran. Les pièces jointes sont stockées dans Documents. |
| x_synergia_visit | Durée estimée (mn) | x_duration_min | Integer | Non | Peut être remplie automatiquement (ex : temps entre début saisie et fin) ou par l’IA pour l’optimisation de tournée. |
| x_synergia_visit | Statut de la visite (workflow interne) | x_state | Selection | ✅ Oui (si workflow) | Ex : ('draft','Brouillon'), ('done','Terminée'), ('cancel','Annulée'). Permet de filtrer les visites actives / archivées. |
| x_synergia_visit | Source de création | x_source | Selection ou Char | Non | Ex : ('webapp','Webapp Synergia'), ('odoo','Back-office Odoo'). Pour tracer d’où vient la visite. |
3️⃣ Lien avec les Actions IA (Résumé, Transmission, Actions rapides)
Ces actions ne sont pas des champs, mais elles s’appuient sur les champs ci-dessus :
🔹 Bouton “Générer un résumé”
-
La webapp envoie à votre backend / N8N :
- note_brute
- contexte patient (via dossier_id / senior_id / profil médical)
- L’IA renvoie un texte structuré.
- Ce texte est écrit dans : x_synergia_visit.resume_ia.
👉 Dans l’historique des visites de la Fiche Senior, tu n’affiches que resume_ia (plus propre) tout en gardant note_brute pour la traçabilité.
🔹 Bouton “Transmission médecin”
- À partir de la visite en cours (x_synergia_visit), la webapp génère un brouillon de transmission via IA.
-
Puis ton orchestrateur (N8N ou backend) :
- crée un enregistrement dans x_synergia_transmission (modèle à part),
- met à jour x_synergia_visit.transmission_id avec l’ID de cette transmission.
⚙️ Côté Odoo Studio, il faudra donc aussi définir le modèle x_synergia_transmission (si ce n’est pas déjà fait) avec au minimum :
| Modèle Odoo | Nom fonctionnel | Nom technique | Type |
|---|---|---|---|
| x_synergia_transmission | Dossier Senior | dossier_id | Many2one → x_synergia_senior_dossier |
| x_synergia_transmission | Destinataire (médecin, etc.) | to_partner_id | Many2one → res.partner |
| x_synergia_transmission | Objet | subject | Char |
| x_synergia_transmission | Corps de la transmission | body | Text |
| x_synergia_transmission | Statut d’envoi | status | Selection (draft/sent/failed) |
| x_synergia_transmission | Date d’envoi | date_sent | Datetime |
👉 L’écran 4 ne modifie pas directement ce modèle, mais y est relié via transmission_id.
🔹 Bouton “Actions rapides…”
En pratique, ce bouton peut déclencher plusieurs types de workflows :
- Créer une tâche dans un projet Odoo (module Projet / project.task).
- Créer une alerte dans ton modèle x_synergia_alert.
- Créer un rappel (événement Calendrier).
Dans tous les cas, tu auras besoin d’au moins : l’ID de la visite (x_synergia_visit.id), du dossier (dossier_id) et éventuellement d’un texte court généré par l’IA.
4️⃣ Liaisons entre Odoo & ta webapp pour cet écran
Quand l’infirmier ouvre “Saisie visite” dans la webapp :
- La webapp connaît déjà le dossier_id (contexte de la Fiche Senior ou de la tournée).
-
Elle fait un create sur x_synergia_visit avec au minimum :
- dossier_id
- infirmier_id (user connecté)
- date_visit (now)
- éventuellement type_visit.
-
Pendant la saisie :
- elle fait des write pour mettre à jour note_brute,
- upload les photos → ir.attachment + update de documents_ids.
-
À chaque action IA :
- Résumé → write dans resume_ia.
- Transmission → create dans x_synergia_transmission + write de transmission_id.
- Actions rapides → création d’enregistrements dans les modèles cibles (tâches/alertes…).
🔚 En résumé
- Odoo Online fournit : patients (res.partner), utilisateurs (res.users), pièces jointes (ir.attachment).
- Odoo Studio crée le modèle x_synergia_visit avec les champs listés ci-dessus, plus x_synergia_transmission pour les messages IA.
- L’écran 4 de la webapp travaille quasi exclusivement sur un enregistrement x_synergia_visit et déclenche des workflows via N8N / backend.
Transciption dans un format inspiré par celui de Antonio
Voici la version “Liste des patients”-style pour l’écran 4 – Saisie de visite (texte + dictée vocale + photos + actions IA).
🟦 1. Modules Odoo Online “classiques” réutilisés
Ces modèles ne sont pas créés avec Odoo Studio, ils existent déjà et servent de briques de base.
🔵 CONTACTS (res.partner)
res.partner
👉 Sert à représenter :
- le patient senior (identité, adresse),
- éventuellement l’infirmier(e) si vous le modélisez comme partenaire.
Rôle pour l’écran Saisie de visite :
- fournir l’identité du senior (nom, âge, adresse) via le Dossier Senior,
- éventuellement stocker les coordonnées de l’infirmier (téléphone, email).
🔵 UTILISATEURS (res.users)
res.users
👉 Représente l’utilisateur connecté dans Odoo (l’infirmier qui saisit la visite).
Rôle pour l’écran Saisie de visite :
- remplir automatiquement le champ infirmier_id (Many2one → res.users),
- tracer qui a réalisé/modifié la visite.
🔵 DOCUMENTS / PIÈCES JOINTES (ir.attachment)
ir.attachment
👉 Stocke les photos et documents liés à la visite :
- photos de plaies,
- photos de pansements,
- documents divers (ordonnances, comptes-rendus).
Rôle pour l’écran Saisie de visite :
- alimenter le bloc “Photos de la visite” via un Many2many.
🔵 (OPTIONNEL) MESSAGES / JOURNAL (mail.message)
mail.message
👉 Journalisation des échanges, commentaires, notifications.
Usage possible :
- historiser certaines transmissions,
- garder une trace textuelle type “journal de bord”.
🔵 (OPTIONNEL) PROJET / TÂCHES (project.task)
project.task
👉 Tâches internes Odoo.
Usage possible avec le bouton “Actions rapides” :
- créer des tâches de suivi interne (rappels, TODO, relances…),
- relier une tâche à une visite précise.
🟦 2. Modèle métier principal : x_synergia_visit (Visite infirmière)
C’est le cœur fonctionnel de l’écran “Saisie de visite”.
Tout ce que la webapp saisit ou met à jour passe par ce modèle.
🔵 LIENS STRUCTURELS (contexte Dossier / Patient / Infirmier)
dossier_id
👉 Lien vers le Dossier Senior.
- Modèle : Many2one → x_synergia_senior_dossier
- Rôle : ancrer la visite dans le dossier du patient.
- Obligatoire : ✅ Oui
- Usage : permet de remonter toutes les visites dans l’historique de la Fiche Senior.
senior_id
👉 Patient concerné par la visite (en lecture seule si dérivé du dossier).
- Modèle : Many2one (related) → res.partner
- Source : dossier_id.senior_id
- Obligatoire : Non (souvent en “related” uniquement).
- Rôle : faciliter les filtres, vues, recherches par patient.
infirmier_id
👉 Infirmier(e) qui réalise la visite.
- Modèle : Many2one → res.users (ou res.partner selon votre choix)
- Obligatoire : ✅ Oui (recommandé)
-
Rôle :
- tracer qui a fait la visite,
- permettre des filtres par infirmier, des stats par professionnel.
-
Domaine recommandé :
- utilisateurs du groupe “Infirmier” (groupe de sécurité dédié).
x_source
👉 Source de création de la visite.
- Type : Selection ou Char
-
Exemples de valeurs :
- webapp → Webapp Synergia
- odoo → Back-office Odoo
- Obligatoire : Non
- Rôle : traçabilité de l’origine (utile pour analyse & debug).
🔵 MÉTADONNÉES DE VISITE (date, type, statut, priorité, durée)
date_visit
👉 Date et heure de la visite.
- Type : Datetime
- Obligatoire : ✅ Oui
-
Rôle :
- positionner la visite dans le temps,
- piloter tri / filtres par date.
-
Remplissage :
- prérempli à “maintenant” à la création depuis la webapp.
type_visit
👉 Type de visite.
- Type : Selection
- Obligatoire : ✅ Oui (avec valeur par défaut)
-
Valeurs typiques :
- soin → Soin
- pansement → Pansement
- suivi_chronique → Suivi chronique
- post_op → Post-opératoire
- bsi → BSI
- autre → Autre
-
Rôle :
- statistiques,
- filtres dans les listes,
- badges dans l’historique.
x_state
👉 Statut de la visite (workflow interne).
- Type : Selection
- Obligatoire : ✅ Oui (si vous formalisez un workflow)
-
Valeurs possibles :
- draft → Brouillon
- done → Terminée
- cancel → Annulée
-
Rôle :
- distinguer les visites en cours / validées / annulées,
- filtrer l’historique.
priority
👉 Niveau de priorité / gravité de la situation.
- Type : Selection (ou Integer)
-
Exemples :
- 0 → Normal
- 1 → Important
- 2 → Urgent
-
Rôle :
- alimenter le module Alertes & Scoring,
- permettre une vue priorisée des visites/patients.
x_duration_min
👉 Durée estimée de la visite (en minutes).
- Type : Integer
- Obligatoire : Non
-
Sources possibles :
- calcul automatique (différence début/fin de saisie),
- estimation générée par IA,
- saisie manuelle de l’infirmier.
-
Rôle :
- optimisation de tournée,
- analyse de charge de travail.
tag_visite
👉 Tag de visite affiché en badge (SOINS, BSI, etc.).
- Type : Selection
-
Exemples :
- soin → Soin
- bsi → BSI
- transmission_medecin → Transmission médecin
-
Rôle :
- affichage visuel rapide dans l’historique,
- filtres simples sur certains types de visites “spéciales”.
🔵 CONTENU DE VISITE (texte brut, IA, photos)
note_brute
👉 Texte brut de la visite (dictée vocale transcrite ou texte tapé).
- Type : Text
- Obligatoire : Non
-
Rôle :
- contenir l’intégralité de ce que l’infirmier dit ou écrit,
- servir d’entrée à l’IA pour générer un résumé structuré.
-
UX :
- c’est ce que l’infirmier voit/rédige dans “Notes de visite”.
resume_ia
👉 Résumé IA propre, structuré et lisible.
- Type : Text
- Obligatoire : Non
-
Rempli par :
- bouton “Proposer un résumé” (via IA / N8N / backend).
-
Rôle :
- c’est ce texte qui sera affiché en priorité dans l’historique des visites de la Fiche Senior (anamnèse / soins / évolution / recommandations).
- permet une lecture rapide sans relire toute la dictée.
documents_ids
👉 Photos et documents attachés à la visite.
- Type : Many2many → ir.attachment
- Obligatoire : Non
-
Rôle :
- stocker les photos de plaies, pansements, environnement, matériel,
- relier les pièces jointes à une visite donnée,
- permettre un visionnage rapide dans la Fiche Senior ou dans la visite.
🔵 LIAISONS AVEC LES WORKFLOWS (transmissions, alertes, tâches)
transmission_id
👉 Lien vers la transmission générée à partir de la visite.
- Type : Many2one → x_synergia_transmission
- Obligatoire : Non
-
Rempli par :
- le bouton “Générer transmission médecin” (via IA + création d’un enregistrement x_synergia_transmission).
-
Rôle :
- accès rapide visite ↔ transmission,
- éviter de rechercher la transmission dans une liste séparée.
(Éventuel futur champ) alert_ids
👉 Liste d’alertes générées à partir de cette visite.
- Type : One2many → x_synergia_alert (optionnel)
-
Rôle :
- rattacher explicitement les alertes au contexte de la visite,
- alimenter le module Alertes & Scoring.
(Éventuel futur champ) task_ids
👉 Tâches projet créées à partir d’une visite.
- Type : One2many → project.task (optionnel)
-
Rôle :
- suivre les actions internes (dossiers à compléter, relances…).
🟦 3. Modèle x_synergia_transmission (Transmission médecin)
Ce modèle est lié mais distinct : il est créé/complété par les actions IA à partir d’une visite.
🔵 LIENS & MÉTADONNÉES
dossier_id
👉 Dossier Senior concerné.
- Type : Many2one → x_synergia_senior_dossier
-
Rôle :
- rattacher la transmission au même dossier que la visite.
to_partner_id
👉 Destinataire de la transmission (souvent le médecin traitant).
- Type : Many2one → res.partner
-
Rôle :
- identifier clairement à qui s’adresse la transmission (médecin, spécialiste, etc.).
subject
👉 Objet de la transmission.
- Type : Char
-
Rôle :
- résumer l’enjeu (ex : “Aggravation douleur genou droit”, “Suspicion infection pansement”),
- faciliter le tri et la recherche.
🔵 CONTENU & STATUT
body
👉 Corps de la transmission (texte IA relu par l’infirmier).
- Type : Text
-
Rôle :
- contenu structuré envoyé au médecin,
- reprécise contexte, observation, demande.
status
👉 Statut d’envoi de la transmission.
- Type : Selection (draft, sent, failed)
-
Rôle :
- savoir si la transmission a été envoyée / est en attente / a échoué.
date_sent
👉 Date et heure d’envoi.
- Type : Datetime
-
Rôle :
- traçabilité,
- preuve d’envoi,
- filtres et reporting.
🟦 4. Configuration dans Odoo Studio (vue “Saisie de visite”)
🔵 Sur le modèle x_synergia_visit
À créer dans Odoo Studio :
- dossier_id (Many2one → x_synergia_senior_dossier, ✅ Obligatoire)
- senior_id (Many2one related → dossier_id.senior_id, lecture seule)
- infirmier_id (Many2one → res.users, ✅ Obligatoire)
- date_visit (Datetime, ✅ Obligatoire)
- type_visit (Selection, ✅ Obligatoire)
- x_state (Selection, ✅ si workflow)
- priority (Selection ou Integer)
- tag_visite (Selection)
- note_brute (Text)
- resume_ia (Text)
- documents_ids (Many2many → ir.attachment)
- x_duration_min (Integer)
- x_source (Selection ou Char)
- transmission_id (Many2one → x_synergia_transmission)
🔵 Layout suggéré de la vue Formulaire
En-tête :
- dossier_id
- senior_id (readonly)
- infirmier_id
- date_visit
- type_visit
- x_state
- priority / tag_visite
Onglet “Contenu” :
- Bloc “Notes de visite (texte / dictée)” → note_brute
- Bouton d’action (dans la webapp) : “Proposer un résumé” → écrit dans resume_ia
- Bloc “Résumé IA” → resume_ia (lecture principale pour historique)
Onglet “Photos / Docs” :
- widget Many2many → documents_ids (pièces jointes)
Onglet “Liaisons” :
- transmission_id (smart button / lien)
- (optionnel) alert_ids, task_ids
🟦 5. Flux JSON typiques côté webapp / n8n
🔵 Création d’une nouvelle visite
{ "model": "x_synergia_visit", "method": "create", "args": [{ "dossier_id": 123, // ID du dossier senior "infirmier_id": 45, // ID de l'utilisateur connecté "date_visit": "2025-11-21 10:30:00", "type_visit": "soin", "x_state": "draft", "x_source": "webapp" }] }
🔵 Mise à jour pendant la saisie (texte + IA)
{ "model": "x_synergia_visit", "method": "write", "args": [ [456], // ID de la visite { "note_brute": "Texte brut issu de la dictée vocale...", "resume_ia": "Résumé structuré généré par l'IA...", "priority": "1", // Important "tag_visite": "bsi" } ] }
🔵 Lien avec la transmission générée
{ "model": "x_synergia_visit", "method": "write", "args": [ [456], { "transmission_id": 789 // ID de x_synergia_transmission créé par N8N } ] }
🟦 6. Résumé des modèles impliqués
-
res.partner
→ identité patient / médecin / infirmier (si besoin). -
res.users
→ utilisateur infirmier connecté. -
ir.attachment
→ stockage des photos & documents. -
x_synergia_senior_dossier
→ contexte du patient, dossier principal. -
x_synergia_visit
→ modèle pivot de la Saisie de visite (écran 4). -
x_synergia_transmission
→ transmission médecin générée par IA à partir d’une visite. -
(Optionnel) project.task, x_synergia_alert
→ actions rapides / alertes / tâches internes.