Проверка СНИЛС

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Функция проверки СНИЛС

Описание функции взято тут

function test_snils($snils)
{
    /* СНИЛС имеет вид: «XXX-XXX-XXX YY», где XXX-XXX-XXX — собственно номер, а YY — контрольное число. Алгоритм формирования контрольного числа СНИЛС таков:
    1) Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001-001-998
    2) Контрольное число СНИЛС рассчитывается следующим образом:
    2.1) Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца)
    2.2) Полученные произведения суммируются
    2.3) Если сумма меньше 100, то контрольное число равно самой сумме
    2.4) Если сумма равна 100 или 101, то контрольное число равно 00
    2.5) Если сумма больше 101, то сумма делится по остатку на 101 и контрольное число определяется остатком от деления аналогично пунктам 2.3 и 

    ПРИМЕР: Указан СНИЛС 112-233-445 95
    Проверяем правильность контрольного числа: 
    цифры номера        1 1 2 2 3 3 4 4 5 
    номер позиции       9 8 7 6 5 4 3 2 1
    Сумма = 1×9 + 1×8 + 2×7 + 2×6 + 3×5 + 3×4 + 4×3 + 4×2 + 5×1 = 95 
    95 ÷ 101 = 0, остаток 95. 
    Контрольное число 95 — указано верно
    */

    preg_match( "/(\d{3})-(\d{3})-(\d{3})\s{1}(\d{2})/", $snils, $matches);
    if($matches == false) return false;
    $kontr = $matches[4];
    $num = $matches[1].$matches[2].$matches[3];
    $k=9;
    for($i=0;$i<9;$i++)
    {
        $sum += $k * $num{$i};
        $k--;
    }
    if($sum < 100)
    {
       if($kontr == $sum) return true;
       else return false;
    }
    elseif($sum == 100 || $sum ==101)
    {
        if($kontr == '00') return true;
        else return false;
    }
    else
    {
        $ost=$sum % 101;
        if($ost == $kontr) return true;
        elseif($ost == 100 && $kontr == '00') return true;
        else  return false;
    }
}