import 'dart:convert'; class OdooRpcHelper { static const String _jsonRpcVersion = "2.0"; static const String _method = "call"; static Map buildLogout({ required String service, required String db, required int uid, required String password, required String model, required String method, List domain = const [], Map kwargs = const {}, }) { // Make sure domain is always a list of lists (even if empty) final safeDomain = domain.isEmpty ? [[]] : domain; return { "jsonrpc": _jsonRpcVersion, "method": _method, "params": { "service": service, "method": "logout", "args": [ db, uid, password, model, method, safeDomain, kwargs, ], }, "id": DateTime.now().millisecondsSinceEpoch, }; } /// Builds the correct JSON-RPC payload for any Odoo model method static Map buildExecuteKw({ required String service, required String db, required int uid, required String password, required String model, required String method, List domain = const [], Map kwargs = const {}, }) { // Make sure domain is always a list of lists (even if empty) final safeDomain = domain.isEmpty ? [[]] : domain; return { "jsonrpc": _jsonRpcVersion, "method": _method, "params": { "service": service, "method": "execute_kw", "args": [ db, uid, password, model, method, safeDomain, kwargs, ], }, "id": DateTime.now().millisecondsSinceEpoch, }; } /// Convenience wrapper for search_read static Map searchRead({ required String db, required int uid, required String password, required String model, List domain = const [], List fields = const [], int? limit, int? offset, String? order, }) { final kwargs = {}; if (fields.isNotEmpty) kwargs["fields"] = fields; if (limit != null) kwargs["limit"] = limit; if (offset != null) kwargs["offset"] = offset; if (order != null) kwargs["order"] = order; return buildExecuteKw( service: "object", db: db, uid: uid, password: password, model: model, method: "search_read", domain: domain, kwargs: kwargs, ); } static Map executeKw({ required String method, required String db, required int uid, required String password, required String model, List domain = const [], List fields = const [], int? limit, int? offset, String? order, }) { final kwargs = {}; if (fields.isNotEmpty) kwargs["fields"] = fields; if (limit != null) kwargs["limit"] = limit; if (offset != null) kwargs["offset"] = offset; if (order != null) kwargs["order"] = order; return buildExecuteKw( service: "object", db: db, uid: uid, password: password, model: model, method: method, domain: domain, kwargs: kwargs, ); } /// Convenience wrapper for create static Map create({ required String db, required int uid, required String password, required String model, required Map values, }) { return buildExecuteKw( service: "object", db: db, uid: uid, password: password, model: model, method: "create", domain: [[]], // create doesn't use domain kwargs: {"vals": values}, // Odoo expects 'vals' for create in some versions ); } }