Расшифровка украинского индентификационного номера налогоплательщика (ИНН) на PHP
В одном из проектов требовалось, при регистрации пользователя по ИНН проверять дату его рождения, а точнее при вводе ИНН автоматически записывать дату рождения в нужное поле.
Как оказалось это делается очень просто. Ведь ИНН - это не просто набор цифр. Помимо уникального идентификационного номера в нем содержится информация о дате рождения и поле его владельца. И эту информацию можно расшифровать.
Кроме определения даты рождения по ИНН, также можно проверять правильность ввода самого идентификационного номера, так как в нем содержится контрольная цифра, которая расчитывается по определенному алгоритмы.
Первые 5 цифр в ИНН у обычных граждан Украины означают дату рождения, в виде количества дней прошедших с 1 января 1900 г. Это не секрет, в остальных цифрах защифрован пол, цифры придающие индивидуальность номеру и контрольные числа
В общем вот php код, который занимается расшифровкой.
function parse_inn($inn){ //$id must contain 10 digits if (empty($inn) || !preg_match('/^\d{10}$/',$inn)) return false; $months = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'); $result = array(); $result['inn'] = $inn; $result['sex'] = (substr($inn, 8, 1) % 2) ? 'm' : 'f'; $split = str_split($inn); $summ = $split[0]*(-1) + $split[1]*5 + $split[2]*7 + $split[3]*9 + $split[4]*4 + $split[5]*6 + $split[6]*10 + $split[7]*5 + $split[8]*7; $result['control'] = (int)($summ - (11 * (int)($summ/11))); $result['status'] = ($result['control'] == (int)$split[9]) ? true : false; $inn = substr($inn, 0, 5); $normal_date = date('d.m.Y', strtotime('01/01/1900 + ' . $inn . ' days - 1 days')); list($result['day'], $result['month'], $result['year']) = explode('.', $normal_date); $result['str_month'] = $months[$result['month'] - 1]; return $result; }
На выходе у нас будет массив, который будет содержать следующие данные:
- inn - введенный ИНН
- sex - Пол. m - мужской, f - женский
- control - контрольная сумма, для проверки ИНН
- status - результат проверки контрольной суммы. Если true - то ИНН корректный, false - не корректный
- day - день рождения
- month - месяц рождения
- year - год рождения
- str_month - русское название месяца
Но стоит сказать, что данный метод не всегда правильно работает и каждого метода есть исключения. Так что имейте это ввиду.
-
Комментарии (7)
- Сайт