Se rendre au contenu

Champ Date dans Odoo : Guide Complet et Pratique

Guide complet sur le champ Date dans le modèle de données Odoo : usage courant, bonnes pratiques et personnalisation technique
6 mars 2026 par
Champ Date dans Odoo : Guide Complet et Pratique
Dasolo
| Aucun commentaire pour l'instant

Introduction


Si vous avez déjà ouvert une commande de vente, une tâche de projet ou un ordre de fabrication dans Odoo, vous avez manipulé un champ Date sans forcément y prêter attention. Toutes les dates sensibles au calendrier — dates de livraison, échéances de factures, début de contrats — reposent généralement sur ce type de champ.

Pour l’utilisateur, le champ Date est simple : on clique, on choisit une date dans le calendrier. Mais côté modèle de données, il y a des différences techniques importantes par rapport aux champs horodatés. Comprendre ce que stocke réellement un champ Date, comment il se distingue d’un DateTime et comment le configurer évite des erreurs liées aux fuseaux horaires et permet des processus plus fiables.

Ce guide rassemble l’essentiel à connaître sur le champ Date dans Odoo : ce qu’il contient, comment l’utiliser au quotidien et comment l’intégrer proprement dans vos processus métier.

Définition du champ Date dans Odoo


Dans l’ORM d’Odoo, un champ de type fields.Date sert uniquement à conserver une date civile : année, mois, jour. Il n’y a pas d’heure ni de secondes attachées ; la valeur représente strictement le jour du calendrier.

Au niveau base de données PostgreSQL, ce champ correspond à une colonne de type DATE, distincte d’un champ DateTime qui, lui, mappe vers TIMESTAMP et contient l’ensemble du repère temporel.

Dans l’interface, le champ Date s’affiche comme un champ texte avec un sélecteur de calendrier. Les utilisateurs peuvent saisir la date à la main ou la sélectionner via le picker ; en vue liste elle apparaît formatée selon la langue et les habitudes locales.

Exemple de définition dans un module personnalisé

from odoo import fields, models

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

    x_deadline_confirmed = fields.Date(
        string='Confirmed Deadline',
        help='The officially confirmed deadline agreed with the customer.',
    )

Dans Odoo Studio, ce champ est présenté sous l’appellation Date et reçoit automatiquement un préfixe x_studio_ lorsqu’il est créé via l’interface. En Python ou via API, vous choisissez vous-même le nom technique du champ.

Comment fonctionne ce champ


Date vs DateTime : où se situent les différences

L’élément essentiel à retenir est ce que le champ Date n’inclut pas : aucune information d’heure ni conversion liée aux fuseaux horaires. C’est uniquement une date de calendrier.

Un champ DateTime, en revanche, enregistre un instant précis (heure, minute, seconde) généralement sauvegardé en UTC puis converti selon le fuseau de l’utilisateur à l’affichage — source fréquente d’écarts d’un jour perçus comme des « décalages ».

Avec un champ Date, la valeur enregistrée est la même pour tous les utilisateurs : 2026-03-15 restera 2026-03-15 quels que soient leur lieu ou leur fuseau horaire.

Attributs clés du champ

Voici les propriétés principales que vous pouvez configurer pour un champ Date dans Odoo :

  • required : rend le champ obligatoire au niveau UI et modèle.
  • default : définit une valeur par défaut automatique, par exemple fields.Date.today pour la date du jour lors de la création.
  • index : crée un index en base pour accélérer les filtres et recherches sur ce champ.
  • compute : lie une méthode Python qui calcule dynamiquement la valeur.
  • store : avec compute, permet de persister le résultat en base.
  • readonly : empêche la modification côté interface.
  • copy : contrôle si la valeur est dupliquée lors de la copie d’un enregistrement (True par défaut).

Affichage dans les vues

En vue formulaire, le champ Date propose un popup calendrier ; en liste il s’affiche formaté ; en vue recherche il offre des filtres de période prêts à l’emploi (cette semaine, ce mois, ce trimestre) ainsi que des opérateurs de comparaison (avant, après, exact).

Le format d’affichage dépend des paramètres de langue de l’utilisateur (par ex. MM/JJ/AAAA vs JJ/MM/AAAA), tandis que la valeur réellement stockée reste au format ISO (YYYY-MM-DD).

Interaction avec l’ORM Odoo

Lorsque vous lisez un champ Date par code, l’ORM renvoie un objet Python datetime.date, ou False s’il est vide. Pour écrire, vous pouvez fournir un datetime.date ou une chaîne au format "YYYY-MM-DD". Via XML-RPC, les dates transitent sous forme de chaînes.

Il n’y a pas de transformations complexes à gérer : Odoo s’occupe du stockage et du formatage, d’où la praticité de ce type pour la majorité des usages métier.

