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

# Certificación y salida a producción

> Casos de prueba, evidencias y checklist de certificación para Pay-me Transit PinPAD.

La certificación debe validar el contrato HTTP, la interacción física con el Wiseasy P5L, la decisión de negocio y la recuperación sin doble cobro.

## Preparación

Antes de ejecutar casos:

* registra la versión de Pay-me PinPAD instalada;
* confirma la asociación entre sistema central, punto de atención y Wiseasy P5L;
* configura una IP estable y el puerto del terminal;
* ejecuta `GET /health` desde el sistema central;
* completa la verificación de llaves en el terminal;
* configura el timeout de autorización en al menos 100 a 110 segundos para las pruebas;
* habilita persistencia y logs sanitizados;
* acuerda referencias, montos y medios de pago de prueba.

## Casos de contrato

| Caso                                   | Estímulo                                                                               | Resultado esperado                                    |
| -------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| Disponibilidad                         | `GET /health`                                                                          | HTTP `200`, `status: "UP"`, `service: "Alignet ECR"`. |
| Solicitud mínima                       | `operationNumber`, `amount`, `currency` y `paymentMethod` válidos                      | La autorización se procesa sin error de validación.   |
| Solicitud completa                     | Incluye los campos obligatorios y `additionalFields` con valores String                | La autorización se procesa sin error de validación.   |
| Referencia numérica                    | `operationNumber: "44992528"`                                                          | Se acepta como String numérico.                       |
| Referencia con caracteres no numéricos | Incluye letras, guiones, espacios u otros caracteres                                   | HTTP `400` con `BAD_REQUEST`.                         |
| Monto como cadena                      | `amount: "100"`                                                                        | Se acepta como String numérico en unidades menores.   |
| Monto como número JSON                 | `amount: 100`                                                                          | HTTP `400` con `BAD_REQUEST`.                         |
| Moneda como cadena                     | `currency: "604"`                                                                      | Se acepta como String numérico de tres dígitos.       |
| Moneda como número JSON                | `currency: 604`                                                                        | HTTP `400` con `BAD_REQUEST`.                         |
| Moneda ausente                         | No incluye `currency`                                                                  | HTTP `400` con `BAD_REQUEST`.                         |
| Método de pago                         | Ejecuta solicitudes independientes con `paymentMethod: "CARD"` y `paymentMethod: "QR"` | Cada valor se acepta por separado.                    |
| Método de pago ausente                 | No incluye `paymentMethod`                                                             | HTTP `400` con `BAD_REQUEST`.                         |
| Métodos de pago simultáneos            | Envía `CARD` y `QR` juntos, como arreglo o valor combinado                             | HTTP `400` con `BAD_REQUEST`.                         |
| Método de pago inválido                | Envía un valor distinto de `CARD` o `QR`                                               | HTTP `400` con `BAD_REQUEST`.                         |
| Referencia inválida                    | Vacía, no numérica o mayor de 64 dígitos                                               | HTTP `400` con `BAD_REQUEST`.                         |
| Monto inválido                         | Cero, negativo, decimal, no numérico o mayor de 12 dígitos                             | HTTP `400` con `BAD_REQUEST`.                         |
| Moneda inválida                        | No contiene exactamente tres dígitos                                                   | HTTP `400` con `BAD_REQUEST`.                         |
| Campo adicional inválido               | Valor que no es String                                                                 | HTTP `400` con `BAD_REQUEST`.                         |

## Casos transaccionales

