ODOO Mapping via JSON RPC <>WebApp#5

C'est parti. Voici la Fiche Technique Odoo pour le premier lot : L'Inscription & Le Profil de Base.


Cette fiche est destinée à être suivie pas à pas dans Odoo Studio.

📂 Module Cible : Contacts (res.partner)

Nous allons utiliser l'objet standard "Contact". Dans Odoo, un infirmier freelance sera considéré comme un Contact Individuel (et non une société).

A. Champs Standards (À réutiliser impérativement)

Ne créez pas de nouveaux champs pour ceux-ci, utilisez les natifs d'Odoo pour bénéficier des fonctionnalités SMS, Email et Géolocalisation.

Donnée ReactChamp Odoo (Nom Technique)Notes d'intégration
Numéro de téléphonemobileLe champ phone existe aussi, mais mobile est prioritaire pour les modules SMS Marketing d'Odoo.
EmailemailServira d'identifiant unique pour le compte portail.
Payscountry_idType : Many2one. Relie à la table res.country.
Photo de profilimage_1920Champ natif pour l'avatar.

B. Champs Personnalisés (À créer avec Odoo Studio)

Préfixe recommandé : x_

Voici les champs spécifiques à créer pour matcher vos écrans 1, 2, 3 et 4.

1. Identité & Segmentation

Label (Studio)Nom TechniqueType de ChampValeurs / OptionsDescription
Prénomx_studio_prnomChar (Texte)-Odoo utilise un champ unique "Nom". Créez ces deux champs pour le formulaire, et une "Action Automatisée" pour concaténer dans name.
Nom de famillex_studio_nom_de_familleChar (Texte)-Idem ci-dessus.
Est un candidat ?x_studio_candidatBooleanTrue/FalseCase à cocher par défaut à l'inscription pour les filtrer des autres contacts.
Domainex_studio_domaineSelectionsoin (Soin), restauration (Restauration)Correspond à l'écran "Domaine".

2. Métier & Géographie

Label (Studio)Nom TechniqueType de ChampValeurs / OptionsDescription
Intitulé du postex_studio_posteChar (Texte)-Reprendre la liste exacte de votre JSON React (Planche 3).
Villes souhaitéesx_studio_villes_souhaitesChar (Texte)-Stocker les villes sous forme de texte (ex: "Paris, Lyon") pour commencer simple.
Départementsx_studio_dpartementsChar (Texte)-Optionnel : Pour un filtrage plus puissant, stocker les "75, 69" ici.

3. Consentements & RGPD (Légal)

Label (Studio)Nom TechniqueType de ChampDescription
Majeur (+18 ans)x_studio_majeurBoolean
CGU Acceptéesx_studio_cgu_acceptesBoolean
Politique Confidentialitéx_studio_politique_confidentialitBoolean
Date Consentementx_studio_date_consentementDatetimeÀ remplir automatiquement par l'API au moment de l'inscription (Preuve légale).

4. Gamification & Onboarding (Planche 4 - Vidéos)

Label (Studio)Nom TechniqueType de ChampDescription
Étape d'inscriptionx_studio_tape_dinscriptionSelectionValeurs : New (Nouveau), Phone verified, Profil filled, Videos watched, Validated. Permet de savoir où l'utilisateur s'est arrêté.
Vidéos Intro Vuesx_studio_vidos_intro_vuesBooleanPasse à True quand les vidéos de la planche 4 sont terminées.

⚙️ Automatisations Recommandées (Odoo Studio / Server Actions)


Pour que la base de données reste propre, demandez à votre intégrateur (ou faites dans Studio) ces deux automatisations :

  1. Concaténation du Nom :
    • Déclencheur : À la mise à jour de x_firstname ou x_lastname.
    • Code Python : record['name'] = (record.x_firstname or '') + ' ' + (record.x_lastname or '')
    • Pourquoi ? Odoo a besoin du champ standard name pour les factures, les emails, etc.
  2. Création Utilisateur Portail :
    • Quand le formulaire d'inscription est validé (après vérification email), une action serveur doit créer un utilisateur système (res.users) lié à ce contact (res.partner) pour qu'il puisse se connecter à l'appli.


💡 Résumé pour le développeur React

Lors de l'appel API vers Odoo (via XML-RPC ou REST), voici la structure du JSON à envoyer pour créer le profil initial :

codeJSON

downloadcontent_copy

expand_less
{
  "model": "res.partner",
  "method": "create",
  "args": [{
    "x_studio_prnom": "Jean",
    "x_studio_nom_de_famille": "Lauret",
    "email": "jhlauret@gmail.com",
    "mobile": "+33612345678",
    "country_id": 75, // ID de la France dans Odoo
    "x_studio_domaine": "soin",
    "x_studio_poste": "infirmier",
    "x_studio_villes_souhaites": "Paris, Lyon",
    "x_studio_majeur": true,
    "x_studio_politique_confidentialit": true,
    "x_studio_candidat": true,
    "x_studio_tape_dinscription": "Profil filled"
  }]
}