Cas d’usage en entreprise


Où le champ Date est utile : cinq exemples concrets

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

Dans l’équipe commerciale, on enregistre souvent les dates de début et de fin de contrat pour suivre la période de couverture d’un accord. Un champ Date sur le lead ou sur un modèle de contrat permet ce suivi simple et lisible.

Associé à des actions automatisées, ce champ permet d’envoyer des rappels avant la fin de contrat ou de changer des statuts automatiquement, évitant ainsi des renouvellements manqués.

Ventes : dates demandées de livraison

Les clients indiquent fréquemment une date de livraison souhaitée lors de la commande. Ajouter un champ Date « date demandée » sur la commande fournit une cible claire pour la planification opérationnelle.

Utiliser Date plutôt que DateTime simplifie la coordination entre services (ventes, entrepôt) et évite des confusions liées aux fuseaux horaires : tout le monde voit la même date.

Stocks : dates de péremption sur les lots

Pour les secteurs alimentaire, pharmaceutique ou chimique, les lots nécessitent des dates de péremption. Odoo stocke ces informations avec des champs Date sur les stock.lot.

Ces dates alimentent des stratégies FEFO (First Expired, First Out) et déclenchent des alertes automatiques quand des stocks approchent de leur expiration, préservant la qualité et la conformité.

Comptabilité : dates d’échéance des factures

Les dates d’échéance des factures sont gérées comme des champs Date. Elles pilotent l’envoi d’avertissements automatiques, l’identification des factures en retard et le calcul des rapports d’échéance.

Une mauvaise date d’échéance peut casser silencieusement le suivi des encaissements et les automatisations de relance : c’est un des usages les plus sensibles du champ Date.

RH : embauche, contrats et certifications

Les équipes RH s’appuient sur des champs Date pour les dates d’embauche, fin de période d’essai, durée des contrats et expiration de certifications. Ces dates alimentent des emails automatiques, des alertes et des règles de paie.

Un module RH fiable repose sur des dates propres et cohérentes au niveau des fiches salariés : ce sont souvent ces champs qui déclenchent des processus critiques pour l’entreprise.

Créer ou personnaliser un champ Date


Selon votre contexte, il existe trois façons principales d’ajouter un champ Date à un modèle Odoo : via Studio, en code Python dans un module, ou via l’API XML-RPC.

Par Odoo Studio (sans code)

Odoo Studio est la méthode la plus accessible pour ajouter un champ Date sans toucher au code ; idéale pour les consultants ou utilisateurs métiers qui veulent enrichir rapidement un formulaire :

  1. Ouvrez Odoo Studio depuis le menu principal.
  2. Allez au formulaire à modifier.
  3. Glissez un champ Date depuis la barre latérale sur le formulaire.
  4. Définissez le libellé, le statut obligatoire et éventuellement une valeur par défaut.
  5. Sauvegardez et fermez Studio.

Studio crée le champ avec le préfixe x_studio_ et l’ajoute immédiatement à la vue, sans nécessiter de migration manuelle de votre part.

En Python dans un module personnalisé

Pour les développeurs et pour les besoins versionnés et déployables, on définit le champ dans un fichier modèle Python. C’est la bonne pratique pour les personnalisations durables :

from odoo import fields, models

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

    x_customer_requested_date = fields.Date(
        string='Customer Requested Date',
        index=True,
        copy=False,
        help='Delivery date requested by the customer at time of order.',
    )

Après avoir ajouté le champ au modèle, n’oubliez pas de le référencer dans le XML de la vue pour qu’il soit visible en interface. L’installation ou la mise à jour du module créera la colonne en base automatiquement.

Via l’API XML-RPC

Pour des créations programmées dans des scripts d’automatisation ou des pipelines de déploiement, il est possible de créer des champs via XML-RPC :

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_customer_requested_date',
        'field_description': 'Customer Requested Date',
        'model_id': model_id,
        'ttype': 'date',
        'state': 'manual',
    }]
)

Le paramètre ttype prend la valeur 'date' pour un champ Date (contre 'datetime' pour DateTime). Un state manuellement défini signale que le champ a été créé sans module — pratique pour des scripts de configuration à distance.

Bonnes pratiques


Règles pratiques à retenir

1. Choisissez Date, pas DateTime, quand l’heure n’a pas d’importance. Prendre DateTime pour une date pure ajoute une complexité inutile liée aux fuseaux et provoque souvent des erreurs d’un jour.

2. Donnez une valeur par défaut pertinente. Pour des dates comme « date de livraison prévue », mettre la valeur par défaut à aujourd’hui ou aujourd’hui + n jours donne un point de départ logique. En Python, utilisez default=fields.Date.today (sans parenthèses) pour que la date soit évaluée lors de la création du record.

