Un proyecto no pierde el margen el día que lo cierras. Lo pierde una tarde cualquiera, cuando las horas gastadas se ponen por delante del trabajo hecho y nadie lo mira. Cuando el informe de rentabilidad te lo cuenta, el dinero ya se ha ido.
En otro artículo explicamos cómo leer ese informe. Aquí nos interesa lo anterior: ver la desviación con el proyecto todavía abierto, cuando aún se puede hablar con el cliente, reasignar a alguien o parar a tiempo.
¿Cuánto cuesta una desviación que nadie ve?
Un ejemplo para verlo claro. Un proyecto a precio cerrado de 3.600 €, con 60 horas presupuestadas y un coste de 45 € por hora. El coste previsto son 2.700 € y el margen, 900 €.
Lo incómodo es que casi nunca se desvía el proyecto entero a la vez. Se desvía una tarea, la dejas pasar porque «es un día más», y la siguiente arrastra el mismo vicio.
| Diseño de pantallas (16 h) | 100 % | |
| Migración de datos (24 h) | 130 % | |
| Formación (12 h) | 40 % | |
| Pruebas con el cliente (8 h) | 0 % |
Mira la migración: 130 % con el proyecto a medias. Son más de siete horas de más que nadie ha decidido regalar. Y aun así el total parece razonable (52 de las 60 horas), porque la formación y las pruebas, que van por debajo, lo disimulan.
¿Qué trae Odoo 19 de serie para comparar horas?
Más de lo que parece, aunque no todo. Las fórmulas están comprobadas en el código de la rama 19.0 y los nombres, en las traducciones oficiales de Odoo al castellano. Cada tarea de un proyecto con los partes de horas activados tiene cuatro datos que importan:
- Tiempo asignado. Las horas que presupuestas para la tarea. Las escribes tú, aunque si la tarea nace de un pedido de venta Odoo puede rellenarlas con la cantidad vendida (no en los servicios por hitos). El proyecto tiene también su propio tiempo asignado.
- Tiempo dedicado. La suma de los partes de horas imputados a la tarea. Las subtareas llevan su cuenta aparte.
- Tiempo restante. Asignado menos dedicado, restando también las horas de las subtareas. Puede salir negativo.
- Progreso y Horas extraordinarias. El progreso es el tiempo dedicado, sumando el de las subtareas, entre el tiempo asignado. No tiene tope: por encima del 100 % sigue subiendo. Se guarda como fracción con dos decimales: 1,30 es el 130 %. Las horas extraordinarias son lo que te has pasado, y valen cero mientras no te pases. Este campo no sale en la ficha de la tarea, pero sí en filtros e informes.
La trampa está en la primera línea. Si una tarea no tiene tiempo asignado, su tiempo restante, su progreso y sus horas extraordinarias valen cero, siempre. No avisa porque no tiene con qué comparar: no se colorea ni sale en los filtros de desvío. Una tarea sin ese campo rellenado puede llevar el quíntuple de lo razonable y seguir pareciendo sana. Y si facturas por hitos, ojo: las tareas que Odoo crea desde el pedido para esos servicios no heredan horas de la venta. Tendrás que ponerlas tú.
¿Cómo se monta el aviso, paso a paso?
- 1. Presupuesta al crear. Al planificar el proyecto, rellena el «Tiempo asignado» de cada tarea. Ni una sin él. Si no sabes cuántas horas, pon una estimación mala: es mejor que cero, porque una estimación mala se corrige con el primer parte.
- 2. Crea una búsqueda guardada. En Proyecto › Tareas › Todas las tareas, abre «Filtros» › «Filtro personalizado...», pon «Progreso» mayor o igual que 0,8 y agrupa por «Proyecto». Ojo: el campo guarda una fracción (0,8 es el 80 %), así que comprueba el resultado con una tarea que conozcas. Guárdala en «Favoritos» › «Guardar búsqueda actual». Es una lista de tareas al límite, ordenada por proyecto. Si miras un solo proyecto, te sirven los filtros de serie, pero marca los dos: «Partes de horas al 80%» deja fuera las que ya se han pasado, y una tarea clavada en el 100 % no sale en ninguno.
- 3. Mira esa vista una vez por semana. Con quien lleva el proyecto, no solo. Una pregunta por cada fila: ¿qué queda por hacer y cuánto cuesta?
- 4. Si quieres que te avise solo, usa una regla de automatización. Necesitas el módulo Reglas de automatización y el modo de desarrollador; la ruta es Ajustes › Técnico › Automatización › Reglas de automatización. Crea una sobre el modelo «Tarea» con el activador «Al crear y editar». En «Aplicar a», pon «Progreso» mayor o igual que 0,8, y comprueba que en «Al actualizar», el campo que se vigila, quede «Progreso». Como acción, «Crear actividad» para quien lleve el proyecto, o «Enviar correo electrónico». Cuidado: tal cual, saltaría con casi cada parte nuevo por encima del umbral, y acabarías ignorando los avisos. Para que salte solo al cruzarlo, añade la condición «Progreso» menor que 0,8 en «Antes de actualizar el dominio»: se comprueba antes del cambio. Pruébala en una base de datos de pruebas, con un parte ficticio, antes de fiarte.
Una duda razonable: el 80 %. Para una tarea de 8 horas, el 80 % son 6,4 h y queda poco margen de maniobra; para una de 80, quedan 16, y hay mucho. Quizá el umbral debería ir en horas y no en porcentaje. Odoo lo permite: filtra por «Tiempo restante» menor que las horas que elijas y añade «Tiempo asignado» mayor que cero. Sin esa segunda condición se cuelan todas las tareas sin presupuesto, que tienen el restante a cero.
Controlar horas no es vigilar a la gente. Es poder decir al cliente, a mitad de proyecto, «esto se sale de lo acordado, ¿lo ampliamos o lo recortamos?» en lugar de tragarlo en silencio. Eso solo se puede decir si el número existe antes de que duela. Presupuestar horas por tarea es aburrido y es lo único que lo hace posible.
Si facturas por hitos, mira también cómo facturar un proyecto a precio cerrado por hitos; y si tu negocio vive de igualas, el análisis cambia: lo contamos en igualas y bolsas de horas. Todo esto forma parte de lo que dejamos montado en Odoo Proyectos y Equipos.
Montamos Odoo Proyectos con horas presupuestadas por tarea y una vista de control semanal, para que veas el desvío con el proyecto abierto.
HablemosFuentes: Código de Odoo 19.0, módulo hr_timesheet (cálculos) · módulo hr_timesheet (vistas y filtros) · Odoo 19 — Rentabilidad del proyecto · Odoo 19 — Reglas de automatización · Código de Odoo 19.0, módulo base_automation. Las fórmulas, los filtros y los activadores se han comprobado en el código de la rama 19.0, y las etiquetas, en sus traducciones oficiales al castellano. El ejemplo numérico es ilustrativo.