Scripts

IBAN Calculatie

Naar aanleiding van de opbouwende kritiek van de eerste uitvoering van deze IBAN calculator hier een verbeterde uitvoering. Voor de duidelijkheid, het is een class die de bedoeling heeft wat functies die men aantreft in het bancaire circuit in een class bij elkaar te laten zien. Het kan zijn dat U het script slecht zal vinden, op zich geen probleem maar zeg dan wat er slecht aan zou zijn. Een van de redenen dat ik het script ter beschikking stel, is om te kijken of ik als voormalig Cobolkrasser PHP onder de knie begin te krijgen en zit dus niet te wachten op kritiek waar ik niets mee aan kan. De (verbeterde) IBAN calculator zit er wederom bij, de oude kan verdwijnen. Omdat dit script bedoeld is voor de situatie in Nederland heb ik dus wat minder Engels gebruikt, verkopen doe ik het niet het is voor mij lering en vermaak. Wat naamgeving betreft heb ik gekozen voor de underscoremethode. Dus zoiets als bepaal_11_proef. Had ik gekozen voor de camelcase structuur dan had eerder genoemde methode dus bepaal11Proef geheten en was de methode generate_select_string voorzien van de naam generateSelectSstring. etc De class heet Biciban.php en daar valt wel wat op aan te merken, BankFuncties had ook gekund. Als toevoeging een script bankfuncties.php geheten wat gebruik maakt van Biciban.php Nogmaals iedere vorm van kritiek is welkom maar dan wel kritiek waar ik wat mee aankan in mijn proces om PHP te leren. Met vriendelijke groeten Rene Geul

Biciban.php
<?php
class Biciban {
  //Fortis is ABN geworden 
  //ASN en SNS hebben dezelfde BIC, ASN is onderdeel van SNS dus ASN niet in de array $babic
  //Dsb bestaat vermoedelijk niet meer maar nog in de array $babic
  //Friesland bank wordt ooit RABO
  //bron wat BIC betreft http://www.theswiftcodes.com/netherlands-2/ , BIC-code altijd in uppercase
  //Slechts voor nederlanse rekeningnummers!!!!!!!!!!!!!!!!!
  //autheur Rene Geul , geen copyrights = open software
  //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 Biciban();
  //               $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
?>
bankfuncties.php
[code]
<?php 
include 'Biciban.php';
$bankfunctions = new Biciban();
$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:#ffffcc;}</style>
</head>
<body>
<div>
<h1>bankfuncties/iban/11 proef/BIC</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";
  }
}
?>
</div>
</body>
</html>
[/code]

Reacties

0
Nog geen reacties.