> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zonavirtual.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Pagos mixtos y fraccionados

> Dividir el pago entre varios medios o dentro de un mismo medio.

Zonapay permite al usuario dividir el total de una transacción entre:

* **Medios distintos** (ej. PSE + TC) - pagos **mixtos**.
* **Varias instancias del mismo medio** (ej. 2 tarjetas distintas) - pagos **fraccionados**.

Ambos se habilitan con códigos en `AdicionalesConfiguracion`.

## Pagos mixtos (PSE + TC)

Habilita pagos mixtos:

```json theme={null}
{ "int_codigo": 109, "str_valor": "1" }
```

y permite división en varios medios

```json theme={null}
{ "int_codigo": 100, "str_valor": "1" }
```

### Ejemplo completo

```json theme={null}
{
  "AdicionalesConfiguracion": [
    { "int_codigo": 50,  "str_valor": "tu_codigo_servicio" },
    { "int_codigo": 109, "str_valor": "1" },
    { "int_codigo": 100, "str_valor": "1" },
    { "int_codigo": 105, "str_valor": "50000" },
    { "int_codigo": 106, "str_valor": "3" }
  ]
}
```

Permite al usuario dividir su pago en hasta 3 fracciones, mínimo \$50.000 por fracción.

## Pagos fraccionados (varias TC o varios PSE)

Fraccionar en varias tarjetas de crédito:

```json theme={null}
{ "int_codigo": 101, "str_valor": "1" }
```

Fraccionar en varias cuentas PSE:

```json theme={null}
{ "int_codigo": 102, "str_valor": "1" }
```

## Configuración de límites

| Código | Propósito                                |
| ------ | ---------------------------------------- |
| `105`  | Monto mínimo por fracción                |
| `106`  | Número máximo de fracciones              |
| `112`  | Valor por defecto de la primera fracción |

## Qué recibes en VerificacionPago

`int_cantidad_pagos` será mayor a 1. Cada elemento del array parseado es un **sub-pago** con su propio `int_n_pago`, `int_id_forma_pago` y `dbl_valor_pagado`.

```javascript theme={null}
const pagos = parseStrResPago(data.str_res_pago);
const totalPagado = pagos.reduce((sum, p) => sum + Number(p.dbl_valor_pagado), 0);
// totalPagado debe igualar flt_total_con_iva del request original

const todosAprobados = pagos.every(p => Number(p.int_estado_pago) === 1);
```

## Lógica de aprobación

<Warning>
  El pago se considera completamente aprobado **solo cuando todos los sub-pagos están aprobados**. Si uno falla, los demás pueden requerir reversa manual — coordina con soporte.
</Warning>

```javascript theme={null}
function estadoPagoMixto(pagos) {
  const todosAprobados = pagos.every(p => Number(p.int_estado_pago) === 1);
  const algunRechazado = pagos.some(p =>
    [1000, 1001, 4000, 4003].includes(Number(p.int_estado_pago))
  );
  const algunPendiente = pagos.some(p =>
    [888, 999, 4001].includes(Number(p.int_estado_pago))
  );

  if (todosAprobados) return "aprobado";
  if (algunPendiente) return "pendiente";
  if (algunRechazado) return "rechazado_parcial";
  return "desconocido";
}
```

## Cuándo usar pagos mixtos

* Tickets altos (\$300k+) donde el usuario quiere distribuir entre medios.
* Productos donde un solo medio puede no cubrir el cupo (electrónica, muebles, tecnología).
* Recaudo tributario que permite pagar con varias cuentas.

No recomendados para:

* Tickets bajos (\<\$100k): genera complejidad sin beneficio.
* Productos digitales de entrega inmediata: esperar varios sub-pagos ralentiza la experiencia.

## Ver también

<CardGroup cols="2">
  <Card title="AdicionalesConfiguracion" icon="sliders" href="/docs/zonapay/api/referencia/adicionales-configuracion">
    Catálogo completo de códigos.
  </Card>

  <Card title="Verificar estado" icon="magnifying-glass" href="/docs/zonapay/guias/verificar-estado">
    Cómo leer múltiples sub-pagos.
  </Card>
</CardGroup>