| Caso                   | Resultado esperado                                                                            | Decisión del sistema central                               |
| ---------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| Pago aprobado          | HTTP `200`, `APPROVED`, `00`, código de autorización y fecha final.                           | Confirmar y aplicar la regla de apertura.                  |
| Pago rechazado         | HTTP `200`, `DENIED` y código distinto de `00`.                                               | No confirmar.                                              |
| Cancelación remota     | `POST /reversals` sobre una autorización activa interrumpe el flujo y termina en `CANCELLED`. | No confirmar ni enviar un extorno adicional.               |
| Extorno aprobado       | `POST /reversals` devuelve HTTP `200`, `REVERSED` y `00`.                                     | Registrar la reversa y su código de autorización.          |
| Extorno pendiente      | HTTP `202`, `PENDING`, `WAITING_RESULT`.                                                      | Consultar `GET /reversals/{operationNumber}`.              |
| Extorno denegado       | HTTP `200`, `DENIED` y código distinto de `00`.                                               | No registrar como extornado ni reintentar automáticamente. |
| Espera agotada         | HTTP `202`, `PENDING`, `WAITING_RESULT`.                                                      | Consultar, sin nuevo cobro.                                |
| Terminal ocupado       | Otra referencia durante un cobro activo devuelve `409 POS_BUSY`.                              | Esperar y reintentar cuando se libere.                     |
| Terminal no listo      | HTTP `503 POS_NOT_AVAILABLE`.                                                                 | Recuperar disponibilidad antes de reintentar.              |
| Referencia inexistente | La consulta devuelve `404 NOT_FOUND`.                                                         | Verificar la referencia; no asumir rechazo financiero.     |

## Casos de idempotencia y recuperación

| Caso                                | Validación esperada                                                                      |
| ----------------------------------- | ---------------------------------------------------------------------------------------- |
| Misma referencia durante el proceso | El segundo envío no inicia otro cobro y devuelve `202` con el estado actual.             |
| Misma referencia finalizada         | Devuelve `200` con el resultado guardado sin otro cargo.                                 |
| Otra referencia concurrente         | Devuelve `409 POS_BUSY`.                                                                 |
| Timeout del sistema central         | El sistema central consulta la referencia original antes de aceptar otro intento.        |
| Pérdida de red                      | Al reconectar, el sistema central consulta las operaciones abiertas.                     |
| Reinicio del sistema central        | Recupera desde persistencia y consulta cada referencia no final.                         |
| Reinicio del P5L durante el cobro   | La operación queda `UNKNOWN`; el sistema central no confirma ni rechaza automáticamente. |
| `202` repetido                      | El sistema central respeta `Retry-After` y aplica el límite de consulta acordado.        |

## Verificaciones de seguridad

<Check>
  El puerto del terminal no es accesible desde redes no autorizadas ni desde Internet.
</Check>

<Check>
  `operationNumber` no contiene datos personales.
</Check>

<Check>
  Las solicitudes, respuestas y evidencias no contienen PAN completo, CVV, PIN, PIN Block, pistas ni datos EMV sensibles.
</Check>

<Check>
  El acceso y la retención de logs están controlados.
</Check>

## Lista de verificación para producción

<Check>
  Cada Wiseasy P5L tiene IP fija o reserva DHCP y puerto documentado.
</Check>

<Check>
  El sistema central ejecuta satisfactoriamente autorización, consulta, extorno y consulta de extorno.
</Check>

<Check>
  El timeout definitivo del sistema central es mayor que la espera interna confirmada de Pay-me PinPAD.
</Check>

<Check>
  La frecuencia, el backoff y el límite de consulta están acordados.
</Check>

<Check>
  El sistema central confirma únicamente `200` + `APPROVED` + `00`.
</Check>

<Check>
  La lógica de idempotencia, concurrencia, timeout y reinicio superó las pruebas.
</Check>

<Check>
  La decisión de negocio para `PENDING` y `UNKNOWN` está aprobada.
</Check>

<Check>
  Las claves de `additionalFields`, monedas y medios de pago están confirmados.
</Check>

<Check>
  El catálogo de códigos y el procedimiento para códigos desconocidos están registrados.
</Check>

<Check>
  Existen monitoreo, contactos de soporte y un procedimiento de escalamiento.
</Check>

<Check>
  El integrador y Alignet aprobaron las evidencias de integración y UAT.
</Check>

## Criterio de aceptación

No habilites producción mientras exista riesgo de interpretar `PENDING`, `UNKNOWN`, timeout o `404` como rechazo y generar un cobro adicional. La salida requiere demostrar que toda operación incierta conserva su referencia original hasta resolverse o escalarse.
