Incidente de promociones · Grupo Dinosaurio · octubre 2026

Promo 15749: el cupón de la bata se otorgó con menos de 50.000 $ en artículos

Análisis de causa del reclamo "Promoción tipo 27 se dispara con monto menor al establecido" y mitigación aplicada en el servicio de generación de promociones.

Promo 15749 (MZA) y gemela 6304 (CBA)Template 27 · Cupones por monto de artículosMínimo: 50.000 $ en artículos Dove

Conclusión

No es un error del POS ni del servicio de generación de promociones. La lista de artículos de la promo se cargó con EAN repetidos: 79 de los 156 EAN Dove figuran dos veces. El POS suma cada artículo una vez por cada fila de la lista que lo contiene, así que los artículos repetidos se computaron doble.

El origen es de carga de datos: el operador cargó dos veces parte de la lista. El sistema de configuración de promociones no tenía ninguna protección contra esa repetición, y ni el servicio de generación ni el POS la detectaban.

POS: funciona según diseño Template 27: correcto para el caso Lista de la promo: EAN repetidos Backoffice: sin control de repetidos

El caso reclamado

Ticket 32, PV 1369, POS 21, sucursal 390 (Tadicor San Martín), 06/10/2026. Total del comprobante 301.281,71 $. El cliente llevó tres artículos de la lista Dove:

Shampoo Dove Humecta10.800,00 Acondicionador Dove10.800,00 Crema de tratamiento Dove 300 g6.900,00 Monto real de artículos de la promo28.500,00 Monto computado por el POS (cada EAN figura 2 veces)57.000,00 Mínimo de la promo50.000,00

Con 57.000 computados se supera el mínimo y sale el cupón. El reclamo indicaba 21.600 $ de artículos Dove; la crema de tratamiento, que también está en la lista, no se había contado.

La hipótesis inicial ("el cupón sale por el total del ticket") no es correcta: hubo tickets de más de 590.000 $ con artículos Dove que no recibieron el cupón.

Evidencia en los logs del POS

Se revisaron los logs completos de dos días: POS 29 (04/10) y POS 21 (06/10). Cada cupón impreso se identificó por su texto: Cine 2x1 (vigencia a 30 días), cortador de verduras (válido el mismo día) y bata de baño (sin línea de vigencia). Hubo 31 tickets con artículos Dove.

Tickets con artículos Dove31
Predichos por "Dove × filas ≥ 50.000"31 de 31
Recibieron el cupón de la bata3
TicketTotal ticketDove realDove computadoCupón bata
181549381.042,9551.950,0094.010,00Sí
73902299.749,0031.050,0062.100,00Sí
181566 (ticket 32)310.469,0028.500,0057.000,00Sí
73968261.583,1121.600,0043.200,00No
73952599.659,5621.600,0043.200,00No
73965440.239,5017.700,0035.400,00No
181562514.186,7615.690,0031.380,00No

Se muestran los 7 tickets con más monto Dove; los 24 restantes tampoco recibieron el cupón. Montos Dove calculados con los precios de lista de la planilla enviada por el cliente; el número de ticket es el interno del POS.

Reproducción en el POS

En un POS de prueba se cargó una promo idéntica en estructura, con un artículo de 2.750 $ y un mínimo de 5.000 $:

Con la promo configurada sin repetidos, el POS evalúa correctamente el mínimo sobre los artículos de la promo.

Cómo se llegó a la lista repetida

Las filas repetidas no son una segunda importación completa: se repitieron 52 artículos enteros, con todos sus EAN, dentro de la misma carga. El sistema de configuración (TiBackPos) lo permite por tres motivos:

  1. La base no lo impide

    PromocionDetalle solo tiene clave primaria sobre Id. No existe un índice único sobre (IdPromocion, TipoDato, Dato).

  2. La carga manual por EAN no controla repetidos

    El control "el EAN ya está en la promo" está desactivado (comentado) en PromocionDetalleHome.java.

  3. La importación de archivo no detecta repetidos dentro del mismo archivo

    UploadArchivos.java compara cada línea solo contra lo ya grabado, valida todo antes de grabar y compara el texto exacto (un EAN con y sin ceros a la izquierda cuenta como distinto).

La carga manual por PLU sí evita repetidos: solo agrega los EAN del artículo que todavía no están en la promo.

Alcance

Sobre las 954.805 filas de detalle de promociones:

Tipo de datoValores repetidosFilas sobrantesPromosVigentes al 14/10
EAN incluido284347112 (15749 y 6304)
EAN en listas de combo1.2632.483560
Exclusiones4.4355.379451
Textos e imágenes6389620

En total, 1.358 EAN distintos repetidos en 67 promociones, la mayoría vencidas (2016 a 2019). Hoy solo las dos promos de la bata tienen efecto visible.

Mitigación aplicada en el servicio de generación

Mientras se depuran los datos y se agregan los controles en el backoffice, el servicio que genera las tablas de promociones del POS (SrvPOS_Promo) descarta las filas repetidas al armar dM_ProAr. Así el POS recibe una fila por artículo aunque la lista de origen tenga repetidos.

[SRVPROMO] dM_ProAr fila repetida omitida (iId=157490000 EAN=7506306241176)
[SRVPROMO] Suc:380 dM_ProAr: 79 filas repetidas omitidas (detalle de promo con EAN cargado mas de una vez)

Prueba realizada

Generación de la sucursal 380 con la promo 15749 tal como está hoy en la base de promociones, sobre una copia de la base y con la salida a archivos de prueba:

Filas de la promo, servicio actual235
Filas de la promo, con la mitigación156
Filas omitidas79

Compilado con la configuración del proyecto: sin errores ni advertencias. La prueba usó una capa de simulación en lugar del motor Btrieve; antes de pasar a producción conviene generar una sucursal piloto con el motor real y verificar la cantidad de filas de la promo.

Acciones pendientes

  1. Depurar las promos 15749 y 6304

    Eliminar los EAN repetidos de la lista y republicar. Resuelve el caso aunque la mitigación todavía no esté instalada.

  2. Instalar la mitigación en el servicio

    Primero en una sucursal piloto; verificar en el log el total de filas omitidas y en dM_ProAr la cantidad de filas de la promo.

  3. Agregar controles en el backoffice

    Reactivar el control de EAN repetido en la carga manual, detectar repetidos dentro del archivo importado y normalizar los ceros a la izquierda del EAN.

  4. Crear el índice único

    Sobre PromocionDetalle (IdPromocion, TipoDato, Dato), después de limpiar las aproximadamente 8.300 filas sobrantes; con esas filas la creación del índice falla.