Ir al contenido

El Misterio del Pedimento Perdido (y cómo encontrarlo en Odoo)

📌 Contexto
18 de junio de 2026 por
BloVox

📌 Contexto

Hace mucho tiempo, en una galaxia llamada México…

Llega el día de la implementación. El consultor, con su capa de Jedi de la implementación, se prepara para cargar el inventario inicial del cliente. Abre Odoo. Respira hondo. Y entonces ve el abismo: 500 productos importados. Cada uno con su número de pedimento. Algunos con lotes únicos.

Busca en el ajuste de inventario el campo "pedimento". No está.

Busca en Google. En foros. En la documentación. Encuentra que existe l10n_mx_edi_pedimento_number pero está en las recepciones de stock. El pánico empieza a hacer eco en la Estrella de la Muerte. ¿Crear una recepción por cada producto? ¿Con 500 pedimentos distintos? Eso no es un plan, es una misión suicida.

Este artículo es para ti, joven Padawan. Vamos a descubrir cómo funciona realmente el pedimento en Odoo, por qué el ajuste de inventario no necesita tenerlo, y cómo salir de esta sin crear 300 recepciones manuales.


🎯 El Desafío: "Es una trampa!"

Historia de un usuario que no conoce la Fuerza:

Como Consultor Implementador, necesito cargar el inventario inicial con sus números de pedimento para cumplir con los requisitos del Lado Oscuro (SAT), sin tener que crear cientos de recepciones de stock manuales que me harían envejecer como el Emperador.

El flujo que la mayoría intenta (y fracasa):

1. Abrir Ajuste de Inventario        ✅
2. Cargar productos y cantidades      ✅ (esto funciona)
3. Buscar campo "pedimento"           ❌ (no existe)
4. Buscar solución...                 😰 (pánico Jedi)
5. Encontrar que está en pickings     🤯 (NOOOOOO)
6. Calcular: 300 Series × 1 picking  → 🤡

¿Por qué el pedimento no está en el ajuste de inventario?

No es un bug. Es la Fuerza actuando. Odoo modela el pedimento como un concepto logístico-fiscal, no como un atributo de stock. El pedimento vive en dos lugares, y depende de para qué lo necesites:

Lugar en la galaxiaEl campo se llamaSirve para
stock.picking (la recepción)l10n_mx_edi_pedimento_numberLa Carta Porte — cuando un camión lleva la mercancía cantando "Y si no soy yo, ¿quién?"
account.move.line (la factura)l10n_mx_edi_customs_numberLa factura — cuando vendés y el SAT quiere saber de dónde salió

El ajuste de inventario inicial es como la cantina de Mos Eisley: es un lugar donde entran y salen cosas, pero no genera ni factura ni Carta Porte. Es una operación interna, un "hola, mundo" del inventario. No hay comercio exterior en ese momento — o al menos eso creés.

Soluciones que fracasaron en la Batalla de Hoth:

  • Crear una recepción por pedimento: con 300 productos de distinto origen es como pedirle a Chewbacca que haga una declaración fiscal. No va a pasar.
  • Poner el pedimento en la descripción del producto: ok, lo ves, pero el SAT no. Fracaso.
  • Ponerlo en el nombre del lote: útil para referencia visual, pero no llega al CFDI. Es como poner un cartelito en el Halcón Milenario que diga "Aquí transportamos contrabando" y esperar que la patrulla imperial no lo vea.

🔍 Análisis Técnico: Que el campo te acompañe

El Lado Luminoso del código:

Odoo tiene dos módulos que manejan el pedimento, y es clave entender la diferencia porque no son lo mismo, aunque en la jerga diaria digamos "pedimento" para todo.

Módulo 1: l10n_mx_edi_stock

Es el R2-D2 de los pickings. Va en el transporte, registra el pedimento, genera la Carta Porte. Si movés mercancía importada de una bodega a otra, necesitás este campo.

Módulo 2: l10n_mx_edi_extended

Es el Halcón Milenario de las facturas. Lleva el pedimento directo a la línea de factura, para el CFDI con Complemento de Comercio Exterior.

El flujo real:

┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  INVENTARIO INI- │     │   SE VENDE EL    │     │   FACTURA CON    │
│  CIAL (ajuste)   │ ──► │   PRODUCTO       │ ──► │   PEDIMENTO EN   │
│                  │     │                  │     │   LA LÍNEA       │
│  Sin pedimento   │     │  Se genera la    │     │  customs_number  │
│  (solo stock)    │     │  factura         │     │  → SAT feliz     │
└──────────────────┘     └──────────────────┘     └──────────────────┘
      no necesita              apareció               misión
      el pedimento             el pedimento            cumplida

¿Dónde aparece el pedimento en la factura?

En la línea de la factura, hay un campo llamado "Número de pedimento" o l10n_mx_edi_customs_number:

# account.move.line
l10n_mx_edi_customs_number = fields.Char(
    string="Customs Number",
    help="Uno o más números de pedimento separados por coma"
)

Ahí ponés algo como:

15 48 3009 0001234

Y si tenés varios pedimentos para la misma línea (por ejemplo, el mismo producto importado en distintas fechas):

15 48 3009 0001234, 16 48 3010 0005678

¿El formato? El SAT es estricto como un stormtrooper con la puntería:

  • 2 dígitos de aduana
  • 2 espacios
  • 2 dígitos del año
  • 2 espacios
  • 4 dígitos de patente
  • 2 espacios
  • 7 dígitos de folio

