Fix de signo en promos combo — resumen por cliente
Reclamo CARACOL v20260902P (02/10/2026) · fix y pruebas 03–04/10/2026 · kit POSKIT
1. El problema
Con promos combo de precio fijo (por ejemplo 2 × 3599 a 5398) sobre artículos con impuestos internos, el ticket imprimía mal el desglose de impuestos. El total final era correcto, y la base (dE_TResu, lo que ve SOLUTIA) también.
| Factura | Impreso (mal) | Correcto |
|---|---|---|
| A | Neto 7255.25 · IVA 1523.61 · II 0.00 | Neto 4352.51 · IVA 914.03 · II 131.46 |
| B (Ley 27.743) | IVA Contenido 1523.61 · II 0.00 | IVA Contenido 914.03 · II 131.46 |
Causa: en ImprimirPromos (pos_mis2.cpp) los valores del combo (stCombAImpresor) llegan ya con signo negativo, y el código los vuelve a multiplicar por el signo del descuento (iSignoAcumula). Menos por menos da más, así que el descuento se sumaba al neto y al IVA, y los impuestos internos (calculados por diferencia) quedaban en 0.
Un segundo problema venía de un arreglo anterior (ALMACOR, agosto). Poner fabs() al leer esos valores corrige los impuestos, pero la línea del combo pasa a imprimirse sin signo (1800.00 en vez de -1800.00).
2. Resultado por cliente
| Cliente | Versión probada | Antes del fix | Cambio aplicado | Después del fix | Archivo a instalar |
|---|---|---|---|---|---|
| CARACOL | 20260916P | Impuestos mal (el reclamo) | fabs() al leer, sólo para acumular impuestos, y restitución de los valores con signo después del switch (+19 líneas) | Impuestos OK · combo -1800.00 | C:\Work\PCPOS\20260914_CARACOL\pos_mis2.cpp |
| ALMACOR | 20260928P | Combo 1800.00 sin signo | Igual que CARACOL (+19 líneas) | Impuestos OK · combo -1800.00 | C:\Work\AI\pcpos\20261003\fix_ALMACOR\pos_mis2.cpp |
| CYRE | 20260916F | Combo 1800.00 sin signo | Se quita el fabs() de agosto en 8 lecturas; su fix propio de 2025 ya acumula bien | Impuestos OK · combo -1800.00 | C:\Work\AI\pcpos\20261003\fix_CYRE\pos_mis2.cpp |
| DINO | 20260923F | Combo 1800.00 sin signo | Igual que CYRE (8 lecturas) | Impuestos OK · combo -1800.00 | C:\Work\AI\pcpos\20261003\fix_DINO\pos_mis2.cpp |
| BECERRA | 20260917P | Ya estaba bien (fix 24/08/2025) | Ninguno | Impuestos OK · combo -1800.00 | — |
Cada carpeta fix_<CLIENTE> tiene también el pos_mis2.diff contra el original del cliente. Los fuentes originales no se modificaron. No reemplazar el archivo entre clientes: el pos_mis2.cpp de cada uno tiene funcionalidades propias.
3. Cómo se probó
Cada cliente se compiló con sus propios fuentes en el kit (EXE y 15–16 DLL). Se vendió 2 × 7790895641800 (combo 490000 del cliente, precio 3599, II 87.65), pagando en efectivo con una promo de medio de pago de -10% (descuento) y de +10% (recargo).
Criterio de aceptación: lo impreso (neto, IVA, impuestos internos y total) igual a lo grabado en dE_TResu; neto + IVA + II = total; línea del combo negativa; línea de efectivo con el signo que corresponde.
| Corrida | Ticket | Línea combo | Línea efectivo | Total | IVA | II | Impreso = base |
|---|---|---|---|---|---|---|---|
| CARACOL sin fix | 317096 | -1800.00 | — | 5398.00 | 1523.61 | 0.00 | NO |
| CARACOL con fix | 317098 | -1800.00 | — | 5398.00 | 914.03 | 131.46 | SI |
| ALMACOR sin fix + desc. | 317105 | 1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
| ALMACOR con fix + desc. | 317106 | -1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
| ALMACOR con fix + recargo | 317107 | -1800.00 | +539.80 | 5937.80 | 1005.43 | 144.61 | SI |
| CYRE sin fix + recargo | 317108 | 1800.00 | +539.80 | 5937.80 | 1005.43 | 144.61 | SI |
| CYRE con fix + recargo | 317109 | -1800.00 | +539.80 | 5937.80 | 1005.43 | 144.61 | SI |
| CYRE con fix + desc. | 317110 | -1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
| DINO sin fix + desc. | 317111 | 1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
| DINO con fix + desc. | 317112 | -1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
| DINO con fix + recargo | 317113 | -1800.00 | +539.80 | 5937.80 | 1005.43 | 144.61 | SI |
| BECERRA (sin cambios) + recargo | 317114 | -1800.00 | +539.80 | 5937.80 | 1005.43 | 144.61 | SI |
| BECERRA (sin cambios) + desc. | 317115 | -1800.00 | -539.80 | 4858.20 | 822.63 | 118.32 | SI |
En CARACOL además se probaron Factura A, dos combos en un ticket, combo con una unidad suelta y descuento por medio de pago sobre artículos con y sin impuesto interno: todos coinciden con la base. Las diferencias de un centavo en algunos casos con descuento son de redondeo.
Evidencia: C:\Work\AI\pcpos\20261003\evidencia_clientes\ (volcados de impresión y RESULTADOS.txt), evidencia_matriz\ y evidencia_AB\.
4. Por qué es seguro con recargos y descuentos
- El código tocado sólo actúa sobre combos de precio fijo por artículo. Ese tipo de combo no puede ser recargo: si el precio del combo supera a los artículos, el POS lo rechaza.
- Los recargos y descuentos por medio de pago van por otro camino, que no se modificó. Las pruebas con +10% y -10% en los cinco clientes lo confirman.
- El código que calcula los valores del combo es idéntico en los cinco clientes. Sólo cambia cómo se imprimen.
- La base (
dE_TResu) estaba bien antes y después del fix: el error era sólo de impresión.
5. Antes de instalar
- POS_MMON.DLL: DINO y BECERRA la cargan, y el
_CDLLS.BATdel kit no la recompila. Con una versión vieja, DINO tira General protection fault al arrancar. Recompilarla con el resto (dlldeb pos_mmon). - DGROUP de CYRE: le quedan 30 bytes libres. Ya estaba así; el fix no lo cambia. ALMACOR 196, DINO 158, BECERRA 500, CARACOL 688.
- Recompilar EXE y todas las DLL de cada cliente después del cambio, como siempre que cambia
pos_main.
6. Notas
- CYRE y DINO tienen un typo sin efecto hoy:
tmpdPromoVsdII105==(...)(comparación en vez de asignación). No se tocó porque no afecta la impresión. - La variante de 2025 (BECERRA, CYRE, DINO) invertiría el signo en promos 2x1 (acción 8). Ninguna base revisada (CARACOL, CYRE, ALMACOR) tiene 2x1 configurado.
- Combo de dos artículos distintos: la promo de prueba no se disparó en el kit y no se investigó. El cálculo del combo mantiene el mismo signo entre alícuotas, por lo que el riesgo es bajo.
- En el kit, las promos por medio de pago se aplicaron aunque estaban deshabilitadas (
bHabilitado=0). No verificado en producción.