Saltar al contenido principal
Professional Services Automation (PSA)

Errores de PSA for Odoo: un caso de ejemplo, mensaje a mensaje

Salvo el genérico Access denied, cada mensaje de error de Professional Services Automation (PSA) for Odoo dice qué falta: un perfil (como Operations Directors para importar tarifas), un requisito del hito (adjunto, aprobación interna o aceptación del cliente) o un estado concreto del contrato, la orden de cambio o la solicitud. Se arregla cumpliendo esa condición, no reintentando. Abajo lo ves con una consultora inventada que recorre el flujo y se encuentra cada mensaje.

FlexigoTech · Responsable: Víctor Gómez · Actualizado el 4 de noviembre de 2026

Lo esencial

Versiones
Odoo 17, 18 y 19
Comprobado
en el código del módulo, versión 19.0 · en las fuentes enlazadas al final
Lectura
7 min

Una consultora inventada que pone en marcha PSA

Ejemplo Caso ilustrativo: la empresa y sus datos son inventados para explicar el flujo.

Estudio Ribera es una consultora inventada que acaba de instalar Professional Services Automation (PSA) for Odoo. Marta, su responsable de operaciones, quiere cargar las tarifas, dejar listo un contrato con hitos y empezar a trabajar con un cliente. Por el camino le salen buena parte de los mensajes de error del módulo. Los repasamos en el orden en que le aparecen: el texto literal, lo que significa y lo que hace para seguir.

Antes de nada, Marta abre los ajustes del módulo. Ahí no le sale ningún error.

Ajustes de Odoo en la sección PSA con el campo WIP Account vacío y la casilla de configuración sin marcar
Los ajustes de PSA tal como los encuentra Marta, con WIP Account vacío.

Si quieres repasar qué menús añade el módulo y qué recorre cada registro, lo tienes en cómo funciona PSA por dentro.

Tarifas: quién puede importarlas y quién puede cambiarlas

Lo primero que intenta Marta es importar la tarifa de la consultora. El módulo la para con Only Operations Directors can import rate cards. El mensaje es claro: importar rate cards es cosa del perfil Operations Directors, y el usuario de Marta no lo tiene. Tiene dos salidas: que la importe alguien con ese perfil o que quien administra los usuarios de su Odoo se lo asigne, si le corresponde.

Lista de Rate Cards del módulo PSA con un único registro activo, Standard Rate Card 2024 (Demo), en EUR
La lista de Rate Cards, con datos de demostración: solo aparece Standard Rate Card 2024 (Demo).

Con la tarifa cargada, Marta quiere aplicar a un cliente una tarifa distinta. Le sale Only PSA Operations users can override billing rates.: cambiar tarifas de facturación está reservado a los usuarios de PSA Operations. Un compañero con ese perfil lo intenta, deja el motivo en blanco y recibe A reason is mandatory for rate overrides. La solución es escribir el motivo del cambio y volver a guardar.

Si en algún momento ves Access denied a secas, el mensaje no dice qué permiso falta. Lo práctico es anotar qué estabas haciendo en ese momento y pedir a quien administra los permisos que lo revise.

Lista Utilization del módulo PSA con columnas de fecha, empleado, proyecto, horas, tarifa, importe facturable, estado WIP y aprobación del cliente
La lista Utilization, con la tarifa y el importe facturable en columnas.

Hitos: lo que pide cada uno antes de darse por alcanzado

El contrato de Estudio Ribera tiene un primer hito, «Análisis». Marta lo marca como alcanzado y el módulo responde con Milestone '%s' requires a deliverable attachment before it can be marked as reached. (en pantalla, en lugar de %s sale el nombre del hito). Ese hito pide un entregable adjunto antes de cerrarse: Marta adjunta el documento y vuelve a marcarlo.

El segundo intento da Milestone '%s' requires internal approval before it can be marked as reached. Ahora lo que falta es la aprobación interna del hito. Hasta que no la tiene, no se puede marcar como alcanzado.

Con la aprobación interna hecha, sale Milestone '%s' requires client acceptance before it can be marked as reached. Current state: %s. Falta la aceptación del cliente, y el mensaje añade el estado actual (Current state).

Cuando Marta intenta pedir esa aprobación al cliente, se encuentra con The customer of milestone '%s' has no portal access: grant it first, the approval page needs a login. La página de aprobación necesita que el cliente inicie sesión y ese cliente no tiene acceso al portal. Hay que darle acceso al portal primero y repetir la acción.

El último mensaje de hitos va al revés: Milestone '%s' does not wait for a client approval. Sale cuando se intenta registrar una aprobación del cliente en un hito que no la espera. Revisa si te has equivocado de hito.

Recorrido por la lista Milestones Roll-up, las categorías no facturables, los ajustes de PSA y la lista Utilization
Las pantallas del módulo que Marta recorre: hitos con su casilla de alcanzado, categorías no facturables, ajustes y Utilization.

Órdenes de cambio: el estado decide qué se puede hacer

A mitad de proyecto, el cliente pide ampliar el alcance y Marta crea una orden de cambio. La envía y, sin darse cuenta, vuelve a enviarla: Only draft change orders can be submitted. Solo se envían las órdenes en borrador, y esta ya no lo estaba.

