Ir al contenido

Añadir Cuenta Manual

Crea una cuenta bancaria manualmente ingresando IBAN, BIC y datos del banco. Útil para mostrar en facturas sin conectar Open Banking.

  1. Haz clic en “Añadir cuenta manual” en pantalla de Bancos
  2. Completa formulario:
    • Nombre del banco (requerido)
    • IBAN (requerido, se auto-formatea con espacios)
    • BIC/SWIFT (opcional, 8 o 11 caracteres)
    • Dirección del banco (opcional)
    • Nombre del beneficiario (opcional)
  3. Marca como predeterminada si quieres usarla por defecto en facturas
  4. Guarda y la cuenta aparece en lista

IBAN: Formato internacional con checksum válido (ej: ES21 1234 5678 9012 3456 7890) ✅ BIC/SWIFT: 8 o 11 caracteres alfanuméricos (ej: BCIRLULL) ✅ Unicidad: No permite IBAN duplicado en mismo negocio

CaracterísticaManualOpen Banking
Transacciones❌ No✅ Sí, automáticas
Saldos❌ No✅ Sí, en tiempo real
Facturas✅ Sí✅ Sí
Conciliación❌ No✅ Sí
ErrorCausaSolución
”Formato de IBAN inválido”IBAN no pasa validación checksumVerifica IBAN con tu banco, copia exactamente
”Este IBAN ya existe”Ya hay cuenta con mismo IBANEdita cuenta existente o usa otro IBAN
”Formato de BIC/SWIFT inválido”BIC tiene longitud incorrectaDeja vacío o ingresa 8/11 caracteres válidos
Detalles de implementación

Componente: BankAccountFormDialog Tabla: business_bank_accounts

Validación IBAN:

export function validateIBAN(iban: string): boolean {
const cleaned = iban.replace(/\s/g, '').toUpperCase();
// Longitud: 15-34 caracteres
if (cleaned.length < 15 || cleaned.length > 34) return false;
// Formato: 2 letras + 2 dígitos + resto alfanumérico
if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(cleaned)) return false;
// Algoritmo MOD-97 checksum
const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
const numeric = rearranged.replace(/[A-Z]/g, (char) =>
String(char.charCodeAt(0) - 55)
);
// BigInt para evitar overflow en IBANs largos
return BigInt(numeric) % 97n === 1n;
}

Auto-formateo:

export function formatIBAN(iban: string): string {
const cleaned = iban.replace(/\s/g, '').toUpperCase();
return cleaned.match(/.{1,4}/g)?.join(' ') || cleaned;
}
// Input: "ES2112345678901234567890"
// Output: "ES21 1234 5678 9012 3456 7890"

Constraint de unicidad:

ALTER TABLE business_bank_accounts
ADD CONSTRAINT unique_iban_per_business
UNIQUE (business_id, iban);