Módulo de Integración con Mercado Libre
Suite completa de integración MercadoLibre para Odoo Enterprise o Community. Publicación masiva, sincronización de stock/precios, gestión de órdenes, múltiples cuentas y contabilidad.
Vendé en Mercado Libre sin salir de Odoo: publicás, sincronizás stock y precios, y las ventas entran solas como pedidos.
El conector mantiene tu catálogo de Odoo y tus publicaciones de Mercado Libre hablando entre sí: publicación masiva, stock y precios al día en los dos lados, e importación automática de las órdenes con los datos del comprador y del envío. Las preguntas de los compradores se responden desde Odoo.
Está pensado para operaciones reales, no para el caso simple: varias cuentas de Mercado Libre en una sola instalación, contabilidad con comisiones y costos de envío, gestión de stock multi-ubicación y las campañas de Mercado Libre. Funciona en Odoo 16, 17, 18 y 19, tanto Enterprise como Community.
Por qué existe. Mercado Libre y Odoo resuelven cosas distintas y ninguno de los dos cede: el marketplace manda en la venta, el ERP manda en el stock, la factura y el número. Sin un puente, alguien del equipo pasa el día copiando datos de una pantalla a la otra — y ahí es donde aparecen el sobrevendido, el precio viejo y el pedido que nadie cargó. Este módulo es ese puente, y lo venimos manteniendo desde 2015, versión de Odoo tras versión de Odoo.
About this Work
Desarrollado por Moldeo Interactive desde 2015, MercadoLibre Publisher es el conector más maduro y estable del mercado, con más de 500 instalaciones activas en toda Latinoamérica.
Certificado como Moldeo Verified Partner y mantenido activamente con actualizaciones mensuales.
MercadoLibre en números
El módulo en funcionamiento
Publicar productos con un clic
Publicación de productos en MercadoLibre desde la ficha del producto en Odoo: se publica con un clic y queda vinculado el ID de la publicación, el SKU y el precio.
Panel de control de la cuenta
Panel de control de la cuenta: órdenes, publicaciones, stock y estado de los CRONs, todo monitoreado en un solo lugar.
Automatización con CRONs
Automatización total: los CRONs de órdenes, stock y precios se ejecutan solos y reportan su tasa de éxito.
Características y beneficios
Costos Reales por Venta
Comisión de ML, costo de envío, cupón y retenciones se asientan desde el detalle real del pago — el margen de la venta deja de ser una estimación.
Publicación Masiva
Publica miles de productos de Odoo a MercadoLibre con un clic. Incluye imágenes, variantes y SKU.
Importación de Órdenes
Importa automáticamente órdenes, pack orders, datos de cliente y costos de envío.
Múltiples Cuentas
Gestiona varias cuentas de MercadoLibre desde una única instalación de Odoo.
Depósitos ML y Multi-Almacén
Mapeá cada depósito logístico de MercadoLibre a una ubicación de Odoo: la venta se rutea sola al almacén desde el que ML surtió.
Promociones y Cuotas
Suscribí publicaciones a campañas de promoción y de cuotas de MercadoLibre desde Odoo, con verificación de que quedaron realmente aplicadas.
Impuestos y Retenciones Mapeados
Cada cargo de MercadoPago —comisión, envío, cupón y retenciones de ISR/IVA— se lee del detalle real del pago y se mapea a un impuesto de Odoo con reglas configurables.
Sincronización en Tiempo Real
Stock y precios sincronizados automáticamente usando notificaciones de MercadoLibre.
Monitoreo y Benchmark de Procesos
Cada proceso automático reporta última y próxima corrida, duración, duración por ítem, promedio/mínimo/máximo, ítems procesados y tasa de éxito — desde la ficha de la cuenta.
| Categoría | Característica | Incluido |
|---|---|---|
| Functional |
Gestión de Stock Avanzada
Control de inventario multi-ubicación con reglas de sincronización configurables. |
|
| Functional |
Gestión de Preguntas
Responde preguntas de compradores directamente desde Odoo. |
|
| Functional |
Publicación Asistida
Sugerencia de categoría, aviso previo de atributos obligatorios faltantes con su nombre en español, y medidas e impuestos enviados a ML en la publicación. |
|
| Functional |
Mensajes del Comprador
Las órdenes marcan los mensajes post-venta sin responder, con filtro dedicado y enlace directo a la conversación en MercadoLibre. |
|
| Integrations |
Integración Contable
Registra automáticamente comisiones de MercadoLibre y costos de envío en tu contabilidad. |
|
| Integrations |
Facturación Fiscal por País
AFIP/ARCA en Argentina con sincronización de secuencia y reconciliación de CAE, Factura Global en México con diario y serie propios, y autofacturación configurable. |
|
| Support |
Soporte Técnico Incluido
Incluido
Instalación guiada, capacitación y soporte técnico por email con respuesta en 24hs. |
|
| Technical |
Herramientas de Diagnóstico
Reporte de configuración de stock en 8 secciones, reactivación automática de publicaciones pausadas con stock, y diagnóstico del pipeline contable. |
|
Demo en vivo
Recorrido completo de la integración, de punta a punta: publicación, ventas, stock, impuestos y campañas. Grabado sobre instalaciones reales.
Preguntas frecuentes
El precio corresponde a la instalación, configuración y capacitación, e incluye 3 meses de soporte total gratuito.
A partir de los 3 meses, de forma opcional podés continuar con soporte y actualizaciones por 50 EUR/mes o 500 EUR/año.
No. Vendemos el combo Premium completo. Los módulos no funcionan de forma independiente en una operación real: la facturación necesita el stock, el stock necesita el núcleo, y todo depende de la capa de API. Es un sistema integrado, no piezas opcionales — y por separado termina saliendo más caro.
- Todos los módulos del combo Premium
- Instalación y configuración
- 4 capacitaciones durante el primer mes
- 3 meses de soporte técnico y actualizaciones incluidos
- Acceso al repositorio privado de GitHub desde el primer día
A partir del cuarto mes es opcional tomar una suscripción para continuar con soporte y actualizaciones. Tres modalidades:
- Mensual — 50 € / mes
- Anual — 500 € / año (equivale a ahorrar dos meses)
- Combo — 80 € / mes (para quienes tienen más de un producto Moldeo: hoy Producteca + Mercado Libre)
Todas con permanencia mínima de un año. Incluye actualizaciones del módulo, soporte técnico y migraciones a nuevas versiones de Odoo sin costo adicional.
No. Todas las modalidades tienen permanencia mínima de un año. Lo que sí podés elegir es cómo pagarla dentro de ese año: en cuotas mensuales o de una sola vez con el plan anual (que sale más barato).
Con suscripción activa, ambas cosas están incluidas sin costo adicional:
- Cuando Mercado Libre cambia su API, actualizamos el módulo de nuestro lado.
- Cuando migrás a una nueva versión de Odoo, la migración del módulo es gratuita.
MercadoLibre Premium Suite es 100% compatible con Odoo Community y Enterprise, versión 17.0. También tenemos versiones para Odoo 14, 15 y 16.
No. Odoo en su versión SaaS (odoo.com) no permite instalar módulos de terceros — es una restricción de Odoo, no del integrador. Para usarlo se necesita estar en Odoo.sh o en un servidor propio (on-premise).
Odoo 16, 17, 18 y 19. Si estás implementando Odoo desde cero, conviene arrancar en la versión más nueva disponible: tiene mayor vida útil de soporte y las últimas mejoras del integrador.
Sí, el módulo funciona en todos los países donde opera MercadoLibre: Argentina, Brasil, México, Colombia, Chile, Perú, Uruguay, Ecuador, Venezuela, Bolivia, Paraguay, Costa Rica, Panamá, República Dominicana, Honduras, Guatemala y Nicaragua.
El módulo gratis (open source) cubre lo básico: conexión con Mercado Libre, importar órdenes y publicar productos. El Premium agrega lo que hace que funcione en una operación real: facturación automática, conciliación de pagos de Mercado Pago, manejo correcto de publicaciones Full, multi-cuenta y —lo más importante— mantenimiento.
Mercado Libre cambia su API seguido. Con el gratis, cuando eso pasa la integración se rompe y dependés de que alguien lo arregle sin plazo. Con el Premium está cubierto dentro del soporte.
Sí. El módulo multi-cuenta viene incluido en el combo aunque hoy uses una sola cuenta — queda disponible para cuando escales a más.
La instalación es simple:
- Descargá los módulos desde Odoo Apps
- Instalá desde el menú Aplicaciones de Odoo
- Seguí nuestra guía de configuración (incluida con la compra)
- Conectá tu cuenta de MercadoLibre con OAuth
Si necesitás ayuda, nuestro equipo de soporte está disponible para guiarte.
Depende del tamaño del catálogo y de qué tan preparado esté el Odoo del cliente. Desde la confirmación del pago hasta tener el módulo instalado y funcionando suele resolverse en 24-48 horas.
Lo esencial:
- Datos fiscales y contabilidad configurados (localización fiscal, plan de cuentas, diario de ventas).
- Inventario activado, con un almacén y stock cargado.
- Tus productos con SKU / Referencia interna definida — el campo más importante: sin SKU el integrador no puede vincular productos de Odoo con publicaciones de ML.
- Una app creada en Mercado Libre (App ID, Secret Key y Seller ID).
El detalle completo te lo pasamos en el onboarding.
Sí, necesitás crear una aplicación en el Portal de Desarrolladores de MercadoLibre (es gratuito). Te proporcionamos instrucciones paso a paso para hacerlo.
Sí, ambos flujos:
- Preguntas de publicación (pre-venta): llegan automáticamente a Odoo y se responden desde ahí, con historial completo por publicación.
- Mensajes postventa: se gestionan desde la orden de venta correspondiente en Odoo, sin necesidad de abrir Mercado Libre.
850,00 € 750,00 €
Pago único — instalación, configuración y capacitación, con 3 meses de soporte gratuito. Soporte y actualizaciones posteriores: 50 €/mes o 500 €/año.
Actualizaciones
El problema principal: cuando MercadoLibre cancelaba una venta que ya se había facturado y despachado, el conector intentaba generar la devolución del remito y fallaba siempre con *"Especifique al menos una cantidad diferente a cero"*. Minor Release
- El problema principal: cuando MercadoLibre cancelaba una venta que ya se había facturado y despachado, el conector intentaba generar la devolución del remito y fallaba siempre con *"Especifique al menos una cantidad diferente a cero"*. En Odoo 16 la ventana de devolución se abría sin líneas (el conector la creaba por código y las líneas sólo se completan al abrirla a mano), así que no había nada que devolver. Es decir: en Odoo 16 la devolución automática nunca funcionó. Ahora las líneas se completan también por código y la devolución se crea sola.
- El proceso automático dejaba de reintentar nunca: como la devolución fallaba, el proceso volvía a intentarlo cada 5 minutos, para siempre, por cada venta cancelada en esa situación. Se agregó el mismo control de "no hay nada que devolver" que ya existía en las otras variantes, así que las entregas sin cantidades reales (típico de las ventas FULL, cuyo stock vive en el depósito de ML) se saltean limpio en vez de reintentarse eternamente.
- Se terminó el historial inundado de avisos repetidos: los avisos *"No se pudo devolver el albarán…"* y *"Cancelación de ML pendiente: factura publicada sin resolver"* se volvían a escribir en el historial de la venta en cada reintento. Ahora se escriben una sola vez; si la situación cambia (otra factura, otro remito), se vuelve a avisar. *Medido en un cliente AR: 2.047 mensajes repetidos en el historial de dos ventas y 514 errores por día en el registro del servidor.* Requiere actualizar el módulo (`-u meli_oerp`).
El problema: una publicación podía quedar con el stock de MercadoLibre desactualizado para siempre, sin ningún aviso. Minor Release
- El problema: una publicación podía quedar con el stock de MercadoLibre desactualizado para siempre, sin ningún aviso. El conector decide qué publicaciones re-enviar mirando la fecha del último movimiento de stock del producto; esa fecha se tomaba de *cuándo se creó* el movimiento y no de *cuándo cambió el stock*. Resultado: si el stock cambiaba sin crear un movimiento nuevo — validar un remito creado días antes, reservar o liberar mercadería, cancelar una entrega —, el conector no se enteraba. Peor: una vez enviado ese stock una primera vez, la publicación salía de la cola y ningún proceso automático la volvía a mirar nunca. Ahora la fecha considera la validación y las modificaciones posteriores del movimiento, y nunca puede "retroceder".
- Red de seguridad nueva: toda publicación cuyo último envío de stock a MercadoLibre supere los 7 días vuelve a la cola por sí sola, haya habido movimientos o no. Es configurable en la cuenta (*Resincronización de stock*); poner 0 la desactiva. Así, si alguna vez se pierde un aviso, el desfase dura días y no meses.
- Los kits (listas de materiales) entran en la cuenta: un producto tipo kit no tiene movimientos propios — su stock sale de los componentes. Ahora los movimientos de los componentes también reactivan la publicación del kit.
- Se detecta cuando MercadoLibre acepta el envío pero no aplica el stock. Hasta ahora, si ML respondía "OK" y dejaba la cantidad vieja, el conector lo daba por publicado y la publicación quedaba desactualizada en silencio. Ahora se compara la cantidad enviada contra la que responde ML y, si no coinciden, la publicación queda marcada como "ML aceptó el envío pero NO aplicó el stock" y se reintenta.
- Errores que se perdían: si fallaba algo al publicar el stock, el error quedaba anotado pero la operación se informaba como exitosa. Ahora el fallo se propaga y la publicación no se marca como actualizada.
- El diagnóstico de stock ahora guarda el estado real que le responde MercadoLibre (activa/pausada). Antes lo consultaba y lo descartaba, así que el estado guardado quedaba viejo por meses y generaba avisos falsos de "publicación pausada con stock" sobre publicaciones que en realidad estaban activas. *Detectado en una cuenta MX con 3.700 publicaciones: 209 movimientos validados con demora en 60 días quedaban fuera de la sincronización, y publicaciones con la fecha congelada desde hacía semanas.* Requiere actualizar el módulo (`-u meli_oerp`).
Al recalcular el flete, el conector reescribía la línea de envío con el mecanismo de Odoo, que primero borra la línea y recién después la vuelve a crear. Minor Release
- al recalcular el flete, el conector reescribía la línea de envío con el mecanismo de Odoo, que primero borra la línea y recién después la vuelve a crear. Si en ese momento la venta no tenía transportista asignado, o la recreación fallaba (compañía incompatible, orden ya facturada, impuestos), el borrado quedaba hecho y la venta se quedaba sin flete y sin transportista: el costo de envío no llegaba nunca a la factura, y el error se descartaba en silencio. Ahora, sin transportista válido no se toca la línea (solo se actualiza su precio) y la reescritura va dentro de un punto de guardado, de modo que si algo falla se deshace el borrado y la línea original sobrevive; los fallos quedan registrados en el log con la venta involucrada. *Detectado en un cliente AR: 47 órdenes sin flete en 7 semanas, 20 de ellas facturadas por debajo de lo cobrado al comprador.*
Las órdenes de MercadoLibre ahora muestran un contador de mensajes del comprador sin responder (post-venta), para saber de un vistazo qué ventas tienen un mensaje pendiente sin tener que revisar publicación por publicación en MercadoLibre. Minor Release
- Las órdenes de MercadoLibre ahora muestran un contador de mensajes del comprador sin responder (post-venta), para saber de un vistazo qué ventas tienen un mensaje pendiente sin tener que revisar publicación por publicación en MercadoLibre.
- Nuevo filtro "Con mensajes del comprador sin leer" en la lista de órdenes, y un enlace directo a la conversación en MercadoLibre.
- Se actualiza solo cada 10 minutos (proceso automático) y también hay un botón "Refrescar mensajes" en la cuenta para actualizarlo al instante.
Al traer las medidas e impuestos de una publicación (con "Traer medidas" o al importar), los datos ahora se escriben en todas las variantes de esa publicación, no solo en la primera. Minor Release
- Al traer las medidas e impuestos de una publicación (con "Traer medidas" o al importar), los datos ahora se escriben en todas las variantes de esa publicación, no solo en la primera. Antes, en publicaciones con varias variantes (por ejemplo distintos colores), solo la primera quedaba con las medidas cargadas y el resto quedaba vacío.
La importación de categorías y de productos ya no puede dejar la transacción de base de datos "abortada" cuando falla un paso frágil (carga de atributos de categoría, filtros de búsqueda o asignación de categoría a un ítem): cada paso queda aislado con un punto de guardado (savepoint), así un fallo puntual no interrumpe el resto de la sincronización con el error en cascada `InFailedSqlTransaction`. Minor Release
- La importación de categorías y de productos ya no puede dejar la transacción de base de datos "abortada" cuando falla un paso frágil (carga de atributos de categoría, filtros de búsqueda o asignación de categoría a un ítem): cada paso queda aislado con un punto de guardado (savepoint), así un fallo puntual no interrumpe el resto de la sincronización con el error en cascada `InFailedSqlTransaction`.
- Cierra además la causa raíz del error de clave foránea de categoría (`meli_category`) que aparecía al importar (#410): la categoría recién creada ya no se pierde en un rollback silencioso.
En el pedido de venta (sale.order) ahora se puede buscar y filtrar por datos del comprador y del destinatario de MercadoLibre Minor Release
- En el pedido de venta (sale.order) ahora se puede buscar y filtrar por datos del comprador y del destinatario de MercadoLibre:
- Nickname e ID del comprador ML (ej. "VIEIROBRIAN20210623234209" / "780371376").
- Provincia, Localidad, Barrio y Código Postal del receiver del envío. Aparecen en el buscador (filtros) y en la pestaña MercadoLibre del formulario del pedido.
- El objeto Envío (mercadolibre.shipment) ahora guarda además el Barrio y el Municipio del destinatario, parseados de la dirección que envía MercadoLibre. Feature genérica, promovida desde el cliente Deco/KPI (cuenta 526). Requiere actualizar el módulo (-u meli_oerp).
Nuevos campos en el producto (plantilla y variante): Ancho/Alto/Largo del producto (número + unidad) e IVA/Impuesto interno, que se completan al importar desde la ficha técnica de MercadoLibre. Minor Release
- Nuevos campos en el producto (plantilla y variante): Ancho/Alto/Largo del producto (número + unidad) e IVA/Impuesto interno, que se completan al importar desde la ficha técnica de MercadoLibre.
- Al publicar, esos mismos datos se envían a MercadoLibre como los atributos correspondientes (WIDTH/HEIGHT/LENGTH, VALUE_ADDED_TAX, IMPORT_DUTY). Enviar los impuestos —obligatorios— evita el error de publicación por atributo faltante.
La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Minor Release
- La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Antes terminaba en silencio: el proceso corría varios minutos sobre miles de productos y no informaba nada, así que desde la pantalla era indistinguible de que no hiciera nada.
- Se corrigió la acción masiva de la vista Lista, que además descartaba el resultado: aunque el proceso corriera bien, nunca llegaba ningún aviso al usuario.
- Si no hay ninguna cuenta de MercadoLibre conectada, o si ninguno de los productos seleccionados está vinculado a una publicación, ahora lo dice explícitamente en vez de terminar en silencio. Nota: "Traer medidas" trae las medidas del paquete de envío (Mercado Envíos: alto/ancho/largo/peso), marca, modelo y género. No trae medidas propias del producto (por ejemplo el ancho y el largo de una cortina).
La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Minor Release
- La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Antes terminaba en silencio: el proceso corría varios minutos sobre miles de productos y no informaba nada, así que desde la pantalla era indistinguible de que no hiciera nada.
- Se corrigió la acción masiva de la vista Lista, que además descartaba el resultado: aunque el proceso corriera bien, nunca llegaba ningún aviso al usuario.
- Si no hay ninguna cuenta de MercadoLibre conectada, o si ninguno de los productos seleccionados está vinculado a una publicación, ahora lo dice explícitamente en vez de terminar en silencio. Nota: "Traer medidas" trae las medidas del paquete de envío (Mercado Envíos: alto/ancho/largo/peso), marca, modelo y género. No trae medidas propias del producto (por ejemplo el ancho y el largo de una cortina).
Nuevos campos en el producto (plantilla y variante), en la pestaña MercadoLibre Plantilla, que se completan solos al importar desde la ficha técnica de la publicación Minor Release
- Nuevos campos en el producto (plantilla y variante), en la pestaña MercadoLibre Plantilla, que se completan solos al importar desde la ficha técnica de la publicación:
- Ancho / Alto / Largo del producto (valor numérico + su unidad, tal como los publica MercadoLibre). Son las medidas del producto (por ejemplo la cortina), distintas de las dimensiones del paquete de envío que ya existían.
- IVA y Impuesto interno (ej. "21 %", "0 %"). Suelen ser obligatorios para publicar; al traerlos automáticamente ya no hace falta cargarlos a mano.
- Estos campos se completan tanto al Importar productos como con el botón "Traer medidas", y MercadoLibre es la fuente autoritativa (si la publicación trae el dato, se actualiza; si no lo trae, no se borra lo que haya). Nota: las medidas del producto salen de los atributos de la publicación (Ancho/Alto/Largo). Si la variación de MercadoLibre trae su propia medida se usa esa; si no, se usa la de la publicación.
La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Minor Release
- La acción "Traer medidas" (botón del producto y acción masiva desde la vista Lista) ahora muestra un aviso en pantalla al terminar, con el resultado: cuántos productos se actualizaron, cuántos se omitieron por no tener publicación vinculada, y cuántos no se pudieron leer de MercadoLibre. Antes terminaba en silencio: el proceso corría varios minutos sobre miles de productos y no informaba nada, así que desde la pantalla era indistinguible de que no hiciera nada.
- Se corrigió la acción masiva de la vista Lista, que además descartaba el resultado: aunque el proceso corriera bien, nunca llegaba ningún aviso al usuario.
- Si no hay ninguna cuenta de MercadoLibre conectada, o si ninguno de los productos seleccionados está vinculado a una publicación, ahora lo dice explícitamente en vez de terminar en silencio. Nota: "Traer medidas" trae las medidas del paquete de envío (Mercado Envíos: alto/ancho/largo/peso), marca, modelo y género. No trae medidas propias del producto (por ejemplo el ancho y el largo de una cortina).
Cuando MercadoLibre rechaza una publicación por atributos faltantes, el mensaje ahora muestra el nombre real en español del atributo además de su código técnico. Minor Release
- Cuando MercadoLibre rechaza una publicación por atributos faltantes, el mensaje ahora muestra el nombre real en español del atributo además de su código técnico. Antes se veía "atributo obligatorio 'PART_NUMBER'"; ahora "atributo obligatorio Número de pieza [PART_NUMBER]". Si faltan varios (ej. Marca y Tipo de vehículo) se listan todos con su nombre. El nombre sale del catálogo de atributos de MercadoLibre ya importado en el sistema. ---
El botón "Sugerir Categoría" (pestaña MercadoLibre del producto) ahora responde en 1-2s en vez de ~10s. Minor Release
- El botón "Sugerir Categoría" (pestaña MercadoLibre del producto) ahora responde en 1-2s en vez de ~10s. Antes, al sugerir, se importaba cada categoría candidata con TODOS sus atributos y su árbol completo (decenas de llamadas a la API de MercadoLibre). Ahora la sugerencia trae sólo lo necesario para elegir (identificador + nombre) de las 3 primeras opciones; si la categoría ya existe en el sistema, no vuelve a consultar a ML.
- Los atributos completos de la categoría se cargan al SELECCIONARLA (no al sugerir), por lo que la publicación sigue validando y enviando todo igual que antes (el pre-flight de atributos obligatorios no cambia).
Cuando MercadoLibre rechaza una publicación, el aviso que ve el usuario ahora traduce a español claro y accionable varios errores que antes salían crudos en inglés Minor Release
- Cuando MercadoLibre rechaza una publicación, el aviso que ve el usuario ahora traduce a español claro y accionable varios errores que antes salían crudos en inglés:
- "attributes are required" / build-title → *"Faltan atributos obligatorios de la categoría. Completá la ficha técnica del producto (marca, modelo, código universal, etc.)…"*.
- `[family_name]` faltante → *"Falta el Nombre de la familia (Family Name)…"*.
- GTIN/EAN requerido o faltante → *"Debe definir el código de barras (GTIN/EAN)…"*.
- SKU del vendedor, categoría inválida/requerida, y otras propiedades del catálogo.
- Se mejoró la presentación: cuando el error llega como un único mensaje (no como lista de causas) —el caso típico de build-title— ahora se muestra con el mismo recuadro estilado (rojo si bloquea la publicación, amarillo si es advertencia), con ícono y un título claro, igual que la lista de causas. Antes ese caso se veía pobre y en amarillo fijo.
- Comportamiento defensivo: si un mensaje no coincide con ningún patrón conocido, se conserva el texto original de MercadoLibre (nunca se pierde información).
El barrido que detecta y cancela solas las ventas que MercadoLibre canceló días atrás (sin abrir el pedido) ahora se concentra en las órdenes en tránsito / no entregadas, que son las únicas que un comprador puede cancelar. Minor Release
- El barrido que detecta y cancela solas las ventas que MercadoLibre canceló días atrás (sin abrir el pedido) ahora se concentra en las órdenes en tránsito / no entregadas, que son las únicas que un comprador puede cancelar. Las ya entregadas se excluyen (no son cancelables por esa vía), lo que reduce muchísimo el volumen a revisar y permite que el barrido cubra toda la ventana de días configurada, en lugar de solo un puñado de las más recientes (que el proceso normal ya cubría).
- El barrido ahora recorre primero las órdenes más viejas de la ventana — que son justamente las de mayor riesgo de haber sido canceladas sin que Odoo se enterara — y deja para el final las más nuevas (ya cubiertas por el proceso normal).
- Se ampliaron los valores por defecto de la ventana (15 días) y del tope por ciclo (500); en la práctica se ajustan por configuración según el volumen de cada cuenta.
Nueva opción "Actualizar Título" en el wizard de Publicar. Minor Release
- Nueva opción "Actualizar Título" en el wizard de Publicar. Al publicar/actualizar productos en Mercado Libre ahora hay una casilla Actualizar Título (junto a Actualizar Stock / Actualizar Precio). Marcada, empuja solo el título de la/s publicación/es (`PUT /items/{id}` con `{ "title": ... }`), sin re-publicar el producto completo. Disponible en el wizard de producto y en el de plantilla. El título enviado sale del campo ML Title (`meli_title`) del producto; si está vacío se usa el nombre del producto.
- Reporte de error en pantalla. Si Mercado Libre rechaza el cambio de título (p. ej. título > 60 caracteres, publicación con catálogo/moderación o no modificable), el wizard muestra el detalle del error devuelto por ML en un aviso, en lugar de fallar en silencio. > Motivado por el cliente RPM Motos (#532), que necesitaba actualizar títulos de publicaciones desde > Odoo. El título es un dato a nivel item (no por variación): el PUT se hace siempre contra el item padre.
BUG-009 — Fecha de la orden = fecha real de MercadoLibre. Minor Release
- BUG-009 — Fecha de la orden = fecha real de MercadoLibre. Al crear/actualizar la orden de venta desde una orden de MercadoLibre, la Fecha de la orden (`date_order`) ahora toma la fecha de cierre de la operación en ML (o la fecha de creación como respaldo), en lugar del momento en que Odoo importó la orden. Las ventas dejan de "entrar con delay" con una fecha que no coincide con la de MercadoLibre.
- BUG-007 — Cancelación explícita al re-chequear estado. El re-chequeo puntual de estado de un pedido (`update_order_status`), cuando MercadoLibre reporta la orden como cancelada, ahora marca la orden de venta como cancelada y dispara la cancelación con detalle (albaranes/facturas) en lugar de reconfirmarla. Antes reconfirmaba de forma incondicional y las sub-órdenes de un pack podían quedar sin cancelar. > Corrige una regresión de sincronización: ambos arreglos vivían solo en un cliente (Dannok) y no > estaban en el código base; ahora quedan en el source para las 4 versiones (16/17/18/19). > (La versión 26.67 fue un arreglo específico de Odoo 18/19 —`action_create_returns_all`— y no > aplica a esta versión; por eso 17.0 salta de 26.66 a 26.68.)
Cada línea de la orden de MercadoLibre ahora guarda el depósito logístico de origen que ML asigna al surtir (el nodo de red y la tienda que ML manda en `Item.stock` de la orden), en dos campos nuevos de la línea de orden: "ML Stock Node ID" y "ML Stock Store ID". Minor Release
- Cada línea de la orden de MercadoLibre ahora guarda el depósito logístico de origen que ML asigna al surtir (el nodo de red y la tienda que ML manda en `Item.stock` de la orden), en dos campos nuevos de la línea de orden: "ML Stock Node ID" y "ML Stock Store ID". Es la base del surtido multi-almacén: permite rutear la venta al almacén/ubicación de Odoo que corresponde al depósito desde el que ML surte esa línea (la resolución vive en el módulo Stock, ver meli_oerp_stock). Sin mapeo cargado el comportamiento es idéntico al anterior (inerte).
El barrido que re-consulta a MercadoLibre el estado de los pedidos abiertos de días anteriores (para cancelarlos solos sin abrirlos uno por uno — ver 26.62) ahora puede trabajar por cuenta de MercadoLibre. Minor Release
- El barrido que re-consulta a MercadoLibre el estado de los pedidos abiertos de días anteriores (para cancelarlos solos sin abrirlos uno por uno — ver 26.62) ahora puede trabajar por cuenta de MercadoLibre. El método `orders_resync_status` acepta un parámetro opcional de cuenta: cuando se le indica, limita el barrido a los pedidos de esa cuenta y usa la compañía de su configuración. Sin ese parámetro, el comportamiento es idéntico al anterior (mono-cuenta). Esto habilita que en instalaciones con varias cuentas/tiendas de MercadoLibre en un mismo Odoo, TODAS las cuentas queden cubiertas (el dispatcher vive en el módulo Multi-cuenta).
Al importar/actualizar un producto desde MercadoLibre (y con la acción "Traer medidas"), las dimensiones del paquete del vendedor (Alto/Ancho/Largo/Peso del paquete — Mercado Envíos) ahora se corrigen con el valor de MercadoLibre, que es la fuente autoritativa del paquete. Minor Release
- Al importar/actualizar un producto desde MercadoLibre (y con la acción "Traer medidas"), las dimensiones del paquete del vendedor (Alto/Ancho/Largo/Peso del paquete — Mercado Envíos) ahora se corrigen con el valor de MercadoLibre, que es la fuente autoritativa del paquete. Antes, si un proceso viejo había dejado en esos campos la medida del *producto* en lugar de la del *paquete* (por ejemplo "100 cm", el ancho del producto, en vez de "10 cm", el del paquete), ese valor viejo equivocado se conservaba. Ahora MercadoLibre lo pisa.
- Si MercadoLibre no informa la medida del paquete, no se borra lo cargado (no se pisa con vacío). Marca/Modelo/Género siguen respetando la carga manual (sólo se completan si están vacíos).
Las cancelaciones (y cambios de estado) de pedidos hechas en MercadoLibre ahora se reflejan solas en Odoo, aunque el pedido sea más viejo que las últimas ~50 órdenes. Minor Release
- Las cancelaciones (y cambios de estado) de pedidos hechas en MercadoLibre ahora se reflejan solas en Odoo, aunque el pedido sea más viejo que las últimas ~50 órdenes. Antes, el cron horario de importación sólo repasaba las órdenes más nuevas por fecha de creación; si un pedido de días atrás se cancelaba en ML, la cancelación no bajaba a Odoo hasta abrir la orden a mano. Ahora un cron dedicado ("Cron Meli Orders Status Resync", cada 30 min) re-consulta los pedidos abiertos recientes y refleja la cancelación automáticamente (con su devolución/NC según la política contable ya configurada).
- Nuevos parámetros por compañía (Configuración ML → Automatización ML a Odoo): activar/desactivar el re-sync de estado, ventana en días hacia atrás (default 7) y tope de pedidos por ciclo (default 100) para acotar el uso de la API.
Se corrigió un error por el cual, en publicaciones con variaciones, el identificador de "producto de usuario" (user_product_id) se guardaba con un formato inválido y la actualización de stock por user-products no llegaba a intentarse. Minor Release
- Se corrigió un error por el cual, en publicaciones con variaciones, el identificador de "producto de usuario" (user_product_id) se guardaba con un formato inválido y la actualización de stock por user-products no llegaba a intentarse. Ahora se guarda correctamente cuando es inequívoco.
El relleno de medidas ("Traer medidas") ahora funciona también en instalaciones con varias cuentas de MercadoLibre. Minor Release
- El relleno de medidas ("Traer medidas") ahora funciona también en instalaciones con varias cuentas de MercadoLibre. La resolución de "de qué cuenta leer cada publicación" se hizo extensible: la versión base sigue funcionando con una cuenta por compañía, y el módulo multi-cuenta (meli_oerp_multiple) la completa para recorrer las cuentas reales. Sin este cambio, en instalaciones multi-cuenta el relleno no encontraba credenciales y no completaba nada.
El botón "Traer medidas" / acción de lista ya no da error y funciona con varias cuentas de MercadoLibre. Minor Release
- El botón "Traer medidas" / acción de lista ya no da error y funciona con varias cuentas de MercadoLibre. La acción de relleno (agregada en 26.58) fallaba al ejecutarse y, en cuentas con varios vendedores de ML en la misma base (p. ej. 3 cuentas), intentaba leer cada publicación con el token de una sola cuenta → error de permisos (403). Ahora cada publicación se lee con el token de la cuenta que realmente la posee (se agrupan por cuenta para no repetir conexiones), y se completa correctamente. Sin cambios en el mapeo de campos (que ya estaba OK).
Al importar un producto desde MercadoLibre ya se completan los campos de la pestaña "MercadoLibre / Plantilla". Minor Release
- Al importar un producto desde MercadoLibre ya se completan los campos de la pestaña "MercadoLibre / Plantilla". Antes, al traer un item de ML, la sección "Dimensiones del paquete (Vendedor – Mercado Envíos)" (Alto/Ancho/Largo/Peso del paquete) y los campos Marca, Modelo y Género quedaban vacíos — había que cargarlos a mano para poder re-publicar (Mercado Envíos exige las medidas del paquete). Ahora el import lee esos datos del propio item de ML y los rellena automáticamente. Si ML no informa un dato, no se pisa lo que hayas cargado a mano (es idempotente).
- Nuevo botón "Traer medidas" y acción masiva para los productos ya importados sin estos datos: en la ficha del producto (pestaña MELI Plantilla) y como acción sobre la lista de productos, relee el item de ML de cada producto con publicación y completa los campos faltantes. Procesa de a lotes de forma segura: si un producto falla, el resto continúa.
Las copias de prueba (staging/duplicados en Odoo.sh) ya no desconectan a producción. Minor Release
- Las copias de prueba (staging/duplicados en Odoo.sh) ya no desconectan a producción. Al duplicar la base para un entorno de test, Odoo la marca como *neutralizada*. Hasta ahora el conector seguía intentando renovar el token de MercadoLibre desde esa copia; como el token de renovación es rotativo (un solo uso), cada renovación desde el test invalidaba la sesión de producción (y viceversa), causando cortes intermitentes de conexión (401). Ahora una base neutralizada nunca renueva el token: el entorno de prueba sigue leyendo con el token vigente hasta que expira y luego queda desconectado (esperado en test), sin afectar a producción. _(Producción sin cambios de comportamiento.)_
El cupón de MercadoLibre vuelve a respetar la configuración del cliente. Minor Release
- El cupón de MercadoLibre vuelve a respetar la configuración del cliente. Una corrección previa (#399) forzaba el descuento del cupón sobre el producto cuando el comprador pagaba el envío completo, incluso con la opción de facturar-con-descuento desactivada — pisando la preferencia del vendedor (regresión #433). Ahora el tratamiento del cupón depende solo del modo declarado en la cuenta.
- Modo de facturación del cupón (tri-estado). La antigua casilla pasa a un selector con tres modos:
- Precio pleno (por defecto, equivale a la casilla desactivada): la factura se emite por el precio completo. Correcto cuando MercadoLibre reembolsa el cupón al vendedor (el ingreso gravado es el precio pleno). *Ni el producto ni el envío llevan el descuento del cupón.*
- Descuento en producto (equivale a la casilla activada): el cupón se refleja como % de descuento sobre las líneas de producto.
- Línea de descuento separada (opcional, avanzado): el cupón se imputa como línea(s) de descuento aparte, una por grupo de impuesto, sin tocar producto ni envío. *Requiere validación fiscal previa.* En todos los modos el total facturado sigue cuadrando con lo que corresponde cobrar. La migración deja a cada cuenta en el modo equivalente a su configuración anterior (desactivada → Precio pleno; activada → Descuento en producto). ---
Productos nuevos al importar una orden: cuando llega una orden de MercadoLibre cuyo producto aún no existe en Odoo y la cuenta tiene activada *"Crear producto desde la orden"*, el sistema lo da de alta automáticamente. Minor Release
- Productos nuevos al importar una orden: cuando llega una orden de MercadoLibre cuyo producto aún no existe en Odoo y la cuenta tiene activada *"Crear producto desde la orden"*, el sistema lo da de alta automáticamente. Si el cron operaba a nombre del *Vendedor ML* (sin permiso para crear productos), esa alta fallaba con un error de acceso y la orden quedaba sin importar. Ahora la creación y el vínculo del producto corren con privilegios de sistema (es parte de la integración automática), de modo que la orden se importa completa. Con la opción desactivada el comportamiento no cambia: el producto no se crea y la incidencia se registra en el log sin abortar el resto de la importación. ---
Refactor interno — helper `meli_confirm_ready` (sin cambio de comportamiento): se extrajo el criterio de "venta lista para confirmar" (la condición de monto de `confirm_ml`: monto a facturar de ML vs total del pedido, con tolerancia por cupón y retenciones, con/sin envío) a un método read-only `meli_confirm_ready()` que devuelve `(lista, motivo)`. Minor Release
- Refactor interno — helper `meli_confirm_ready` (sin cambio de comportamiento): se extrajo el criterio de "venta lista para confirmar" (la condición de monto de `confirm_ml`: monto a facturar de ML vs total del pedido, con tolerancia por cupón y retenciones, con/sin envío) a un método read-only `meli_confirm_ready()` que devuelve `(lista, motivo)`. La confirmación automática lo consume sin cambiar su lógica ni sus mensajes. Esto permite que otros flujos (p. ej. el wizard de importación de `meli_oerp_multiple`) detecten ventas incompletas con exactamente el mismo criterio, sin confirmar ni modificar las ventas. ---
Host API ML de rescate (reverse proxy): Nuevo campo de configuración (solo administrador técnico) "Host API ML (rescate)" que permite rutear las llamadas a MercadoLibre — y el OAuth — por un reverse proxy externo cuando la IP del servidor está bloqueada por ML. Minor Release
- Host API ML de rescate (reverse proxy): Nuevo campo de configuración (solo administrador técnico) "Host API ML (rescate)" que permite rutear las llamadas a MercadoLibre — y el OAuth — por un reverse proxy externo cuando la IP del servidor está bloqueada por ML. Vacío = directo a `api.mercadolibre.com` (comportamiento por defecto, sin cambios). Pensado para incidentes de IP bloqueada. ---
Devoluciones — Sin duplicar al cancelar: Corregido el chequeo de devoluciones ya existentes (busca por `origin_returned_move_id` sobre los movimientos del picking, no al revés) y eliminada una doble llamada interna en la cancelación, que generaban pickings de devolución (IN) duplicados por cada ciclo de cron. Minor Release
- Devoluciones — Sin duplicar al cancelar: Corregido el chequeo de devoluciones ya existentes (busca por `origin_returned_move_id` sobre los movimientos del picking, no al revés) y eliminada una doble llamada interna en la cancelación, que generaban pickings de devolución (IN) duplicados por cada ciclo de cron.
- AFIP — Códigos de responsabilidad ampliados: El mapeo de tipo de contribuyente de ML reconoce más variantes (`RESPONSABLE INSCRIPTO`, `IVA EXENTO`, `EXENTO`, `SUJETO EXENTO`).
- Envíos — Línea de envío con costo en factura: Cuando el envío tiene costo real, se restaura `qty_to_invoice` en la línea para que aparezca en la factura (el conector factura al pago, no a la entrega). ---
Envíos — Flete del comprador en órdenes pack/ME2: En ventas tipo pack (varios ítems en un carrito), el costo de envío a cargo del comprador no viene en el pago (`payment.shipping_amount=0`) ni en la orden — vive en el envío (`/shipments/{id}/costs → receiver.cost`). Minor Release
- Envíos — Flete del comprador en órdenes pack/ME2: En ventas tipo pack (varios ítems en un carrito), el costo de envío a cargo del comprador no viene en el pago (`payment.shipping_amount=0`) ni en la orden — vive en el envío (`/shipments/{id}/costs → receiver.cost`). Ahora el conector lo captura (`mercadolibre.shipment.shipping_receiver_cost`) y lo usa como precio de la línea de envío cuando el pago no lo trae, de modo que la factura cierra con lo que pagó el comprador (producto + envío). ---
Mapeo de transportistas — respeta el producto del carrier: La línea de envío del pedido ahora usa el producto del transportista mapeado en su tabla de mapeo (antes lo pisaba con un servicio de envío autogenerado). Minor Release
- Mapeo de transportistas — respeta el producto del carrier: La línea de envío del pedido ahora usa el producto del transportista mapeado en su tabla de mapeo (antes lo pisaba con un servicio de envío autogenerado). `shipment.py _update_sale_order_shipping_info`.
- Etiqueta de envío — modos PDF / ZPL (zip) / ZPL (txt): Nuevo modo `zpl_txt` que extrae el contenido ZPL del zip que entrega ML y lo guarda como `.zpl` plano (listo para impresora). Además fix del nombre de descarga: los binarios de etiqueta ahora llevan `filename=`, así la descarga muestra `Shipment_.pdf/.zpl` en vez del tamaño (`"1.10 Kb"`).
- Equipo / vendedor: `meli_fix_team` ya no resetea el equipo ni el vendedor cuando fueron seteados a mano; asigna `seller_team` aunque la cuenta no tenga compañía (guard company-less).
- Posición fiscal configurable: El sistema respeta el flag `mercadolibre_set_fiscal_position` (default True). En False deja en blanco la posición fiscal de la venta. `orders.py`.
- Fechas placeholder de ML descartadas: `ml_datetime` descarta las fechas placeholder de ML (año < 1970) que rompían el `write` del envío con `ValueError '1-01-01 00:00:00'`. `versions.py`.
- Costo de envío en la primera importación: `_ensure_payment_shipping_amounts` completa el `shipping_amount` del pago antes de calcular la línea de envío, evitando que el envío quede en 0 en la primera importación de la orden. `orders.py`.
- Fechas del envío desde `shipping_option`: Se incorporan buffering_date, schedule_limit, pay_before, pickup_promise (from/to) y desired_promised_delivery a la ficha del envío. ---
Stock — Priorización por movimiento de stock: Cuando ocurre un movimiento de stock para un producto publicado en ML, `meli_update_boms()` ahora resetea `meli_stock_update = NULL` vía SQL directo. Minor Release
- Stock — Priorización por movimiento de stock: Cuando ocurre un movimiento de stock para un producto publicado en ML, `meli_update_boms()` ahora resetea `meli_stock_update = NULL` vía SQL directo. El cron ordena por `meli_stock_update ASC NULLS FIRST` — con NULL, el producto sube al frente del queue en el primer ciclo siguiente (5-10 min). Antes, un producto synced con qty=0 quedaba al fondo de la cola y podía tardar 30+ minutos en reactivarse.
- Stock — `meli_stock_diagnostic()` como red de seguridad: Nueva función que corre al final de cada ciclo de `meli_update_remote_stock`. Detecta y corrige automáticamente:
- Items `status=paused` en ML con `virtual_available > 0` → reactiva vía `product_post_stock()`
- Items `status=active` con `available_quantity=0` pero Odoo tiene stock → push corrección
- `meli_available_quantity` stale cuando ML tiene qty>0 → sincroniza desde ML (SQL directo)
- Drift de cantidades (Odoo ≠ ML) → log WARNING `MELI_STOCK_DIAG`
- Stock — Skip fulfillment en cron: Productos con `meli_shipping_logistic_type='fulfillment'` ya no generan llamadas a ML API innecesarias en el cron de stock (ML no permite modificar stock de almacenes fulfillment vía API). El cron ahora hace `continue` directamente con `meli_stock_error="fulfillment"`.
- Órdenes — Fix `seller_discount` sobreestimado con cupón: `amounts.seller` del endpoint `/orders/{id}/discounts` contiene el descuento total de precio de lista (precio original − precio de venta), no la contribución real del vendedor al cupón. Para evitar que `meli_amount_to_invoice` devuelva un valor menor al correcto, el descuento del vendedor se capea al `coupon_amount` cuando `(paid - seller_discount) < amount_total`.
- Webhooks ML — CSRF desactivado en `/meli_notify`: Los endpoints de webhook de ML (`/meli_notify`, `/meli_notify/`) ahora tienen `csrf=False` en el decorator. Sin este flag, Odoo rechazaba los POST de ML con 400 "No CSRF validation token provided".
- Billing info — Migración a API v2: El endpoint legacy `/orders/{order_id}/billing_info` fue deprecado por ML en Q1 2026. Migrado al nuevo endpoint `/orders/billing-info/{SITE_ID}/{BILLING_INFO_ID}` con header `x-version: 2`. Incluye normalizador de formato para el nuevo schema anidado (antes UPPERCASE flat, ahora `identification.type`, `name`, `address.street_name`).
- Compatibilidad Odoo 19 — `_sql_constraints` obsoletos eliminados: 23 warnings de startup eliminados. Odoo 19 emite `DeprecationWarning` por cada clase con `_sql_constraints`. Todos los modelos ya tenían `UniqueIndex`/`Constraint` como atributos de clase — el atributo era redundante. ---
Cupón ML — control de descuento en factura: El campo `coupon_amount` de MercadoLibre es un costo que ML financia al comprador — el vendedor cobra el precio completo. Minor Release
- Cupón ML — control de descuento en factura: El campo `coupon_amount` de MercadoLibre es un costo que ML financia al comprador — el vendedor cobra el precio completo. La lógica anterior aplicaba ese monto como descuento en las líneas del SO siempre, y calculaba el porcentaje sobre el precio base sin IVA (incorrecto). Cambios:
- Nuevo campo de configuración `meli_coupon_discount_on_invoice` (Boolean, default=False):
- Desactivado (default): factura por precio de venta completo. Si hubo descuentos incorrectos previos, se limpian automáticamente al reimportar la orden.
- Activado: aplica el cupón como descuento porcentual usando el precio bruto con IVA como denominador (corrección del bug de cálculo).
- Reparar entrega — notificación de resultado (UX): El método `meli_repair_missing_pickings()` ahora retorna una notificación Odoo con el resultado (`success` si reparó, `warning` si no encontró movimientos huérfanos).
- Advertencias ML — renderizado de causas anidadas: Los errores de la API ML que devuelven `causes` como lista ahora se renderizan como alertas HTML individuales en el chatter, mostrando el detalle de cada causa aunque el mensaje principal sea un string simple.
- Compatibilidad Odoo 19 — `qty_done` → `quantity`: En Odoo 19 el campo `qty_done` de `stock.move.line` fue renombrado a `quantity`. La detección ahora es automática via `hasattr`, sin hardcodear el nombre del campo.
- Compatibilidad Odoo 19 — view_mode f-string: Fix en `cron_execution.py`: la variable `view_mode_tree` no se expandía en el string de la acción de ventana de CRONs. ---
Protección de billing child en `_commercial_sync_from_company`: Los contactos hijos de tipo `invoice` (billing child) cuyo padre tiene órdenes ML (`meli_buyer` o `meli_order_id`) ahora están protegidos de la sincronización fiscal automática de Odoo. Minor Release
- Protección de billing child en `_commercial_sync_from_company`: Los contactos hijos de tipo `invoice` (billing child) cuyo padre tiene órdenes ML (`meli_buyer` o `meli_order_id`) ahora están protegidos de la sincronización fiscal automática de Odoo. Sin esta protección, Odoo sobreescribía los datos fiscales del hijo con los del padre comercial, eliminando el CUIT y tipo de responsabilidad AFIP.
- Propagación de `partner_invoice_id` en sub-órdenes pack: Al confirmar una orden con sub-órdenes (packs ML), si el billing child resuelto es diferente del partner padre del buyer, se propaga `partner_invoice_id` a todas las sub-órdenes para que facturen al mismo billing child.
- Context flags en `_assign_picking()`: Al llamar `_assign_picking()` durante la confirmación de la orden, se activan los flags `tracking_disable=True`, `mail_notrack=True` y `meli_skip_stock_update=True` para evitar triggers innecesarios de notificaciones y actualizaciones de stock en cada asignación individual. ---
Descuento de vendedor con cupones (fix): Cuando ML reporta un `seller_discount` grande (precio de lista vs. Minor Release
- Descuento de vendedor con cupones (fix): Cuando ML reporta un `seller_discount` grande (precio de lista vs. precio pagado) y hay un cupón, el descuento se capea al monto del cupón solo si la diferencia produciría un monto por debajo del total del SO. Resuelve el error "amount doesn't match" en órdenes con descuentos de lista + cupón.
- Reparación de pickings huérfanos: Nuevo método `meli_repair_missing_pickings()`. Detecta stock moves en órdenes confirmadas sin picking asignado y los asigna a un picking existente (o crea uno). Se llama automáticamente si `confirm_ml()` produce una orden sin picking. También disponible como acción en el wizard de operaciones.
- API billing_info v2: Migración al endpoint `/orders/billing-info/{SITE_ID}/{BILLING_INFO_ID}` con `x-version: 2`. La respuesta v2 se normaliza al formato legacy (claves UPPERCASE) para transparencia. Fallback automático al endpoint viejo.
- CSRF webhooks (fix crítico): Los endpoints `/meli_notify` ahora tienen `csrf=False`. Sin este fix todas las notificaciones ML eran rechazadas con HTTP 400. ---
Nombre de venta con info de envío: El nombre del pedido de venta ahora muestra el número de seguimiento o ID de envío junto al número de orden ML, facilitando la identificación rápida. Minor Release
- Nombre de venta con info de envío: El nombre del pedido de venta ahora muestra el número de seguimiento o ID de envío junto al número de orden ML, facilitando la identificación rápida.
- Tabla de mapeo de transportistas: Nueva pantalla en MercadoLibre > Mapeo de Transportistas donde se pueden asignar los métodos de envío de ML a transportistas existentes en Odoo, evitando la creación de duplicados.
- Descuentos de cupón aplicados correctamente: Los cupones y descuentos de MercadoLibre ahora se reflejan como descuento porcentual en las líneas del pedido de venta, asegurando que la factura refleje el monto real pagado por el cliente.
- Fechas de envío detalladas: Se incorporaron las fechas reales de cada etapa del envío (preparación, despacho, entrega, etc.) además de las fechas estimadas, visibles en la ficha del envío.
- Etiqueta de envío visible en albarán: La etiqueta PDF y su vista previa ahora se muestran directamente en el albarán (stock.picking).
- Nombre de impresora en configuración: Se puede indicar el nombre de la impresora destino para etiquetas ZPL en la configuración de la cuenta ML. ---
Publicación de productos: Permalink API ahora incluye access_token para acceso directo desde el backend de Odoo. Minor Release
- Publicación de productos: Permalink API ahora incluye access_token para acceso directo desde el backend de Odoo. ---