All files ibanGenerator.ts

94.44% Statements 17/18
66.66% Branches 2/3
100% Functions 5/5
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43            1x   1x   1x   1x   1x 1x               1x   6x     1x 1x           1x 2x   2x 12x 2x    
// src/ibanGenerator.ts
 
/**
 * Genereert een geldig Nederlands IBAN nummer voor testdoeleinden.
 * Formaat: NLkkBBBB0123456789 (kk = controlegetal, BBBB = bankcode)
 */
export function generateTestDutchIBAN(bankCode: string = "TEST"): string {
  // Bankcode moet 4 hoofdletters zijn
  bankCode = bankCode.toUpperCase().padEnd(4, 'X').slice(0, 4);
  // 10 random cijfers voor het rekeningnummer
  const accountNumber = Math.floor(1000000000 + Math.random() * 9000000000).toString();
  // IBAN zonder controlegetal
  const partialIban = `NL00${bankCode}${accountNumber}`;
  // Controlegetal berekenen
  const checkDigits = calculateIbanCheckDigits(partialIban);
  return `NL${checkDigits}${bankCode}${accountNumber}`;
}
 
/**
 * Bereken het IBAN controlegetal volgens de mod-97 methode.
 */
function calculateIbanCheckDigits(iban: string): string {
  // Zet letters om naar cijfers (A=10, B=11, ..., Z=35)
  const rearranged = iban.slice(4) + iban.slice(0, 4);
  // Let op: sommige banken geven een rekeningnummer met leidende nullen, dus we moeten alles als string behandelen
  const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
  // BigInt kan alleen werken met cijfers, dus we moeten de string splitsen als deze te lang is
  // Maar voor Nederlandse IBANs is de string kort genoeg voor BigInt
  const mod97 = 98n - (BigInt(replaced) % 97n);
  return mod97.toString().padStart(2, '0');
}
 
/**
 * Valideert of een string een geldig Nederlands IBAN is.
 */
export function isValidDutchIBAN(iban: string): boolean {
  Iif (!/^NL\d{2}[A-Z]{4}\d{10}$/.test(iban)) return false;
  // Mod-97 check
  const rearranged = iban.slice(4) + iban.slice(0, 4);
  const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
  return BigInt(replaced) % 97n === 1n;
}