— Cuando el C-3PO de tu inventario no sabe que hay cajas dentro de cajas dentro de palets —
Empresas importadoras de todo tipo —electrónicos, repuestos, calzado, juguetes, lo que se te ocurra— se enfrentan a un problema que el mismísimo Obi-Wan jamás anticipó: los empaques no vienen sueltos, vienen anidados. Y Odoo, tan genial como es con sus módulos de inventario, tiene un punto ciego del tamaño de una Estrella de la Muerte cuando se trata de empaques recursivos.
Este artículo cuenta la historia real de una empresa importadora que necesitaba que Odoo entendiera que una Masterbox contiene 4 unidades, y que un palet contiene 48 Masterbox, y que si el cliente pide 792 unidades, el sistema debería poder calcular que eso son 198 Masterbox y 4.125 palets.
Spoiler: Odoo v17 no pudo. Pero encontramos el camino. Y en el proceso, aprendimos algo valioso sobre los límites de la Fuerza (y de los sistemas ERP).
¿Para quién es este artículo? Para consultores funcionales de Odoo, PMs de implementación, y dueños de operaciones logísticas que están considerando migrar sus procesos de empaques a Odoo. No necesitás saber programar — solo tener ganas de entender un problema fascinante y sus soluciones posibles.
📌 Contexto: Hace mucho tiempo, en una empresa muy lejana...
Imaginá una empresa que importa equipos eléctricos desde el planeta Corellia —famoso por su industria pesada— hacia varios planetas del Borde Medio. No es una operación chica: hablamos de más de 1.000 productos distintos, cada uno con su propia configuración de empaque. Llegan en contenedores hyperspaciales, viajan desde las fábricas de Corellia hasta zonas francas en planetas como Naboo, Alderaan, Bespin y Coruscant, y desde ahí se distribuyen a clientes finales.
El negocio no es complicado conceptualmente: comprás, importás, almacenás, vendés. Pero el diablo está en los detalles de cómo se empacan las cosas.
Los productos no viajan sueltos. Viajan así:
Unidad individual (retail)
└── Masterbox (caja maestra, contiene 4 unidades)
└── Palet (plataforma de madera, contiene 48 Masterbox)
└── Contenedor marítimo (contiene ~22 palets)
Cada nivel tiene sus propias dimensiones, su propio peso, su propia estructura. Y cuando armás un packing list para la naviera, o un documento de internamiento para la aduana, necesitás mostrar toda la jerarquía.
La naviera no quiere saber cuántas unidades individuales hay. Quiere saber cuántos palets y cuántas cajas, porque necesita planificar la carga del contenedor. El almacén de zona franca quiere saber cuántos palets van a recibir para organizar el espacio. El seguro se calcula sobre el peso total con embalajes. Todo el mundo necesita la estructura anidada.
Pero Odoo v17... bueno, digamos que la Fuerza no está especialmente fuerte del lado de los empaques recursivos.
🎯 El Desafío: "Eso no está en las tablas, Obi-Wan"
La Historia de Usuario (en una galaxia no tan lejana)
Como jefe de operaciones logísticas de una importadora,
necesito que Odoo entienda que mis productos tienen múltiples niveles de empaque (unidad → masterbox → palet),
para poder generar packing lists y documentos aduaneros que reflejen la estructura real de la carga, sin tener que calcular todo a mano en Excel como un droide de primera generación.
El Flujo Actual (o la Era de los Arquitectos de Excel)
Antes de Odoo, el proceso era más o menos así:
- Las fábricas de Corellia producen la mercancía y la empacan en Masterbox sobre palets. Te mandan un holomensaje con el BL (Bill of Lading) y las facturas.
- El equipo local crea un "paquete" en Odoo —un grupo de productos que viajan juntos en el mismo contenedor— pero solo a nivel de unidades.
- El analista de operaciones arma manualmente el documento de internamiento en Excel: copia datos de facturas de múltiples proveedores, calcula costos, seguros, fletes.
- El coordinador logístico arma el packing list en Excel: hace capturas de pantalla de los packing lists que mandó cada proveedor, los pega en un Excel maestro, y calcula totales a mano.
- Todo eso se manda al almacén de zona franca.
- El almacén confirma recepción físicamente (sin sistema).
- Finalmente, alguien valida el picking en Odoo para que el stock quede correcto.
¿Cuántas horas de trabajo manual por cada contenedor? ¿Cuántos errores de cálculo? ¿Cuántas veces alguien tuvo que rehacer un documento porque la suma de pesos no daba?
Muchas. Demasiadas. Nivel "Padme perdiendo la voluntad de vivir" de frustración.
El Flujo Deseado (la Nueva República)
Lo que la empresa soñaba era algo como esto:
- Se crea la Orden de Compra en Odoo, indicando el tipo de embalaje del proveedor. Ej: "Este proveedor entrega este producto en Masterbox de 4 unidades."
- Al recibir la mercancía, Odoo registra no solo "llegaron 1000 unidades", sino "llegaron 250 Masterbox con 4 unidades cada una, organizadas en 6 palets (5 completos + 1 parcial)."
- El equipo agrupa productos en un Paquete (contenedor), con número de BL, referencias de órdenes de compra.
- La mercancía viaja desde Corellia hacia una estación espacial de tránsito (como la Estación Espacial de Nar Shaddaa), y de allí a la zona franca del planeta destino.
- Almacén recibe y confirma.
- El coordinador logístico valida el picking.
- Odoo genera automáticamente:
- ✅ Documento de Internamiento (PDF con productos, costos unitarios, totales, Incoterm, flete, seguro)
- ✅ Packing List (PDF con cajas, palets, pesos con y sin embalaje, dimensiones, cubicaje)
¿Suena a ciencia ficción? No lo es. Es Odoo... con esteroides. O con un droide de protocolo bien configurado.
Soluciones Que NO Funcionan (o que no funcionaron)
La empresa ya había probado varias alternativas antes de llamar a los consultores:
| Lo que probaron | Por qué no sirvió |
| Poner todo como producto suelto y calcular la estructura a mano en el reporte | No escala. Con 60+ líneas de productos por contenedor, los errores de cálculo son inevitables |
| Separar en múltiples órdenes de compra (una por nivel de empaque) | Pierde la relación: no es una compra de palets, es una compra de productos que viajan en palets |
| Usar notas en las líneas ("este producto va en Masterbox de 4") | No es funcional. Los reportes no leen notas, y nadie quiere programar un parser de texto libre para calcular cubicaje |
| Seguir en Excel | Es lo que vienen haciendo y ya están hartos. Además el know-how se va cuando la persona clave se jubila |
🔍 Análisis Funcional: ¿Qué sabe hacer Odoo v17 con empaques?
Cómo viene de fábrica
Odoo v17 tiene dos conceptos relacionados con empaques:
product.packaging(Embalajes del producto): Define que un producto tiene un tipo de empaque estándar. Ej: "Este producto se vende en cajas de 12 unidades." Es una relación directa entre un producto y un embalaje, con cantidad. Pero solo un nivel. No podés decir "una Masterbox contiene 4 unidades, y un palet contiene 48 Masterbox."
stock.package_type(Tipos de paquete): Define tipos de contenedores físicos (cajas, palets) con dimensiones y peso. Se usa para agrupar productos en paquetes físicos durante el picking. Tampoco tiene relaciones jerárquicas.
En palabras simples: Odoo v17 sabe que vendés un producto en cajas. Pero no sabe que esas cajas van dentro de palets, y que los palets van dentro de contenedores. Cada nivel de empaque es un objeto independiente y aislado.
La configuración que se necesita
Para entender la magnitud del problema, acá están los datos que la empresa necesitaba cargar:
Por producto (más de 1.000 productos):
- Peso unitario (ej: 4.6 kg)
- Volumen unitario (ej: 0.0096 m³)
- Dimensiones unitarias
Por Masterbox (configurable por producto):
- Cantidad de unidades que contiene (ej: 4)
- Dimensiones propias (ej: 568×365×211 mm)
- Peso máximo con producto adentro
Por tipo de palet (~80-90 tipos diferentes):
- Dimensiones (ej: 1150×1150×1850 mm)
- Peso de la madera sola (ej: 15 kg)
- Peso máximo soportado
- Cuántas Masterbox entran
Y la relación jerárquica entre todo eso:
- Unidad → Head → Masterbox
- Masterbox → Head → Palet
- Masterbox → Left → Contenedor marítimo
Odoo v17, como un joven Skywalker, tiene el potencial pero todavía no domina la Fuerza para manejar esta complejidad.
El problema concreto (con números reales)
Tomemos un producto cualquiera. Digamos, el Regulador Voltaje RC-1000:
- 1 unidad = 4.6 kg
- 1 Masterbox = 4 unidades = 18.4 kg (dimensiones: 568×365×211 mm)
- 1 Palet = 48 Masterbox = 192 unidades = ~271 kg total (incluyendo 15 kg de madera del palet)
- Dimensiones del palet: 1150×1150×1850 mm
Si un cliente pide 792 unidades:
→ 792 ÷ 4 = 198 Masterbox
→ 198 ÷ 48 = 4.125 palets
→ 4 palets completos + 1 palet parcial (6 Masterbox)
→ Peso total producto: 792 × 4.6 kg = 3,643.2 kg
→ Peso Masterbox: 198 × 0 kg (embalaje liviano) ≈ 0 kg adicional
→ Peso palets: 5 × 15 kg (madera) = 75 kg
→ Peso total con embalaje: ~3,718.2 kg
→ Volumen total:?
Este cálculo, que un humano hace en 2 minutos con calculadora pero con alto riesgo de error, Odoo v17 no puede hacerlo automáticamente porque no entiende que las relaciones son recursivas: la Masterbox está DENTRO del palet, y el producto está DENTRO de la Masterbox.
¿Y si el contenedor lleva 3 productos diferentes cada uno con su propio ratio de empaque?
Esto no es un problema teórico. En la práctica, los contenedores de 40 pies llevan combinaciones de productos, cada uno con su propia estructura de empaque. El Excel que la empresa usaba como calculadora de contenedores hacía estas cuentas mágicamente. Replicar eso en Odoo era el desafío.
💡 Las Soluciones: Tres Caminos (como en toda buena historia de Star Wars)
Frente a este problema, identificamos tres caminos posibles. Como en Star Wars, cada uno tiene su lado luminoso y su lado oscuro.
🌙 Opción A: El Camino del Rebelde (Workaround en v17)
Qué hace: Configurar cada nivel de empaque como un objeto independiente y calcular las relaciones manualmente en los reportes.
- Masterbox como
product.packagingdel producto - Palet como
stock.package_type - La relación jerárquica se calcula en los reportes QWeb mediante lógica condicional
Pros:
- ✅ Se puede implementar en la versión actual
- ✅ Sin migración
- ✅ Costo y esfuerzo menor
- ✅ Los usuarios no notan la diferencia (el reporte se ve igual)
Contras:
- ❌ No hay relación jerárquica nativa entre Masterbox y Palet
- ❌ Los cálculos se hacen en el reporte, no en los datos
- ❌ No se puede representar un palet mixto (con diferentes productos)
- ❌ El peso del palet (madera) se suma una vez, no por cada producto
- ❌ Si cambia la estructura de empaque, hay que tocar el reporte
Veredicto: Es la solución pragmática. Como la Alianza Rebelde, hace cosas imposibles con recursos limitados. Pero no escala para palets mixtos ni configuraciones complejas.
🧘 Opción B: El Camino del Jedi (Esperar a Odoo v19/v20)
Qué hace: Postergar la implementación completa hasta que Odoo tenga soporte nativo para empaques recursivos. Las versiones v19+ prometen mejor soporte para unidades de medida y empaques anidados.
Pros:
- ✅ Solución nativa, sin desarrollo custom
- ✅ Cálculos automáticos por nivel
- ✅ Soporte oficial, actualizaciones futuras compatibles
Contras:
- ❌ El cliente necesita la solución AHORA, no en 6-12 meses
- ❌ La migración v17 → v19/v20 no es inmediata
- ❌ Presión del equipo de operaciones (que sigue sufriendo con Excel)
- ❌ No hay fecha confirmada de cuándo estará disponible el soporte completo
Veredicto: Es la opción de Yoda: "Paciencia, joven Padawan." Sensata, pero no siempre viable cuando el negocio presiona.
⚡ Opción C: El Camino Sith (Desarrollo Custom)
Qué hace: Construir un desarrollo a medida que agregue jerarquía de empaques en v17, con reportes QWeb personalizados.
- Crear un modelo personalizado que defina relaciones jerárquicas (Embalaje → Subembalaje)
- Configurar Masterbox como nivel 1, Palet como nivel 2
- Reportes QWeb que recorran la jerarquía y calculen automáticamente
- Container Calculator integrado en los reportes
Pros:
- ✅ Solución completa ahora, no después
- ✅ Maneja palets mixtos
- ✅ Cálculos automáticos precisos
- ✅ Independiente de la versión de Odoo
Contras:
- ❌ Costo de desarrollo y mantenimiento
- ❌ Hay que actualizarlo en cada upgrade mayor
- ❌ Si Odoo eventualmente lo soporta nativo, quizás quede obsoleto
Veredicto: "El lado oscuro ofrece poder… ¡poder sin límites!" Pero también responsabilidad. La solución custom es la más completa, pero requiere mantenimiento.
La Decisión
La empresa terminó yendo por un híbrido: implementación del workaround en v17 (Opción A) para solucionar el problema inmediato mientras planifican la migración a v19/v20 (Opción B) donde esperan tener soporte nativo. El desarrollo custom (Opción C) quedó como plan de contingencia si las versiones futuras no cumplen las expectativas.
✅ Resultados y Beneficios: La Nueva República Llega a los Empaques
Cómo cambió el día a día
Antes:
- Procesamiento manual de cada contenedor: 4-6 horas de trabajo del equipo de operaciones
- Packing lists con riesgo de errores de cálculo
- Capturas de pantalla pegadas en Excel como si fuera un collage de Pinterest
- Sin trazabilidad entre documentos y registros de Odoo
- Dependencia crítica de una o dos personas que "sabían cómo hacerlo"
Después del workaround funcional:
- Odoo genera automáticamente el packing list con: cantidad de cajas, cantidad de palets, peso con y sin embalaje, dimensiones, cubicaje
- El documento de internamiento se genera con costos, fletes, seguros
- Se redujeron los errores de cubicaje que obligaban a reabrir contenedores
- Cualquier persona del equipo puede generar los documentos (no solo los "arquitectos de Excel")
Lo que aprendimos en el camino
- Excel no es un ERP. Por más mágico que sea el VLOOKUP del coordinador logístico, la información en Excel no está integrada con Odoo. Cuando alguien actualiza un precio en Odoo pero no en el Excel, el documento de internamiento queda desactualizado.
- La estructura anidada no es un lujo, es un requerimiento funcional. Si tu negocio maneja empaques de múltiples niveles, no podés tratarlos como planos. La relación "caja dentro de palet dentro de contenedor" debe ser modelada en el sistema.
- El workaround te compra tiempo, pero la solución nativa te da tranquilidad. El camino híbrido (workaround ahora + migración después) es perfectamente razonable, siempre que tengas claro que el workaround tiene límites (palets mixtos, por ejemplo).
- Los 80-90 tipos de palet no son un detalle. La configuración inicial de datos es el 40% del esfuerzo. No subestimes la cantidad de trabajo que requiere cargar pesos, dimensiones y capacidades de cada tipo de palet.
Extensiones futuras (ideas que quedaron pendientes)
- Container Calculator nativo: Una herramienta que, dado un conjunto de productos con cantidades, calcule automáticamente cuántos palets y contenedores se necesitan, optimizando el espacio.
- Palets mixtos: Que un palet pueda contener diferentes productos (ej: 30 Masterbox de producto A + 18 Masterbox de producto B en el mismo palet).
- Integración con transportistas: Que el sistema envíe automáticamente el packing list a la naviera o al agente aduanal.
- Escaneo de códigos de barra de palets: Para que al recibir en almacén, se pueda escanear cada palet y el sistema sepa exactamente qué contiene.
📚 Para Profundizar (sin salir de este cuadrante de la galaxia)
- Odoo Inventory Documentation: La documentación oficial de empaques en Odoo. Leela con ojo crítico — te va a mostrar qué SÍ se puede, pero también te va a ayudar a ver los silencios sobre lo que NO se puede.
- Odoo Packaging Types: Sobre tipos de paquete en inventario. Útil para entender los límites.
- Forum Odoo: "Packaging hierarchy / recursive packaging": Buscá este tema en el foro de Odoo. Hay discusiones interesantes de gente que enfrentó el mismo problema.
- Odoo v19 Release Notes: Para estar al tanto de cuándo agregan soporte nativo para empaques recursivos.
💬 ¿Tu experiencia es diferente?
¿Tu empresa también importa productos con empaques anidados? ¿Encontraste alguna solución creativa? ¿O te fuiste por el lado oscuro del desarrollo custom?
Contanos en los comentarios. Porque si algo aprendí en esta galaxia de ERP, es que cada empresa tiene su propia Estrella de la Muerte — algún proceso que parece imposible hasta que alguien encuentra la rendija.
Que la Fuerza (del inventario) te acompañe.
✨ Bonus track: Este artículo está inspirado en un caso real de una importadora de equipos eléctricos. Los nombres de productos y personas han sido cambiados para proteger a los inocentes (y a los que todavía usan Excel). Pero el problema es real, y si lo estás viviendo, sabemos cómo se siente. Vos no estás solo en esta galaxia.