Проверка медицинского полиса: различия между версиями
Misha (обсуждение | вклад) |
Misha (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 27: | Строка 27: | ||
/* Функция проверки полиса | /* Функция проверки полиса | ||
Алгоритм взят http://www.rostov-tfoms.ru/services/zasedaniya-rabochih-grupp/erp/enp-struct | Алгоритм взят http://www.rostov-tfoms.ru/services/zasedaniya-rabochih-grupp/erp/enp-struct | ||
− | |||
− | |||
− | |||
− | |||
− | |||
*/ | */ | ||
// Дб все цифры - без пробелов | // Дб все цифры - без пробелов | ||
$error=''; | $error=''; | ||
+ | $a=''; | ||
+ | $b=''; | ||
$lents = strlen($number); | $lents = strlen($number); | ||
//echo "lents=$lents\n"; | //echo "lents=$lents\n"; | ||
Строка 59: | Строка 56: | ||
$a .= $digits[$i]; | $a .= $digits[$i]; | ||
} | } | ||
− | $a= | + | $a *= 2; |
for($i=$lents-3; $i>=0; $i=$i-2 ) | for($i=$lents-3; $i>=0; $i=$i-2 ) | ||
{ | { | ||
$b .= $digits[$i]; | $b .= $digits[$i]; | ||
} | } | ||
− | $b = | + | $b .= $a; |
$digitsb = preg_split('//', $b, -1, PREG_SPLIT_NO_EMPTY); | $digitsb = preg_split('//', $b, -1, PREG_SPLIT_NO_EMPTY); | ||
$sum=0; | $sum=0; | ||
foreach ($digitsb as $value) | foreach ($digitsb as $value) | ||
{ | { | ||
− | $sum = | + | $sum += $value; |
} | } | ||
$c = ceil($sum/10) *10; | $c = ceil($sum/10) *10; |
Текущая версия на 19:40, 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 */ // Дб все цифры - без пробелов $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; }