Conectar una app móvil con Odoo sin instalar módulos

Una duda habitual al plantear una app móvil para Odoo es si hace falta desarrollar un módulo en el servidor. En la mayoría de los casos, no: Odoo ya incluye lo necesario. Esto es lo que hemos comprobado en el código de Odoo 9 a 20.

La vía más simple: la sesión web

El navegador inicia sesión en Odoo llamando a /web/session/authenticate, y luego lee los datos mediante /web/dataset/call_kw. Una app puede hacer exactamente lo mismo:

curl -c cookies.txt https://tu-odoo.com/web/session/authenticate \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"call","params":{
        "db":"mi_base","login":"ana@empresa.com","password":"***"}}'

Con la cookie de sesión, cualquier llamada se ejecuta como ese usuario:

curl -b cookies.txt https://tu-odoo.com/web/dataset/call_kw/res.partner/search_read \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"call","params":{
        "model":"res.partner","method":"search_read","args":[],
        "kwargs":{"fields":["name","email"],"limit":5}}}'

La gran ventaja es que el ERP aplica sus reglas: permisos de acceso, reglas de registro y compañías permitidas. No hay que replicar nada en la app.

Si la cuenta usa verificación en dos pasos

Con 2FA activado, la contraseña no basta: /web/session/authenticate devuelve uid: null. En ese caso hay que crear una clave API en las preferencias del usuario.

  • Odoo 14 a 18: la clave se usa como contraseña en /jsonrpc.
  • Odoo 19 o superior: se recomienda la API JSON-2, con la clave como token Bearer.

Cómo saber qué puede ver el usuario

Las ACL no bastan para decidir qué mostrar. Un vendedor suele poder leer account.move, por ejemplo, sin ser contable. Por eso conviene combinar dos comprobaciones:

  1. Probar el acceso al modelo principal con search_count.
  2. Consultar su grupo con has_group, como sales_team.group_sale_salesman.

Ojo: desde Odoo 18, has_group se llama sobre un registro, así que hay que pasar los ids del usuario.

Las diferencias entre versiones

Una app compatible con varias versiones debe pedir solo los campos que existen. La forma más limpia es consultar fields_get antes de leer. Estas son algunas diferencias reales:

DatoCambio
Facturasaccount.invoice hasta Odoo 12, account.move desde Odoo 13
Tipo de facturatype en Odoo 13, move_type desde Odoo 14
Clientecustomer hasta Odoo 12, customer_rank desde Odoo 13
Importe del CRMplanned_revenue hasta Odoo 13, expected_revenue después
Móvil del contactomobile desapareció en Odoo 19
Cantidad en stockqty en versiones antiguas, quantity después

Limitaciones

Preguntas frecuentes

¿Necesito un módulo para conectar una app a Odoo?

No para leer y crear datos con los permisos del usuario. Solo lo necesitarías si quieres lógica específica en el servidor.

¿Es seguro guardar la contraseña en la app?

Debe guardarse en el almacenamiento seguro del sistema, como el llavero de iOS y macOS, y nunca en texto plano.

Si quieres ver el resultado, prueba MultiERP Móvil, que funciona exactamente así.

Sigue leyendo