Introduction
Chaque fois que vous indiquez un nombre d’unités sur une commande, comptez des jours de retard sur une tâche ou attribuez un score de priorité à un prospect, vous utilisez indirectement un champ de type entier dans Odoo. Simple en apparence, ce type de champ est omniprésent dans le modèle de données et soutient beaucoup de logiques métiers quotidiennes.
Savoir comment l’entier se comporte est utile à trois profils : les utilisateurs qui configurent les formulaires, les développeurs qui codent des modules, et les consultants qui conçoivent l’architecture des données pour leurs clients.
Ce guide explique ce que contient un champ Entier, comment Odoo le gère dans l’ORM et l’interface, comment le créer depuis Odoo Studio ou en Python, et illustre le tout par des cas concrets et des avertissements pratiques.
Qu’est‑ce que le champ Entier dans Odoo
Dans l’ORM d’Odoo, le champ Entier stocke exclusivement des nombres entiers. Il correspond à une colonne INTEGER en PostgreSQL (entier 4 octets), donc il accepte des valeurs négatives et positives jusqu’à des ordres de grandeur de l’ordre de deux milliards environ.
Pour l’utilisateur, un champ Entier se présente comme un champ numérique simple dans les formulaires et comme une colonne numérique dans les listes. C’est le choix naturel pour tout comptage en unités entières : quantités physiques, scores, durées en jours, positions dans une séquence, etc.
Exemple de déclaration classique en Python :
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
estimated_hours = fields.Integer(
string='Estimated Hours',
default=0,
)
Le paramètre string définit l’étiquette visible pour l’utilisateur, tandis que default initialise automatiquement la valeur lors de la création d’un enregistrement.
Dans Odoo Studio, le type apparaît simplement comme « Integer ». Les champs créés via Studio reçoivent automatiquement le préfixe x_studio_. Si vous le déclarez en Python ou via l’API, vous choisissez le nom technique vous‑même.
Comment ce champ fonctionne
Quand vous ajoutez un champ Entier, Odoo crée la colonne correspondante en base lors de l’installation ou de la mise à jour du module : pas besoin d’écrire des migrations SQL à la main.
Au niveau base de données, la colonne est de type INTEGER. L’ORM effectue la conversion de type et, important à noter, si l’utilisateur ne renseigne rien le champ renverra 0 plutôt que None ou False. C’est un comportement à garder en tête car il diffère d’autres types comme Float ou Char.
Attributs clés du champ
Voici les propriétés principales qu’on peut paramétrer sur un champ Entier :
- string : l’étiquette affichée à l’écran.
- default : valeur initiale affectée aux nouveaux enregistrements. Par défaut, Odoo met
0si rien n’est précisé. - required : rend le champ obligatoire. Comme la valeur par défaut est déjà
0, on l’utilise surtout si l’on veut interdire l’enregistrement avec zéro. - readonly : empêche la modification directe par l’utilisateur dans l’interface.
- index : crée un index PostgreSQL pour accélérer les recherches et tris sur ce champ.
- compute : relie une méthode Python qui calcule dynamiquement la valeur à partir d’autres champs.
- store : avec
compute, contrôle si la valeur calculée est stockée en base ou recalculée à la volée. - copy : définit si la valeur est dupliquée lors de la copie d’un enregistrement.
- groups : limite la visibilité du champ à certains groupes d’utilisateurs.
Affichage dans les vues
En formulaire, l’Entier s’affiche comme un champ numérique. Odoo applique automatiquement des séparateurs de milliers pour faciliter la lecture des grands nombres.
En liste, les entiers sont alignés à droite par convention. Dans les vues de recherche, ils supportent les opérateurs classiques : égal, supérieur, inférieur, etc.
Il est possible d’associer des widgets pour modifier la présentation : par exemple le widget priority transforme le nombre en étoiles cliquables, et progressbar affiche une barre de progression si vous avez une valeur maximale.
Interaction avec l’ORM
Pour un développeur, manipuler un champ Entier est simple : sa valeur est toujours un int Python. Attention toutefois : champ non renseigné et valeur zéro sont indiscernables — un point à considérer lorsque vous testez l’absence d’une donnée.
Les champs Entier s’intègrent naturellement dans les champs calculés, les domaines (filtres) ou les actions automatisées utilisées partout dans Odoo.
Cas d’usage en entreprise
Où l’Entier intervient dans les modules
1. CRM : scoring des leads
Dans le CRM, on ajoute souvent un champ Entier « score » pour prioriser les opportunités. Ce score peut être saisi manuellement par les commerciaux ou alimenté par une règle automatique basée sur la taille de l’entreprise, le budget, ou le niveau d’engagement.
Cela permet de trier le pipeline et de concentrer les efforts sur les prospects les plus prometteurs.
2. Ventes : quantité minimale de commande
Dans les modules Ventes et Stock, des champs Entier servent à définir des quantités minimales. Par exemple, imposer un minimum de 10 unités évite de valider des commandes en dessous de ce plancher et simplifie les échanges commerciaux.
3. Stock : règles de réapprovisionnement
Les règles de réapprovisionnement utilisent des champs Entier pour les seuils minimum et maximum. Quand le stock descend sous le minimum, Odoo génère automatiquement une commande jusqu’au maximum défini. Des valeurs mal calibrées peuvent conduire à des ruptures ou des excédents.
4. Gestion de projet : story points et estimations
Dans Project, on ajoute souvent un champ Entier pour les story points ou les heures estimées. Visible en kanban ou en liste, il aide à suivre la capacité d’équipe et la vélocité sur les sprints.
5. Comptabilité : délais de paiement en jours
Les conditions de paiement utilisent des entiers pour définir le nombre de jours (Net 30, Net 60, etc.). Ces valeurs alimentent le calcul des dates d’échéance des factures, d’où leur importance pour la trésorerie.
Créer ou personnaliser un champ Entier
Deux façons d’ajouter un champ Entier : avec Odoo Studio sans code, ou en Python pour un contrôle complet.
Utiliser Odoo Studio
Odoo Studio est l’outil intégré pour personnaliser sans écrire de code. Pour ajouter un champ Entier via Studio :
- Ouvrez le formulaire cible.
- Activez Studio depuis le menu en haut à droite.
- Dans la palette de champs, glissez le type Integer sur le formulaire.
- Définissez l’étiquette, si le champ est requis, et la valeur par défaut.
- Enregistrez et quittez Studio.
Studio crée le champ avec le préfixe x_studio_ et ajoute la définition dans ir.model.fields. Le champ devient immédiatement utilisable dans les vues.
Définir le champ en Python (personnalisation technique)
Pour les développeurs, on déclare le champ dans une classe de modèle Python :
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
x_lead_score = fields.Integer(
string='Lead Score',
default=0,
index=True,
help='Score from 0 to 100 used to prioritize opportunities',
)
Après ajout dans le code, lancez odoo-bin -u your_module pour appliquer les modifications : la colonne est créée automatiquement en base.
Créer le champ via l’API XML‑RPC
Il est aussi possible de créer un champ Entier à distance via l’API XML‑RPC — utile pour des déploiements automatisés ou en l’absence d’accès direct au serveur :
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_lead_score',
'field_description': 'Lead Score',
'model_id': crm_lead_model_id,
'ttype': 'integer',
'state': 'manual',
}]
)
Le ttype pour un entier est 'integer'. Le state doit être 'manual' pour indiquer qu’il s’agit d’un champ personnalisé.
Champs Entier calculés
Les champs Entier calculés sont pratiques pour dériver automatiquement des valeurs, par exemple le nombre de tâches ouvertes liées à un projet :
class Project(models.Model):
_inherit = 'project.project'
open_task_count = fields.Integer(
string='Open Tasks',
compute='_compute_open_task_count',
store=True,
)
def _compute_open_task_count(self):
for project in self:
project.open_task_count = self.env['project.task'].search_count([
('project_id', '=', project.id),
('stage_id.fold', '=', False),
])
Utiliser store=True enregistre la valeur en base, ce qui permet de la filtrer et de trier sans recalculer à chaque accès.
Bonnes pratiques
Conseils pratiques pour bien utiliser les entiers
Utilisez Les Entiers pour les Comptages et Quantités Entières
Choisissez Integer quand la valeur doit être entière. Pour l’argent, les mesures ou toute donnée fractionnable, privilégiez Float ou Monetary afin d’éviter la perte de précision.
Définissez une valeur par défaut pertinente
Odoo met par défaut 0. Réfléchissez si zéro a du sens dans votre contexte. Si zéro signifie « non renseigné », envisagez d’ajouter un booléen indicateur ou de gérer cette logique explicitement.
Ajoutez un index si vous filtrez souvent sur ce champ
Si vous filtrez, triez ou regroupez fréquemment par ce champ, définissez index=True. L’index améliore nettement les performances sur de grandes tables au prix d’un surcoût minime en stockage et en temps d’écriture.
Stockez les champs calculés utilisés en filtre
Pour qu’un champ calculé soit utilisable dans des domaines ou pour le groupement, mettez store=True. Sans cela, Odoo ne pourra pas l’utiliser efficacement dans les requêtes.
Documentez les plages de valeurs
Si le champ a une plage significative (par ex. score de 0 à 100), mettez un texte d’aide via help pour guider les utilisateurs et réduire les erreurs de saisie.
Évitez d’utiliser l’Entier pour des références d’enregistrements
Pour pointer vers un autre enregistrement, préférez Many2one plutôt que stocker un identifiant dans un Integer. Many2one apporte navigation, règles en cascade et intégration ORM, tandis qu’un identifiant brut est fragile.
Pièges fréquents
Pièges les plus courants
Confondre Integer et Float
Erreur fréquente : utiliser Integer alors que des décimales sont possibles. Odoo tronque silencieusement les décimales, ce qui cause perte de données. Pour des valeurs comme 1,5 ou 0,25, utilisez Float (ou Monetary pour les montants).
Prendre zéro pour absence de valeur
Comme un champ Entier non renseigné renvoie 0, on ne peut pas distinguer « jamais rempli » de « rempli avec zéro ». Si cette distinction est importante, ajoutez un booléen comme has_score ou utilisez un autre type.
Oublier d’indexer un champ souvent filtré
Ajouter un champ sans index alors qu’il est utilisé en filtre peut dégrader les performances sur de grandes bases. Mieux vaut définir l’index dès le départ si vous prévoyez des recherches fréquentes.
Stocker des ratios décimaux dans un Entier
Enregistrer des pourcentages comme entiers (ex. 75 pour 75 %) fonctionne jusqu’au jour où une précision décimale est nécessaire. Si des demi‑pourcentages sont possibles, utilisez Float.
Oublier store=True sur un champ calculé utilisé en filtre
Un champ calculé sans store=True ne peut pas être utilisé dans les domaines, les actions automatisées ou le group-by. C’est une erreur répandue en développement Odoo.
Conclusion
Le champ Entier est un élément fondamental du modèle de données Odoo. Sa simplicité cache des comportements particuliers — notamment le retour de 0 pour les champs vides et la nécessité de store=True pour certains usages — qui, mal compris, peuvent provoquer des bugs difficiles à corriger.
Qu’on configure Odoo pour la force de vente, qu’on développe un module sur mesure ou qu’on règle des règles de réapprovisionnement, les champs Entier sont partout. Savoir quand les employer plutôt que Float ou Monetary est essentiel pour des implémentations robustes et faciles à maintenir.
Si vous préparez une personnalisation Odoo et souhaitez vous assurer d’un modèle de données bien pensé dès le départ, ces principes de base vous feront gagner du temps et évitent des corrections coûteuses plus tard.
Travaillez avec un expert Odoo
Chez Dasolo, nous accompagnons les entreprises pour implémenter, personnaliser et optimiser Odoo quel que soit le secteur. Que ce soit pour concevoir un modèle de données propre, développer des champs et flux métier personnalisés, ou intégrer Odoo à des systèmes externes via l’API, nous avons l’expérience pour le faire correctement.
Si vous avez des questions sur votre configuration Odoo ou souhaitez discuter d’un projet, contactez notre équipe— nous serons ravis de vous accompagner.