Suomalaisen ja ulkomaalaisen pankkiviitenumeron laskeminen (PHP)

Tarvitsin tällaista ja etsiskelin sitä erilaisilta foorumeilta. Muutama koodinpätkä löytyi, mutta niidenkään alkuperäistä lähdettä ei kukaan muistanut. Ajattelin yhdistellä löytämäni tiedot ja tehdä yhden funktion, joka yhdistää kummatkin. Yleensähän viitenumero lasketaan joko asiakasnumeron tai laskun numeron perusteella, tms.

Tässä kirjalliset ohjeet suomalaisen viitenumeron laskemiseen

  1. Perusviitetieto kerrotaan vasemmalta oikealle luvuilla 1, 3, 7, 1, 3, 7 jne, kunnes viimeinen numero on kerrottu
  2. Saadut tulot lasketaan yhteen tarkistussummaksi
  3. Tarkistussummaa seuraavasta nollaan päättyvästä luvusta vähennetään tarkistussumma
  4. Erotus on viitenumeron tarkiste

Kirjallinen ohje ulkomaisen viitenumeron laskemiseen suomalaisesta

  1. Suomalaisen viitenumeron (huom! tarkisteineen, muuten se ei kelpaa suomalaisille pankeille) loppuun lisätään ”271500”
  2. Näin saatu luku jaetaan luvulla 97
  3. Jakolaskun jakojäännös (modulus) vähennetään luvusta 98, joka on tarkiste
  4. Kirjaimet RF ja tarkiste lisätään suomalaisen viitenumeron eteen
function viitenumero($in, $isrf, $print) {//$isrf = true/false onko kyseessä RF-viite, $print = true/false onko kyseessä tulostettava arvo, 
     $in = strval($in);//muutetaan stringiksi, että päästään myöhemmin kertomaan numero kerrallaan
     $paino = array(7, 3, 1);//painoarvot, joita toistetaan kaikille luvun numeroille
     $summa = 0;

     for($i=strlen($in)-1, $j=0; $i>=0; $i--,$j++){
          $summa += (int) $in[$i] * (int) $paino[$j%3];//lasketaan tarkistussumma viimeisestä ensimmäiseen siten, että jokainen luku kerrotaan järjestyksellä painoarvoin.
     }

     $tarkiste = (10-($summa%10)) % 10;//suomalaisen viitenumeron tarkiste
     $viite = $in.$tarkiste;
     $modulus = intval($viite."271500") % 97;//jakojäännös
     $kvviite = "RF".$modulus.$viite;//kansainvälinen viitenumero

     if($isrf){
          if($print){
               return wordwrap($kvviite , 4 , ' ' , true );//jos tulostettava, lisätään lukemista helpottavat välilyönnit
          }else{
               return $kvviite;
          }
     }else{
          if($print){
               return wordwrap($viite , 4 , ' ' , true );
          }else{
               return $viite;
          }
     }
}

Huom! Tätä koodia ei ole vielä tarkastettu, eli en takaa sen toimimista pankkien kanssa. Poistan tämän tekstin, heti kun olen saanut sen tarkastettua ja mahdollisesti korjattua.