Se rendre au contenu

Champ de date dans Odoo : Le guide complet

Tout ce que vous devez savoir sur le champ Date dans le modèle de données Odoo, de l'utilisation de base à la personnalisation technique.
6 mars 2026 par
Champ de date dans Odoo : Le guide complet
Dasolo
| Aucun commentaire pour l'instant

Introduction


Si vous avez déjà ouvert un bon de commande, une tâche de projet ou un bon de fabrication dans Odoo, vous avez déjà utilisé un champ Date. Les délais, les dates de livraison, les dates d'échéance des factures, les dates de début de contrat - la plupart des données sensibles au temps dans Odoo sont stockées à l'aide de ce type de champ.

Pour les utilisateurs professionnels, les champs Date sont intuitifs : vous cliquez, un calendrier apparaît, vous choisissez une date. Mais il se passe plus de choses en coulisses. Comprendre comment le champ Date fonctionne dans le modèle de données Odoo, comment il diffère des champs DateTime, et comment le créer ou le personnaliser vous aidera à construire des flux de travail plus précis et à éviter les surprises liées aux fuseaux horaires qui perturbent de nombreuses implémentations d'Odoo.

Ce guide couvre tout ce que vous devez savoir sur le champ Date dans Odoo, de ce qu'il stocke à la manière de l'utiliser efficacement dans vos processus commerciaux.

Quel est le champ Date dans Odoo


Dans l'ORM Odoo, le type fields.Date est conçu pour stocker des dates de calendrier sans composante temporelle. Une date comme "2026-03-06" est stockée exactement telle quelle, sans heures, minutes ou secondes attachées.

Dans PostgreSQL, la base de données sur laquelle Odoo fonctionne, un champ Date correspond au type de colonne DATE. Cela est distinct du champ DateTime, qui correspond à TIMESTAMP et inclut un horodatage complet jusqu'à la seconde.

Dans l'interface utilisateur, un champ Date s'affiche comme un champ de texte avec un sélecteur de calendrier. Les utilisateurs peuvent soit taper une date directement, soit cliquer sur l'icône du calendrier pour en sélectionner une. Dans les vues en liste, il apparaît sous forme de texte formaté aligné sur la locale de l'utilisateur.

Voici à quoi ressemble une définition de champ Date dans un module Python personnalisé :

from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_deadline_confirmed = fields.Date(
        string='Deadline Confirmée',
        help='La date limite officiellement confirmée convenue avec le client.',
    )

Dans Odoo Studio, ce champ est simplement étiqueté Date. Lorsqu'il est créé via Studio, il obtient automatiquement un préfixe x_studio_. Lorsqu'il est créé via du code Python ou l'API XML-RPC, vous choisissez vous-même le nom technique.

Comment fonctionne le champ


Date vs. DateTime : qu'est-ce qui change réellement

La chose la plus importante à comprendre à propos du champ Date est ce qu'il ne contient pas : le temps. Il n'y a pas d'heures, pas de conversions de fuseau horaire, rien au-delà de la date du calendrier elle-même.

Le champ DateTime, en revanche, stocke un horodatage complet et est enregistré en UTC dans la base de données. Odoo le convertit ensuite en fuseau horaire local de l'utilisateur lors de l'affichage. C'est la source de nombreux bugs déroutants "ma date a changé d'un jour" que les équipes rencontrent. Ce sont presque toujours des problèmes de DateTime, pas des problèmes de champ Date.

Lorsque vous utilisez un champ Date, ce que vous stockez est exactement ce que les utilisateurs voient. Une valeur de 2026-03-15 est 2026-03-15 pour chaque utilisateur, peu importe où dans le monde ils se trouvent.

Attributs clés du champ

