Проверка медицинского полиса

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

Проверка правильности ввода единого номера полиса (ЕНП) обязательного медицинского страхования

1-15
16
X X X X X X X X X X X X X X X K

Единый номер полиса ОМС представлет собой шестнадцатиразрядное число, последний символ которого (K) является контрольным разрядом номера полиса ОМС:

- XXXXXXXXXXXXXXX – номер полиса ОМС

- К – контрольный разряд номера полиса ОМС, вычисляется арифметически в соответствии с методикой расчета, описанной в международном стандарте ISO/HL7 27931:2009 (алгоритм Mod10):

а) выбираются нечетные цифры по порядку, начиная справа, в виде числа, и умножается это число на 2.

б) выбираются четные цифры по порядку, начиная справа, в виде числа, и результат приписывается слева от числа, полученного в пункте а).

в) складываются все цифры полученного в пункте б) числа.

г) полученное в пункте в) число вычитается из ближайшего большего или равного числа, кратного 10. В результате получается искомая контрольная цифра.

Алгоритм на PHP

Тут проверяются 16-разрядные полисы по вышеизложенному алгоритму и старые полисы (от 7 до 15 знаков), у которых проверяются только на цифры в номере.

function test_policy ($number)
{
    //echo "number=$number\n";;
    /* Функция проверки полиса
        Алгоритм взят http://www.rostov-tfoms.ru/services/zasedaniya-rabochih-grupp/erp/enp-struct
    */
    // Дб все цифры - без пробелов
    $error='';
    $a='';
    $b='';
    $lents = strlen($number);
    //echo "lents=$lents\n";
    if($lents == 0)
    {

      $error .='Вы не ввели номер полиса';
    }else
    {

        if(preg_match("/^(\d+)$/", $number)==false)
        {

          $error .='В полисе  должны быть только цифры';

        }
        else
        {
          if($lents == 16)
          {
            $digits = preg_split('//', $number, -1, PREG_SPLIT_NO_EMPTY);
            for($i=$lents-2; $i>=0; $i=$i-2 )
            {
              $a .= $digits[$i];
            }
            $a *= 2;
            for($i=$lents-3; $i>=0; $i=$i-2 )
            {
              $b .= $digits[$i];
            }
            $b .=  $a;
            $digitsb = preg_split('//', $b, -1, PREG_SPLIT_NO_EMPTY);
            $sum=0;
            foreach ($digitsb as  $value)
            {
              $sum +=  $value;
            }
            $c = ceil($sum/10) *10;
            $d=$c-$sum;
            if ($d != $digits[15])
            {
              $error .='Проверте все цифры полиса, он введен не правильно';
            }
          }
          elseif($lents > 16 || $lents < 7)
          {
            $error .='Количество цифр полиса должно быть от 7 до 16';
          }
        }
      }

    return $error;
}