base_amount) · reemplaza el PDF 2026-09-10.BeneficiosCenter (Tipre) decide, antes de autorizar, qué descuento corresponde a cada tipo de cuenta DINI para ese ticket. El GatewayQR adjunta el resultado a la intención de pago en el bloque benefits_methods_data del estándar Prisma. El Autorizador DINI/TECSO aplica una sola entrada, la que coincide con la cuenta que efectivamente pagó, y devuelve lo aplicado en benefits_data. Los filtros (vigencia, día y horario, sucursal, monto mínimo, tipo de factura) ya vienen resueltos: lo que llega, aplica.
base_amount: un monto base de cálculo (provisto por el POS) sobre el cual se calcula el beneficio, en vez de sobre el total. El total a pagar no cambia; el descuento (calculado sobre base_amount) se resta del total. Regla: amount = mín(base_amount × percentage / 100, maximum_discount_amount). El origen de base_amount (cómo lo computa y acumula el POS) se documenta aparte, del lado POS.
{
"original_amount": 100000.00, // monto que se paga por QR (totalitem); tope de base_amount
"benefits_methods_data": [
{
"establishment_id": "12345678",
"benefits_card": { "code": "990", "description": "Jueves Dini Negocios 10%" },
"discount": {
"percentage": 10.00,
"base_amount": 30000.00, // NUEVO: base de cálculo (del POS); default = original_amount
"maximum_discount_amount": 15000.00,
"amount": 3000.00, // = mín(base_amount × percentage/100, tope)
"type": "DISCOUNT"
}
},
{
"establishment_id": "12345678",
"benefits_card": { "code": "991", "description": "Gift Card 5% Septiembre" },
"discount": { "percentage": 5.00, "base_amount": 30000.00, "amount": 1500.00, "type": "DISCOUNT" }
}
]
}
Estándar Prisma (págs. 14, 21, 28, 29 del doc v27): benefits_methods_data es un array opcional; benefits_card.code es alfanumérico y no se valida (van los códigos de cuenta DINI 990/991); discount.percentage es el porcentaje; discount.maximum_discount_amount es opcional (si no hay tope, no se envía).
Extensión Tipre. discount.amount es el monto ya calculado por BeneficiosCenter. base_amount es el monto base sobre el que se calculó: amount = mín(base_amount × percentage/100, maximum_discount_amount). discount.type anticipa beneficios que no sean descuento (hoy siempre DISCOUNT). Si el Autorizador no acepta estos campos, el gateway los omite y el contrato queda en los campos estándar.
Ejemplo. Ticket total 100.000 (sigue siendo lo que se paga). El POS acumuló 30.000 de promos (base_amount). Jueves Dini Negocios 10% → amount = 30.000 × 10% = 3.000 (no supera el tope 15.000). El cliente paga 100.000 − 3.000 = 97.000. Si el POS no manda base_amount, vale base_amount = original_amount = 100.000 → 10% = 10.000 (comportamiento histórico).
"discount": {
"percentage": 10.00,
"base_amount": 250000.00,
"maximum_discount_amount": 15000.00,
"amount": 15000.00, // 250000 × 10% = 25000 > tope → amount = 15000
"type": "DISCOUNT"
}
Regla: amount = mín(base_amount × percentage/100, maximum_discount_amount), redondeado a 2 decimales. El Autorizador no computa nada: descuenta amount y devuelve discounted_amount.
{
"status": "approved",
"payment_method_id": 990,
"amount": 97000.00, // total a pagar ya con el descuento restado
"benefits_data": {
"benefits_card": { "code": "990", "description": "Jueves Dini Negocios 10%" },
"original_amount": 100000.00, // total del ticket
"base_amount": 30000.00, // NUEVO (eco): base sobre la que se calculó
"discounted_amount": 3000.00, // descuento aplicado
"percentage": 10.00,
"type": "DISCOUNT"
}
}
Estándar Prisma (págs. 37, 46, 47): benefits_data viene solo si intervino una tarjeta de beneficios, con benefits_card aplicada, original_amount y discounted_amount. Con payment_method_id = benefits_card.code el gateway sabe qué entrada se aplicó, calcula importe_recdesc e importe_final para el POS, y el trxid lo cruza con la auditoría de BeneficiosCenter.
Extensión Tipre. percentage y type permiten conciliar sin recalcular. base_amount en la respuesta es el eco del monto base; permite auditar total y base. No son imprescindibles: con code y discounted_amount alcanza.
importe_recdesc negativo (pos_mppo.cpp PagoQR_ImputarDescuento: dD = -1 × importe_recdesc, rechaza si dD < 0). GatewayQR lee benefits_data.discounted_amount (no el top level) desde la rev. v20261001.
base_amount base_amount| Regla | Definición |
|---|---|
| Base de cálculo | base_amount provisto por el POS. Default = original_amount (total) si no viene → comportamiento histórico. |
| Descuento | amount = mín(base_amount × percentage/100, maximum_discount_amount), 2 decimales. |
| Monto mínimo del beneficio | Se evalúa contra base_amount (no contra el total). |
| Validación / tope | 0 ≤ base_amount ≤ original_amount, donde original_amount = monto QR a pagar (totalitem). El server usa base_efectivo = mín(base_amount, original_amount); así amount ≤ original_amount y nunca da importe_final negativo (importa por pagos QR parciales: el tope es el monto QR, no el total del canasto). |
| Base bruto | base_amount es bruto (IVA + imp. internos, pre-percepciones), 2 decimales, misma unidad que totalitem. El % se aplica sobre ese bruto. |
| Total a pagar | No cambia: final = original_amount − amount (≥ 0). |
| Auditoría | BeneficiosCenter y el trx registran total y base para conciliar. |
base_amount requiere acuerdo con el Autorizador DINI/TECSO.