Cuando en Odoo Community (módulo Asistencias / hr_attendance) ves que una jornada “no cuadra” —por ejemplo, entras a las 08:00, sales a las 15:00 y no te devuelve 7h— lo normal es pensar que Odoo está “metiendo” un descanso que no existe.
En la práctica, Odoo no se inventa una pausa: la mayoría de discrepancias vienen de cómo está definido el Calendario de trabajo (resource.calendar) o de cómo se cruzan varios factores como tramos AM/PM, huecos, zona horaria, y reglas de redondeo.
La clave es esta:
Asistencias registra horas reales de entrada/salida, pero cuando se interpretan/contrastan con otras piezas (Work Entries, Planning, informes, nómina…), manda el Calendario de trabajo.
Si el calendario no refleja la realidad, el sistema no puede cuadrar.
1) Contexto y síntoma
Ejemplo típico 1: “No salen 7h”
Entrada: 08:00
Salida: 15:00
Esperado: 7:00 h
Resultado en Odoo (o en informes): 6:00 h, o la jornada aparece “cortada”.
Esto suele notarse más cuando:
Se generan informes, PDFs o reportes que tiran de calendarios/entradas de trabajo.
Se usan Work Entries (Entradas de trabajo) y hay reglas de planificación.
Hay usuarios con zonas horarias distintas (usuario vs empleado vs servidor).
Ejemplo típico 2: “La jornada aparece como partida”
El empleado hace jornada continua de 08:00 a 15:00.
Pero el calendario está definido como:
08:00–14:00
16:00–18:00
(con hueco 14:00–16:00)
En ese caso, aunque el empleado haya fichado continuo, Odoo interpreta que existe una estructura de jornada partida y al conciliar horas con calendario / entradas de trabajo puede aparecer una “partición” o descuadre.
2) Qué revisar primero (check rápido)
Antes de tocar nada, haz este checklist en 2 minutos:
✅ A) Calendario de trabajo del empleado
Ruta típica:
RRHH → Empleados → Contrato → Calendario de trabajo
Comprueba:
Si el calendario es el correcto (muchas veces el empleado tiene uno heredado por copia o plantilla).
Si el calendario define jornada continua o partida.
✅ B) Tramos AM/PM y huecos
Mira si el horario tiene:
Dos bloques (mañana / tarde)
Un hueco entre medias
📌 Si hay hueco, Odoo entiende jornada partida (aunque tú no lo veas como “descanso”, para el sistema es un intervalo no laborable).
✅ C) Zona horaria
Revisa:
Zona horaria del usuario que revisa
Zona horaria del empleado
Zona horaria del servidor / contenedor Docker
Ejemplo de fallo típico:
Usuario en Europe/Madrid
Servidor en UTC
Empleado sin TZ definida o con otra TZ
→ una entrada 08:00 puede interpretarse internamente con offset y “moverse” a otra hora al conciliar.
✅ D) Reglas de redondeo (si están activas)
Algunas configuraciones o módulos complementarios aplican:
redondeo de entrada/salida (ej. al cuarto de hora)
redondeo por tramos
Eso puede hacer que 08:03–15:02 se convierta en 08:15–15:00, etc.
3) Diagnóstico paso a paso
Paso A: Localiza un día “fallido”
Elige un día donde el empleado se queje del descuadre y revisa:
la entrada y salida registradas
si hay más de un registro ese día (doble fichaje, fichaje abierto, etc.)
Si tienes acceso técnico:
revisa registros en
hr.attendancepara ese empleado y fecha.
Paso B: Verifica el calendario asociado
Abre el calendario (resource.calendar) y valida:
¿Qué tramos están definidos?
Caso correcto (jornada continua 8–15):
08:00–15:00 (un solo bloque)
Caso problemático (jornada partida “por plantilla”):
08:00–14:00
16:00–18:00
¿Coinciden con la realidad?
Si el empleado trabaja continuo, pero el calendario define partido, estás sembrando la discrepancia.
Paso C: Aísla si es un problema de configuración o de datos
Haz una prueba rápida:
Compara con un empleado “control” que tenga un calendario estándar bien definido.
Repite el mismo patrón (08:00–15:00) en un día de prueba.
Si con el empleado control funciona y con el otro no, casi seguro es:
calendario asignado incorrecto
o redondeos / tz / reglas asociadas a ese contrato/empleado
4) Solución
Solución principal: ajustar el calendario para que represente el horario real
Opción 1: Jornada continua real
Si la empresa trabaja de 08:00 a 15:00:
Define un único tramo: 08:00–15:00
Evita que el calendario tenga dos bloques.
Opción 2: Jornada partida real (pero coherente)
Si realmente hay descanso y jornada partida:
Define los tramos reales y asegúrate de que los fichajes esperados “encajan”.
Ejemplo:08:00–14:00
15:00–17:00
(si el descanso es 14:00–15:00)
📌 Si el empleado ficha de 08:00 a 17:00 sin pausa, el sistema tendrá conflicto: el calendario dice que 14:00–15:00 no es laborable.
Recomendación práctica para despliegues
Documenta el “horario corporativo” por tipo de contrato (ej. oficina, taller, parcial, intensiva verano…).
Crea calendarios separados por caso.
Asigna explícitamente el calendario correcto en el contrato.
Esto evita el clásico:
“copié el contrato de otro empleado”
y te llevas un calendario que no corresponde.
5) Validación
Después de cambiar el calendario:
Repite el caso:
Entrada 08:00
Salida 15:00
Comprueba que las horas esperadas coinciden.
Si tienes módulos conectados, revisa impacto en:
Partes de horas (Timesheets)
Entradas de trabajo (Work Entries)
Planning
Nómina (si aplica)
📌 Importante: si ya existen Work Entries generadas con el calendario anterior, puede que necesites:
regenerar entradas de trabajo para el periodo afectado
o recalcular según el flujo que estés usando (depende versión/configuración)
6) Conclusión
En Odoo, la regla de oro es:
Si el calendario no representa la realidad, Asistencias no puede cuadrar.
Checklist final para futuros despliegues
Calendario correcto asignado en el contrato
Tramos horarios sin huecos si la jornada es continua
Zonas horarias alineadas (usuario/empleado/servidor)
Redondeos revisados y documentados
Validación con 2–3 casos reales antes de pasar a producción