Voici les propriétés les plus importantes que vous pouvez configurer sur un champ Date dans le framework Odoo :

  • required : Rend le champ obligatoire à la fois au niveau de l'interface et du modèle.
  • default : Définit une valeur par défaut automatique. Par exemple, fields.Date.today par défaut à la date d'aujourd'hui pour les nouveaux enregistrements.
  • index : Crée un index de base de données pour un filtrage et une recherche plus rapides sur ce champ.
  • compute : Lie une méthode Python qui calcule la valeur dynamiquement.
  • store : Lorsqu'il est combiné avec compute, persiste la valeur calculée dans la base de données.
  • readonly : Empêche les utilisateurs de modifier le champ directement dans l'interface.
  • copy : Contrôle si la valeur est transférée lors de la duplication d'un enregistrement. Par défaut, c'est True.

Comment cela apparaît dans les vues

Dans les vues de formulaire, un champ Date s'affiche comme un champ de texte avec un popup de calendrier. Dans les vues de liste, il apparaît sous forme de texte formaté. Dans les vues de recherche, il prend en charge les filtres de plage de dates par défaut : "cette semaine", "ce mois-ci", "ce trimestre", ainsi que des opérateurs de comparaison exacts tels que avant, après et à une date spécifique.

Le format d'affichage suit les paramètres de langue de l'utilisateur dans Odoo. Un utilisateur américain voit MM/JJ/AAAA tandis qu'un utilisateur européen voit JJ/MM/AAAA. La valeur stockée sous-jacente est toujours au format ISO (AAAA-MM-JJ), peu importe comment elle apparaît à l'écran.

Interaction avec l'ORM Odoo

Lors de la lecture d'un champ Date dans le code, l'ORM Odoo renvoie un objet Python datetime.date, ou False si le champ est vide. Lors de l'écriture via l'ORM, vous pouvez passer soit un objet datetime.date, soit une chaîne au format "YYYY-MM-DD". Via l'API XML-RPC, les dates sont toujours transmises et reçues sous forme de chaînes.

Il n'y a pas de transformations complexes impliquées lors de l'utilisation des champs Date dans le modèle de données Odoo. Le cadre gère automatiquement le formatage et le stockage, ce qui fait partie de ce qui rend ce type de champ si pratique pour un usage quotidien dans le développement Odoo.

Cas d'utilisation commerciale


Le champ Date apparaît dans presque toutes les parties d'une implémentation Odoo. Voici cinq exemples pratiques tirés de véritables flux de travail d'entreprise.

CRM : Dates de début et de fin de contrat

Dans les équipes de vente utilisant Odoo CRM, les contrats ont souvent des dates de début et de fin définies. Un champ Date sur le lead ou un modèle de contrat personnalisé facilite le suivi des moments où les affaires s'activent et quand elles expirent.

Associé à des actions automatisées, vous pouvez déclencher des rappels par e-mail ou des changements de statut lorsque qu'un contrat approche de sa date de fin, sans aucun suivi manuel de l'équipe. Ce type d'automatisation est simple à mettre en place et permet d'éviter de nombreux renouvellements manqués au fil du temps.

Ventes : Dates de livraison demandées

Les clients demandent souvent une date de livraison spécifique lors de la passation de commandes. De nombreuses entreprises ajoutent un champ Date "Date demandée par le client" sur les commandes de vente pour donner à l'équipe des opérations une date cible claire autour de laquelle planifier.

Utiliser un champ Date plutôt qu'un champ DateTime garde les données simples et évite la confusion des fuseaux horaires lors de la coordination avec l'entrepôt. L'équipe d'entrepôt voit la même date que l'équipe de vente a saisie, sans risque de problèmes de conversion.

Inventaire : Dates d'expiration sur les lots

Dans les secteurs alimentaire, pharmaceutique et chimique, les lots de produits doivent avoir des dates d'expiration suivies au niveau de l'entrepôt. La gestion des lots d'Odoo utilise des champs Date pour stocker les dates d'expiration et de consommation optimale sur stock.lot.

Ceci alimente des stratégies de prélèvement FEFO (First Expired First Out) et des alertes automatisées lorsque le stock approche de l'expiration, protégeant à la fois la conformité réglementaire et la qualité des produits sans nécessiter de vérifications manuelles.

Comptabilité : Dates d'échéance des factures

Les dates d'échéance des factures dans Odoo sont des champs de date. Elles déterminent quand les rappels de paiement automatiques sont envoyés, comment les factures en retard sont identifiées et comment les rapports de créances et de dettes âgées sont calculés.