💡 La Solución: Yo soy tu padre... del inventario inicial

Depende de lo que realmente necesites. Elegí tu camino:

🅰️ Solo necesitás facturar con Complemento de Comercio Exterior

"Hazlo o no lo hagas, pero no lo intentes" — Yoda

No toques el ajuste de inventario. No necesitás crear recepciones. Sencillamente:

  1. Vendé los productos normalmente
  2. En la factura, clickeá la línea del producto
  3. Buscá el campo "Customs Number" o "Número de pedimento"
  4. Meté el pedimento: 15 48 3009 0001234
  5. Validá la factura → El CFDI genera el Complemento de Comercio Exterior automáticamente
  6. SAT acepta ✅
  7. Todos contentos. Incluso Jar Jar.

Validación funcional:

  • [ ] El campo l10n_mx_edi_customs_number aparece en la línea de factura cuando el país fiscal del cliente es MX
  • [ ] El XML del CFDI incluye
  • [ ] El SAT no rechaza la factura (milagro)

🅱️ Querés trazabilidad desde el stock hasta la factura

"La Fuerza es fuerte en este campo"

Si querés que el pedimento viaje con cada lote desde que entra hasta que se factura, necesitás un mini-módulo custom (~10 líneas). Es más fácil de lo que parece:

AlternativaDificultadResultado
✅ Agregar campo a stock.quant5 minutosLo capturás en el ajuste, importás por XLSX, queda visible
✅ Propagar a stock.move2 líneas másViaja con el movimiento
✅ Propagar a factura despuésScript aparteLlega a la línea de factura sola
❌ Crear recepcionesInviableNo lo hagas, Padawan

El código en una servilleta:

# 1. Agregás el campo al quant
class StockQuant(models.Model):
    _inherit = 'stock.quant'
    
    l10n_mx_edi_pedimento_number = fields.Char(string="Pedimento")

    # 2. Lo propagás al crear el movimiento
    def _get_inventory_move_values(self, qty, *args, **kwargs):
        vals = super()._get_inventory_move_values(qty, *args, **kwargs)
        if self.l10n_mx_edi_pedimento_number:
            vals['l10n_mx_edi_pedimento_number'] = self.l10n_mx_edi_pedimento_number
        return vals

# 3. Agregás el campo al move (para que exista)
class StockMove(models.Model):
    _inherit = 'stock.move'
    l10n_mx_edi_pedimento_number = fields.Char(string="Pedimento")

¿Qué ganás con esto?

  • En la vista de ajuste de inventario aparece la columna "Pedimento"
  • El botón ⚙️ → Import del ajuste de inventario te deja cargar desde Excel con columnas: Producto | Cantidad | Lote | Pedimento
  • Cuando aplicás el ajuste, cada stock.move lleva su pedimento

🅲 Estás haciendo Carta Porte (transporte)

"Esta es la vía"

Si transportás mercancía importada entre ubicaciones y necesitás Carta Porte con el pedimento, entonces sí necesitás pickings. Pero ¡ojo! No para el inventario inicial. Para los traslados reales que hagas después.

Ahí no hay shortcut: el picking tiene l10n_mx_edi_pedimento_number y es el vehículo oficial para la Carta Porte.


✅ Resultados y Beneficios: ¡Qué bonita explosión!

Lo que aprendimos en esta aventura galáctica:

  1. El pedimento NO se necesita en el inventario inicial. Se necesita en la factura de venta (Complemento de Comercio Exterior) o en la Carta Porte (transporte).
  2. Odoo ya lo soporta estándar. El campo l10n_mx_edi_customs_number en la línea de factura (módulo l10n_mx_edi_extended) recibe el pedimento y el CFDI lo incluye automáticamente.
  3. Si querés trazabilidad, 10 líneas de código y el pedimento viaja con cada lote desde el ajuste inicial hasta la factura.
  4. No te asustés con los pickings. Solo los necesitás si hacés Carta Porte. Y aun así, no para el inventario inicial.

Beneficios por bando:

PersonajeQué gana
Consultor JediSabe exactamente qué hacer, no pierde horas en workarounds
Almacén RebeldeCarga el inventario inicial en un solo Excel, no crea 300 pickings
Contador SithEl CFDI lleva el pedimento correcto, SAT acepta, la paz reina en la galaxia
DesarrolladorImplementación mínima, código sin midiclorianos oscuros

Lecciones del lado luminoso:

  • No confundir pedimento de Carta Porte (picking) con pedimento de factura (account.move.line). Son momentos fiscales distintos.
  • El inventario inicial no es un evento de comercio exterior. No genera CFDI. No necesita pedimento per se.
  • La importación por XLSX + campo custom es el sable de luz de cualquier implementador mexicano.

📚 Para Profundizar: Los Archivos Jedi


💬 ¿Tu experiencia es diferente?

En la galaxia de México cada implementación es única. Algunos manejan zonas libres como Cancún o Ciudad Hidalgo. Otros tienen regímenes aduaneros especiales como el RECIAS o el DAAAAA (sí, existe). ¿Te encontraste con un caso fuera de este mundo? ¿Usaste algún otro approach? Dejalo en los comentarios — una comunidad unida es más fuerte que la Estrella de la Muerte.

Que el código te acompañe. 🚀

📬 ¿No querés perderte ningún artículo nuevo?

Dejanos tu correo y te avisamos cuando publiquemos algo.

¡Gracias por suscribirte!