<?php
class Iban {
//Slechts voor Nederlanse rekeningnummers.
//de BIC is in wezen de verkorte notatie van de Swift code pos 1..4 is bank pos 5..6 is land
//dit is een class en er is geen echte pogingen gedaan om te voldoen aan allerlei OOP regels
//er zijn 4 methoden die gebruikt kunnen worden
//-1 generate_select_string
// geen input
// returns
// een string die een select bevat waar alle banken in staan
// de select heeft options waar in de value de BIC staat
// de select heeft ook "selected = selected" bij een option indien
// de waarde al een keer is geselecteerd in een form die
// gebruik maakt van de select_string die uiteraard met een echo
// in het script staat
// name en id van de select = "Banksel"
// voorbeeld :$objectje = new Iban();
// $echo_string = objectje->generate_select_string;
// echo $echo_string;
//-2 invoer_voor_iban
// input
// -de bic van de bank, maak gebruik van $_POST['Banksel'] indien select_string is gebruikt
// -het rekeningnummer bijvoorbeeld $_POST['Reknr']
// returns
// een string die
// -de IBAN bevat of
// -een foutmelding, de string begint dan met een "!"
//-3 banknaam
// input
// de BIC die wordt naar uppercase gezet
// returns
// de banknaam of "onbekend" indien de BIC niet bekend is
//-4 bepaal_11_proef
// input
// een rekeningnummer
// returns
// boolean true of false
// true indien de input voldoet aan de 11-proef
//-------------------------------------------------------------------------------------------------------------
//beschrijving van berekening IBAN zie http://nl.wikipedia.org/wiki/International_Bank_Account_Number
//controledigits altijd 2 posities dus geen "4" maar "04"
//beschrijving 11-proef zie http://nl.wikipedia.org/wiki/Elfproef
//-------------------------------------------------------------------------------------------------------------
// BIC => Naam vd bank
private $babic = array('ABNANL' => 'Abn Amro' ,
'AEGONL' => 'Aegon bank' ,
'CEBUNL' => 'C & E Bankiers' ,
'CITINL' => 'Citybank International' ,
'FVLBNL' => 'F. van Lanschot Bankiers' ,
'FTSBNL' => 'Fortis bank' ,
'FRBKNL' => 'Friesland bank' ,
'INGBNL' => 'Ing bank' ,
'RABONL' => 'Rabobank' ,
'SNSBNL' => 'Sns en Asn bank',
// 'SNSBNL' => 'Asn bank(=Sns bank)',
'RBOSNL' => 'Royal bank of Scotland',
'AHBKNL' => 'Achmea Hypotheek bank',
'ARBNNL' => 'Achmea Retail bank',
'AENVNL' => 'Aegon NV',
'AKBKNL' => 'Akbank',
'AMSCNL' => 'Amstel Securities',
'STOLNL' => 'Amsterdam Trade bank',
'ANDLNL' => 'Anadolubank Nederland',
'ABPTNL' => 'Apg Algemene Pensioen Groep',
'ARAMNL' => 'Aramco Overseas Company',
'AZLHNL' => 'Azl',
'INSINL' => 'Bank Insinger de Beaufort',
'BKMGNL' => 'Bank Mendes Gans',
'BOFANL' => 'Bank of America',
'BKCHNL' => 'Bank of China',
'BOTKNL' => 'Bank of Tokyo-Mitsubishi UFJ',
'BICKNL' => 'Binck bank',
'BNPANL' => 'Bnp Paribas',
'CGGVNL' => 'Cggveritas Services Holding',
'CITCNL' => 'Citco bank',
'COBANL' => 'Commertz bank AG',
'FBHLNL' => 'Credit Europe bank',
'DAIXNL' => 'Daimler International Finance',
'DLIMNL' => 'Delta Lloyd Asset Management',
'DLBKNL' => 'Delta Lloyd bank',
'DHBNNL' => 'Demir-Halk bank',
'DEUTNL' => 'Deutsche bank',
'DSSBNL' => 'Dsb bank',
'MIFINL' => 'Dutch Ministry of Finance',
'DSTANL' => 'Dutch State Treasury Agency',
'TEBUNL' => 'Economy bank',
'EMCFNL' => 'Emcf',
'INNDNL' => 'Equens',
'EQUINL' => 'Equity Trust Co',
'NECINL' => 'Euroclear Nederland',
// 'ECLNNL' => 'Euroclear Nederland(2)', niet in gebruik oid volgens Euroclear
// mensen van Euroclear zijn niet echt spraakzaam
'UGBINL' => 'Garantibank International',
'ARTENL' => 'Ge Artesia bank',
'HABBNL' => 'Habib bank',
'HBUANL' => 'Hollandsche Bank Unie',
'HSBCNL' => 'HSBC bank',
'BBRUNL' => 'Ing Belgium NV/SA',
'INGINL' => 'Ing Investment Management',
'BCITNL' => 'Intensa Sanpaolo S.P.A.',
'ISBKNL' => 'Isbank GMBH',
'CHASNL' => 'JpMorgan Chase bank',
'KASANL' => 'Kas bank',
'KREDNL' => 'Kbc bank',
'KBCLNL' => 'Kbc Clearing',
'KEMPNL' => 'Kempen and Co',
'KECANL' => 'Kempen Capital Management',
'JBBRNL' => 'Kepler Equities',
'KPNCNL' => 'Koninklijke KPN',
'KOEXNL' => 'Korea Exchange bank',
'LPLNNL' => 'Leaseplan Corporation',
'OVBNNL' => 'Levob bank',
'LOYDNL' => 'Lloyds TSB bank',
'LOCYNL' => 'Lombard Odier Darier Hentsch en Cie',
'TWIXNL' => 'Mars Nederland',
'ICBCNL' => 'Mega International Commercial bank',
'MHCBNL' => 'Mizuho Corporate bank',
'MNSNNL' => 'Mn Services NV',
'AMTSNL' => 'Mts Amsterdam',
'BOUNNL' => 'N.V. Bank Voor de Bouwnijverheid',
'NTCONL' => 'Nachenius Tjeenk and Co',
'ESESNL' => 'Nederlands Centraal Instituut Voor Giraal Effectenverkeer',
'FLORNL' => 'Nederlandsche bank',
'NFMONL' => 'Nederlandse Financierings-maatschappij voor ontwikkelingslanden',
'NWABNL' => 'Nederlandse Waterschapsbank',
'DNIBNL' => 'Nibc bank',
'BNGHNL' => 'Bank Nederlandse Gemeenten',
'SBNLNL' => 'Settlement bank of the Netherlands',
'PGGMNL' => 'Pggm',
'BVHLNL' => 'Rbc Dexia Investor Services',
'RGVMNL' => 'Robeco Institutional Asset Management',
'RGRBNL' => 'Robeco Institutional Asset Management Funds',
'ROCHNL' => 'Roche Pharmholding',
'SFBVNL' => 'Schlumberger Finance',
'SCRTNL' => 'Schretlen en Co',
'SNSINL' => 'Sns asset management',
'SOVENL' => 'Sociale Verzekeringsbank',
'SOGENL' => 'Societe Generale',
'STALNL' => 'Staal bankiers',
'SCBLNL' => 'Standard Chartered Latin America',
'SHELNL' => 'Stichting Shell pensioenfonds',
'HANDNL' => 'Svenska Handelsbanken',
'SWHQNL' => 'Swift Customer Service Centre',
'SYAVNL' => 'Syntrus Achmea asset management',
'TDOMNL' => 'Td Waterhouse bank',
'GILLNL' => 'Theodoor Gilissen bankiers',
'TRIONL' => 'Triodus bank',
'BFOFNL' => 'Unilever Finance International',
'AMSTNL' => 'Westlandutrecht effectenbank',
'KABANL' => 'Yapi KREDI bank');
private $numeriek = false; //indicator of iets numeriek is
private $input_bic =''; //de bic ontdaan van voorloop en trailing spaties en HTML en in uppercase
private $input_rek =''; //rekeningnummer ontdaan van voorloop en trailing spaties en HTML
private $iban =''; //de uiteindelijk berekende iban/foutmelding die geretouneerd wordt
private function numeriek_test($teststring)
{
$loopcount = 0;
$this->numeriek = true;
for ($loopcount = 0;$loopcount < strlen($teststring);$loopcount++)
{
if (($teststring[$loopcount] < '0') or ($teststring[$loopcount] > '9'))
{
$this->numeriek = false;
}
}
}
public function banknaam($bic)
{
$onbekend = 'onbekend';
$upperbic = strtoupper($bic);//de bic in uppercase
if (isset($this->babic[$upperbic]))
{
return $this->babic[$upperbic];
}
return $onbekend;
}
public function bepaal_11_proef($testrekening)
{
//rekeningnummers met minder dan 8 posities(voormalige postbank) voldoen vaak niet aan de 11-proef
//"gewone" rekeningnummers (9 posities) voldoen als het goed is aan de 11-proef
$loopcount = 0; //naam spreekt voor zich
$weegfactor = 0; //naam spreekt voor zich
$totaal = 0; //totaal om modulo 11 te plegen
$this->numeriek_test($testrekening);
if (!$this->numeriek)
{
return false;
}
else
{
$weegfactor = strlen($testrekening);
for ($loopcount=0;$loopcount < strlen($testrekening);$loopcount++)
{
$totaal = $totaal + (($testrekening[$loopcount]) * $weegfactor);
$weegfactor = $weegfactor - 1;
}
if (($totaal % 11) == 0)
{
return true;
}
else
{
return false;
}
}
}
public function generate_select_string()
{
$select_string = '';
asort($this->babic);
$select_string = "\n" . '<select name="Banksel" id="Banksel" >';
foreach ($this->babic as $labl => $waarde)
{
$select_string = $select_string . "\n <option value=\"" . $labl . "\" ";
if (isset($_POST['Banksel']))
{
if ($labl == $_POST['Banksel'])
{
$select_string = $select_string . "selected=\"selected\" ";
}
}
$select_string = $select_string . '>' . $waarde . '</option>';
}
$select_string = $select_string . "\n";
$select_string = $select_string . '</select>' . "\n";
return $select_string;
}
public function invoer_voor_iban($invoer_bic , $invoer_rek)
{
$this->input_bic = trim($invoer_bic);
$this->input_bic = strtoupper($this->input_bic);
$this->input_bic = htmlspecialchars($this->input_bic);
$this->input_rek = trim($invoer_rek);
$this->input_rek = htmlspecialchars($this->input_rek);
$this->iban='';
$this->validate();
return $this->iban;
}
private function omzet($omstring)
{
//zet 1e 4 pos van een BICstring om in een cijferstring A--->10 B-->11 etc
$res = (string) ord($omstring[0]) - ord('A') + 10 .
(string) ord($omstring[1]) - ord('A') + 10 .
(string) ord($omstring[2]) - ord('A') + 10 .
(string) ord($omstring[3]) - ord('A') + 10;
return $res;
}
private function reken()
{
//bereken iban
$numbic = $this->omzet($this->input_bic);
$bignum = $numbic . $this->input_rek . '2321' . '00' ; //'2321' is 'NL' ("A" = 10 etc)
$modulo97='';
$checkdigits='00';//checkdigits of controlegetal is 2 digits/tekens groot
//lange string (bignum)voor uitrekenen checkdigits
//deze string krijgt een modulo berekening over 24 digits dus staartdeling met 6 pos tegelijk
//modulo gedaan voor het berekenen van de 2 checkdigits
$modulo97 = (int)substr($bignum,0,6);
$modulo97 = $modulo97 % 97;
$modulo97 = (1000000 * $modulo97) + (int)substr($bignum,6,6);
$modulo97 = $modulo97 % 97;
$modulo97 = (1000000 * $modulo97) + (int)substr($bignum,12,6);
$modulo97 = $modulo97 % 97;
$modulo97 = (1000000 * $modulo97) + (int)substr($bignum,18,6);
$modulo97 = $modulo97 % 97;
$checkdigits = 98 - $modulo97;
//einde modulo staartdeling
if (strlen($checkdigits) < 2)
{
$checkdigits = '0' . $checkdigits;
}
$this->iban = 'NL' . $checkdigits . substr($this->input_bic,0,4) . $this->input_rek;
}
private function validate()
{
//valideren van reknr
$fout = '!geen reknr opgegeven'; //eventuele foutmelding
$loopcount = 0; //loopcount = teller tbv een loop
$valrek = $this->input_rek; //kopie van $this->input_rek (korte notatie)
if ( strlen($this->input_rek) > 0)
{
$fout = '';
$this->numeriek_test($this->input_rek);
if (!$this->numeriek)
{
$fout = '!rekeningnummer mag alleen de tekens 0...9 bevatten';
}
if ( ($fout == '') and (strlen($this->input_rek) >10))
{
$fout = '!rekeningnummer mag maximaal 10 posities bevatten';
}
}
if ($fout == "")
{
if (!isset($this->babic[$this->input_bic]))
{
$fout = '!BIC onbekend ' . $this->input_bic;
}
}
if ($fout != "")
{
$this->iban = $fout;
}
else
{ while (strlen($this->input_rek) < 10)
{
$this->input_rek = '0' . $this->input_rek;
}
$this->reken();
}
}
} // einde class
show_source(__FILE__);
?>
Bankfuncties
Iban omzetten, 11 proef en BIC ciode
<?php
include 'ibanclass.php';
$bankfunctions = new Iban();
$reknr = '';
$iban = '';
if (isset($_POST['Reknr'])) {
$reknr = $_POST['Reknr'];
$iban = $bankfunctions->invoer_voor_iban($_POST['Banksel'] , $_POST['Reknr']);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Bankfuncties</title>
<style type="text/css">body{background-color:#CCCCCC;}</style>
</head>
<body>
<div>
<h1>Iban omzetten, 11 proef en BIC ciode</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Rekeningnummer: <input type="text" name="Reknr" id="Reknr" maxlength="10"
value ="<?php echo $reknr;?>"/>
<?php
echo $bankfunctions->generate_select_string();
?>
<input type="submit" <?php echo "value=\"Bereken\nIban\"";?>/>
</form>
<br/>
<?php
if (substr($iban,0,1) == '!')
{
echo 'foutmelding: ' . '<b>' .substr($iban,1) . '</b>' . "\n";
}
else
{
if (strlen($iban) > 0)
{
echo 'Iban: ' . '<b>' .$iban . '</b>' . ' <br/>';
if ($bankfunctions->bepaal_11_proef($_POST['Reknr']))
{
echo "\n" .'<br>Rekeningnummer voldoet <b>wel</b> aan de 11 proef<br>';
}
else
{
echo "\n" . '<br>Rekeningnummer voldoet <b>niet</b> aan de 11 proef<br>';
}
echo "\n" .'<br><b>' . $_POST['Banksel'] . '</b> is de BIC van ' . '<b>' .
$bankfunctions->banknaam($_POST['Banksel']) . "</b>\n";
}
}
show_source(__FILE__);
?>
</div>
<a href="ibanclass.php" >Class bekijken?</a>
</body>
</html>
Class bekijken?