Проверка медицинского полиса: различия между версиями
Misha (обсуждение | вклад) |
Misha (обсуждение | вклад) |
||
Строка 35: | Строка 35: | ||
// Дб все цифры - без пробелов | // Дб все цифры - без пробелов | ||
$error=''; | $error=''; | ||
+ | $a=''; | ||
+ | $b=''; | ||
$lents = strlen($number); | $lents = strlen($number); | ||
//echo "lents=$lents\n"; | //echo "lents=$lents\n"; |
Версия 19:20, 20 мая 2016
Проверка правильности ввода единого номера полиса (ЕНП) обязательного медицинского страхования
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=''; $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=$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; }