Introducción
Las fechas y las marcas de tiempo están integradas en casi todos los procesos empresariales. ¿Cuándo se realizó este pedido? ¿Cuándo está programada la entrega? ¿Cuándo se registró el empleado? En Odoo, el campo Datetime es la forma estándar de capturar y almacenar este tipo de información.
A diferencia del campo Fecha, que solo almacena una fecha del calendario, el campo Datetime captura tanto la fecha como la hora exacta. Esta distinción es más importante de lo que parece, especialmente en entornos con usuarios en múltiples zonas horarias o al rastrear eventos a nivel de hora y minuto.
Esta guía cubre todo lo que necesitas saber sobre el campo Datetime en Odoo: qué almacena, cómo se comporta en el modelo de datos, cómo crearlo y configurarlo utilizando Odoo Studio o Python, y ejemplos prácticos de flujos de trabajo empresariales reales.
¿Qué es el campo Datetime en Odoo?
En el ORM de Odoo, fields.Datetime almacena un valor combinado de fecha y hora, hasta el segundo. A nivel de base de datos, se mapea a una columna TIMESTAMP en PostgreSQL. Odoo siempre almacena los valores Datetime en UTC internamente y los convierte a la zona horaria local del usuario activo al mostrarlos en la interfaz.
Desde la perspectiva del usuario, un campo Datetime aparece como un selector combinado de fecha y hora en los formularios. Muestra un widget de calendario junto a una entrada de tiempo. En vistas de lista e informes, el valor se formatea de acuerdo con la configuración de idioma y zona horaria del usuario activo.
Así es como se ve un campo Datetime en una definición de modelo de Python:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_confirmed_on = fields.Datetime(
string='Confirmed On',
default=fields.Datetime.now,
readonly=True,
copy=False,
)
El parámetro string establece la etiqueta que se muestra en la interfaz. El parámetro default llena automáticamente el campo con la marca de tiempo actual cuando se crea un nuevo registro. El parámetro readonly impide la edición manual, lo cual es común para las marcas de tiempo de auditoría.
En Odoo Studio, este tipo de campo se llama campo Fecha y Hora. Cuando se crea a través de Studio, recibe automáticamente un prefijo x_studio_. Cuando se crea a través de código o la API XML-RPC, defines el nombre técnico tú mismo.
Cómo funciona el campo
Cuando defines un campo Datetime en Odoo, el marco crea automáticamente la columna de base de datos correspondiente durante la instalación o actualización del módulo. No es necesario escribir migraciones SQL a mano.
Una cosa que sorprende a muchos desarrolladores y usuarios de negocios es cómo Odoo maneja las zonas horarias. La base de datos siempre almacena el valor en UTC. Cuando un usuario en París establece una hora de reunión a las 3:00 PM, Odoo guarda 1:00 PM UTC en la base de datos. Un usuario en Nueva York que lea el mismo registro verá las 9:00 AM en su interfaz. El ORM de Odoo maneja esta conversión de manera transparente según la zona horaria configurada en el perfil de cada usuario.
Atributos Clave del Campo
Aquí están las propiedades más importantes de un campo Datetime en el marco de Odoo:
- default: A menudo se establece en
fields.Datetime.nowpara rellenar automáticamente con la marca de tiempo UTC actual cuando se crea un registro. - required: Hace que el campo sea obligatorio en los formularios y a nivel de modelo.
- readonly: Previene la edición manual en la interfaz. Común para marcas de tiempo generadas automáticamente.
- compute: Vincula un método de Python que calcula el valor del campo dinámicamente a partir de otros campos o lógica empresarial.
- store: Cuando se combina con
compute, persiste el valor calculado en la base de datos para su uso en búsquedas e informes. - copy: Controla si el valor se duplica al copiar un registro. Por defecto es
True. Establezca enFalsepara marcas de tiempo que no deben trasladarse a duplicados. - index: Crea un índice en la base de datos. Útil en campos que se utilizan con frecuencia en filtros, como fechas programadas en tablas grandes.
Cómo Aparece en las Vistas
En las vistas de formulario, un campo Datetime se presenta como un selector de fecha y hora combinado. Los usuarios hacen clic para abrir un calendario y establecer la hora directamente en la misma entrada. En las vistas de lista, el valor aparece como una cadena formateada según la configuración de idioma del usuario. En las vistas de búsqueda, los campos Datetime admiten filtros de rango de fechas como antes, después y entre un período específico.
También puede emparejar un campo Datetime con el widget date_range para mostrar una selección de rango directamente en el formulario, lo cual es útil para programar ventanas y tareas con límite de tiempo.
Datetime vs Fecha: Elegir el Campo Correcto
Una pregunta común en el desarrollo de Odoo es cuándo usar fields.Datetime frente a fields.Date. La regla es sencilla: use fields.Date cuando la hora del día no sea relevante, y fields.Datetime cuando necesite precisión a nivel de hora o minuto.
Use Fecha para: fechas de vencimiento de facturas, cumpleaños, fechas de caducidad de productos, fechas de renovación de contratos.
Use Datetime para: marcas de tiempo de confirmación de pedidos, horas de inicio de reuniones, registros de asistencia de empleados, operaciones de almacén programadas.
Usar Datetime innecesariamente añade complejidad de zona horaria sin ningún beneficio real. Cuando tenga dudas, pregúntese si la hora del día realmente importa para el proceso empresarial que está modelando.
Casos de uso empresarial
El campo Datetime aparece en casi todos los módulos de Odoo. Aquí hay cinco ejemplos prácticos de flujos de trabajo empresariales reales.
CRM: Seguimiento de Actividades de Leads
En el módulo CRM, varios campos Datetime nativos rastrean cuándo ocurrieron eventos clave. El campo date_open registra cuándo un lead se estableció como En Progreso. El campo date_deadline programa un seguimiento. Los gerentes de ventas utilizan estos campos para medir los tiempos de respuesta, identificar oportunidades estancadas e informar sobre la actividad del equipo. Los campos Datetime personalizados pueden extender esto aún más, por ejemplo, para registrar cuándo se envió una cotización o cuándo tuvo lugar una llamada específica.
Ventas: Tiempos de Confirmación de Pedidos
El campo date_order en sale.order es un campo Datetime. Captura el momento exacto en que se confirmó una venta. Esto es valioso para informar sobre la actividad de ventas diaria o por hora, calcular cuánto tiempo tardan los pedidos en procesarse y auditar los cambios realizados después de la confirmación. Filtrar los pedidos de venta por este campo es una de las operaciones de informes más comunes en cualquier configuración de ventas de Odoo.
Inventario: Fechas de Transferencia Programadas
El campo scheduled_date en stock.picking es un campo Datetime que los equipos de almacén utilizan para planificar cuándo debe tener lugar una recepción o envío. Las acciones automatizadas en Odoo pueden activar flujos de trabajo basados en cómo esta fecha se compara con el tiempo actual. Por ejemplo, se puede enviar un correo electrónico automatizado cuando una entrega ha estado retrasada durante un cierto número de horas, lo que permite una comunicación proactiva con los clientes antes de que se pongan en contacto.
Manufactura: Tiempos de Inicio y Fin de Producción
Los pedidos de fabricación utilizan campos Datetime para registrar cuándo comenzó la producción y cuándo se completó. Estos datos se alimentan directamente en la planificación de capacidad, informes de eficiencia y análisis de rendimiento. Para las empresas que operan múltiples turnos, capturar el tiempo preciso es esencial para comprender la producción real frente a la planificada e identificar cuellos de botella por hora del día o por operador.
RRHH: Gestión de Asistencia y Licencias
El módulo de Asistencia de RRHH utiliza campos Datetime para registrar los tiempos de entrada y salida de los empleados. Las solicitudes de licencia dependen de Datetime para definir el inicio y el final exactos de una ausencia. Los cálculos de nómina y las reglas de horas extra a menudo dependen de que estos valores sean precisos hasta el minuto. Cualquier desviación o marca de tiempo faltante en los registros de asistencia puede afectar directamente los cálculos de compensación, convirtiendo la precisión aquí en un requisito empresarial real en lugar de una preferencia técnica.
Creando o personalizando el campo Datetime
Hay tres formas principales de agregar un campo Datetime a un modelo de Odoo, dependiendo de tu configuración técnica y si prefieres un enfoque sin código o de desarrollador.
Usando Odoo Studio (Sin Código)
Odoo Studio es la herramienta de personalización integrada que te permite agregar campos sin escribir ningún código. Para agregar un campo de Fecha y Hora a través de Studio:
- Abre Odoo Studio desde el menú principal.
- Navega hasta el formulario donde deseas agregar el campo.
- Arrastra un campo Fecha y Hora desde la barra lateral al formulario.
- Establece la etiqueta, el estado requerido y opcionalmente un valor predeterminado en el panel de propiedades del campo.
- Guarda y cierra Studio.
Studio crea automáticamente el campo con un prefijo x_studio_ y lo agrega a la vista del formulario. No se necesita migración de base de datos de tu parte. Odoo maneja todo eso automáticamente cuando guardas. Este es el enfoque recomendado para los usuarios empresariales que necesitan agregar una marca de tiempo a un formulario existente sin la intervención de un desarrollador.
Usando Python en un Módulo Personalizado
Para los desarrolladores que construyen módulos de Odoo, los campos de Fecha y Hora se definen en archivos de modelo de Python. Este es el enfoque recomendado para cualquier personalización que necesite ser controlada por versiones y desplegada en múltiples entornos:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_last_contact_date = fields.Datetime(
string='Fecha del Último Contacto',
default=fields.Datetime.now,
copy=False,
)
Después de definir el campo en el modelo, agrégalo al archivo XML de vista relevante para que aparezca en la interfaz. Odoo crea automáticamente la columna TIMESTAMP cuando instalas o actualizas el módulo. No se necesita SQL manual.
Uso de la API XML-RPC
Si gestionas personalizaciones de Odoo de forma programática, por ejemplo, como parte de un pipeline de despliegue o un script de configuración remota, puedes crear campos de fecha y hora a través de la API XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_last_contact_date',
'field_description': 'Fecha del Último Contacto',
'model_id': model_id,
'ttype': 'datetime',
'state': 'manual',
}]
)
El valor ttype: datetime indica a Odoo que cree un campo de fecha y hora. El valor state: manual indica que este campo fue creado fuera de la instalación de un módulo, que es la configuración correcta para los campos creados a través de Studio o la API. Así es como Dasolo gestiona la creación remota de campos para los clientes como parte de scripts de configuración automatizados.
Mejores prácticas
1. Usa fields.Datetime.now como una referencia de función, no como una llamada
Al establecer un valor predeterminado, escribe default=fields.Datetime.now sin paréntesis. Si añades paréntesis, Python evalúa la función una vez cuando se carga la clase, y cada registro creado durante la vida del proceso de Odoo compartirá la misma marca de tiempo congelada. Sin paréntesis, Odoo llama a la función en el momento de la creación del registro, dando a cada registro su propia marca de tiempo precisa.
2. Establece copy=False en las marcas de tiempo de eventos
Si un campo registra cuándo ocurrió algo, como una fecha de confirmación o una marca de tiempo de finalización, establece copy=False. Cuando los usuarios duplican un registro, estas marcas de tiempo no deben trasladarse del original. Un pedido de venta duplicado no debe mostrar la fecha de confirmación del pedido del que fue copiado. Sin esta configuración, los datos históricos se vuelven silenciosamente poco fiables.
3. Siempre pasa UTC al escribir a través de la API
Al crear o actualizar registros a través de la API XML-RPC, siempre pasa valores de fecha y hora en UTC utilizando el formato de cadena YYYY-MM-DD HH:MM:SS. La API no realiza conversión de zona horaria al escribir. Cualquier cadena que pases se almacena directamente en la base de datos como si fuera UTC, por lo que pasar una hora local creará silenciosamente un error de desplazamiento que es difícil de diagnosticar más tarde.
4. Usa readonly para marcas de tiempo generadas automáticamente
Los campos que capturan cuándo ocurrió algo deben establecerse generalmente como de solo lectura en la interfaz. Esto evita que los usuarios ajusten manualmente marcas de tiempo que deberían reflejar eventos reales del sistema. Si hay una razón legítima para permitir la edición, controla el acceso a través de la configuración de seguridad a nivel de campo de Odoo en lugar de dejar el campo editable abiertamente.
5. Elige Fecha en lugar de Fecha y Hora cuando no se necesita la hora
Si un campo solo necesita rastrear una fecha del calendario, como una fecha límite de entrega, una fecha de renovación o una fecha de vencimiento de factura, utiliza fields.Date. Fecha y Hora añade complejidad en el manejo de zonas horarias que no tiene propósito cuando el componente de tiempo siempre es irrelevante. Mantener el tipo de campo tan simple como lo requiere el caso de uso hace que el modelo de datos sea más fácil de entender y mantener.
Errores comunes
Confusión de zonas horarias al leer valores en bruto
Esta es la fuente de confusión más frecuente con los campos de Fecha y Hora. Cuando lees un valor directamente de la base de datos o a través de la API, ves el valor UTC, no la hora local del usuario. Muchos desarrolladores construyen informes o integraciones basados en la salida en bruto de la API y terminan con marcas de tiempo que están desfasadas por una o más horas. Siempre aplica la conversión de zona horaria en el lado del cliente al presentar los resultados de la API a los usuarios finales, y haz de esto un paso explícito en cualquier integración que construyas.
Escribiendo horas localizadas a través de la API
Si pasas un valor de Fecha y Hora que ya está en una zona horaria local a la API de Odoo, la base de datos lo almacenará como si fuera UTC. Una reunión programada a las 3:00 PM hora de París, escrita como 2026-01-01 15:00:00 a la API, se mostrará como 4:00 PM o 5:00 PM para un usuario en París, dependiendo de la hora de verano o invierno. Este es uno de esos errores que solo aparece en producción cuando usuarios reales en zonas horarias reales comienzan a usar el sistema.
Usando default=fields.Datetime.now() con paréntesis
Agregar paréntesis al valor por defecto es un error sutil pero grave. fields.Datetime.now() se evalúa una vez cuando se carga la clase de Python. Cada registro creado durante toda la vida del proceso del trabajador de Odoo compartirá esa misma marca de tiempo congelada. Los registros parecerán correctos inicialmente pero romperán cualquier análisis basado en los tiempos de creación. Este es un error silencioso que puede tardar mucho tiempo en detectarse porque las marcas de tiempo parecen existir, simplemente son todas idénticas.
Olvidando copy=False en las marcas de tiempo de eventos
Sin copy=False, un registro duplicado lleva consigo todos los valores de Fecha y Hora del original. Una fecha de confirmación de pedido, un tiempo de creación de un lead o una marca de tiempo de inicio de producción del registro fuente aparecerán sin cambios en el nuevo. Esto contamina silenciosamente los informes históricos y hace que las auditorías sean poco fiables. Es un pequeño detalle de configuración que tiene un impacto desproporcionado en la calidad de los datos.
Usando Fecha y Hora cuando Fecha es suficiente
Elegir Fecha y Hora para un campo como una fecha de vencimiento de factura o una fecha de caducidad de producto añade complejidad innecesaria. Los usuarios ven un componente de tiempo que no necesitan, se realizan cálculos de zona horaria en cada visualización sin ningún beneficio, y la interfaz se vuelve ligeramente más engorrosa sin razón. El tipo de campo correcto es el más simple que modela correctamente el requisito del negocio.
Conclusión
El campo Datetime es uno de los tipos de campo más útiles en Odoo cuando la precisión importa. Desde el seguimiento de cuándo se abrió un lead hasta el registro de los tiempos de inicio de producción y la asistencia de los empleados, aparece en casi todos los módulos del sistema.
Lo clave es internalizar el modelo de almacenamiento UTC. Todo lo almacenado en la base de datos está en UTC. La interfaz maneja automáticamente la visualización de la zona horaria para los usuarios, pero cualquier lectura o escritura externa a través de la API necesita tener esto en cuenta explícitamente. La mayoría de los errores relacionados con la zona horaria en las integraciones de Odoo se remontan a este malentendido.
Además de eso, usar la sintaxis predeterminada correcta, establecer copy=False donde sea apropiado y elegir Fecha en lugar de Datetime cuando el tiempo no sea relevante mantendrá limpio tu modelo de datos y tus informes confiables.
En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo en todos los departamentos. Ya sea que necesites ayuda para diseñar un modelo de datos sólido, agregar campos personalizados a tus flujos de trabajo o construir un módulo completo de Odoo desde cero, nuestro equipo está listo para ayudar. Contáctanos y hablemos sobre tu proyecto de Odoo.