Проверка медицинского полиса
Проверка правильности ввода единого номера полиса (ЕНП) обязательного медицинского страхования
| 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 - Не правильное кол-во цифр
*/
// Дб все цифры - без пробелов
$error='';
$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=$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])
{
$error .='Проверте все цифры полиса, он введен не правильно';
}
}
elseif($lents > 16 || $lents < 7)
{
$error .='Количество цифр полиса должно быть от 7 до 16';
}
}
}
return $error;
}