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;

   }

}

Leave a Reply

%d bloggers like this: