Introducción
Si alguna vez has abierto una orden de venta, una tarea de proyecto o una orden de fabricación en Odoo, ya has utilizado un campo de fecha. Fechas límite, fechas de entrega, fechas de vencimiento de facturas, fechas de inicio de contratos: la mayoría de los datos sensibles al tiempo en Odoo se almacenan utilizando este tipo de campo.
Para los usuarios empresariales, los campos de fecha son intuitivos: haces clic, aparece un calendario, eliges una fecha. Pero hay más en juego detrás de escena. Entender cómo funciona el campo de fecha en el modelo de datos de Odoo, cómo se diferencia de los campos de fecha y hora, y cómo crearlo o personalizarlo te ayudará a construir flujos de trabajo más precisos y evitar las sorpresas de zonas horarias que complican muchas implementaciones de Odoo.
Esta guía cubre todo lo que necesitas saber sobre el campo de fecha en Odoo, desde lo que almacena hasta cómo usarlo de manera efectiva en tus procesos empresariales.
¿Qué es el campo de fecha en Odoo?
En el ORM de Odoo, el tipo fields.Date está diseñado para almacenar fechas del calendario sin componente de tiempo. Una fecha como "2026-03-06" se almacena exactamente tal cual, sin horas, minutos o segundos adjuntos.
En PostgreSQL, la base de datos en la que se ejecuta Odoo, un campo de fecha se mapea al tipo de columna DATE. Esto es distinto del campo DateTime, que se mapea a TIMESTAMP e incluye una marca de tiempo completa hasta el segundo.
En la interfaz de usuario, un campo de fecha se presenta como un campo de texto con un selector de calendario. Los usuarios pueden escribir una fecha directamente o hacer clic en el icono del calendario para seleccionar una. En las vistas de lista, aparece como texto formateado alineado con la configuración regional del usuario.
Así es como se ve la definición de un campo de fecha en un módulo de Python personalizado:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_deadline_confirmed = fields.Date(
string='Fecha Límite Confirmada',
help='La fecha límite oficialmente confirmada acordada con el cliente.',
)
En Odoo Studio, este campo simplemente se etiqueta como Fecha. Cuando se crea a través de Studio, recibe automáticamente un prefijo x_studio_. Cuando se crea a través de código Python o la API XML-RPC, eliges el nombre técnico tú mismo.
Cómo funciona el campo
Fecha vs. DateTime: ¿qué cambia realmente?
Lo más importante que hay que entender sobre el campo de fecha es lo que no incluye: tiempo. No hay horas, no hay conversiones de zona horaria, nada más allá de la fecha del calendario en sí.
El campo DateTime, en contraste, almacena una marca de tiempo completa y se guarda en UTC en la base de datos. Odoo luego lo convierte a la zona horaria local del usuario al mostrarlo. Esta es la fuente de muchos confusos errores de "mi fecha se desplazó un día" que los equipos encuentran. Esos son casi siempre problemas de DateTime, no problemas del campo de fecha.
Cuando usas un campo de fecha, lo que almacenas es exactamente lo que los usuarios ven. Un valor de 2026-03-15 es 2026-03-15 para cada usuario, independientemente de dónde se encuentren en el mundo.
Atributos clave del campo
Aquí están las propiedades más importantes que puedes configurar en un campo de Fecha en el marco de Odoo:
- required: Hace que el campo sea obligatorio tanto a nivel de interfaz como de modelo.
- default: Establece un valor predeterminado automático. Por ejemplo,
fields.Date.todaypredetermina la fecha de hoy en nuevos registros. - index: Crea un índice de base de datos para un filtrado y búsqueda más rápidos en ese campo.
- compute: Vincula un método de Python que calcula el valor dinámicamente.
- store: Cuando se combina con
compute, persiste el valor calculado en la base de datos. - readonly: Impide que los usuarios editen el campo directamente en la interfaz.
- copy: Controla si el valor se transfiere al duplicar un registro. Por defecto es
True.
Cómo Aparece en las Vistas
En las vistas de formulario, un campo de Fecha se renderiza como un campo de texto con un popup de calendario. En las vistas de lista, se muestra como texto formateado. En las vistas de búsqueda, admite filtros de rango de fechas de forma predeterminada: "esta semana", "este mes", "este trimestre", así como operadores de comparación exactos como antes, después y en una fecha específica.
El formato de visualización sigue la configuración de idioma del usuario en Odoo. Un usuario estadounidense ve MM/DD/YYYY mientras que un usuario europeo ve DD/MM/YYYY. El valor almacenado subyacente siempre está en formato ISO (YYYY-MM-DD), independientemente de cómo aparezca en pantalla.
Interacción con el ORM de Odoo
Al leer un campo de Fecha en el código, el ORM de Odoo devuelve un objeto datetime.date de Python, o False si el campo está vacío. Al escribir a través del ORM, puedes pasar ya sea un objeto datetime.date o una cadena en formato "YYYY-MM-DD". A través de la API XML-RPC, las fechas siempre se envían y reciben como cadenas.
No hay transformaciones complejas involucradas al trabajar con campos de Fecha en el modelo de datos de Odoo. El marco maneja el formato y el almacenamiento automáticamente, lo que es parte de lo que hace que este tipo de campo sea tan práctico para el uso diario en el desarrollo de Odoo.
Casos de uso empresarial
El campo de Fecha aparece en casi todas las partes de una implementación de Odoo. Aquí hay cinco ejemplos prácticos de flujos de trabajo empresariales reales.
CRM: Fechas de Inicio y Fin de Contratos
En los equipos de ventas que utilizan Odoo CRM, los contratos a menudo tienen fechas de inicio y fin definidas. Un campo de Fecha en el lead o en un modelo de contrato personalizado facilita el seguimiento de cuándo se activan los acuerdos y cuándo expiran.
Combinado con acciones automatizadas, puedes activar recordatorios por correo electrónico o cambios de estado cuando un contrato se acerca a su fecha de finalización, sin necesidad de seguimiento manual por parte del equipo. Este tipo de automatización es fácil de configurar y ahorra muchas renovaciones perdidas con el tiempo.
Ventas: Fechas de Entrega Solicitadas
Los clientes a menudo solicitan una fecha de entrega específica al realizar pedidos. Muchas empresas añaden un campo de Fecha "Fecha Solicitada por el Cliente" en los pedidos de venta para dar al equipo de operaciones una fecha objetivo clara para planificar.
Usar un campo de Fecha en lugar de DateTime mantiene los datos simples y evita confusiones de zona horaria durante la coordinación del almacén. El equipo de almacén ve la misma fecha que el equipo de ventas ingresó, sin riesgo de problemas de conversión.
Inventario: Fechas de Caducidad en Lotes
En las industrias alimentaria, farmacéutica y química, los lotes de productos necesitan fechas de caducidad rastreadas a nivel de almacén. La gestión de lotes de Odoo utiliza campos de Fecha para almacenar fechas de caducidad y de consumo preferente en stock.lot.
Estos impulsan estrategias de picking FEFO (Primero en Caducar, Primero en Salir) y alertas automatizadas cuando el stock se acerca a la fecha de caducidad, protegiendo tanto el cumplimiento normativo como la calidad del producto sin requerir verificaciones manuales.
Contabilidad: Fechas de Vencimiento de Facturas
Las fechas de vencimiento de las facturas en Odoo son campos de Fecha. Determinan cuándo se envían los recordatorios de pago automáticos, cómo se identifican las facturas vencidas y cómo se calculan los informes de cuentas por pagar y por cobrar.
Obtener estas fechas correctamente es uno de los usos operativos más importantes del campo Fecha en todo el modelo de datos de Odoo. Una fecha de vencimiento incorrecta rompe silenciosamente el seguimiento del flujo de efectivo y la automatización del seguimiento.
RRHH: Fechas de Incorporación, Contrato y Certificación
Los equipos de RRHH dependen en gran medida de los campos de Fecha para las fechas de contratación, fechas de finalización de la prueba, fechas de inicio y finalización de contratos, y fechas de caducidad de certificaciones. Estos valores alimentan correos electrónicos automáticos, alertas y reglas de cálculo de nómina.
Un módulo de RRHH bien diseñado en Odoo es imposible sin datos limpios y precisos del campo Fecha en los registros de empleados. Estas fechas son a menudo los desencadenantes de algunas de las automatizaciones más críticas para el negocio en una configuración de Odoo.
Crear o Personalizar el Campo Fecha
Hay tres maneras principales de agregar un campo Fecha a un modelo de Odoo, dependiendo de tu configuración técnica y enfoque de implementación.
Usando Odoo Studio (Sin Código)
Odoo Studio es la forma más sencilla de agregar un campo Fecha sin escribir ningún código. Este es el enfoque recomendado para usuarios de negocios y consultores que desean agregar seguimiento de fechas a formularios estándar de Odoo rápidamente:
- Abre Odoo Studio desde el menú principal.
- Navega al formulario donde deseas el campo.
- Arrastra un campo de Fecha desde la barra lateral al formulario.
- Establece la etiqueta, el estado requerido y un valor predeterminado si es necesario.
- Guarda y cierra Studio.
Studio crea el campo con un prefijo x_studio_ y lo añade a la vista del formulario de inmediato. No se necesita migración de base de datos de tu parte.
Usando Python en un Módulo Personalizado
Para los desarrolladores que construyen módulos de Odoo, los campos de Fecha se definen en archivos de modelo de Python. Este es el enfoque correcto para cualquier personalización que necesite ser controlada por versiones y desplegada en múltiples entornos:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_customer_requested_date = fields.Date(
string='Fecha Solicitada por el Cliente',
index=True,
copy=False,
help='Fecha de entrega solicitada por el cliente en el momento del pedido.',
)
Después de añadir el campo al modelo, también necesitas añadirlo al archivo XML de vista relevante para que aparezca en la interfaz. Odoo se encarga de la creación de la columna de base de datos cuando instalas o actualizas el módulo.
Usando la API XML-RPC
Para la creación programática de campos como parte de un pipeline de despliegue o un cuaderno de configuración remota, puedes crear campos de Fecha a través de la API XML-RPC de Odoo:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_customer_requested_date',
'field_description': 'Fecha Solicitada por el Cliente',
'model_id': model_id,
'ttype': 'date',
'state': 'manual',
}]
)
El valor ttype para un campo de Fecha es 'date'. Para un campo de Fecha y Hora sería 'datetime'. Usar 'manual' como estado le indica a Odoo que este campo fue creado manualmente, no por la instalación de un módulo. Así es como Dasolo gestiona la creación remota de campos para clientes como parte de scripts de configuración automatizados.
Mejores prácticas
1. Usa Fecha, no FechaHora, cuando el tiempo no es relevante
Si lo único que importa es la fecha del calendario (una fecha límite, una fecha de contrato, una fecha de nacimiento, una fecha de expiración), usa fields.Date. Elegir FechaHora para datos puramente basados en la fecha añade complejidad de zona horaria sin ningún beneficio práctico, y puede causar confusos errores de un día de diferencia dependiendo de la configuración de la zona horaria del servidor.
2. Establece un valor predeterminado significativo cuando tenga sentido
Para campos como "Fecha de Entrega Esperada" o "Fecha de Seguimiento", establecer como predeterminado hoy o hoy más un número de días proporciona a los usuarios un punto de partida sensato. Usa default=fields.Date.today sin paréntesis para un valor predeterminado dinámico que se evalúa en el momento de la creación del registro, no en el momento de la definición de la clase.
3. Indexa los campos de fecha utilizados en informes y filtros de búsqueda
Si tus usuarios filtran regularmente registros por un campo de fecha (facturas vencidas, renovaciones próximas, certificaciones que expiran), añade index=True. En conjuntos de datos grandes, esto mejora drásticamente el rendimiento de los filtros y los informes. Es un pequeño cambio con un impacto significativo a gran escala y cuesta casi nada implementar por adelantado.
4. Usa copy=False para fechas que no deben trasladarse
Fechas como "Fecha de Inicio del Contrato" o "Fecha de Expiración" no deben copiarse cuando un usuario duplica un registro. Añadir copy=False obliga al usuario a establecer la fecha explícitamente en el nuevo registro, evitando errores silenciosos donde una fecha desactualizada persiste en un contrato o tarea de proyecto duplicada.
5. Añade restricciones cuando dos campos de fecha formen un rango
Siempre que un modelo tenga un par de "Fecha de Inicio" y "Fecha de Fin", añade una restricción de Python usando @api.constrains para asegurar que la fecha de fin no sea anterior a la fecha de inicio. Esto es sencillo de implementar y previene toda una categoría de problemas de calidad de datos que son molestos de diagnosticar después del hecho.
Errores comunes
Campos de Fecha y FechaHora confusos
Este es el error más frecuente al trabajar con datos sensibles al tiempo en Odoo. FechaHora almacena una marca de tiempo completa en UTC y convierte al mostrar. Fecha almacena solo la fecha del calendario sin conversión. Usar FechaHora cuando solo necesitas una fecha conduce a problemas de zona horaria: una fecha ingresada como 15 de marzo en un entorno UTC+2 puede aparecer como 14 de marzo para un usuario UTC-5.
Siempre utiliza el tipo de campo más simple que satisfaga tu necesidad empresarial real.
No tener en cuenta la zona horaria del servidor en acciones programadas
Al construir acciones programadas o informes que filtren en un campo de Fecha en relación con "hoy", ten en cuenta que fields.Date.today() devuelve la fecha del servidor en UTC. Para la mayoría de los casos de uso de informes, esto está bien, pero puede causar discrepancias de un día para equipos en zonas horarias que difieren significativamente del servidor. Prueba las automatizaciones dependientes de la fecha desde múltiples zonas horarias si tu equipo está distribuido globalmente.
Faltan restricciones en pares de rangos de fechas
Es común ver implementaciones donde "Fecha de Inicio" y "Fecha de Fin" existen como campos separados, pero no hay validación que asegure que la fecha de fin sea posterior a la fecha de inicio. Esto permite que datos inválidos ingresen al sistema silenciosamente, rompiendo cálculos de duración, resultados de filtros e informes. Siempre añade una verificación @api.constrains cuando dos fechas formen un rango lógico.
Olvidar indexar campos de fecha utilizados en filtros
Los campos de fecha utilizados en verificaciones de "vencidos", vistas de "plazos próximos" o informes de saldo envejecido se consultan típicamente con comparaciones como "fecha menor que hoy". Sin un índice, cada consulta de este tipo es un escaneo completo de la tabla. En modelos con grandes cantidades de registros como facturas, tareas o movimientos de stock, la falta de índices en campos de Fecha ralentiza notablemente las operaciones diarias con el tiempo.
Almacenar fechas como campos Char
Algunos equipos almacenan fechas como cadenas de texto en campos Char para preservar un formato personalizado o evitar el selector de fechas. Esto rompe completamente la clasificación, filtrado, aritmética de fechas e informes. Siempre utiliza el tipo adecuado fields.Date. El marco y la base de datos de Odoo manejan automáticamente el formato y la localización, por lo que no hay razón práctica para almacenar fechas como texto plano.
Preguntas frecuentes
¿Cuál es la diferencia entre un campo de Fecha y un campo de FechaHora en Odoo?
Un campo de Fecha almacena solo una fecha del calendario (año, mes, día) sin componente de tiempo. Un campo de FechaHora almacena una marca de tiempo completa que incluye horas, minutos y segundos, guardada en UTC y mostrada en la zona horaria local del usuario. Usa Fecha cuando la hora del día no sea relevante para el proceso empresarial. Usa FechaHora cuando necesites rastrear exactamente cuándo ocurrió algo.
¿Cómo establezco la fecha de hoy como predeterminada para un campo de Fecha?
En Python, usa default=fields.Date.today sin paréntesis. Este es un callable que Odoo evalúa en el momento de la creación del registro, por lo que el valor predeterminado siempre es la fecha actual en lugar de una fecha fija establecida en la definición de la clase. En Odoo Studio, selecciona "Hoy" como el valor predeterminado en el panel de propiedades del campo.
¿Puedo calcular un campo de fecha basado en otros valores de campo?
Sí. Define el campo con compute='_compute_my_date' y escribe un método decorado con @api.depends() que enumere los campos que desencadenan la recomputación. Dentro del método, realiza cálculos de fecha utilizando datetime.date o timedelta de Python. Agrega store=True si deseas que el resultado se guarde en la base de datos para su uso en filtros de búsqueda, agrupaciones y exportaciones.
¿Cómo filtro registros por un rango de fechas en un dominio de Odoo?
Utiliza operadores de comparación estándar en el dominio. Por ejemplo, para encontrar registros donde el campo de fecha esté en marzo de 2026:
[
('x_date_field', '>=', '2026-03-01'),
('x_date_field', '<=', '2026-03-31')
]
Las cadenas de fecha en los dominios siempre deben estar en formato ISO: AAAA-MM-DD.
¿Puedo hacer que un campo de fecha sea obligatorio solo bajo ciertas condiciones?
El Odoo estándar no impone campos requeridos condicionales en el backend sin código. Puedes usar attrs en XML de vista para marcar visualmente un campo como requerido basado en otros valores, pero la verdadera imposición en el backend necesita una restricción de Python usando @api.constrains. Para casos simples, las reglas de visibilidad condicional de Odoo Studio proporcionan un sustituto práctico sin necesidad de escribir código.
Conclusión
El campo de fecha es uno de los tipos de campo más prácticos en el marco de Odoo. Es simple de entender, fácil de usar y lo suficientemente potente como para impulsar lógica empresarial importante como recordatorios, verificaciones de vencimiento e informes sensibles al tiempo.
Las cosas clave a tener en cuenta: usa Fecha en lugar de FechaHora cuando solo necesites una fecha del calendario, entiende cómo los valores predeterminados y los índices mejoran la usabilidad y el rendimiento, y siempre agrega restricciones cuando dos campos de fecha definan un rango.
Construir modelos de datos limpios y bien diseñados en Odoo comienza con pequeñas decisiones como elegir el tipo de campo correcto. Acertar en esas decisiones desde el principio es uno de los sellos distintivos de una implementación sólida de Odoo, y el campo de fecha es una pieza fundamental de ese rompecabezas.
En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo en todos los departamentos y procesos de negocio. Ya sea que necesite ayuda para diseñar un modelo de datos limpio, agregar campos y flujos de trabajo personalizados, o construir un módulo completo de Odoo desde cero, nuestro equipo está aquí para ayudar. Póngase en contacto con nosotros y hablemos sobre su proyecto de Odoo.