BeneficiosCenter — Beneficios en la intención de pago

Contrato GatewayQR ↔ Autorizador DINI/TECSO · rev. 2026-10-01 (incorpora 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.

negro = campo del estándar Prisma v27 (Grandes cuentas, QR) naranja = extensión Tipre (requiere acuerdo con el Autorizador DINI/TECSO)
Novedad de esta revisión — base_amount
Hasta ahora el descuento se calculaba sobre el total del ticket. Se incorpora 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.

1. Lo que viaja en la intención de pago (GatewayQR → Autorizador DINI/TECSO)

{
  "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).

1b. Cuando el descuento supera el tope

"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.

2. Lo que devuelve el Autorizador DINI/TECSO (webhook o consulta)

{
  "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.

Recordatorio de signo (POS). El POS espera 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.

3. Reglas de cálculo con base_amount base_amount

ReglaDefinición
Base de cálculobase_amount provisto por el POS. Default = original_amount (total) si no viene → comportamiento histórico.
Descuentoamount = mín(base_amount × percentage/100, maximum_discount_amount), 2 decimales.
Monto mínimo del beneficioSe evalúa contra base_amount (no contra el total).
Validación / tope0 ≤ 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 brutobase_amount es bruto (IVA + imp. internos, pre-percepciones), 2 decimales, misma unidad que totalitem. El % se aplica sobre ese bruto.
Total a pagarNo cambia: final = original_amount − amount (≥ 0).
AuditoríaBeneficiosCenter y el trx registran total y base para conciliar.
BeneficiosCenter · Contrato "Beneficios en la intención de pago" · rev. 2026-10-01. Referencias: [Integradores] Grandes cuentas - QR v27 (Prisma); Minuta Descuentos QR DINI; BeneficiosCenter SPEC §4–§5 y ADR-004. La extensión base_amount requiere acuerdo con el Autorizador DINI/TECSO.