Files
saat-app/flutter/lib/odoo_rpc_helper.dart
2026-09-06 04:31:16 +07:00

154 lines
3.7 KiB
Dart

import 'dart:convert';
class OdooRpcHelper {
static const String _jsonRpcVersion = "2.0";
static const String _method = "call";
static Map<String, dynamic> buildLogout({
required String service,
required String db,
required int uid,
required String password,
required String model,
required String method,
List<dynamic> domain = const [],
Map<String, dynamic> 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<String, dynamic> buildExecuteKw({
required String service,
required String db,
required int uid,
required String password,
required String model,
required String method,
List<dynamic> domain = const [],
Map<String, dynamic> 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<String, dynamic> searchRead({
required String db,
required int uid,
required String password,
required String model,
List<dynamic> domain = const [],
List<String> fields = const [],
int? limit,
int? offset,
String? order,
}) {
final kwargs = <String, dynamic>{};
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<String, dynamic> executeKw({
required String method,
required String db,
required int uid,
required String password,
required String model,
List<dynamic> domain = const [],
List<String> fields = const [],
int? limit,
int? offset,
String? order,
}) {
final kwargs = <String, dynamic>{};
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<String, dynamic> create({
required String db,
required int uid,
required String password,
required String model,
required Map<String, dynamic> 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
);
}
}