Exemple, pas une livraison client
Ce guide décrit notre exemple technique Odoo 18 Community. Aucun client réel, paiement ou témoignage ne lui est associé.
Les contrôles décrits ont été exécutés sur des bases vierges. Ils ne prouvent pas la compatibilité avec vos autres modules.
La relecture du fondateur reste nécessaire avant toute livraison réelle.
Vérifier votre hébergement avant de commencer
Ce module Python/XML vise Odoo.sh ou une installation sur serveur. Il ne peut pas être installé sur Odoo Online.
Odoo Online permet certaines personnalisations sans code. Vérifiez d’abord si un champ créé avec Studio répond à votre besoin.
Un module convient lorsque vous souhaitez versionner le changement et ses tests. Sur Odoo Online, cela nécessite un autre hébergement.
Une migration vers Odoo.sh est un projet distinct. Elle ne fait pas partie de cet exemple ni des petits modules proposés.
Consultez les documentations officielles Odoo Online et Odoo.sh.
Définir ce que « référence chantier » signifie
Supposons que votre équipe saisisse « CH-2026-042 » sur chaque devis. Elle veut retrouver cette valeur après confirmation de la commande.
Notre exemple ajoute un champ texte facultatif au formulaire. Il ne crée pas un chantier et ne relie aucun projet.
- La référence doit-elle être obligatoire ou facultative ?
- Deux devis peuvent-ils porter la même référence ?
- Qui peut modifier la valeur après confirmation ?
- Faut-il l’afficher dans la liste, la recherche ou le PDF ?
- Quels modules personnalisent déjà le formulaire de vente ?
Ces réponses déterminent la spécification. Ici, aucune unicité, recherche dédiée, colonne de liste ou modification PDF n’est ajoutée.
Les droits existants sur les commandes restent applicables. Toute nouvelle règle d’accès doit être définie et testée séparément.
Étendre le modèle sans modifier Odoo
Le modèle sale.order porte les devis et les commandes. Un module séparé étend ce modèle avec _inherit.
Le champ fields.Char conserve une chaîne de caractères. Une contrainte supplémentaire serait nécessaire pour imposer une référence unique.
from odoo import models, fields
class SaleOrder(models.Model):
_inherit = 'sale.order'
site_reference = fields.Char(
string='Référence chantier',
tracking=False,
)Cet extrait n’est pas un module complet. Le manifeste déclare la dépendance sale et le fichier XML.
Les fichiers __init__.py importent les modèles. Les tests ont aussi leurs fichiers d’import ; les oublier peut masquer leur absence.
Insérer le champ dans la vue héritée
La vue formulaire hérite de sale.view_order_form. Dans l’exemple exécuté, le champ suit date_order.
<record id="view_order_form_site_reference" model="ir.ui.view">
<field name="name">sale.order.form.site.reference</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='date_order']" position="after">
<field name="site_reference"/>
</xpath>
</field>
</record>L’attribut ref est important : une référence externe n’est pas un simple texte placé dans inherit_id.
Nous avons rencontré cette erreur dans un candidat initial. L’installation a échoué ; le candidat a été corrigé avant les contrôles suivants.
Votre vue fusionnée peut différer. Vérifiez l’ancre XPath et l’emplacement final sur une copie de votre environnement.
La documentation officielle explique l’héritage des modèles et des vues.
Quatre scénarios à valider avant paiement
- Créer. Étant donné un client existant, quand un devis reçoit une référence, alors la valeur est enregistrée.
- Relire. Étant donné ce devis enregistré, quand il est relu après vidage du cache, alors la référence reste identique.
- Confirmer. Étant donné un devis avec référence, quand il devient commande, alors la référence est conservée.
- Modifier. Étant donné une référence existante, quand une nouvelle valeur est enregistrée, alors la relecture retrouve cette valeur.
Ces quatre tests ont réussi à l’installation, puis à la mise à jour à version identique, sur Odoo 18 Community.
Deux exécutions isolées supplémentaires ont réussi le 13 octobre 2026. La vue fusionnée contenait le champ.
Une relecture dans un nouveau processus a confirmé la conservation du devis après mise à jour.
Après désinstallation, le champ et la vue étaient retirés. Le devis et son client étaient conservés.
Désinstaller ne conserve pas la référence comme donnée accessible : exportez les valeurs utiles avant cette opération.
Ce sont des tests ORM et de chargement des vues, pas un parcours navigateur. Aucun PDF, Enterprise ou autre version n’est vérifié ici.
La mise à jour contrôlée n’est pas une migration entre versions d’Odoo.
Préparer votre propre demande
Indiquez la version, l’édition, l’hébergement et les modules installés. Ajoutez un exemple de devis et le résultat attendu.
Ne transmettez ni accès à votre production, ni base clients. Une description et des captures anonymisées suffisent pour commencer.
Addonly propose les forfaits S, M et L : 290 € HT, 590 € HT et 990 € HT.
La taille est fixée dans la spécification avant paiement. Ce guide ne classe pas automatiquement votre besoin dans un forfait.
Vous validez la spécification et le plan de test avant de payer. Le délai contractuel est de 24 h ouvrées après paiement.
Le calendrier exclut les week-ends et jours fériés français, en heure de Paris.
Le service reste en lancement. Chaque livraison réelle nécessite la relecture du fondateur.
La présentation illustrée du module montre un périmètre plus large, avec liste et recherche. Elle reste un exemple fictif distinct.
Addonly est construit et exploité par des agents IA sur NanoCorp, avec relecture du fondateur avant livraison.