Después, un compañero intenta aprobarla y recibe User %(name)s has no pending approval step on this change order. El mensaje pone el nombre del usuario y dice que no tiene ningún paso de aprobación pendiente en esa orden. Tiene que aprobar quien sí tenga ese paso pendiente.

Por último, Marta quiere aplicar la orden antes de que el cliente conteste: Only client-accepted change orders can be implemented. Solo se implementan las órdenes que el cliente ya ha aceptado, así que toca esperar a esa aceptación.

Tres logs que no admiten cambios

Marta ve una entrada en uno de los logs del módulo e intenta corregirla. Hay tres mensajes de este tipo:

  • NTE audit log is immutable.
  • Portal action log is immutable.
  • Rate override log is immutable.

El mensaje lo dice: ese log es inmutable. No es un fallo de permisos que se arregle con otro perfil.

Contratos y exportaciones: los estados que mira el módulo

Al cerrar el año, Marta quiere terminar un contrato y archivar otro. El primero le da Only active or suspended contracts can be terminated.: solo se terminan contratos activos o suspendidos. El segundo, Only terminated or suspended contracts can be archived.: solo se archivan los terminados o suspendidos. El contrato que quería archivar seguía activo, así que primero lo termina y después lo archiva.

Queda un mensaje más: Export can only be generated for pending or processing requests. La exportación solo se genera para solicitudes pendientes o en proceso. Si la solicitud no está en uno de esos estados, el módulo no la genera.

Qué aprender del caso de Estudio Ribera

Cada tropiezo de Marta se resolvió leyendo el final del mensaje: ahí está el perfil que falta, el requisito del hito o el estado que hace falta. Este es el resumen:

MensajeCuándo saleQué hacer
Only Operations Directors can import rate cardsAl importar rate cards sin ese perfilQue lo haga un Operations Director o pedir el perfil
Only PSA Operations users can override billing rates.Al cambiar una tarifa de facturación sin ese perfilQue lo haga un usuario de PSA Operations
A reason is mandatory for rate overrides.Al cambiar una tarifa sin motivoEscribir el motivo
Milestone '%s' requires a deliverable attachment...Al marcar alcanzado un hito sin entregableAdjuntar el entregable
Milestone '%s' requires internal approval...Al marcar alcanzado un hito sin aprobación internaConseguir la aprobación interna
Milestone '%s' requires client acceptance...Al marcar alcanzado un hito sin aceptación del clienteEsperar la aceptación; el mensaje da el estado actual
The customer of milestone '%s' has no portal access...El cliente del hito no tiene acceso al portalDarle acceso al portal y repetir
Only draft change orders can be submitted.Al enviar una orden que no está en borradorComprobar el estado de la orden
Only client-accepted change orders can be implemented.Al implementar una orden sin aceptación del clienteEsperar a que el cliente la acepte
Only active or suspended contracts can be terminated.Al terminar un contrato en otro estadoRevisar el estado del contrato
Only terminated or suspended contracts can be archived.Al archivar un contrato activoTerminarlo antes

Para dejar los perfiles, hitos y contratos bien preparados antes de que salgan estos mensajes, mira la puesta en marcha del módulo.

Cómo te ayuda FlexigoTech

En FlexigoTech implantamos Odoo 17, 18, 19 y 20 y desarrollamos conectores e integraciones a medida, así que podemos ayudarte a repartir perfiles, preparar hitos y revisar los mensajes que te salgan en tu caso. El módulo está en Odoo Apps para 17, 18 y 19, a 9 € por versión de Odoo, pago único y sin IVA; el servicio local de FlexigoTech Cloud cuesta 29 €/mes o 290 €/año sin IVA (Pro: 58 €/mes o 580 €/año). Tienes todos los detalles en la página del módulo y en su ficha de Odoo Apps.

Sigue leyendo

Cómo funciona Professional Services Automation (PSA) for Odoo por dentroMenús, tareas programadas y servicio externo de Professional Services Automation (PSA) for Odoo, explicados término a término para quien ya usa Odoo.Puesta en marcha de PSA for Odoo: ajustes, campos del proyecto y la primera semanaGuía para poner en marcha Professional Services Automation (PSA) en Odoo 17, 18 y 19: ajustes, campos del proyecto y qué revisar la primera semana.Professional Services Automation (PSA) for Odoo: cómo saber si encaja en tu empresaQué cubre y qué no Professional Services Automation (PSA) for Odoo según su ficha, qué comprobar antes de instalarlo y en qué versiones de Odoo está publicado.
Comprobado en el código del módulo (versión 19.0) y en las fuentes enlazadas

Fuentes

  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): controllers/portal.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): controllers/rate_card_import.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/account_analytic_line_ext.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/project_milestone_ext.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_change_order.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_dsar_request.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_nte_audit_log.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_portal_action_log.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_rate_override_log.py
  • Código del módulo: flexigo_psa_premium 19.0 (9670343f): models/psa_retainer_contract.py
  • apps.odoo.com/apps/modules/19.0/flexigo_psa_premium
  • apps.odoo.com/apps/modules/17.0/flexigo_psa_premium
  • apps.odoo.com/apps/modules/18.0/flexigo_psa_premium
  • flexigotech.com/en/services.html
  • flexigotech.com/precios.html