La gestion des Expériences Professionnelles.

Parfait. Passons au morceau le plus techniqueLa gestion des Expériences Professionnelles.

Contrairement au profil de base, ici nous avons une relation "1 vers Plusieurs" (One-to-Many). Un infirmier a plusieurs expériences.

Nous ne pouvons pas stocker cela directement dans la fiche contact (res.partner). Nous allons créer un Modèle Personnalisé via Odoo Studio.

📂 Nouveau Modèle : Expérience Candidat (x_candidate_experience)

Dans Odoo Studio, ne surchargez pas les modules RH existants (conçus pour vos salariés). Créez un nouvel objet dédié aux freelances.

1. Création de l'Objet (Table)

  • Nom du modèle : x_candidate_experience
  • Description : Historique pro des infirmiers/candidats.
  • Ordre de tri par défaut : x_date_start desc (Pour voir les expériences récentes en premier).

2. Le Champ de Liaison (Crucial)

C'est ce qui relie l'expérience à l'infirmier.

Label (Studio)Nom TechniqueType de ChampCibleNotes
Candidatx_studio_candidatMany2oneContact (res.partner)C'est la clé étrangère. Indispensable.

Une fois ce champ créé, allez sur le modèle res.partner (Contact), ajoutez un onglet "Expériences" et insérez le champ "One2many" pointant vers x_candidate_experience.

3. Les Champs de Données (Mapping React)

Voici les champs à créer dans x_candidate_experience pour matcher votre formulaire React (Planches 5, 6, 7).

Donnée ReactChamp Odoo (Nom Technique)Type de ChampOptions / Valeurs
Date Débutx_studio_date_dbutDate-
Date Finx_studio_date_finDate-
Toujours en postex_studio_toujours_en_posteBooleanSi coché, ignore x_date_end dans les calculs.
Postex_studio_posteCharinfirmier, aide_soignant, cadre_sante, iade, ibode... (Reprendre la liste exacte de la modale).
Établissementx_studio_tablissementChar (Texte)-
Villex_studio_villeChar (Texte)-
Type Établissementx_studio_type_dtablissementCharhopital, clinique, domicile, ehpad... (Liste de la modale).
Descriptionx_studio_descriptionText (Multiligne)-
Certificat Travailx_studio_certificat_travailfilePermet de stocker le fichier (PDF/JPG).
Nom du Fichierx_studio_nom_du_fichierCharNécessaire pour qu'Odoo télécharge le fichier avec le bon nom (ex: "certif.pdf").

4. Champ Calculé (Optionnel mais recommandé)

Pour faciliter le tri des candidats dans Odoo plus tard, ajoutez un champ calculé :

LabelNom TechniqueTypeCalcul (Python)
Durée (Mois)x_studio_dure_moisFloatCalcule la différence entre Start et End (ou Today si Current). Utile pour filtrer "Candidats avec > 2 ans d'expérience".

💡 Résumé pour le développeur React


L'expérience utilisateur React est fluide (ajout dans une liste temporaire), mais techniquement, vous avez deux stratégies d'enregistrement vers Odoo :

Stratégie A (Recommandée) : Enregistrement unitaire

À chaque fois que l'utilisateur clique sur "Enregistrer l'expérience" dans le formulaire, vous envoyez un appel API create.

Stratégie B : Envoi en bloc (Batch)

Vous attendez que l'utilisateur clique sur "Valider" (fin de la liste) pour tout envoyer. C'est plus risqué si l'appli plante.

