Controle Burger Service Nummer

Het Burger Service Nummer (BSN) is een uniek Nederlands persoonsgebonden nummer. Iedereen die zich bij een gemeente laat inschrijven in de Gemeentelijke basisadministratie van persoonsgegevens (GBA) krijgt zo’n nummer. Het is door de Nederlandse overheid in 2007 ingevoerd om, in combinatie met het DigiD, het elektronisch verkeer tussen overheid en burger in goede banen te leiden.

Het bestaat uit 8 of 9 cijfers en wordt voor de leesbaarheid veelal in drie groepen, gescheiden door een spatie, weergegeven. Is het nummer 8 cijfers lang kan het eerste cijfer (een nul) worden weggelaten.

In onderstaande code ga ik ervan uit dat de code wordt gebruikt om de invoer in een (Drupal-)formulier te valideren.

Hieronder wordt gesproken over de elfproef. De officiële benaming is: modulo 11 controle. Voor het BSN wordt een gewijzigde modulo 11 controle toegepast.

Validatiefase in een formulier

In de validatiefase van een formulier is een controle op het BSN noodzakelijk. Er zijn een aantal controles van belang:

  • het nummer mag niet leeg zijn -→ te realiseren ofwel in de opties van het veld ofwel in de controle bij de validatie
  • de invoer moet numeriek zijn
  • het nummer moet groter dan 9.999.999 en kleiner dan 100.000.000 zijn.

/**
 * Controleer Burger Service Nummer (BSN).
 *
 * @param $bsn
 *   Het te controleren Burger Service Nummer.
 *
 * @return
 *   Foutboodschap of lege string als geen fout gevonden.
 */
function controle_bsn($bsn) {
  // verwijder tussenliggende punten, komma's en spaties.
  $bsnr = str_replace(array('.', ',', ' '), '', trim($bsn));

  // BSN: alleen cijfers.
  if (!is_numeric($bsnr)) {
    return 'Het BSN bevat ongeldige tekens.';
  }

  // Verwijder voorloopnullen.
  while (substr($bsnr, 0, 1) == '0' && strlen($bsnr > 0)) {
    $bsnr = substr($bsnr, 1);
  }

  // BSN: controle op lengte en juistheid.
  $len = strlen($bsnr);
  if ($len > 9) {
    return 'Het BSN bevat te veel cijfers.';
  }
  if ($len < 8) {
    return 'Het BSN moet groter zijn dan 9.999.999.';
  }
  elseif (_bsn_elfproef($bsnr)) {
    return 'Het BSN is onbestaanbaar.';
  }
  return '';
}

De functie elfproef

/**
 * Controleer een BSN mbv de speciale elfproef (Modulo 11).
 * Wijkt af van de elfproef voor bankrekeningnummers:
 * het meest rechtercijfer wordt afgetrokken van het voorgaande resultaat.
 *
 * @param $bsnr
 *   Het geheel numerieke Burger Service Nummer.
 *
 * @return:
 *   True als fout, false als voldoet aan de proef.
 */
function _bsn_elfproef($bsnr) {
  $res = 0;
  $verm = strlen($bsnr);
  for ($i = 0; $i < strlen($bsnr); $i++, $verm--) {
    if ($verm == 1) {
      $verm = -1;
    }
    $res += substr($bsnr, $i, 1) * $verm;
  }
  return ($res % 11);
}