{"id":13155,"date":"2024-09-21T18:28:58","date_gmt":"2024-09-21T16:28:58","guid":{"rendered":"https:\/\/www.palentino.es\/blog\/?p=13155"},"modified":"2024-09-21T18:28:58","modified_gmt":"2024-09-21T16:28:58","slug":"desarrollo-de-una-aplicacion-de-escritorio-en-net-para-gestion-de-socios-en-odoo-usando-xml-rpc-poc","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/desarrollo-de-una-aplicacion-de-escritorio-en-net-para-gestion-de-socios-en-odoo-usando-xml-rpc-poc\/","title":{"rendered":"Desarrollo de una aplicaci\u00f3n de escritorio en .NET para gesti\u00f3n de socios en Odoo usando XML-RPC. (PoC)"},"content":{"rendered":"<h4>\u00bfQu\u00e9 es Odoo?<\/h4>\n<p><a href=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/oddo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-13175 alignleft\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/oddo.png\" alt=\"\" width=\"213\" height=\"68\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/oddo.png 398w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/oddo-300x96.png 300w\" sizes=\"auto, (max-width: 213px) 100vw, 213px\" \/><\/a><\/p>\n<p><strong>Odoo<\/strong> es una suite de aplicaciones empresariales (<strong>ERP<\/strong>) de <strong>c\u00f3digo abierto<\/strong> que ofrece una amplia gama de soluciones para la gesti\u00f3n de empresas, tales como <strong>CRM<\/strong>, contabilidad, ventas, inventario, y m\u00e1s. Su arquitectura <strong>modular<\/strong> permite integrar diferentes m\u00f3dulos seg\u00fan las necesidades espec\u00edficas de la empresa. En este proyecto, usar\u00e9 Odoo como la plataforma principal para gestionar los <strong>socios<\/strong> de una empresa, lo cual implica realizar operaciones b\u00e1sicas sobre los registros de socios a trav\u00e9s de una aplicaci\u00f3n externa.<\/p>\n<p>Para hacer las pruebas he creado un servidor (<strong>VPS<\/strong>) en <a href=\"https:\/\/clouding.io\/#\" target=\"_blank\" rel=\"noopener\">clouding.io,<\/a> con un<strong>\u00a0Odoo 17 (Ubuntu 22.04 64Bit) <\/strong>cargado de datos de ejemplo, he usado un dominio gratuito, <a class=\"md-primary server-name ng-binding ng-scope md-cldn-content-theme\" href=\"https:\/\/portal.clouding.io\/dsb\/vmm\/vmdetails\/tenant_206128\/bc175966-6ea3-485d-845d-89f58189b484\/info\">pruebas.publicvm.com.<\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/Odoo-desde-net.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13172\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/Odoo-desde-net.gif\" alt=\"\" width=\"780\" height=\"514\" \/><\/a><\/p>\n<h4>\u00bfQu\u00e9 es CRUD?<\/h4>\n<p>El t\u00e9rmino <strong>CRUD<\/strong> representa las cuatro operaciones b\u00e1sicas que pueden realizarse sobre los datos en un sistema de gesti\u00f3n: <strong>Crear<\/strong>, <strong>Leer<\/strong>, <strong>Actualizar<\/strong> y <strong>Eliminar<\/strong> (por sus siglas en ingl\u00e9s: Create, Read, Update, Delete). Estas son las operaciones fundamentales en cualquier sistema que gestione datos, y son esenciales para mantener y manipular la informaci\u00f3n en cualquier base de datos o sistema de almacenamiento.<\/p>\n<p>En este proyecto, implementamos un sistema <strong>CRUD<\/strong> para la gesti\u00f3n de socios en Odoo mediante una aplicaci\u00f3n en <strong>VB.NET<\/strong>, donde se pueden realizar las siguientes operaciones:<\/p>\n<ul>\n<li><strong>Crear<\/strong> nuevos socios.<\/li>\n<li><strong>Leer<\/strong> (cargar) la lista de socios existentes.<\/li>\n<li><strong>Actualizar<\/strong> la informaci\u00f3n de un socio seleccionado.<\/li>\n<li><strong>Eliminar<\/strong> un socio existente de la base de datos.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/conectado-odoo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13170\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/conectado-odoo.png\" alt=\"\" width=\"142\" height=\"133\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h4>Tecnolog\u00edas empleadas<\/h4>\n<p>Este proyecto combina varias tecnolog\u00edas y t\u00e9cnicas que permiten la interacci\u00f3n entre la aplicaci\u00f3n de escritorio <strong>VB.NET<\/strong> y el sistema Odoo:<\/p>\n<ol>\n<li><strong>VB.NET<\/strong>: Lenguaje de programaci\u00f3n utilizado para desarrollar la aplicaci\u00f3n de escritorio que gestionar\u00e1 los socios, el proyecto esta en Winforms.<\/li>\n<li><strong>XML-RPC<\/strong>: Protocolo que permite la comunicaci\u00f3n remota entre sistemas. A trav\u00e9s de XML-RPC, la aplicaci\u00f3n VB.NET se comunica con Odoo para realizar operaciones CRUD en tiempo real. XML-RPC env\u00eda solicitudes y recibe respuestas en formato XML.<\/li>\n<li><strong>Odoo<\/strong>: El sistema ERP donde se almacenan y gestionan los datos de los socios.<\/li>\n<li><strong>EPPlus<\/strong>: Biblioteca de .NET utilizada para exportar los datos a archivos Excel (.xlsx).<\/li>\n<li><strong>Windows Forms<\/strong>: Plataforma gr\u00e1fica para crear interfaces de usuario en aplicaciones de escritorio de Windows.<\/li>\n<\/ol>\n<h4>\u00bfC\u00f3mo se env\u00edan los datos a Odoo mediante XML-RPC?<\/h4>\n<p><strong>XML-RPC<\/strong> (Remote Procedure Call) es un protocolo ligero que permite la comunicaci\u00f3n entre aplicaciones a trav\u00e9s de llamadas remotas utilizando <strong>XML<\/strong> para el formato de los datos. En este proyecto, se utiliz\u00f3 <strong>XmlRpc.NET<\/strong> para facilitar la interacci\u00f3n entre la aplicaci\u00f3n <strong>VB.NET<\/strong> y el servidor Odoo.<\/p>\n<p>Las operaciones se env\u00edan mediante solicitudes XML que contienen los datos que queremos enviar o recibir de Odoo. Aqu\u00ed hay un resumen de las operaciones que realizamos usando XML-RPC:<\/p>\n<ul>\n<li><strong>Autenticaci\u00f3n<\/strong>: Para cualquier operaci\u00f3n en Odoo, primero debemos autenticarnos enviando las credenciales (usuario, base de datos y contrase\u00f1a) al servidor mediante XML-RPC. Esto nos devuelve un identificador de usuario (UID) que se usa en las operaciones posteriores.<\/li>\n<li><strong>Crear (Create)<\/strong>: Para crear un nuevo socio en Odoo, enviamos un diccionario (representado por XmlRpcStruct en <strong>XmlRpc.NET<\/strong>) con los datos del nuevo socio, como el nombre y el correo electr\u00f3nico.<\/li>\n<li><strong>Leer (Read\/Search_Read)<\/strong>: Para obtener la lista de socios, hacemos una solicitud search_read que devuelve los registros almacenados en Odoo con la informaci\u00f3n solicitada.<\/li>\n<li><strong>Actualizar (Update\/Write)<\/strong>: Para actualizar un socio existente, enviamos el identificador del socio junto con los nuevos valores que queremos modificar.<\/li>\n<li><strong>Eliminar (Delete\/Unlink)<\/strong>: Para eliminar un socio, enviamos el identificador de ese socio mediante el m\u00e9todo unlink.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/odoo-palencia.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13165\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/odoo-palencia.jpg\" alt=\"\" width=\"837\" height=\"480\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/odoo-palencia.jpg 837w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/odoo-palencia-300x172.jpg 300w\" sizes=\"auto, (max-width: 837px) 100vw, 837px\" \/><\/a><\/p>\n<h4>T\u00e9cnicas utilizadas en el proyecto<\/h4>\n<ol>\n<li><strong>Validaci\u00f3n de datos<\/strong>: Antes de realizar cualquier operaci\u00f3n (como actualizar, crear o eliminar), validamos que los campos necesarios no est\u00e9n vac\u00edos y que los identificadores no sean nulos.<\/li>\n<li><strong>Manejo de excepciones con Try-Catch<\/strong>: Implementamos bloques de c\u00f3digo <strong>Try-Catch<\/strong> para capturar cualquier excepci\u00f3n que ocurra durante las operaciones con Odoo o al escribir archivos Excel. Esto asegura que la aplicaci\u00f3n no se bloquee inesperadamente y muestra mensajes de error amigables al usuario.<\/li>\n<li><strong>Exportaci\u00f3n a Excel<\/strong>: Usamos la biblioteca <strong>EPPlus<\/strong> no comercial, aunque puede cambiarse si adquieres licencia, para exportar los datos de los socios a un archivo <strong>.xlsx<\/strong>. Esta exportaci\u00f3n incluye la selecci\u00f3n del lugar donde se desea guardar el archivo mediante un <strong>SaveFileDialog<\/strong> y, despu\u00e9s de exportar, se abre autom\u00e1ticamente el archivo generado.<\/li>\n<li><strong>Control de errores al exportar<\/strong>: Se verifica si el archivo de Excel ya est\u00e1 abierto antes de intentar escribir en \u00e9l, lo que evita errores de acceso y proporciona mensajes claros al usuario en caso de que el archivo est\u00e9 bloqueado.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/rpc-palencia.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-13167 size-full\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/rpc-palencia.jpg\" alt=\"\" width=\"1286\" height=\"859\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/rpc-palencia.jpg 1286w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/rpc-palencia-300x200.jpg 300w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2024\/09\/rpc-palencia-1024x684.jpg 1024w\" sizes=\"auto, (max-width: 1286px) 100vw, 1286px\" \/><\/a><\/p>\n<p>La t\u00e9cnica de objetos para XML-RPC que utilizamos en este proyecto se basa en la creaci\u00f3n de proxies que representan las llamadas remotas a los m\u00e9todos de Odoo. Esta t\u00e9cnica permite interactuar con el servidor de Odoo de manera muy similar a c\u00f3mo interactuamos con los objetos locales en la programaci\u00f3n orientada a objetos.<\/p>\n<p>En el contexto de XmlRpc.NET, creamos interfaces que representan los m\u00e9todos que vamos a llamar en el servidor Odoo. Por ejemplo, para la autenticaci\u00f3n y para las operaciones CRUD, definimos interfaces como IOdooRpcCommon y IOdooRpcObject. Estas interfaces definen los m\u00e9todos de Odoo que queremos invocar, como login, create, write, unlink y search_read. Luego, utilizamos el m\u00e9todo XmlRpcProxyGen.Create para generar din\u00e1micamente objetos proxy que implementan esas interfaces y que internamente manejan las solicitudes XML-RPC. De esta manera, en lugar de escribir manualmente las solicitudes XML y manejar las respuestas, simplemente llamamos a los m\u00e9todos del proxy como si estuvi\u00e9ramos trabajando con objetos normales de VB.NET.<\/p>\n<p>Por ejemplo, al llamar al m\u00e9todo create en el proxy de IOdooRpcObject, simplemente pasamos los par\u00e1metros necesarios (como los campos del socio que queremos crear), y XmlRpc.NET se encarga de traducir esa llamada a una solicitud XML v\u00e1lida, enviarla al servidor Odoo y recibir la respuesta, devolvi\u00e9ndonos el resultado como si fuera una operaci\u00f3n local. Este enfoque simplifica enormemente la interacci\u00f3n con Odoo, ya que podemos trabajar con objetos y m\u00e9todos en lugar de manejar manualmente el protocolo XML-RPC en su forma m\u00e1s cruda.<\/p>\n<h4>Flujo del Proyecto<\/h4>\n<ol>\n<li><strong>Autenticaci\u00f3n en Odoo<\/strong>: Al iniciar la aplicaci\u00f3n, se realiza una autenticaci\u00f3n con el servidor de Odoo utilizando XML-RPC. Si la autenticaci\u00f3n es exitosa, el sistema nos devuelve un UID que permite hacer las siguientes operaciones.<\/li>\n<li><strong>CRUD en la lista de socios<\/strong>: El usuario puede:\n<ul>\n<li>Crear un nuevo socio: Introduce los datos (nombre y correo electr\u00f3nico) y guarda el registro en Odoo.<\/li>\n<li>Leer la lista de socios: La lista de socios se carga y se muestra en un <strong>DataGridView<\/strong>.<\/li>\n<li>Actualizar un socio: Selecciona un socio en la lista, modifica los datos y los guarda.<\/li>\n<li>Eliminar un socio: Selecciona un socio en la lista y lo elimina del sistema.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Exportaci\u00f3n a Excel<\/strong>: Se ofrece la opci\u00f3n de exportar la lista de socios a un archivo Excel. El usuario puede seleccionar la ubicaci\u00f3n donde guardar el archivo y la aplicaci\u00f3n lo abrir\u00e1 autom\u00e1ticamente al finalizar la exportaci\u00f3n.<\/li>\n<\/ol>\n<h4>Conclusi\u00f3n<\/h4>\n<p>Este proyecto es un excelente ejemplo de c\u00f3mo conectar una aplicaci\u00f3n de escritorio <strong>VB.NET<\/strong> con un servidor <strong>Odoo<\/strong> utilizando <strong>XML-RPC<\/strong>. A trav\u00e9s de esta implementaci\u00f3n, logramos realizar operaciones CRUD sobre los datos de los socios y gestionar los errores de manera adecuada para mejorar la experiencia del usuario. Adem\u00e1s, la funcionalidad de exportaci\u00f3n a Excel permite al usuario mantener una copia de los datos de manera sencilla.<\/p>\n<p>Recuerda que he usado controles est\u00e1ndar de Windows. Mediante controles como <strong>Syncfusion o Devexpress<\/strong> entre otros puedes hacer maravillas con los datos obtenidos, desde reports, hasta Grid altamente avanzados, as\u00ed como<strong> pasarelas para comunicaci\u00f3n y automatizaci\u00f3n de aplicaciones con otros ERPs<\/strong>.<\/p>\n<p>El c\u00f3digo completo del proyecto est\u00e1 disponible en <strong>GitHub<\/strong>, donde podr\u00e1s descargarlo, mejorarlo y adaptarlo a tus necesidades espec\u00edficas. \u00a1No dudes en explorarlo!<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/github.com\/oscardelacuesta\/OdooFromNET\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3443 size-full\" src=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/02\/GitHub-el-facebook-de-los-programadores.png\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><\/p>\n<p>Nota: El coste de la prueba que realizado sobre clouding.io son 4 euros mes. \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 es Odoo? Odoo es una suite de aplicaciones empresariales (ERP) de c\u00f3digo abierto que ofrece una amplia gama de soluciones para la gesti\u00f3n de empresas, tales como CRM, contabilidad, ventas, inventario, y m\u00e1s. Su arquitectura modular permite integrar diferentes m\u00f3dulos seg\u00fan las necesidades espec\u00edficas de la empresa. En este proyecto, usar\u00e9 Odoo como la plataforma principal para gestionar los socios de una empresa, lo cual implica realizar operaciones b\u00e1sicas sobre los registros de socios a trav\u00e9s de una aplicaci\u00f3n externa. Para hacer las pruebas he creado un servidor (VPS) en clouding.io, con un\u00a0Odoo 17 (Ubuntu 22.04 64Bit) cargado de datos de ejemplo, he usado un dominio gratuito, pruebas.publicvm.com. &nbsp; \u00bfQu\u00e9 es CRUD? El t\u00e9rmino CRUD representa las cuatro operaciones b\u00e1sicas que pueden realizarse sobre los datos en un sistema de gesti\u00f3n: Crear, Leer, Actualizar y Eliminar (por sus siglas en ingl\u00e9s: Create, Read, Update, Delete). Estas son las operaciones fundamentales en cualquier sistema que gestione datos, y son esenciales para mantener y manipular la informaci\u00f3n en cualquier base de datos o sistema de almacenamiento. En este proyecto, implementamos un sistema CRUD para la gesti\u00f3n de socios en Odoo mediante una aplicaci\u00f3n en VB.NET, donde se pueden realizar las siguientes operaciones: Crear nuevos socios. Leer (cargar) la lista de socios existentes. Actualizar la informaci\u00f3n de un socio seleccionado. Eliminar un socio existente de la base de datos.<\/p>\n","protected":false},"author":1,"featured_media":9989,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1415],"tags":[],"class_list":["post-13155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria-es"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/13155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=13155"}],"version-history":[{"count":16,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/13155\/revisions"}],"predecessor-version":[{"id":13177,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/13155\/revisions\/13177"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/9989"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=13155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=13155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=13155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}