Introducción
En Odoo, los modelos definen cómo se estructura y almacena la información en la base de datos. Cada pieza de datos empresariales con la que trabajas, desde órdenes de venta hasta facturas y productos, vive en un modelo.
Entender los modelos de Odoo es esencial tanto para desarrolladores como para consultores funcionales. Los modelos son la base de la arquitectura de datos de Odoo. Definen los campos, relaciones y lógica empresarial de Odoo. Cada modelo en Odoo sigue los mismos patrones.
Este artículo se centra en uno de los modelos más importantes en Odoo: product.template. Ya sea que estés construyendo módulos personalizados, integrando sistemas externos o configurando catálogos de productos, trabajarás con este modelo.
¿Qué es el modelo product.template?
El modelo product.template representa un grupo de productos similares que solo difieren en algunas propiedades, como el tamaño o el color. En lugar de crear registros de productos separados para cada variación, los productos se organizan en plantillas con variantes.
Este modelo en Odoo se utiliza en Ventas, Compras, Inventario, Comercio Electrónico y Fabricación. Cuando creas un producto en el catálogo, estás creando un registro product.template. Cuando creas un pedido de cliente, seleccionas entre las variantes de producto que heredan de la plantilla.
El modelo está definido en el módulo de producto. Otros módulos lo extienden a través de la herencia de modelos de Odoo. Ventas añade precios y facturación. Compras añade gestión de proveedores. Inventario añade seguimiento de stock. Cada módulo añade lo que necesita sin duplicar la estructura central.
Entender la diferencia entre product.template y product.product es clave. La plantilla contiene datos compartidos. La variante (product.product) contiene datos específicos de la variante como el código de barras y el SKU.
Campos clave en el modelo
Aquí están los campos más importantes de Odoo en el modelo product.template. Entender estos te ayudará a trabajar de manera efectiva con los productos.
1. name
Tipo: Char. Este campo almacena el nombre del producto. Se muestra en muchas vistas de Odoo y es el identificador principal para la plantilla de producto.
2. create_date
Tipo: Datetime. Almacena la fecha y hora en que se creó el registro. Gestionado automáticamente por Odoo. Útil para informes y auditorías.
3. write_date
Tipo: Datetime. Almacena la fecha y hora de la última modificación. También gestionado automáticamente. Ayuda a rastrear cuándo se actualizó por última vez la información.
4. active
Tipo: Booleano. Bandera de eliminación suave. Cuando es Falso, el registro se archiva y se oculta de las vistas predeterminadas. Los registros no se eliminan físicamente.
5. secuencia
Tipo: Entero. Orden de visualización para la clasificación. Se utiliza en listas de productos y menús desplegables. Los valores más bajos aparecen primero.
6. tipo
Tipo: Selección. Tipo de producto: Consumible, Servicio o Producto Almacenable. Los consumibles no se rastrean en stock. Los servicios no tienen inventario físico. Los productos almacenables se rastrean en el inventario.
7. categ_id
Tipo: Many2one (product.category). La categoría del producto. Impulsa informes, rutas predeterminadas y organización del catálogo. Las categorías pueden ser jerárquicas.
8. list_price
Tipo: Flotante. El precio de venta. Se utiliza como predeterminado al crear cotizaciones. Puede ser anulado por listas de precios o precios específicos de variantes.
9. standard_price
Tipo: Flotante. El precio de costo. Se utiliza para cálculos de margen y valoración de inventario. Afecta a los informes de rentabilidad.
10. currency_id
Tipo: Many2one (res.currency). La moneda para list_price y standard_price. Generalmente heredada de la empresa.
11. uom_id
Tipo: Many2one (uom.uom). La unidad de medida para ventas. Define cómo se expresan las cantidades (por ejemplo, Unidades, Kg, Litros).
12. uom_po_id
Tipo: Many2one (uom.uom). La unidad de medida para compras. Puede diferir de uom_id en escenarios de conversión.
13. default_code
Tipo: Char. Referencia interna o código. Útil para la asignación de sistemas externos y numeración personalizada. A menudo se utiliza como SKU.
14. barcode
Tipo: Char. Código de barras para escaneo. Utilizado en POS, almacén e inventario. Para variantes, el código de barras suele estar en product.product.
15. description
Tipo: Char. Descripción interna. Visible solo para usuarios internos. Utilizada para notas internas sobre el producto.
16. description_sale
Tipo: Texto. Descripción de ventas. Se muestra en cotizaciones y facturas. Puede incluir HTML para formateo.
17. descripción_compra
Tipo: Texto. Descripción de compra. Se muestra en órdenes de compra y facturas de proveedores. Ayuda a los compradores a comunicarse con los proveedores.
18. venta_ok
Tipo: Booleano. Indica si el producto puede ser vendido. Cuando es Falso, el producto se oculta de los formularios de ventas y cotizaciones.
19. compra_ok
Tipo: Booleano. Indica si el producto puede ser comprado. Cuando es Falso, el producto se oculta de los formularios de compra.
20. peso
Tipo: Flotante. Peso del producto. Se utiliza para cálculos de envío y logística. La unidad depende de la configuración de UoM de la empresa.
21. volumen
Tipo: Flotante. Volumen del producto. Se utiliza para logística y planificación de capacidad de almacén.
22. ids_variante_producto
Tipo: Uno a muchos (product.product). La lista de variantes de producto. Cada variante hereda de la plantilla.
23. product_variant_count
Tipo: Entero. Número de variantes. Computado a partir de product_variant_ids. Usado para visualización y filtrado.
24. image_1920
Tipo: Binario. Imagen del producto. Odoo almacena múltiples tamaños. Usado en formularios, informes y en el sitio web.
25. responsible_id
Tipo: Muchos a uno (res.users). El usuario responsable. Usado para la gestión de productos y la asignación de actividades.
26. company_id
Tipo: Muchos a uno (res.company). En configuraciones de múltiples empresas, esto indica a qué empresa de Odoo pertenece el producto.
27. tax_ids
Tipo: Muchos a muchos (account.tax). Impuestos del cliente para ventas. Aplicados en facturas y cotizaciones.
28. supplier_tax_id
Tipo: Many2many (account.tax). Impuestos de proveedor para compras. Aplicado en las facturas de proveedores.
29. attribute_line_ids
Tipo: One2many. Líneas de atributos de producto para variantes. Define qué atributos (por ejemplo, Tamaño, Color) crean variantes.
30. route_ids
Tipo: Many2many (stock.route). Rutas de stock. Determina cómo se mueve el producto a través de la cadena de suministro (por ejemplo, Comprar, Hacer por Pedido).
31. property_stock_production
Tipo: Many2one (stock.location). Ubicación de producción para productos manufacturados. Se utiliza cuando el tipo es Almacenado y la ruta incluye fabricación.
32. property_stock_inventory
Tipo: Many2one (stock.location). Ubicación de ajuste de inventario. Se utiliza para conteos y correcciones de stock.
33. property_valuation
Tipo: Selección. Método de valoración de inventario: Automatizado o Manual. Afecta cómo se calcula el costo.
34. property_cost_method
Tipo: Selección. Método de costeo: Estándar o FIFO. Determina cómo se calcula el valor del inventario.
35. property_account_income_id
Tipo: Many2one (account.account). Cuenta de ingresos por ventas. Se utiliza al facturar.
36. property_account_expense_id
Tipo: Many2one (account.account). Cuenta de gastos por compras. Se utiliza al recibir facturas de proveedores.
37. invoice_policy
Tipo: Selección. Cuándo facturar: Cantidades de pedido o Cantidades entregadas. Afecta cuándo se reconoce el ingreso.
38. expense_policy
Tipo: Selección. Cuándo contabilizar el gasto: Pedido o Entregado. Afecta cuándo se reconocen los costos.
39. service_type
Tipo: Selección. Para productos de servicio: Manual, Hoja de tiempo o Hitos. Determina cómo se rastrean y facturan los servicios.
40. optional_product_ids
Tipo: Many2many (product.template). Productos opcionales para venta adicional. Se muestran al agregar este producto a una cotización.
Cómo se utiliza este modelo en los flujos de trabajo empresariales
1. Ventas y Cotizaciones
Cuando un vendedor crea una cotización, selecciona productos del catálogo. El modelo product.template proporciona el producto base. Se eligen variantes cuando el producto tiene atributos (tamaño, color).
2. Comercio Electrónico
En el sitio web, los clientes ven plantillas de productos en el catálogo. Cuando hacen clic en un producto, pueden elegir entre variantes. La plantilla contiene la descripción y las imágenes compartidas.
3. Compras y Proveedores
Los pedidos de compra y las facturas de proveedores están vinculados a product.template. El campo purchase_ok controla la visibilidad. supplier_tax_id y uom_po_id determinan el comportamiento de compra.
4. Inventario y Fabricación
Los movimientos de stock y las órdenes de fabricación hacen referencia a variantes de productos. La plantilla define rutas, valoración y método de costo. El inventario se rastrea por variante.
5. Facturación
Las facturas y los recibos hacen referencia a líneas de productos. La plantilla proporciona reglas fiscales y cuentas contables. La política de facturación determina cuándo se reconoce el ingreso.
Cómo los desarrolladores extienden este modelo
Los desarrolladores extienden product.template utilizando varios patrones. La herencia de modelos de Odoo es el principal mecanismo.
Herencia de Modelos
Utiliza _inherit = 'product.template' para extender el modelo. Esto es la herencia de modelos de Odoo en acción. Agrega nuevos campos de Odoo, sobrescribe métodos o añade restricciones. El modelo heredado en Odoo mantiene tus cambios en un módulo separado para facilitar las actualizaciones. Cuando heredas un modelo en Odoo, lo extiendes sin modificar el original.
Añadiendo Campos
Define nuevos campos de Odoo en tu modelo heredado. Utiliza el tipo de campo correcto: Char, Many2one, Boolean, Integer, Text, Selection. Considera campos dependientes de la empresa para multiempresa.
Extensiones de Python
Sobrescribe create, write o unlink para añadir lógica. Utiliza super() para llamar al original. Ten cuidado con los campos computados y sus dependencias.
Odoo Studio
Odoo Studio te permite añadir campos sin código. Es bueno para personalizaciones rápidas. Para lógica compleja o actualizaciones, los módulos personalizados son más mantenibles.
Mejores prácticas
- Utiliza correctamente la relación de variante de plantilla. Coloca los datos compartidos en la plantilla, y los datos específicos de la variante en product.product.
- Establece categ_id para un enrutamiento y reporte adecuados. Las categorías impulsan el comportamiento predeterminado.
- Utiliza default_code para el mapeo con sistemas externos. Mantenlo único siempre que sea posible.
- Al construir integraciones de API, utiliza la API XML-RPC o JSON-RPC. El modelo product.template está completamente expuesto como un modelo de API en Odoo. Mapea los IDs externos con cuidado.
- Para campos personalizados, utiliza el prefijo
x_o un prefijo de módulo para evitar conflictos con futuras versiones de Odoo.
Errores comunes
- Crear plantillas duplicadas en lugar de usar variantes. Utiliza attribute_line_ids para productos que solo difieren en tamaño, color, etc.
- Confundir product.template y product.product. Cuando necesites datos específicos de variantes (código de barras, SKU), utiliza product.product.
- Olvidar establecer sale_ok o purchase_ok. Los productos están ocultos en los formularios cuando estos son False.
- Sobrescribir métodos centrales sin llamar a super(). Esto puede romper otros módulos o futuras actualizaciones.
- Agregar campos personalizados requeridos sin valores predeterminados. Los registros existentes fallarán en la validación durante la actualización.
Conclusión
El modelo product.template es central en Odoo. Almacena definiciones de productos y atributos compartidos. Comprender sus campos y cómo los módulos lo extienden te ayudará a configurar, personalizar e integrar Odoo de manera efectiva.
Ya seas un consultor funcional mapeando catálogos de productos o un desarrollador construyendo módulos personalizados, un sólido conocimiento de product.template te ahorrará tiempo y evitará errores.
Comienza con Dasolo
Dasolo ayuda a las empresas a implementar, personalizar y optimizar Odoo. Nos especializamos en integraciones de API y desarrollo de Odoo. Nuestro equipo tiene una profunda experiencia con la arquitectura de datos de Odoo y modelos como product.template.
Si necesitas ayuda con tu implementación de Odoo, módulos personalizados o integraciones, estamos aquí para ayudar. Reserva una demostración para discutir tu proyecto.