É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”.


AGENT3 prompt de cet écran 

👍 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 :

  1. Ce qui vient d’Odoo Online “classique”
  2. Ce qui est à créer avec Odoo Studio (modèles & champs)

1️⃣ Côté Odoo Online “classique” (modules & objets réutilisés)

Module OdooObjet / modèleRôle pour l’écran “Saisie visite”
Contactsres.partnerIdentité du patient senior (nom, âge, adresse) et éventuellement de l’infirmier si on le modélise en partner.
Utilisateursres.usersIdentité de l’utilisateur connecté qui saisit la visite (l’infirmier dans Odoo).
Documentsir.attachmentStockage des photos (plaies, pansements, docs) associées à la visite.
(Optionnel) Discussion / Mailmail.messageSi tu veux loguer des messages de type “journal de bord” ou l’envoi de transmissions.
(Optionnel) Projet / Tâchesproject.taskSi 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 OdooNom fonctionnel sur le formulaireNom technique OdooType de champObligatoireCommentaire
x_synergia_visitDossier Seniordossier_idMany2one → x_synergia_senior_dossier✅ OuiLien principal vers le dossier du patient. Sert à remonter la visite dans l’historique de la Fiche Senior.
x_synergia_visitPatient (lecture seule)senior_idMany2one (related)NonRelated : dossier_id.senior_id. Utile pour filtres & vues mais pas obligatoire sur le formulaire.
x_synergia_visitInfirmier(e)infirmier_idMany2one → res.users ou res.partner✅ Oui (recommandé)Qui réalise la visite. Domaine = utilisateurs du groupe “Infirmier”.
x_synergia_visitDate et heure de la visitedate_visitDatetime✅ OuiPrérempli à “maintenant” à la création depuis la webapp.
x_synergia_visitType de visitetype_visitSelection✅ 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_visitNotes de visite (texte brut / dictée vocale)note_bruteTextNonZone 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_visitRésumé IA (version propre pour l’historique)resume_iaTextNonGé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_visitTag de visite (affiché en badge : SOIN / BSI …)tag_visiteSelectionNonValeurs ex : ('soin','Soin'), ('bsi','BSI'), ('transmission_medecin','Transmission médecin'). Permet les petits labels dans l’historique.
x_synergia_visitNiveau de priorité (gravité de la situation)prioritySelection (ou Integer)NonEx : ('0','Normal'), ('1','Important'), ('2','Urgent'). Utile pour l’écran Alertes & priorités.
x_synergia_visitLien vers la transmission généréetransmission_idMany2one → x_synergia_transmissionNonRempli quand l’action IA “Transmission médecin” crée un message. Facilite la navigation visite ↔ transmission.
x_synergia_visitPhotos de la visitedocuments_idsMany2many → ir.attachmentNonSupport du bloc “Photos” de l’écran. Les pièces jointes sont stockées dans Documents.
x_synergia_visitDurée estimée (mn)x_duration_minIntegerNonPeut être remplie automatiquement (ex : temps entre début saisie et fin) ou par l’IA pour l’optimisation de tournée.
x_synergia_visitStatut de la visite (workflow interne)x_stateSelection✅ Oui (si workflow)Ex : ('draft','Brouillon'), ('done','Terminée'), ('cancel','Annulée'). Permet de filtrer les visites actives / archivées.
x_synergia_visitSource de créationx_sourceSelection ou CharNonEx : ('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) :
    1. crée un enregistrement dans x_synergia_transmission (modèle à part),
    2. 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 OdooNom fonctionnelNom techniqueType
x_synergia_transmissionDossier Seniordossier_idMany2one → x_synergia_senior_dossier
x_synergia_transmissionDestinataire (médecin, etc.)to_partner_idMany2one → res.partner
x_synergia_transmissionObjetsubjectChar
x_synergia_transmissionCorps de la transmissionbodyText
x_synergia_transmissionStatut d’envoistatusSelection (draft/sent/failed)
x_synergia_transmissionDate d’envoidate_sentDatetime

👉 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 :

  1. La webapp connaît déjà le dossier_id (contexte de la Fiche Senior ou de la tournée).
  2. Elle fait un create sur x_synergia_visit avec au minimum :
    • dossier_id
    • infirmier_id (user connecté)
    • date_visit (now)
    • éventuellement type_visit.
  3. Pendant la saisie :
    • elle fait des write pour mettre à jour note_brute,
    • upload les photos → ir.attachment + update de documents_ids.
  4. À 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

  1. res.partner
    → identité patient / médecin / infirmier (si besoin).
  2. res.users
    → utilisateur infirmier connecté.
  3. ir.attachment
    → stockage des photos & documents.
  4. x_synergia_senior_dossier
    → contexte du patient, dossier principal.
  5. x_synergia_visit
    → modèle pivot de la Saisie de visite (écran 4).
  6. x_synergia_transmission
    → transmission médecin générée par IA à partir d’une visite.
  7. (Optionnel) project.task, x_synergia_alert
    → actions rapides / alertes / tâches internes.