Saltar al contenido principal

Intentos de Pago (Payment Retry)

El sistema de retry procesa automáticamente intentos de cobro para facturas en atraso.

Estados del Intento​

StatusDescripción
pendingEsperando procesamiento
processingSiendo procesado (reclamado por el worker)
succeededPago exitoso
failedPago rechazado, más intentos disponibles
exhaustedMáximo de intentos alcanzado

Campos del Intento​

CampoDescripción
FacturaFactura asociada
PagoRegistro de pago creado
Número del intentoSecuencial (1, 2, 3...)
Método de pagoMétodo utilizado en el intento
Valor (centavos)Valor a ser cobrado
Código de falloMotivo del rechazo
Mensaje de falloDescripción detallada del error
Programado paraFecha/hora del intento
Procesado enFecha/hora del procesamiento
Próximo retry enCuándo el próximo intento será realizado

Worker de Retry​

El worker se ejecuta cada 6 horas y:

  1. Busca intentos con status=pending y scheduledFor ≤ ahora
  2. Reclama atómicamente cada intento (pending → processing) para evitar duplicación
  3. Para cada intento:
    • Verifica si la factura ya fue pagada (omite)
    • Crea registro de pago
    • Procesa el pago vía gateway
  4. En caso de éxito:
    • Marca la factura como pagada
    • Crea registro de recuperación
    • Elimina la cuenta de la lista de morosos
  5. En caso de fallo:
    • Si hay intentos restantes: programa el próximo
    • Si agotó los intentos: marca como exhausted y suspende la cuenta (si está configurado)

Prevención de Condiciones de Carrera​

El sistema usa updateMany atómico con verificación de status para garantizar que solo un worker procese cada intento:

WHERE id = X AND status = 'pending'
SET status = 'processing'

Si count = 0, otro worker ya reclamó el intento.

Retry para Cuotas​

Los intentos también pueden ser dirigidos a cuotas específicas:

  • El metadata.installmentId identifica la cuota
  • El valor del intento es el de la cuota, no el de la factura completa