Obtenir ces dates correctement est l'un des usages opérationnels les plus importants du champ Date dans l'ensemble du modèle de données Odoo. Une mauvaise date d'échéance casse silencieusement le suivi des flux de trésorerie et l'automatisation du suivi.

RH : Dates d'intégration, de contrat et de certification

Les équipes RH s'appuient fortement sur les champs de date pour les dates d'embauche, les dates de fin de période d'essai, les dates de début et de fin de contrat, et les dates d'expiration des certifications. Ces valeurs alimentent des e-mails automatisés, des alertes et des règles de calcul de la paie.

Un module RH bien conçu dans Odoo est impossible sans des données de champ Date propres et précises dans les dossiers des employés. Ces dates sont souvent les déclencheurs de certaines des automatisations les plus critiques pour l'entreprise dans une configuration Odoo.

Créer ou personnaliser le champ Date


Il existe trois principales façons d'ajouter un champ Date à un modèle Odoo, en fonction de votre configuration technique et de votre approche de déploiement.

Utiliser Odoo Studio (sans code)

Odoo Studio est le moyen le plus simple d'ajouter un champ Date sans écrire de code. C'est l'approche recommandée pour les utilisateurs professionnels et les consultants qui souhaitent ajouter un suivi des dates aux formulaires Odoo standard rapidement :

  1. Ouvrez Odoo Studio depuis le menu principal.
  2. Naviguez vers le formulaire où vous souhaitez ajouter le champ.
  3. Faites glisser un champ Date depuis la barre latérale vers le formulaire.
  4. Définissez l'étiquette, le statut requis et une valeur par défaut si nécessaire.
  5. Enregistrez et fermez Studio.

Studio crée le champ avec un préfixe x_studio_ et l'ajoute immédiatement à la vue du formulaire. Aucune migration de base de données n'est nécessaire de votre part.

Utiliser Python dans un module personnalisé

Pour les développeurs construisant des modules Odoo, les champs Date sont définis dans des fichiers de modèle Python. C'est la bonne approche pour toute personnalisation qui doit être contrôlée par version et déployée sur plusieurs environnements :

from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_customer_requested_date = fields.Date(
        string='Date demandée par le client',
        index=True,
        copy=False,
        help='Date de livraison demandée par le client au moment de la commande.',
    )

Après avoir ajouté le champ au modèle, vous devez également l'ajouter au fichier XML de vue pertinent afin qu'il apparaisse dans l'interface. Odoo gère la création de la colonne de base de données lorsque vous installez ou mettez à niveau le module.

Utiliser l'API XML-RPC

Pour la création de champs par programmation dans le cadre d'un pipeline de déploiement ou d'un carnet de configuration à distance, vous pouvez créer des champs Date via l'API XML-RPC d'Odoo :

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_customer_requested_date',
        'field_description': 'Date demandée par le client',
        'model_id': model_id,
        'ttype': 'date',
        'state': 'manual',
    }]
)

La valeur ttype pour un champ Date est 'date'. Pour un champ DateTime, ce serait 'datetime'. Utiliser 'manual' comme état indique à Odoo que ce champ a été créé manuellement, et non par l'installation d'un module. C'est ainsi que Dasolo gère la création de champs à distance pour les clients dans le cadre de scripts de configuration automatisés.

Meilleures pratiques


1. Utilisez Date, pas DateTime, lorsque l'heure est sans importance

