Asociar a Transacción Bancaria
Exportar contenido
Vinculación manual o automática de gastos con transacciones bancarias importadas.
Componente
Sección titulada «Componente»<BankTransactionsTab onReconciliationComplete={handleReconciliation}/>Características
Sección titulada «Características»- Vista de transacciones tipo DEBIT (gastos)
- Estados de conciliación: Pendiente, Conciliado, Ignorado
- Sugerencias automáticas con nivel de confianza
- Crear gasto desde transacción con datos pre-cargados
- Confirmación de coincidencias con un clic
- Búsqueda manual de coincidencias
- Acciones en lote para múltiples transacciones
Tipos de datos
Sección titulada «Tipos de datos»interface BankTransaction { id: string; business_id: string; bank_account_id: string; transaction_id: string; // ID del banco amount: number; currency: string; transaction_date: string; description: string; merchant_name: string | null; // Nombre del comercio category: string | null; reconciliation_status: 'pending' | 'matched' | 'ignored'; matched_expense_id: string | null; // FK a expenses match_confidence: 'high' | 'medium' | 'low' | null; reconciled_at: string | null; reconciled_by: string | null;}Flujo de asociación manual
Sección titulada «Flujo de asociación manual»- Usuario selecciona transacción pendiente
- Click en botón “Ver/Crear gasto”
- Se abre
CreateExpenseSheetcon datos pre-cargados:amount: Monto de la transacciónexpense_date: Fecha de la transacciónname:merchant_nameodescription
- Usuario completa campos faltantes (categoría, IVA, proveedor)
- Al guardar, se crea el gasto y se vincula:
// Crear gastoconst { data: newExpense, error } = await supabase .from('expenses') .insert(expenseData) .select() .single();
// Vincular transacciónawait supabase .from('bank_transactions') .update({ matched_expense_id: newExpense.id, reconciliation_status: 'matched', match_confidence: 'high', reconciled_at: new Date().toISOString(), reconciled_by: user.id, }) .eq('id', transaction.id);Sugerencias de proveedor
Sección titulada «Sugerencias de proveedor»El sistema sugiere proveedores usando:
import { useBankTransactionVendorMatch } from '@/features/bank/hooks/useBankTransactionVendorMatch';
const { matchResult, createAutoAlias } = useBankTransactionVendorMatch( transaction.merchant_name);
// matchResult contiene:// {// vendor: Vendor | null,// confidence: 'high' | 'medium' | 'low',// matchedBy: 'alias' | 'name' | 'fuzzy'// }Algoritmo:
- Busca alias exactos en tabla
vendor_aliases - Si no encuentra, busca coincidencia de nombre
- Si no encuentra, usa fuzzy matching (Levenshtein)
Auto-learning de alias
Sección titulada «Auto-learning de alias»Cuando el usuario selecciona un proveedor diferente al sugerido, el sistema aprende:
if (formData.vendor_id && transaction.merchant_name) { await createAutoAlias(formData.vendor_id, transaction.merchant_name);}
// Crea entrada en vendor_aliases:// {// vendor_id: 'uuid',// alias: 'AMAZON EU',// is_auto: true,// business_id: 'uuid'// }Búsqueda manual de coincidencias
Sección titulada «Búsqueda manual de coincidencias»<FindMatchSheet open={findMatchOpen} onOpenChange={setFindMatchOpen} transaction={selectedTransaction} onSelectMatch={handleManualMatch}/>Permite:
- Buscar gastos por texto, fecha, monto
- Ver detalles de cada coincidencia posible
- Asociar manualmente una transacción con un gasto existente