Validación de datos
Comprobar la hipótesis a nivel de datos
El flujo de la API y de los eventos indicaba que la transferencia había llegado a un estado de rechazo, pero el saldo disponible del cliente sugería que la reserva de fondos original seguía activa.
En este punto, la investigación va más allá de la respuesta del servicio y comprueba si los datos persistidos reflejan el estado de negocio esperado.
El objetivo no es consultar la base de datos en cada prueba, sino usar SQL cuando los datos del backend pueden confirmar o descartar una hipótesis concreta de la investigación.
1. Confirmar el estado de la transferencia y la reserva
SQL
SELECT
t.transfer_id,
t.status AS transfer_status,
t.amount,
r.status AS reservation_status,
r.reserved_amount
FROM transfers t
LEFT JOIN fund_reservations r
ON r.transfer_id = t.transfer_id
WHERE t.transfer_id = 'TRF-908771';Resultado esperado de la investigación
transfer_status = REJECTED
reservation_status = ACTIVE
reserved_amount = 8750.00
Esto confirma la inconsistencia: la transacción de negocio está rechazada, pero la reserva de fondos sigue activa.
2. Verificar el impacto en el saldo del cliente
SQL
SELECT
account_id,
ledger_balance,
reserved_amount,
available_balance
FROM account_balances
WHERE account_id = 'ACC-ES-4410';Resultado esperado
ledger_balance = 12480.00
reserved_amount = 8750.00
available_balance = 3730.00
El saldo contable no ha disminuido, pero la reserva activa sigue reduciendo el importe disponible para el cliente.
3. Comprobar si el evento de liberación se procesó
SQL
SELECT
e.event_type,
e.event_version,
e.processing_status,
e.created_at
FROM integration_events e
WHERE e.transfer_id = 'TRF-908771'
ORDER BY e.created_at;Resultado de ejemplo
transfer.created | 1.0 | PROCESSED
funds.reserved | 1.0 | PROCESSED
transfer.rejected | 2.0 | FAILED
Los datos respaldan la hipótesis del flujo de eventos: el evento de rechazo existe, pero su procesamiento posterior no se completó correctamente.
4. Detectar el patrón global
SQL
SELECT
COUNT(*) AS affected_transfers,
SUM(r.reserved_amount) AS total_funds_still_reserved
FROM transfers t
JOIN fund_reservations r
ON r.transfer_id = t.transfer_id
WHERE t.status = 'REJECTED'
AND r.status = 'ACTIVE';Esta consulta cambia la pregunta de “¿ha fallado una transferencia?” a “¿es esto una inconsistencia de estado sistémica y repetible?”.
SQL se utiliza aquí como evidencia de investigación: cada consulta existe para validar una hipótesis concreta sobre estado, dinero o procesamiento de eventos.