Dienstag, 31. Dezember 2013

Ein Monat bis SEPA - Berechnungsfunktion für die IBAN

Online-Banking und eingehende Rechnungsbelege sind inzwischen weitestgehend auf SEPA umgestellt. Stapelweise Schreiben von Versicherungen und Dienstleistern bezüglich der Umstellung auf SEPA-Lastschriftmandate sind abgelegt.

Unsere Kunden sind fit für SEPA. Schon vor Monaten wurden IBAN-Berechnungsroutinen in unsere CRM-Systeme eingebaut, die automatisch anhand der bisherigen Kontodaten die SEPA-gerechten Zahlenfolgen ermitteln.

Wer immer noch eine Berechnungsroutine für SEPA sucht, findet nachfolgend eine in Perl geschriebene Funktion. Zu beachten ist, dass mit sehr großen Integerzahlen gearbeitet wird.

$iban = &IBANErmittlung($blz,$konto);
sub IBANErmittlung
{

    use bigint;
    use Math::BigInt;

    my $blz = $_[0];
    my $konto = $_[1];
    my $iban = '';

    return         if $blz !~ m/^[1-9][0-9]{7}$/
                   || $konto !~ m/[1-9]/
                   || length($konto) > 10;
    while (length($konto) < 10) { $konto = "0$konto"; }

    my $landkennung = 131400;   # DE = 13 14 und 00
    my $bban = Math::BigInt->new("$blz$konto");
    my $bban2 = Math::BigInt->new("$bban$landkennung");
    my $pruefziffer = $bban2 % 97;
    $pruefziffer = sprintf "%.2d", 98 - $pruefziffer ;
    $iban = "DE$pruefziffer$bban";

    return($iban);
}
Was passiert in diesem Code-Fragment?

Der Funktion werden die alte Bankleitzahl und die Kontonummer übergeben. Danach wird deren Syntax überprüft. Anschließend wird die Kontonummer mit Vornullen auf zehn Stellen gefüllt. Aus BLZ und Kontonummer wird die BBAN gebildet. Diese wird rechts um die Länderkennung ergänzt. Daraus wird per Modulo 97 und der folgenden Subtraktion von 98 die Prüfziffer ermittelt. Ist die Prüfziffer einstellig, wird noch eine Null davor gesetzt.

Der Returnwert setzt sich dann aus "DE", der zweistelligen Prüfziffer und der BBAN zusammen.

Autor: Matthias Baumann