Entendiendo el modelo de datos de Odoo

Gustavo Orrillo
- 05/04/2022 - 4 min. de lectura

Odoo cuenta con un ORM (Object Relational Mapper) que internamente mapea (por lo general) cada objeto del módelo de Odoo, a una tabla en PostgreSQL. El ORM abstrae al desarrollador de las complejidades de manejar directamente el modelo de datos en la base de datos. Tambien el ORM le permite a Odoo asegurarse que los datos en su modelo de datos son íntegros (y que no provocan ningún error en el sistema) y verificar la seguridad del sistema (impedir que usuarios no deseados accedan a objetos no autorizados, por ejemplo un vendedor accediendo una orden de fabricación).

Muchas veces se escucha la pregunta "donde se encuentra un diagrama (o un DER) con todas las tablas de Odoo?", y la respuesta es siempre la misma; "se puede generar uno, pero es más sencillo chequear las herramientas que provee Odoo. Para entender su modelo de datos Odoo brinda el modo desarrollador y un menú muy util en "Configuración > Tecnico > Estructura de la base de datos > Modelos". Este menú brinda un listado de los modelos con (o clases para los puristas de la orientación a objetos) con los que trabaja Odoo.


Aquí podemos conocer cada uno de los objetos con los que trabaja Odoo; y si clickeamos en el mismo podemos conocer sus campos, el tipo de los mismos, que módulo redefine el campo (muy util para los desarrolladores). 


De esta manera, podemos conocer que "tablas y campos" componen el modelo de datos de Odoo. Tambien incluye los modelos transitorios (creados para los wizard) y los campos computados (que pueden almacenarse o no en la base de datos).

Ahora, pasemos a conocer para los módulos principales como se relacionan los modelos principales con los que trabaja Odoo.

Contactos

Contactos funciona con un modelo (o tabla) fundamental, que es res.partner. Un partner en Odoo significa cualquier contacto; el cual puede ser un cliente, proveedor, empleado, usuario, empresa (pueden haber más). Dicho ente (ya sea físico o jurídico). Cual es el nombre del objeto? res.partner. Dicho objeto es usado a lo largo de todos los módulos (cada objeto en Odoo tiene dos campos llamados create_uid y write_uid, los cuales indirectamente apuntan a res.partner).

Productos

Otro módulo con datos maestros que uno debe conocer es el de productos. Este trabaja con dos modelos: product. template (conocido como productos) y product.product (conocido como variante de productos). Cada producto automaticamente crea una variante y todos los campos de product.template se reflejan en product.product. Un punto a tener en cuenta es, practicamente todos los módulos referencian estos modelos. Y referencian el modelo product.product, es muy raro que referencien product.template. 

Conceptualmente los productos pueden ser productos para la venta, materias primas, materiales desechables.

Contabilidad

El módulo contable consta de varios modelos. El más importante es el modelo account.move el cual almacena los asientos contables (consta de lineas las cuales son las imputaciones contables, estas estan almacenadas en el modelo account.move.line). Los asientos contables también almacenan las facturas de proveedor y de cliente, junto con sus notas de crédito (no vamos a entrar en detalle aca de como funcionan). 

En este módulo también se administran los pagos (modelo account.payment) el cual administra los pagos. Tenga en cuenta que cada pago esta relacionado con un asiento contable (independientemente del estado del pago). Además se gestionan los resumenes bancarios, los cuales son almacenados en el objeto account.bank.statement (con sus líneas las que pertenecen al modelo account.bank.statement.line). Esten al tanto que cada línea del extracto bancario crea un asiento contable (account.move). 

A nivel datos maestros; los tres modelos más importantes son account.journal (diario contable), account.account (cuenta contable) y account.tax (impuesto)

Ventas

El módulo de ventas administra los pedidos de venta de los vendedores. Su principal modelo es sale.order, el cual almacena los pedidos de venta. Este mismo se relaciona con los clientes por medio del campo partner_id. Y consta de líneas que están almacenadas en el modelo sale.order.line. Estas líneas se relacionan con los productos por medio del campo product_id. Las ventas pueden crear facturas de cliente (modelo account.move) y entregas (stock.picking).

CRM

Las oportunidades y las iniciativas se almacenan en un solo objeto llamado crm.lead. Este modelo tiene un campo llamado type el cual permite identificar una iniciativa de una oportunidad. Puede estar relacionado o no con un contacto (por medio del partner_id) y puede crear un pedido de ventas (sale.order).

Compras

El módulo de compras administra principalmente ordenes de compra y licitaciones. Su principal modelo es purchase.order, el cual almacena las órdenes de compra. Este mismo se relaciona con los proveedores por medio del campo partner_id. Y consta de líneas que estan almacenadas en el modelo purchase.order.line. Estas líneas se relacionan con los productos por medio del campo product_id. Las compras pueden crear facturas de proveedor (modelo account.move) y remitos de entrega (stock.picking).

Inventarios

El módulo de inventarios consta de transferencias (stock.picking) que son la cabecera de los movimientos de stock. Cada transferencia consta de movimientos de stock (stock.move) que mueven la mercadería (product.product) de una ubicación a otra (stock.location). Las ubicaciones se encuentran almacenadas jerarquicamente y se agrupan por medio de almacenes (stock.warehouse).

Manufactura

El dato maestro principal en manufactura (más alla de las materias primas y productos terminados) son las listas de materiales. Estas almacenan las formulas que dictan que materia prima se va a consumir cada vez que se produzca un producto terminado. El modelo que administra las listas de materiales es mrp.bom y el mismo consta de líneas (mrp.bom.line).

Cada orden de fabricación se almacena en el objeto mrp.production (el cual se encuentra relacionado con los productos por medio del campo product_id y con la lista de materiales por medio del campo bom_id). La orden de fabricación consta de componentes (la materia prima consumida o a consumir) las cuales son movimientos de stock (stock.move). Y el producto terminado, el cual es tambien otro movimiento de material (stock.move).

Aclaremos que en el módulo de manufactura no detallamos el módulo de operaciones.

Acerca de:

Gustavo Orrillo

Apasionado de la programación, implementa Odoo para distintos tipos de negocios desde el año 2010. En Moldeo Interactive es Socio fundador y Programador; además de escribir en el Blog sobre distintos temas relacionados a los desarrollos que realiza.