Проверка номера ОКПО

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
function test_okpo($number)
{
  /* Функция проверки номера ОКПО на PHP
      Алгоритм взят https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE#.D0.9D.D0.BE.D0.BC.D0.B5.D1.80_.D0.9E.D0.9A.D0.9F.D0.9E
  */
  // Дб все цифры - без пробелов
  // Если все ок возвращает 1;
  $error='';
  $sum=0;
  $weight=array();
  $lents = strlen($number);
  if($lents == 0)
  {
    $error .='Вы не ввели номер ОКПО';
  }else
  {
    if(preg_match("/^(\d+)$/", $number)==false)
    {
      $error .='В номере ОКПО  должны быть только цифры';
    }
    else
    {
      if ($lents == 9) {$number = '0'.$number; $lents=10;}
      if($lents == 10 || $lents==8)
      {
        $digits = preg_split('//', $number, -1, PREG_SPLIT_NO_EMPTY);
        $ost = balance($digits,1);
        if($ost == 10)
        {
          $ost = balance($digits,3);
          if($ost == 10) $ost = 0;
        }
        if($ost == $digits[$lents-1]) $error = 1;
        else $error .='Номер ОКПО введен не правильно';
      }
      elseif($lents > 10 || $lents < 8)
      {
        $error .='Количество цифр номера ОКПО должно быть от 8 до 10';
      }
    }
  }

  return $error;
}

function balance($digits, $shift)
{
  $lents = count($digits);
  for($i=0; $i < $lents-1; $i++)
  {
    $weight[$i]=$i+$shift;
    $sum += $digits[$i] * $weight[$i];
  }
  $ost = $sum % 11;
  return $ost;
}