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"]
- Identificar el tipo por longitud y prefijo del código.
- Extraer el código de producto (el tramo que identifica el artículo) y buscarlo en
catalogo. - Extraer el valor embebido (peso o precio) del tramo correspondiente.
- Armar la línea según el flag del artículo:
- Pesable (
bPeso): la cantidad del ítem es el peso decodificado (ej. 0,750 kg) y el importe = peso × precio por kg. - Random price (
bRandomPrice): el importe es el precio embebido directamente; la cantidad es 1. - 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.