UNPKG

@bb4first/odoo-xmlrpc

Version:
313 lines (305 loc) 6.24 kB
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 };