From ad753a27478722e23f56a3355e955330b3116775 Mon Sep 17 00:00:00 2001 From: "helpcode.ai" Date: Mon, 9 Nov 2026 08:57:52 +0100 Subject: [PATCH] Read Odoo partners without fields that need the Invoicing app odoo_list_partners is the setup check of both Odoo adapters and asked for customer_rank and supplier_rank. Those fields come with Odoo's Invoicing app: an Odoo without it answered the check with a 500 Invalid field, and the setup page told the customer the problem was on their side. 8 workspaces hit it on Cloud in two weeks. The wrapper now reads only fields every Odoo has; the domain hint says when customer_rank exists. --- packages/backend/src/adapters/intl/odoo-jsonrpc.json | 4 ++-- .../backend/src/adapters/intl/odoo-jsonrpc.live.spec.ts | 6 ++++++ packages/backend/src/adapters/intl/odoo.json | 4 +--- packages/backend/src/adapters/intl/odoo.live.spec.ts | 3 +++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/adapters/intl/odoo-jsonrpc.json b/packages/backend/src/adapters/intl/odoo-jsonrpc.json index f53847eea..9166dcf96 100644 --- a/packages/backend/src/adapters/intl/odoo-jsonrpc.json +++ b/packages/backend/src/adapters/intl/odoo-jsonrpc.json @@ -244,7 +244,7 @@ }, "domain": { "type": "array", - "description": "Extra Odoo domain, e.g. [[\"customer_rank\",\">\",0]] for customers only.", + "description": "Extra Odoo domain, e.g. [[\"customer_rank\",\">\",0]] for customers only. customer_rank and supplier_rank exist only when the Invoicing app is installed; without it that domain fails with Invalid field.", "items": { "type": "array" }, @@ -255,7 +255,7 @@ "endpointMapping": { "method": "POST", "path": "/jsonrpc", - "bodyTemplate": "{\"jsonrpc\":\"2.0\",\"method\":\"call\",\"id\":1,\"params\":{\"service\":\"object\",\"method\":\"execute_kw\",\"args\":[\"{{ODOO_DB}}\",{{ODOO_UID}},\"{{ODOO_API_KEY}}\",\"res.partner\",\"search_read\",[${domain}],{\"fields\":[\"id\", \"name\", \"email\", \"phone\", \"city\", \"country_id\", \"customer_rank\", \"supplier_rank\", \"vat\"],\"limit\":${limit},\"offset\":${offset},\"order\":\"name asc\"}]}}" + "bodyTemplate": "{\"jsonrpc\":\"2.0\",\"method\":\"call\",\"id\":1,\"params\":{\"service\":\"object\",\"method\":\"execute_kw\",\"args\":[\"{{ODOO_DB}}\",{{ODOO_UID}},\"{{ODOO_API_KEY}}\",\"res.partner\",\"search_read\",[${domain}],{\"fields\":[\"id\", \"name\", \"email\", \"phone\", \"city\", \"country_id\", \"vat\"],\"limit\":${limit},\"offset\":${offset},\"order\":\"name asc\"}]}}" }, "annotations": { "readOnlyHint": true diff --git a/packages/backend/src/adapters/intl/odoo-jsonrpc.live.spec.ts b/packages/backend/src/adapters/intl/odoo-jsonrpc.live.spec.ts index f3e5c6cd7..98970a44b 100644 --- a/packages/backend/src/adapters/intl/odoo-jsonrpc.live.spec.ts +++ b/packages/backend/src/adapters/intl/odoo-jsonrpc.live.spec.ts @@ -39,4 +39,10 @@ describe('odoo-jsonrpc adapter: static spec conformance', () => { it('checks the connection on a path every Odoo version serves', () => { expect(a.connector.healthcheckPath).toBe('/web/health'); }); + + it('reads partners with fields every Odoo has, since the setup check calls this tool', () => { + const partners = a.tools.find((t) => t.name === 'odoo_list_partners'); + // customer_rank / supplier_rank come with the Invoicing app only. + expect(partners?.endpointMapping.bodyTemplate).not.toMatch(/customer_rank|supplier_rank/); + }); }); diff --git a/packages/backend/src/adapters/intl/odoo.json b/packages/backend/src/adapters/intl/odoo.json index 94662eb83..abac3db8d 100644 --- a/packages/backend/src/adapters/intl/odoo.json +++ b/packages/backend/src/adapters/intl/odoo.json @@ -226,7 +226,7 @@ }, "domain": { "type": "array", - "description": "Extra Odoo domain, e.g. [[\"customer_rank\",\">\",0]] for customers only.", + "description": "Extra Odoo domain, e.g. [[\"customer_rank\",\">\",0]] for customers only. customer_rank and supplier_rank exist only when the Invoicing app is installed; without it that domain fails with Invalid field.", "items": { "type": "array" } @@ -245,8 +245,6 @@ "phone", "city", "country_id", - "customer_rank", - "supplier_rank", "vat" ], "limit": "$limit", diff --git a/packages/backend/src/adapters/intl/odoo.live.spec.ts b/packages/backend/src/adapters/intl/odoo.live.spec.ts index 8fc80abc7..06d82201b 100644 --- a/packages/backend/src/adapters/intl/odoo.live.spec.ts +++ b/packages/backend/src/adapters/intl/odoo.live.spec.ts @@ -54,6 +54,9 @@ describe('odoo adapter — static spec conformance', () => { // The partner wrapper's fixed field list must work on Odoo 19 as shipped. const partners = tools.find((t) => t.name === 'odoo_list_partners'); expect(JSON.stringify(partners?.endpointMapping)).not.toContain('"mobile"'); + // customer_rank / supplier_rank come with the Invoicing app: an Odoo + // without it answers the setup check (this tool) with Invalid field. + expect(JSON.stringify(partners?.endpointMapping)).not.toMatch(/customer_rank|supplier_rank/); }); it("tells call_method to pass required arguments by name and one id for singleton actions", () => {