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