Si la seule chose qui compte est la date du calendrier (une date limite, une date de contrat, une date de naissance, une date d'expiration), utilisez fields.Date. Choisir DateTime pour des données purement basées sur la date ajoute une complexité de fuseau horaire sans avantage pratique et peut causer des bugs déroutants de décalage d'un jour selon la configuration du fuseau horaire du serveur.

2. Définissez une valeur par défaut significative lorsque cela a du sens

Pour des champs comme "Date de Livraison Prévue" ou "Date de Suivi", définir par défaut aujourd'hui ou aujourd'hui plus un certain nombre de jours donne aux utilisateurs un point de départ sensé. Utilisez default=fields.Date.today sans parenthèses pour une valeur par défaut dynamique qui s'évalue au moment de la création de l'enregistrement, et non au moment de la définition de la classe.

3. Indexez les champs de date utilisés dans les rapports et les filtres de recherche

Si vos utilisateurs filtrent régulièrement des enregistrements par un champ de date (factures en retard, renouvellements à venir, certifications expirantes), ajoutez index=True. Sur de grands ensembles de données, cela améliore considérablement les performances des filtres et des rapports. C'est un petit changement avec un impact significatif à grande échelle et cela coûte presque rien à mettre en œuvre au départ.

4. Utilisez copy=False pour les dates qui ne doivent pas être reportées

Des dates comme "Date de Début de Contrat" ou "Date d'Expiration" ne doivent pas être copiées lorsqu'un utilisateur duplique un enregistrement. Ajouter copy=False oblige l'utilisateur à définir la date explicitement sur le nouvel enregistrement, évitant ainsi des erreurs silencieuses où une date obsolète persiste sur un contrat ou une tâche de projet dupliqué.

5. Ajoutez des contraintes lorsque deux champs de date forment une plage

Chaque fois qu'un modèle a une paire "Date de Début" et "Date de Fin", ajoutez une contrainte Python en utilisant @api.constrains pour garantir que la date de fin n'est pas antérieure à la date de début. C'est simple à mettre en œuvre et cela prévient toute une catégorie de problèmes de qualité des données qui sont ennuyeux à diagnostiquer après coup.

Pièges courants


Champs Date et DateTime déroutants

C'est l'erreur la plus fréquente lors du travail avec des données sensibles au temps dans Odoo. DateTime stocke un horodatage complet en UTC et convertit lors de l'affichage. Date ne stocke que la date du calendrier sans conversion. Utiliser DateTime lorsque vous avez seulement besoin d'une date entraîne des problèmes de fuseau horaire : une date saisie comme le 15 mars dans un environnement UTC+2 peut apparaître comme le 14 mars pour un utilisateur UTC-5.

Utilisez toujours le type de champ le plus simple qui répond à votre besoin commercial réel.

Ne pas tenir compte du fuseau horaire du serveur dans les actions programmées

Lorsque vous construisez des actions programmées ou des rapports qui filtrent sur un champ Date par rapport à "aujourd'hui", sachez que fields.Date.today() renvoie la date du serveur en UTC. Pour la plupart des cas d'utilisation de rapports, cela convient, mais cela peut entraîner des écarts d'un jour pour les équipes dans des fuseaux horaires qui diffèrent considérablement de celui du serveur. Testez les automatisations dépendantes de la date depuis plusieurs fuseaux horaires si votre équipe est répartie à l'échelle mondiale.

Contraintes manquantes sur les paires de plages de dates

Il est courant de voir des implémentations où "Date de début" et "Date de fin" existent en tant que champs séparés mais aucune validation n'assure que la date de fin est après la date de début. Cela permet à des données invalides d'entrer dans le système discrètement, perturbant les calculs de durée, les résultats de filtrage et les rapports. Ajoutez toujours une vérification @api.constrains lorsque deux dates forment une plage logique.

Oublier d'indexer les champs de date utilisés dans les filtres

Les champs de date utilisés dans les vérifications "en retard", les vues "échéances à venir" ou les rapports de solde âgé sont généralement interrogés avec des comparaisons comme "date inférieure à aujourd'hui". Sans index, chaque requête de ce type est un scan complet de la table. Sur des modèles avec un grand nombre d'enregistrements comme les factures, les tâches ou les mouvements de stock, l'absence d'index sur les champs Date ralentit visiblement les opérations quotidiennes au fil du temps.

Stocker des dates en tant que champs Char

Certaines équipes stockent des dates sous forme de chaînes de texte dans des champs Char pour préserver un format personnalisé ou éviter le sélecteur de date. Cela casse complètement le tri, le filtrage, l'arithmétique des dates et les rapports. Utilisez toujours le type fields.Date approprié. Le framework Odoo et la base de données gèrent automatiquement le formatage et la localisation, il n'y a donc aucune raison pratique de stocker des dates sous forme de texte brut.

FAQ


Quelle est la différence entre un champ Date et un champ DateTime dans Odoo?

Un champ Date ne stocke qu'une date calendaire (année, mois, jour) sans composant horaire. Un champ DateTime stocke un horodatage complet incluant les heures, les minutes et les secondes, enregistré en UTC et affiché dans le fuseau horaire local de l'utilisateur. Utilisez Date lorsque l'heure de la journée est sans importance pour le processus commercial. Utilisez DateTime lorsque vous devez suivre exactement quand quelque chose s'est produit.

Comment définir la date d'aujourd'hui comme valeur par défaut pour un champ Date?

En Python, utilisez default=fields.Date.today sans parenthèses. C'est un appelable qu'Odoo évalue au moment de la création de l'enregistrement, donc la valeur par défaut est toujours la date actuelle plutôt qu'une date fixe intégrée lors de la définition de la classe. Dans Odoo Studio, sélectionnez "Aujourd'hui" comme valeur par défaut dans le panneau des propriétés du champ.

Puis-je calculer un champ Date basé sur d'autres valeurs de champ ?

Oui. Définissez le champ avec compute='_compute_my_date' et écrivez une méthode décorée avec @api.depends() listant les champs qui déclenchent la recomputation. À l'intérieur de la méthode, effectuez des calculs de date en utilisant datetime.date ou timedelta de Python. Ajoutez store=True si vous souhaitez que le résultat soit enregistré dans la base de données pour une utilisation dans les filtres de recherche, le regroupement et les exports.

Comment filtrer les enregistrements par une plage de dates dans un domaine Odoo ?

Utilisez des opérateurs de comparaison standard dans le domaine. Par exemple, pour trouver des enregistrements où le champ de date se situe en mars 2026 :

[
    ('x_date_field', '>=', '2026-03-01'),
    ('x_date_field', '<=', '2026-03-31')
]

Les chaînes de date dans les domaines doivent toujours être au format ISO : AAAA-MM-JJ.

Puis-je rendre un champ Date obligatoire uniquement sous certaines conditions ?

Odoo standard n'impose pas de champs requis conditionnels à l'arrière-plan sans code. Vous pouvez utiliser attrs dans le XML de la vue pour signaler visuellement un champ comme requis en fonction d'autres valeurs, mais une véritable application à l'arrière-plan nécessite une contrainte Python utilisant @api.constrains. Pour des cas simples, les règles de visibilité conditionnelle d'Odoo Studio fournissent un substitut pratique sans écrire de code.

Conclusion


Le champ Date est l'un des types de champs les plus pratiques dans le cadre Odoo. Il est simple à comprendre, facile à utiliser et suffisamment puissant pour conduire des logiques commerciales importantes comme les rappels, les vérifications de retard et les rapports sensibles au temps.

Les points clés à retenir : utilisez Date plutôt que DateTime lorsque vous n'avez besoin que d'une date calendaire, comprenez comment les valeurs par défaut et les index améliorent l'utilisabilité et les performances, et ajoutez toujours des contraintes lorsque deux champs de date définissent une plage.

Construire des modèles de données propres et bien conçus dans Odoo commence par de petites décisions comme le choix du bon type de champ. Obtenir cela correctement dès le début est l'un des signes d'une mise en œuvre Odoo solide, et le champ Date est une pièce fondamentale de ce puzzle.

Chez Dasolo, nous aidons les entreprises à mettre en œuvre, personnaliser et optimiser Odoo dans tous les départements et processus d'affaires. Que vous ayez besoin d'aide pour concevoir un modèle de données propre, ajouter des champs et des flux de travail personnalisés, ou construire un module Odoo complet à partir de zéro, notre équipe est là pour vous aider. Contactez-nous et parlons de votre projet Odoo.

Champ de date dans Odoo : Le guide complet
Dasolo 6 mars 2026
Partager cet article
Se connecter pour laisser un commentaire.