@bb4first/odoo-xmlrpc
Version:
Odoo XMLRPC Interface
313 lines (305 loc) • 6.24 kB
JavaScript
import xmlRpc from "xmlrpc";
//#region src/constants/errors.enum.ts
/**
* Copyright (C) 2022 Intelica. Scientific and Software Solutions
* Author: Reinier Millo Sánchez <millo@intelica.mx>
*
* This file is part of the @intelica/odoo-xmlrpc package.
* This project is distributed under MIT License.
* Check LICENSE file in project root folder.
*/
/**
* Predefined errors
*/
const ERRORS = { INVALID_CREDENTIALS: {
value: 1001,
str: "odoo-invalid-credentials"
} };
//#endregion
//#region src/models/odoo.types.ts
/**
* Copyright (C) 2022 Intelica. Scientific and Software Solutions
* Author: Reinier Millo Sánchez <millo@intelica.mx>
*
* This file is part of the @intelica/odoo-xmlrpc package.
* This project is distributed under MIT License.
* Check LICENSE file in project root folder.
*/
let MODEL_TYPE = /* @__PURE__ */ function(MODEL_TYPE$1) {
MODEL_TYPE$1["CONTACTS"] = "res.partner";
MODEL_TYPE$1["LEAD_OPPORTUNITY"] = "crm.lead";
MODEL_TYPE$1["EMPLOYEES"] = "hr.employee";
return MODEL_TYPE$1;
}({});
//#endregion
//#region src/controllers/odoo.crud.ts
var OdooCRUD = class {
_model;
_odoo;
_keys;
constructor(model, odoo, keys = []) {
this._model = model;
this._odoo = odoo;
this._keys = keys;
}
count() {
return new Promise((resolve, reject) => {
const params = [
this._model,
"search_count",
[[]]
];
this._odoo.callRPC(params).then((value) => {
resolve(value);
}).catch(reject);
});
}
create(value) {
return new Promise((resolve, reject) => {
const params = [
this._model,
"create",
[value]
];
this._odoo.callRPC(params).then((value$1) => {
resolve(value$1);
}).catch(reject);
});
}
searchRead(query, limit = 10, keys = []) {
return new Promise((resolve, reject) => {
const params = [
this._model,
"search_read",
[query],
{
fields: [...this._keys, ...keys],
limit
}
];
this._odoo.callRPC(params).then((value) => {
resolve(value);
}).catch(reject);
});
}
getByIds(ids, keys = []) {
return new Promise((resolve, reject) => {
const params = [
this._model,
"read",
[ids],
{ fields: [...this._keys, ...keys] }
];
this._odoo.callRPC(params).then((value) => {
resolve(value);
}).catch(reject);
});
}
read(ids, keys = []) {
return this.getByIds(ids, keys);
}
getById(id, keys = []) {
return this.getByIds([id], keys).then((values) => values[0]);
}
getAllIds(limit) {
return this._odoo.callRPC([
this._model,
"search",
[[]],
{ limit }
]);
}
update(id, data) {
return new Promise((resolve, reject) => {
const params = [
this._model,
"write",
[[id], data]
];
this._odoo.callRPC(params).then((value) => {
resolve(value);
}).catch(reject);
});
}
delete(id) {
return new Promise((resolve, reject) => {
const params = [
this._model,
"unlink",
[[id]]
];
this._odoo.callRPC(params).then((value) => {
resolve(value);
}).catch(reject);
});
}
};
//#endregion
//#region src/controllers/contacts.odoo.ts
var Contacts = class extends OdooCRUD {
constructor(odoo) {
super(MODEL_TYPE.CONTACTS, odoo);
this._keys = [
"id",
"name",
"phone",
"email",
"ref"
];
}
create(value) {
if (value.category_id && value.category_id.length > 0) value.category_id = [[
6,
0,
value.category_id
]];
return super.create(value);
}
searchByEmail(email) {
return this.searchRead([[
"email",
"=",
email
]]);
}
searchByPhone(phone) {
return this.searchRead([[
"phone",
"=",
phone
]]);
}
};
//#endregion
//#region src/controllers/employees.odoo.ts
var Employees = class extends OdooCRUD {
constructor(odoo) {
super(MODEL_TYPE.EMPLOYEES, odoo);
this._keys = [
"id",
"department_id",
"name",
"work_phone",
"work_email",
"category_ids"
];
}
searchByEmail(email) {
return this.searchRead([[
"work_email",
"=",
email
]]);
}
searchByPhone(phone) {
return this.searchRead([[
"work_phone",
"=",
phone
]]);
}
};
//#endregion
//#region src/controllers/leads.odoo.ts
var Leads = class extends OdooCRUD {
constructor(odoo) {
super(MODEL_TYPE.LEAD_OPPORTUNITY, odoo);
this._keys = [
"id",
"name",
"partner_id",
"contact_name",
"email_from",
"phone",
"description",
"source_id",
"user_id",
"team_id",
"tag_ids"
];
}
searchByEmail(email) {
return this.searchRead([[
"email_from",
"=",
email
]]);
}
searchByPhone(phone) {
return this.searchRead([[
"phone",
"=",
phone
]]);
}
};
//#endregion
//#region src/controllers/odoo.ts
var Odoo = class {
_client;
_uid;
_db;
_password;
constructor(host, port = 443) {
this._client = xmlRpc.createSecureClient({
host,
port
});
}
_commonPath() {
this._client.options.path = "/xmlrpc/2/common";
}
_objectPath() {
this._client.options.path = "/xmlrpc/2/object";
}
version() {
return new Promise((resolve, reject) => {
this._commonPath();
this._client.methodCall("version", [], (error, value) => {
error ? reject(error) : resolve(value);
});
});
}
authenticate(db, username, password) {
return new Promise((resolve, reject) => {
this._db = db;
this._password = password;
this._commonPath();
this._client.methodCall("authenticate", [
db,
username,
password,
{}
], (error, value) => {
if (error) return reject(error);
if (!value) return reject({ boError: ERRORS.INVALID_CREDENTIALS });
this._uid = value;
resolve(value);
});
});
}
callRPC(params) {
return new Promise((resolve, reject) => {
this._objectPath();
const opts = [
this._db,
this._uid,
this._password,
...params
];
this._client.methodCall("execute_kw", opts, (error, value) => {
error ? reject(error) : resolve(value);
});
});
}
getModelActions(model) {
switch (model) {
case MODEL_TYPE.CONTACTS: return new Contacts(this);
case MODEL_TYPE.LEAD_OPPORTUNITY: return new Leads(this);
case MODEL_TYPE.EMPLOYEES: return new Employees(this);
}
throw new Error("Invalid model type");
}
};
//#endregion
export { Contacts, ERRORS, Employees, Leads, MODEL_TYPE, Odoo, OdooCRUD };