Exemple de Payload JSON (Création d'une expérience) :

codeJSON

downloadcontent_copy

expand_less
{
  "model": "x_candidate_experience",
  "method": "create",
  "args": [{
    "x_studio_candidat": 142, // ID du Contact (récupéré à l'étape précédente)
    "x_studio_poste": "infirmier",
    "x_studio_tablissement": "Clinique des Lilas",
    "x_studio_ville": "Lyon",
    "x_studio_date_dbut": "2023-04-01",
    "x_studio_date_fin": "2023-06-30",
    "x_studio_toujours_en_poste": false,
    "x_studio_type_dtablissement": "clinique",
    "x_studio_description": "Service des urgences...",
    // Pour le fichier binaire, Odoo demande du Base64
    "x_studio_nom_du_fichier": "certificat_travail.pdf",
    "x_studio_certificat_travail": "JVBERi0xLjQKJ..." // Base64 string
  }]
}



conformité légale (KYC) et aux documents administratifs.

C'est la dernière étape, mais c'est la plus sensible car elle touche à la conformité légale (KYC) et aux documents administratifs.

Ici, nous avons deux types de données :

  1. Des fichiers (Diplômes, CNI, CV...).
  2. Des statuts de validation (Vidéos vues, Identité vérifiée par Persona).

Voici la structure recommandée pour garder un Odoo propre et sécurisé.

📂 Nouveau Modèle : Documents de Conformité (x_compliance_document)

Plutôt que de créer 10 champs binaires sur la fiche contact (ce qui alourdit la base), nous allons créer un modèle dédié. Cela permet de gérer les dates d'expiration (ex: CNI périmée) et le statut de validation (ex: Diplôme rejeté car illisible).

1. Création de l'Objet (Table)

  • Nom du modèle : x_compliance_document
  • Description : Documents légaux et administratifs des candidats.

2. Les Champs (Mapping React)

Label (Studio)Nom TechniqueType de ChampOptions / Notes
Candidatx_studio_candidatMany2oneLien vers res.partner.
Type de Documentx_studio_type_de_documentSelectionValeurs : ID Card (Identité), Passport (Passeport), Diploma (Diplôme), CV , KBIS (Statut Indép.), RPPS (Preuve RPPS).
Fichierx_studio_fichierBinaryLe document lui-même (PDF/JPG).
Nom du fichierx_studio_nom_du_fichierCharPour le téléchargement.
Date d'expirationx_studio_date_dexpirationDateCrucial pour CNI/Passeport.
Statutx_studio_statutSelectionDraft (À valider), Valid (Validé), Rejected (Rejeté). Par défaut : draft.
Commentaire Refusx_studio_commentaire_refustextePour expliquer au candidat pourquoi le doc est refusé.

📂 Extensions sur le Contact (res.partner)

Certaines données de vos écrans ne sont pas des documents, mais des informations propres à l'infirmier. Il faut les ajouter directement sur la fiche contact.

1. Identifiants & Statuts (Planche 8 - Liste Tâches)

Donnée ReactChamp Odoo (x_)TypeNotes
Numéro RPPSx_studio_numro_rppsCharL'identifiant unique des professionnels de santé (11 chiffres).
Statut Indépendantx_studio_statut_indpendantCHARauto_entrepreneur, societe, portage.
Engagements Signésx_studio_engagements_signsBooleanCorrespond à la tâche "Vos engagements sur Synergia".
Vidéos Onboardingx_studio_vidos_onboardingCHARnot_started, in_progress, completed. (Lié au player vidéo vertical).

2. Gestion Identité / KYC (Planche 9 - Persona)

Attention : Si vous utilisez une solution externe comme "Persona" ou "Onfido" (comme suggéré par vos écrans), ne stockez pas les données biométriques dans Odoo pour des raisons RGPD/Sécurité. Stockez uniquement le résultat.

DonnéeChamp Odoo (x_)TypeDescription
Statut KYCx_studio_statut_kyccharpending (En cours), verified (Validé), rejected (Échoué).
ID Vérification Ext.x_studio_id_vrification_extCharL'ID de la transaction chez Persona (pour retrouver le dossier en cas de litige).
Nationalitéx_studio_nationalitMany2oneLien vers res.country (si différent du pays de résidence).

⚙️ Logique de Validation (Workflow Odoo)

Pour gérer cela efficacement dans Odoo, je vous conseille de configurer une Vue Kanban sur le modèle x_compliance_document groupée par x_validation_status.

  1. L'app React envoie le document 
    →→
     Il arrive dans la colonne "À valider" (draft).
  2. Un administrateur Synergia vérifie le fichier PDF.
  3. Il glisse la carte dans la colonne "Validé" (valid).
  4. Automatisation (Action Serveur) : Si tous les documents obligatoires (CNI + Diplôme + RPPS) d'un candidat passent à "Validé", alors passer le statut du Contact (res.partner) à "Profil Vérifié".

💡 Résumé pour le développeur React

Voici comment gérer l'upload des fichiers (Planches 8 & 9) vers Odoo via l'API.

Payload JSON (Upload d'un document) :

codeJSON

downloadcontent_copy

expand_less
{
  "model": "x_compliance_document",
  "method": "create",
  "args": [{
    "x_studio_candidat": 142,
    "x_studio_type_de_document": "Diploma",
    "x_studio_nom_du_fichier": "diplome_etat_infirmier.pdf",
    "x_studio_fichier": "JVBERi0xLjQKJ...", // Base64 string du fichier
    "x_studio_statut": "Draft"
  }]
}

Payload JSON (Mise à jour statut vidéo/tâches) :

Quand l'utilisateur a fini la vidéo "Frais et URSSAF".

codeJSON

downloadcontent_copy

expand_less
{
  "model": "res.partner",
  "method": "write",
  "args": [
    [142], // ID de l'utilisateur
    {
      "x_studio_vidos_onboarding": "completed",
      "x_studio_engagements_signs": true
    }
  ]
}

✅ Conclusion du Mapping

Vous avez maintenant l'architecture complète pour construire votre backend Odoo Studio :

  1. res.partner (Customisé) : Profil, Info légales, Statut Onboarding.
  2. x_candidate_experience : CV et parcours pro.
  3. x_compliance_document : La GED (Gestion Électronique des Documents) pour valider les profils.