Provjera ispravnosti OIBa u PHP-u
U nastavku slijedi funkcija koja provjerava dali je dana vrijednost ispravan OIB. Provjera se vrši po normi ISO 7064 (MOD 11, 10). Uputa po kojoj je kod napisan dostupna ovdje.
<?php
namespace App\Helpers;
class OIB {
/**
* Provjeri ispravnost OIB-a.
*
* Napravljeno prema uputi: http://www.regos.hr/UserDocsImages/KONTROLA%20OIB-a.pdf
*
* @param string $oib Vrijednost OIB-a
* @return boolean True ako je ispravan, inače false.
*
*/
public static function check( $oib )
{
// OIB ima 11 znamenaka i mora biti numeric.
if ( mb_strlen( $oib ) != 11 || ( ! is_numeric( $oib ) ) ) {
return false;
}
// Posljednja tj. 11. znamenka je kontrolna znamenka. Dobivena je
// izračunom iz prethodnih 10 znamenaka po međunarodnoj normi ISO 7064 (MOD 11, 10).
// Prva znamenka zbroji se s brojem 10. U sljedećim koracima to će biti ostatak koji će se zbrajati
// s idućom znamenkom.
$ostatak = 10;
// Prođi kroz sve znamenke, osim zadnje.
for ( $i = 0; $i < 10; $i++ ) {
// Dohvati trenutni znak iz OIBa i castaj ga u int kako bismo mogli raditi operacije.
$trenutnaZnamenka = (int) $oib[$i];
// 1. Prva znamenka zbroji se s brojem 10, a svaka sljedeća s ostatkom u prethodnom koraku.
$zbroj = $trenutnaZnamenka + $ostatak;
// 2. Dobiveni zbroj cjelobrojno (s ostatkom) podijeli se brojem 10; ako je dobiveni
// ostatak 0 zamijeni se brojem 10 (ovaj broj je tzv. međuostatak)
$meduOstatak = $zbroj % 10;
if ( $meduOstatak == 0) {
$meduOstatak = 10;
}
// 3. Dobiveni međuostatak pomnoži se brojem 2
$umnozak = $meduOstatak * 2;
// 4. Dobiveni umnožak cjelobrojno (s ostatkom) podijeli se brojem 11; ovaj ostatak
// matematički nikako ne može biti 0 jer je rezultat prethodnog koraka uvijek paran broj
$ostatak = $umnozak % 11;
// 5. Slijedeća znamenka zbroji se s ostatkom u prethodnom koraku...
// 6. Ponavljaju se koraci 2, 3, 4 i 5 dok se ne potroše sve znamenke...
}
// 7. Razlika izmeñu broja 11 i ostatka u zadnjem koraku je kontrolna znamenka.
// Ako je ostatak 1 kontrolna znamenka je 0 (11 1=10, a 10 ima dvije znamenke)
if ( $ostatak == 1 ) {
$kontrolnaZnamenka = 0;
}
else {
$kontrolnaZnamenka = 11 - $ostatak;
}
// Provjeri dali kontrolne znamenka odgovara onoj u OIBu
if ( ( (int) $oib[10] ) == $kontrolnaZnamenka ) {
return true;
}
// Ako smo došli tu, kontrola nije prošla.
return false;
}
}