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

Материал из Wiki МИАЦ ВО
Версия от 11:49, 9 февраля 2016; Misha (обсуждение | вклад) (Новая страница: «==Проверка правильности ввода единого номера полиса (ЕНП) обязательного медицинского ст…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

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

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
       Возвращает
       0 - все норм
       1 - Полис 16 знаков, но введен не правильно
       2 - В полисе есть не правильные знаки
       3 - Не правильное кол-во цифр
    */
    $out = array();
    // Дб все цифры - без пробелов
    $lents = strlen($number);
    //echo "lents=$lents\n";
    if($lents == 0)
    {

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

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

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

        }
        else
        {
          //Вычисляем длину
          $lents = strlen($number);
          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=$a*2;
            for($i=$lents-3; $i>=0; $i=$i-2 )
            {
              $b .= $digits[$i];
            }
            $b = $b . $a;
            $digitsb = preg_split('//', $b, -1, PREG_SPLIT_NO_EMPTY);
            $sum=0;
            foreach ($digitsb as  $value)
            {
              $sum = $sum + $value;
            }
            $c = ceil($sum/10) *10;
            $d=$c-$sum;
            if ($d == $digits[15])
            {
              //$out['error']=0;

            }else
            {

              $error .='Проверте все цифры полиса, он введен не правильно';
            }
          }
          elseif($lents <= 16 && $lents >= 7)
          {
            //$out['error']=0;
          }

          else
          {

            $error .='Количество цифр полиса должно быть от 7 до 16';
          }
        }
      }

    return $error;
}