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", () => {