ODOO Mapping via JSON RPC <>WebApp#5
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 React | Champ Odoo (Nom Technique) | Notes d'intégration |
| Numéro de téléphone | mobile | Le champ phone existe aussi, mais mobile est prioritaire pour les modules SMS Marketing d'Odoo. |
| Servira d'identifiant unique pour le compte portail. | ||
| Pays | country_id | Type : Many2one. Relie à la table res.country. |
| Photo de profil | image_1920 | Champ 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 Technique | Type de Champ | Valeurs / Options | Description |
| Prénom | x_studio_prnom | Char (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 famille | x_studio_nom_de_famille | Char (Texte) | - | Idem ci-dessus. |
| Est un candidat ? | x_studio_candidat | Boolean | True/False | Case à cocher par défaut à l'inscription pour les filtrer des autres contacts. |
| Domaine | x_studio_domaine | Selection | soin (Soin), restauration (Restauration) | Correspond à l'écran "Domaine". |
2. Métier & Géographie
| Label (Studio) | Nom Technique | Type de Champ | Valeurs / Options | Description |
| Intitulé du poste | x_studio_poste | Char (Texte) | - | Reprendre la liste exacte de votre JSON React (Planche 3). |
| Villes souhaitées | x_studio_villes_souhaites | Char (Texte) | - | Stocker les villes sous forme de texte (ex: "Paris, Lyon") pour commencer simple. |
| Départements | x_studio_dpartements | Char (Texte) | - | Optionnel : Pour un filtrage plus puissant, stocker les "75, 69" ici. |
3. Consentements & RGPD (Légal)
| Label (Studio) | Nom Technique | Type de Champ | Description |
| Majeur (+18 ans) | x_studio_majeur | Boolean | |
| CGU Acceptées | x_studio_cgu_acceptes | Boolean | |
| Politique Confidentialité | x_studio_politique_confidentialit | Boolean | |
| Date Consentement | x_studio_date_consentement | Datetime | À remplir automatiquement par l'API au moment de l'inscription (Preuve légale). |
4. Gamification & Onboarding (Planche 4 - Vidéos)
| Label (Studio) | Nom Technique | Type de Champ | Description |
| Étape d'inscription | x_studio_tape_dinscription | Selection | Valeurs : New (Nouveau), Phone verified, Profil filled, Videos watched, Validated. Permet de savoir où l'utilisateur s'est arrêté. |
| Vidéos Intro Vues | x_studio_vidos_intro_vues | Boolean | Passe à 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 :
- 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.
- 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 technique : La 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 Technique | Type de Champ | Cible | Notes |
| Candidat | x_studio_candidat | Many2one | Contact (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 React | Champ Odoo (Nom Technique) | Type de Champ | Options / Valeurs |
| Date Début | x_studio_date_dbut | Date | - |
| Date Fin | x_studio_date_fin | Date | - |
| Toujours en poste | x_studio_toujours_en_poste | Boolean | Si coché, ignore x_date_end dans les calculs. |
| Poste | x_studio_poste | Char | infirmier, aide_soignant, cadre_sante, iade, ibode... (Reprendre la liste exacte de la modale). |
| Établissement | x_studio_tablissement | Char (Texte) | - |
| Ville | x_studio_ville | Char (Texte) | - |
| Type Établissement | x_studio_type_dtablissement | Char | hopital, clinique, domicile, ehpad... (Liste de la modale). |
| Description | x_studio_description | Text (Multiligne) | - |
| Certificat Travail | x_studio_certificat_travail | file | Permet de stocker le fichier (PDF/JPG). |
| Nom du Fichier | x_studio_nom_du_fichier | Char | Né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é :
| Label | Nom Technique | Type | Calcul (Python) |
| Durée (Mois) | x_studio_dure_mois | Float | Calcule 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 :
- Des fichiers (Diplômes, CNI, CV...).
- 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 Technique | Type de Champ | Options / Notes |
| Candidat | x_studio_candidat | Many2one | Lien vers res.partner. |
| Type de Document | x_studio_type_de_document | Selection | Valeurs : ID Card (Identité), Passport (Passeport), Diploma (Diplôme), CV , KBIS (Statut Indép.), RPPS (Preuve RPPS). |
| Fichier | x_studio_fichier | Binary | Le document lui-même (PDF/JPG). |
| Nom du fichier | x_studio_nom_du_fichier | Char | Pour le téléchargement. |
| Date d'expiration | x_studio_date_dexpiration | Date | Crucial pour CNI/Passeport. |
| Statut | x_studio_statut | Selection | Draft (À valider), Valid (Validé), Rejected (Rejeté). Par défaut : draft. |
| Commentaire Refus | x_studio_commentaire_refus | texte | Pour 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 React | Champ Odoo (x_) | Type | Notes |
| Numéro RPPS | x_studio_numro_rpps | Char | L'identifiant unique des professionnels de santé (11 chiffres). |
| Statut Indépendant | x_studio_statut_indpendant | CHAR | auto_entrepreneur, societe, portage. |
| Engagements Signés | x_studio_engagements_signs | Boolean | Correspond à la tâche "Vos engagements sur Synergia". |
| Vidéos Onboarding | x_studio_vidos_onboarding | CHAR | not_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ée | Champ Odoo (x_) | Type | Description |
| Statut KYC | x_studio_statut_kyc | char | pending (En cours), verified (Validé), rejected (Échoué). |
| ID Vérification Ext. | x_studio_id_vrification_ext | Char | L'ID de la transaction chez Persona (pour retrouver le dossier en cas de litige). |
| Nationalité | x_studio_nationalit | Many2one | Lien 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.
- L'app React envoie le document
→→
Il arrive dans la colonne "À valider" (draft). - Un administrateur Synergia vérifie le fichier PDF.
- Il glisse la carte dans la colonne "Validé" (valid).
- 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 :
- res.partner (Customisé) : Profil, Info légales, Statut Onboarding.
- x_candidate_experience : CV et parcours pro.
- x_compliance_document : La GED (Gestion Électronique des Documents) pour valider les profils.