Ir al contenido

Reconectar Banco

Renueva una conexión bancaria con tokens expirados o revocados.

  • ⚠️ Badge “Requiere reconexión” en tarjeta de conexión
  • ⚠️ Status: expired o revoked
  • ⚠️ Sincronización fallando repetidamente
  1. Haz clic en “Reconectar” en tarjeta de banco
  2. Repite flujo OAuth (mismo proceso que conexión inicial)
  3. Tokens se actualizan preservando historial de transacciones
  4. Conexión vuelve a active

✅ Historial de transacciones importadas ✅ Reconciliaciones realizadas ✅ Configuración de sincronización (frecuencia, rango) ✅ Cuentas en business_bank_accounts

AcciónReconectarNueva conexión
Historial✅ Preservado❌ Se crea nueva conexión
Transacciones✅ Mantiene existentes❌ Duplicaría transacciones
ID conexión✅ Mismo ID⚠️ Nuevo ID
ErrorCausaSolución
”Esta conexión ya está activa”Conexión no está expiradaNo necesita reconexión
”Banco ya conectado”Existe conexión activa del mismo bancoDesconectar la antigua primero
Detalles de implementación

Lógica de reconexión en truelayer-auth:

// Buscar conexión existente por business_id y account_ids
const { data: existingConnection } = await supabase
.from("bank_connections")
.select("id, status, connection_id")
.eq("business_id", business_id)
.contains("account_ids", accountIds) // ← Crucial
.in("status", ["active", "expired", "disconnected", "revoked"])
.order("created_at", { ascending: false })
.limit(1)
.maybeSingle();
if (existingConnection) {
// UPDATE: Reactivar conexión existente
console.log("♻️ Actualizando conexión existente");
const { data: updatedConnection } = await supabase
.from("bank_connections")
.update({
token_expires_at: expiresAt.toISOString(),
status: "pending", // Será 'active' tras guardar tokens
requires_reauth: false,
consecutive_failures: 0,
last_error: null,
})
.eq("id", existingConnection.id)
.select()
.single();
connection = updatedConnection;
isUpdate = true;
} else {
// INSERT: Nueva conexión
console.log("➕ Creando nueva conexión bancaria");
// ...
}
// Actualizar tokens encriptados (igual para INSERT/UPDATE)
await supabase.rpc("update_bank_connection_tokens", {
p_connection_id: connection.id,
p_new_access_token: tokenData.access_token,
p_new_refresh_token: tokenData.refresh_token,
p_new_expires_at: expiresAt.toISOString(),
p_new_status: "active",
});
return {
success: true,
is_reconnection: isUpdate // ← Frontend puede mostrar mensaje diferente
};

Por qué contains("account_ids", accountIds):

  • Evita duplicados cuando usuario reconecta exactamente las mismas cuentas
  • Si usuario conecta cuentas DIFERENTES del mismo banco → nueva conexión
  • Permite tener múltiples conexiones de un banco si son cuentas distintas