Saltar a contenido

Decodificación de EAN

No todos los códigos de barras son iguales. Un yogur tiene un EAN fijo que mapea a un precio; pero un trozo de queso cortado en balanza trae el peso o el precio embebidos en el propio código. La terminal escanea el mismo tipo de lector para todos, así que el backend tiene que decodificar qué clase de EAN es y extraer la información correcta. Ese trabajo lo hace EanDecodeService (tickets), y es el paso 2 del cómputo del ticket.

El código es la fuente de verdad

Los prefijos y longitudes exactos dependen de la configuración de balanzas del comercio. Esta página describe el modelo; los valores concretos viven en EanDecodeService y en la config.

Por qué hace falta

Un artículo del catálogo (Articulo, en catalogo) trae flags que indican cómo interpretarlo:

Flag Significa
bPeso El artículo es pesable: se vende por kg/g, no por unidad.
bRandomPrice El precio viene embebido en el código (random price / price-embedded).
bEnvase Es un envase retornable (ver Envases y vales).

Y el EAN escaneado puede ser:

  • EAN normal (13 dígitos): mapea 1:1 a un artículo con precio fijo.
  • EAN pesable / random-price (típicamente con prefijo 2x): los primeros dígitos identifican el producto, y un tramo posterior codifica peso o precio, más un dígito verificador.
  • DUN (más de 13 dígitos): identifica una venta por bulto. Ver Promociones → BULTO.

Cómo se decodifica

graph TD
    SCAN["EAN escaneado"] --> LEN{longitud / prefijo}
    LEN -->|13 dígitos normales| NORMAL["Buscar artículo por EAN<br/>precio de catálogo × cantidad"]
    LEN -->|prefijo balanza 2x| EMB["Extraer código de producto<br/>+ peso o precio embebido"]
    LEN -->|> 13 dígitos| DUN["Tratar como DUN<br/>(venta por bulto)"]
    EMB --> PESO{bPeso / bRandomPrice}
    PESO -->|bPeso| KG["cantidad = peso decodificado<br/>importe = peso × precio/kg"]
    PESO -->|bRandomPrice| PRE["importe = precio embebido<br/>cantidad = 1"]
  1. Identificar el tipo por longitud y prefijo del código.
  2. Extraer el código de producto (el tramo que identifica el artículo) y buscarlo en catalogo.
  3. Extraer el valor embebido (peso o precio) del tramo correspondiente.
  4. Armar la línea según el flag del artículo:
  5. Pesable (bPeso): la cantidad del ítem es el peso decodificado (ej. 0,750 kg) y el importe = peso × precio por kg.
  6. Random price (bRandomPrice): el importe es el precio embebido directamente; la cantidad es 1.
  7. Normal: cantidad entera × precio de catálogo.

Por qué importa para el cómputo

El resultado del decode alimenta el paso 3 (armado de la línea y su núcleo impositivo): un pesable de 0,750 kg a \$2.000/kg produce una línea de \$1.500 con su IVA correspondiente, exactamente como si fuera una unidad de \$1.500. A partir de ahí, el resto del cómputo (promos, envases, total) no necesita saber que era pesable: ya quedó normalizado a una línea con su importe y su núcleo impositivo.

Pesables y random-price son donde más se rompe la itemización

Un dígito verificador mal interpretado, un prefijo de balanza no contemplado o un redondeo del peso producen importes incorrectos. Si vas a tocar EanDecodeService, probá con EANs reales de balanza del comercio (no inventados): los formatos varían por configuración.