Встретил у Болка запись о том, как формируются номера российских ИНН. Стало интересно, как с этим обстоит дело у нас.
Итак, украинский ИНН (индивидуальный налоговый номер) состоит из 10 цифр. В нём зашифрованы:
- дата рождения (первые пять цифр образуют число, равное количеству дней от 01.01.1900 до даты рождения владельца ИНН);
- пол (чётность девятой цифры: четная цифра – женский, нечетная – мужской);
- checksum, т.е. контрольное число (последняя цифра)
Как считается контрольная цифра я пока что не знаю. Здесь можно проверить, как работает большой брат, исходники большого брата — под катом.
Забавные факты про украинский ИНН:
- физическим лицам, которые из-за своих религиозных или других убеждений отказываются от принятия идентификационного номера, официально сообщили об этом соответствующим органам государственной власти и имеют соответствующую отметку в паспорте, предоставляется идентификационный номер в виде номера и серии паспорта таких лиц (src);
- иностранцы не могут отказаться от кодов, даже если они имеют соответствующие религиозные убеждения. Причина: украинские власти не могут внести соответствующую отметку в их паспорт (см. предыдущий пункт) и присвоить ИНН по номеру паспорта. Зачем нужен украинский ИНН иностранцу? Чтобы иметь возможность стать учредителем юрлица или заниматься предпринимательской деятельностью на территории Украины (src);
- я не смог найти в сети информацию о том, какие ИНН присваиваются гражданам, родившимся в 19 веке (т.е. до 01.01.1900 года).
Отдельно хочется процитировать каких-то религиозных маразматиков (орфография и пунктуация сохранены):
Как здесь не заметить, что определенные проблемы будут ощущать, например, лица, которые изменили свой пол.
Понятно, что не сложно написать программу, которая к 1 января 1900 года прибавит число и получит дату рождения. Так что, милые дамы, со старинным правилом этикета, согласно которого о Вашем возрасте спрашивать было не принято, придется расстаться. У технотронного века свой жесткий и далекий от условностей приличия “этикет”.
Мой вам совет, милые дамы: если кто-то выспрашивает у вас ваш ИНН, отнеситесь к нему с подозрением!
/* developed by студия webous
http://dev.zp.ua/
author: val petruchek
e-mail: petruchek, собака, gmail.com
date: October 29, 2007 */
function ParseUaID($id)
{
//$id must contain 10 digits
if (!preg_match(‘/^\d{10}$/’,$id) || ($id==0))
return false;
$result = array();
//sex
$result[’sex’] = (substr($id,8,1) % 2) ? ‘M’ : ‘F’;
//birthdate
$days = substr($id,0,5);
$year = 1900; $day = 01; $month = 01;
while ($days > 0)
{
$daysInYear = (checkdate (02, 29, $year)) ? 366 : 365;
if ($days > $daysInYear)
{
$days -= $daysInYear;
$year ++;
}
else{
for ($daysInMonth = 31; !checkdate($month, $daysInMonth, $year); $daysInMonth–) ;
if ($days > $daysInMonth)
{
$days -= $daysInMonth;
$month ++;
}
else{
$day = $days;
$days = 0;
}
}
}
$result[‘year’] = $year;
$result[‘month’] = $month;
$result[‘day’] = $day;
return $result;
}

1. В регулярном выражении нехватает слеша перед «d».
2. Проверку на нулевой id можно делать так: !$id
3. Нечётность надо проверять вот так: $var & 1, нахождение остатка от деления — плохой способ
4. Найти количество дней в месяце можно вызовом date(’t', $timestamp)
…хватит, думаю
Comment by BOLK — 29.10.2007 @ 14:58
Bolk,
1. WordPress съел, я что-то сразу не догадался глянуть, на каком именно этапе он потерялся.
2. Можно так, а можно и не так. Дело вкуса.
3. Почему плохой? Дело вкуса.
4. Windows does not support dates prior to midnight (00:00:00), January 1, 1970 — соответственно вызов $days = date(’t', mktime(0,0,0,2,1,1940)); будет работать не везде, ага.
Comment by Val Petruchek — 29.10.2007 @ 17:47
BTW, Bolk, у тебя старые ссылки не работают, что не очень правильно при апгрейде движка.
Comment by Val Petruchek — 29.10.2007 @ 18:00
Там ещё информация есть - одна или две цифры - какой ты по порядку человек, родившийся в тот же день
То есть если уже есть 4 ИНН у которых пять первых цифр совпадают - то одна из цифр в ИНН будет 5 (а у тех четырёх соответственно 1-4)
Comment by Vanger — 30.10.2007 @ 10:59
Vanger: на это отведены три с половиной цифры (с шестую по девятую). При этом девятая заодно хранит информацию о поле.
Дело в том, что налоговой не под силу узнать “какой я по порядку человек, родившийся в этот день”, так что эти цифры каким-то образом меня уникально идентифицируют среди тех, кто родился со мной в один день.
Код рассчитан под максимум 5000 мальчиков и 5000 девочек, родившихся в один день.
Comment by Val Petruchek — 30.10.2007 @ 12:19
“какой я по порядку человек, родившийся в этот день”,
все достаточно прозаично, в порядке регистрации в налоговой,
т.е кто раньше получил код у того номер и меньше.
Comment by ESL — 14.03.2008 @ 09:23
ESL, получается “кто раньше встал, того и тапки”.
Спасибо.
Comment by Val Petruchek — 14.03.2008 @ 09:59