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.

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.

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.

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.

Ó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:
| Mensaje | Cuándo sale | Qué hacer |
|---|---|---|
Only Operations Directors can import rate cards | Al importar rate cards sin ese perfil | Que 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 perfil | Que lo haga un usuario de PSA Operations |
A reason is mandatory for rate overrides. | Al cambiar una tarifa sin motivo | Escribir el motivo |
Milestone '%s' requires a deliverable attachment... | Al marcar alcanzado un hito sin entregable | Adjuntar el entregable |
Milestone '%s' requires internal approval... | Al marcar alcanzado un hito sin aprobación interna | Conseguir la aprobación interna |
Milestone '%s' requires client acceptance... | Al marcar alcanzado un hito sin aceptación del cliente | Esperar 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 portal | Darle acceso al portal y repetir |
Only draft change orders can be submitted. | Al enviar una orden que no está en borrador | Comprobar el estado de la orden |
Only client-accepted change orders can be implemented. | Al implementar una orden sin aceptación del cliente | Esperar a que el cliente la acepte |
Only active or suspended contracts can be terminated. | Al terminar un contrato en otro estado | Revisar el estado del contrato |
Only terminated or suspended contracts can be archived. | Al archivar un contrato activo | Terminarlo 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
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
