Hoy el beneficio se calcula como un % del total del ticket. La idea es calcularlo sobre un monto base (base_amount) que define el negocio vía promociones, no sobre el total. El cliente paga lo mismo menos el descuento; cambia sobre qué se calcula ese descuento.
base_amount, el beneficio se calcula sobre el total — el comportamiento actual no cambia.Opciones de comportamiento que proponemos (detalle en §5):
base_amount (ausente) → beneficio sobre el total del ticket. Es el comportamiento de hoy.base_amount (> 0) → beneficio sobre esa base (los ítems de la promo).base_amount = 0 → sin beneficio. propuesta a confirmar por el cliente para el caso "la promo base está configurada pero no acumuló ítems". El server ya lo soporta; requiere un cambio del POS (ver §5). No aprobado aún.Cinco actores, cada uno con un rol claro:
| Actor | Rol en base_amount |
|---|---|
| POS | Calcula el monto base acumulando las promociones que correspondan y lo envía. Nunca aplica el descuento él mismo. |
| RouterQR | Relaya el dato (transparente). |
| GatewayQR | Lleva base_amount al resolvedor y se lo informa al autorizador. |
| BeneficiosCenter | Calcula el beneficio: % sobre el monto base (con tope y mínimo), sin cambiar el total. |
| TECSO (autorizador) | Aplica el descuento y lo confirma; el POS lo imputa y reparte el IVA. |
base_amountbase_amount. (El detalle de configuración está en el doc técnico.)0: no aplica ningún beneficio (BASE_CERO). El server lo soporta; cuándo el POS envía 0 es un punto abierto — ver §5.| Regla | Qué significa |
|---|---|
| Cálculo | descuento = mín( base × % , tope ). |
| Tope por el monto QR | El monto base nunca supera lo que se paga por QR → el descuento nunca deja el pago en negativo. |
| Monto mínimo | El mínimo del beneficio se evalúa contra el monto base (no contra el total). |
| Default (ausente) | Sin base_amount → se usa el total (comportamiento actual). Pensado para promos clásicas sobre todo el ticket. |
| base = 0 (si se enviara) | Si el POS enviara base_amount = 0 → no se ofrece ningún beneficio (motivo BASE_CERO). El server ya lo soporta; ver el punto abierto abajo sobre cuándo el POS lo envía. |
| Un beneficio por medio de pago | Nunca se suman beneficios; se elige uno (sin cambios respecto de hoy). |
| El total no cambia | El descuento se resta de lo que se cobra; el ticket sigue valiendo lo mismo. |
base_amount ausente → el beneficio se calcula sobre el total del ticket.base_amount = 0 → no aplica ningún beneficio (BASE_CERO). Implementado y verificado.base_amount en dos casos: (a) no hay promo base aplicable, y (b) hay una promo base configurada pero no acumuló ítems (requiere iAcuPromos>0; verificado en pos_tic2.cpp). Como "ausente" cae al total, hoy el caso (b) termina en beneficio sobre el total — lo contrario a la intención de negocio de "si no acumula, no aplica".
base_amount = 0 cuando existe una promo base configurada aunque no haya acumulado. Eso es un cambio en el POS (pos_tic2.cpp + rebuild + regresión), no del server (el server ya lo soporta). Es una idea propuesta, pendiente de confirmación del cliente que solicita el desarrollo — no está aprobada ni implementada. El comportamiento vigente es el descripto arriba (hoy (b) → beneficio sobre el total).
El autorizador confirma el descuento aplicado. El POS lo recibe e imputa el descuento repartiéndolo sobre todo el ticket (de forma proporcional por alícuota de IVA), de modo que lo informado al fisco cierra contra lo cobrado. El cálculo del beneficio usa el monto base; el reparte fiscal es sobre el ticket completo — son dos cosas distintas y así queda validado.
base_amount; falta el E2E real y el build de prod.Todo este cambio se desarrolla aparte del release en QA; no afecta lo que ya está en producción. El formato del campo quedó confirmado entre POS y server. Falta la prueba de punta a punta con el POS real (build de prod).
docs/base-amount-circuito-completo.html. El contrato con el autorizador, en docs/Beneficios-contrato-autorizador.html.