3. Indexez les champs utilisés en rapports ou filtres. Si vous filtrez fréquemment sur un champ Date (factures échues, renouvellements à venir), index=True améliore fortement les performances sur de gros volumes.

4. Mettez copy=False pour les dates qui ne doivent pas être dupliquées. Les dates de début de contrat ou de péremption ne doivent pas être recopiées automatiquement lors d’une duplication d’enregistrement.

5. Ajoutez des contraintes pour les paires date de début/fin. Quand deux champs forment une plage, imposez une vérification backend (@api.constrains) afin d’empêcher une date de fin antérieure à la date de début.

Pièges fréquents à éviter

Confondre Date et DateTime

La confusion entre Date et DateTime est la source la plus commune de bugs temporels. DateTime stocke en UTC et convertit à l’affichage ; Date ne fait aucune conversion. Utiliser DateTime pour une simple date peut faire apparaître la journée précédente ailleurs dans le monde.

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

Pièges courants


Attention : fields.Date.today() renvoie la date du serveur en UTC. Pour la plupart des rapports, cela convient, mais sur des équipes très dispersées, des différences d’un jour peuvent apparaître. Testez vos automatisations dépendantes de la date depuis plusieurs fuseaux si nécessaire.

Absence de validations sur les paires de dates

Des « Start Date » et « End Date » sans contrainte permettent l’entrée de données incohérentes qui cassent les calculs de durée et les rapports. Ajoutez toujours une contrainte pour ce type de paire.

Oublier d’indexer les dates utilisées en filtres

Les filtres sur des dates non indexées impliquent des scans complets de table. Sur des modèles volumineux (factures, tâches, mouvements), l’absence d’index ralentit notablement le quotidien.

Stocker des dates en tant que Char

Enregistrer des dates sous forme de texte casse complètement le tri, les filtres, les calculs et les exports. Utilisez toujours fields.Date : Odoo et PostgreSQL gèrent le formatage et la localisation.

FAQ (questions fréquentes)

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

Un champ Date retient uniquement la date civile (année, mois, jour). Un DateTime enregistre un instant précis avec heures/minutes/secondes, sauvegardé en UTC et converti selon le fuseau utilisateur à l’affichage. Choisissez Date quand l’heure n’est pas pertinente, DateTime quand il faut tracer le moment exact d’un événement.

Comment définir la date du jour comme valeur par défaut ?

FAQ


En Python, utilisez default=fields.Date.today (sans parenthèses) pour que la date par défaut soit calculée à la création du record. Dans Studio, sélectionnez « Today » comme valeur par défaut dans les propriétés du champ.

Peut-on calculer un champ Date à partir d’autres champs ?

Oui. Déclarez le champ avec compute='_compute_my_date', utilisez @api.depends() sur les champs déclencheurs et calculez avec datetime.date ou timedelta. Ajoutez store=True si vous souhaitez indexer ou filtrer le résultat en base.

Comment filtrer par plage de dates dans un domaine Odoo ?

Utilisez des opérateurs de comparaison standards. Par exemple, pour les enregistrements 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 utiliser le format ISO : YYYY-MM-DD.

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

Le backend Odoo n’applique pas de conditionnalité "required" sans code. Vous pouvez utiliser attrs dans le XML pour l’affichage conditionnel dans la vue, mais pour une enforcement réel il faut une contrainte Python (@api.constrains). Pour des cas simples, les règles de visibilité/obligation de Studio sont souvent suffisantes sans coder.

Synthèse

Le champ Date est un des types les plus utiles et les plus simples d’Odoo : il stocke une date civile sans complexité temporelle, sert de base à des rappels, relances et calculs métier, et s’intègre facilement aux vues et recherches.

Points clés à retenir : privilégiez Date plutôt que DateTime quand l’heure n’apporte rien, définissez des valeurs par défaut pertinentes, indexez les champs utilisés dans les rapports et ajoutez des contraintes pour les plages de dates.

Conclusion


Bien concevoir votre modèle de données commence par des choix simples mais décisifs, comme le bon type de champ. Des décisions correctes dès la phase de design facilitent grandement la maintenance et la fiabilité d’une implémentation Odoo.

Nos services

Chez Dasolo, nous accompagnons les entreprises pour implémenter, personnaliser et optimiser Odoo dans tous les départements. Que vous ayez besoin d’aide pour structurer vos données, ajouter des champs et workflows ou développer un module complet, notre équipe peut vous assister.

Contactez-nous parlez-nous de votre projet Odoo. Nous sommes disponibles pour étudier votre besoin et proposer une solution adaptée.

Champ Date dans Odoo : Guide Complet et Pratique
Dasolo 6 mars 2026
Partager cet article
Se connecter pour laisser un commentaire.