Val Petruchek

подписывайтесь, а то хуже будет!  

ПОДПИСЫВАЙТЕСЬ НА RSS

« Грузинская Опера
PHP (ссылки) »

Украинские ИНН

29.10.07 @ 14:20 — Programming, PHP, Ukraine

Встретил у Болка запись о том, как формируются номера российских ИНН. Стало интересно, как с этим обстоит дело у нас.

Итак, украинский ИНН (индивидуальный налоговый номер) состоит из 10 цифр. В нём зашифрованы:

  • дата рождения (первые пять цифр образуют число, равное количеству дней от 01.01.1900 до даты рождения владельца ИНН);
  • пол (чётность девятой цифры: четная цифра – женский, нечетная – мужской);
  • checksum, т.е. контрольное число (последняя цифра)

Как считается контрольная цифра я пока что не знаю. Здесь можно проверить, как работает большой брат, исходники большого брата — под катом.

Забавные факты про украинский ИНН:

  • физическим лицам, которые из-за своих религиозных или других убеждений отказываются от принятия идентификационного номера, официально сообщили об этом соответствующим органам государственной власти и имеют соответствующую отметку в паспорте, предоставляется идентификационный номер в виде номера и серии паспорта таких лиц (src);
  • иностранцы не могут отказаться от кодов, даже если они имеют соответствующие религиозные убеждения. Причина: украинские власти не могут внести соответствующую отметку в их паспорт (см. предыдущий пункт) и присвоить ИНН по номеру паспорта. Зачем нужен украинский ИНН иностранцу? Чтобы иметь возможность стать учредителем юрлица или заниматься предпринимательской деятельностью на территории Украины (src);
  • я не смог найти в сети информацию о том, какие ИНН присваиваются гражданам, родившимся в 19 веке (т.е. до 01.01.1900 года).

Отдельно хочется процитировать каких-то религиозных маразматиков (орфография и пунктуация сохранены):

Как здесь не заметить, что определенные проблемы будут ощущать, например, лица, которые изменили свой пол.

Понятно, что не сложно написать программу, которая к 1 января 1900 года прибавит число и получит дату рождения. Так что, милые дамы, со старинным правилом этикета, согласно которого о Вашем возрасте спрашивать было не принято, придется расстаться. У технотронного века свой жесткий и далекий от условностей приличия “этикет”.

Мой вам совет, милые дамы: если кто-то выспрашивает у вас ваш ИНН, отнеситесь к нему с подозрением!

        /*      developed by http://webous.com
                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 (0229$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;
    }

41 Comments »

  1. 1. В регулярном выражении нехватает слеша перед «d».
    2. Проверку на нулевой id можно делать так: !$id
    3. Нечётность надо проверять вот так: $var & 1, нахождение остатка от деления — плохой способ
    4. Найти количество дней в месяце можно вызовом date(’t', $timestamp)

    …хватит, думаю :)

    Comment by BOLK — 29.10.2007 @ 14:58

  2. 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

  3. BTW, Bolk, у тебя старые ссылки не работают, что не очень правильно при апгрейде движка.

    Comment by Val Petruchek — 29.10.2007 @ 18:00

  4. Там ещё информация есть - одна или две цифры - какой ты по порядку человек, родившийся в тот же день
    То есть если уже есть 4 ИНН у которых пять первых цифр совпадают - то одна из цифр в ИНН будет 5 (а у тех четырёх соответственно 1-4)

    Comment by Vanger — 30.10.2007 @ 10:59

  5. Vanger: на это отведены три с половиной цифры (с шестую по девятую). При этом девятая заодно хранит информацию о поле.

    Дело в том, что налоговой не под силу узнать “какой я по порядку человек, родившийся в этот день”, так что эти цифры каким-то образом меня уникально идентифицируют среди тех, кто родился со мной в один день.

    Код рассчитан под максимум 5000 мальчиков и 5000 девочек, родившихся в один день.

    Comment by Val Petruchek — 30.10.2007 @ 12:19

  6. “какой я по порядку человек, родившийся в этот день”,
    все достаточно прозаично, в порядке регистрации в налоговой,
    т.е кто раньше получил код у того номер и меньше.

    Comment by ESL — 14.03.2008 @ 09:23

  7. ESL, получается “кто раньше встал, того и тапки”.

    Спасибо.

    Comment by Val Petruchek — 14.03.2008 @ 09:59

  8. Funny enough, я нашел этот пост в поисках информации по работе и он оказался мне полезен!

    Comment by zorgg — 09.02.2009 @ 14:45

  9. OMG ZORGG IS READING MY BLOGG!!1

    Comment by Val Petruchek — 09.02.2009 @ 14:50

  10. На самом деле в украинских ИНН бывают осечки с полом
    (т.е. ИНН муж. принадлежал жен. и наоборот).
    В моей практике
    peooc.donntu.edu.ua/aladin/
    таких случаев было примерно 2 на 130 человек.

    Это значит, что 100% эта расшифровка не работает
    и есть исключения.
    Кроме того различного рода программы выпускаемые налоговой и пенсионным фондом не используют этот алгоритм проверки. По всей видимости по той же причине.

    Comment by don_alessandro — 17.02.2009 @ 09:13

  11. don_alessandro, это всего лишь осечки, которые не мешают пользоваться системой.

    Например: по вводимому ИНН автоматически предзаполнять поля с датой рождения и полом, которые потом верифицировать и менять в случае несовпадения.

    Comment by Val Petruchek — 21.02.2009 @ 05:10

  12. Откуда 5000 ???
    первые 5 цифр одинаковые у всех людей с одинаковой датой рождения
    девятая цифра среди них одинаковая среди мальчиков и девочек
    десятая одинаковая у всех, у кого одинаковые первые девять, остается три цифры - шестая, седьмая и восьмая, это 999 комбинаций в пределах одних суток

    Comment by gusto — 03.04.2009 @ 23:42

  13. Gusto, (с)читать научитесь.

    Чётность девятой цифры определяет пол, она необязательно совпадает для всех мальчиков.

    “десятая одинаковая у всех, у кого одинаковые первые девять” — эту гениальную идею я даже комментировать не буду, перечитывайте её до просветления.

    Очевидно, что раз десятая цифра — это контрольная, то она не содержит новой информации, а валидирует предыдущие девять цифр.

    Первые пять — дата рождения.

    6,7,8,9 - порядковый номер среди родившихся в один день и пол. Всего 10000 вариантов. Половина (5000) — чётные (мальчики), вторая половина (5000) — нечётные (девочки).

    Даже как-то неудобно такие очевидности писать.

    С уважением, ваш Капитан.

    Comment by Val Petruchek — 04.04.2009 @ 08:50

  14. Кстати, если интересно, то вот вам формула расчета контрольной (10-ой) цифры:
    код:АБВГДЕЖЗИК

    Х = А*(-1) + Б*5 + В*7 + Г*9 + Д*4 + Е*6 + Ж*10 + З*5 + И*7

    К= Х-(11 * целая часть(Х/11))

    Comment by Tranzit — 25.05.2009 @ 18:34

  15. К= Х-(11 * целая часть(Х/11))

    В excele это пишется формулой: ОСТАТ(X;11)
    В иных прогах - MOD(X;11)

    Comment by Tranzit — 25.05.2009 @ 18:38

  16. Спасибо!

    Comment by brag — 23.10.2009 @ 01:24

  17. К= Х-(11 * целая часть(Х/11)) = ОСТАТ(X;11) = MOD(X;11):
    Возвратит значение от 0 до 10(!)
    Есть подозрение что нужно еще раз взять остаток по модулю 10 чтобы получить выборку от 0 до 9

    Но все-таки интересно: у кого есть доступ к большой базе кодов - проверить базовый алгоритм на всех - может этот вариант (когда остаток деления на 11 дает 10) исключается “правильным” подбором цифр с 6 по 9 ? Но тогда к-во рожденных мальчиков/девочек в один день будет меньше 5000 ;)

    Comment by Kivals — 13.11.2009 @ 23:36

  18. Стало интересно - проверил на 440 ИНН:
    4 не сошлась контрольная цифра (большая вероятность что неправильно внесли)
    Остальные вернули остаток от деления на 11 от 1(!) до 10, т.е. нацело не поделилась ни одна “контрольная сумма”.
    (остаток 10 пришелся на 47 записей - т.е. практически 10% - вполне раномерное распределение)

    Comment by Kivals — 14.11.2009 @ 03:57

  19. лица отказавшиеся от ИНН получают код 000000000 (9 нулей), вариант с серией/номером паспорта не встречал, хотя выборка огромная

    Comment by yl — 25.11.2009 @ 13:12

  20. За формулу - СПАСИБО!! 33 года искал :)

    Comment by slawko — 20.01.2010 @ 16:22

  21. “лица отказавшиеся от ИНН получают код 000000000 (9 нулей)”
    Сам смысл ИНН - в его уникальности. Если все получают одинаковый код - смысл потерян.
    Хотя в законе ничего не сказано про получение ИНН лицами, которые от него отказались: http://zakon.rada.gov.ua/cgi-bin/laws/main.cgi?nreg=320%2F94-%E2%F0
    Но в том же законе написано, что должна проставляться соответствующая отметка в паспорте (про отказ от ИНН), так что для внесения такого физ.лица в систему учета вариант с паспортом более правдоподобен.

    Comment by Kivals — 09.02.2010 @ 16:03

  22. проверка контрольной суммы на пхп

    function INN_CSumCCheck($inn){
    if(strlen($inn)==10){
    $s = $inn[0]*(-1)+$inn[1]*5+$inn[2]*7+$inn[3]*9+$inn[4]*4+$inn[5]*6+$inn[6]*10+$inn[7]*5+$inn[8]*7;
    $p=$s/11;
    $s-($n*intval($p));
    if(mod($sum,11)==$uparam['UF_INN'][9]) return true;
    }
    return false;

    вернёт true в случае верной контрольной суммы и false если ошибка

    Comment by Сергей — 04.03.2010 @ 14:06

  23. это пздц, такую функцию для просчета даты %)

    всего то 3 строчки надо:

    $inn = ‘3189807923′;
    $inn = substr($inn,0,5);
    $normal_date = date(”d.m.Y”, strtotime(’01/01/1900 + ‘ . $inn . ‘ days - 1 days’));
    echo $normal_date;

    Comment by net4 — 11.09.2010 @ 02:20

  24. net4, тестировать надо тщательнее.

    PHP 4.4.8, FreeBSD: 04.05.1987
    PHP 5.2.8, WinXPru: 02.05.1987

    strtotime — это очень весёлая функция.

    Comment by Val Petruchek — 11.09.2010 @ 12:36

  25. зачем прогу писать?!?! достаточно в Excel’е (первые пять цифр кода)+1 преобразовать в формат “Дата”, а четность/нечетность девятой цифры можно и на глаз определить

    Comment by Ольга — 13.05.2011 @ 14:40

  26. тоесть пустые ИНН могут быть? у мну есть выборка из реальной базы на 30000 записей, так вот - там около 50 полей с ИНН ” 0″. а я думал это ошибка базы. опять прийдется голову ломать над клиентом((

    Comment by JCD — 15.05.2011 @ 00:06

  27. люди добрые, подскажите, как можно идентифицировать человека для системы учета?

    Comment by JCD — 15.05.2011 @ 00:33

  28. JCD, системы учёта чего?

    У резидента Украины необязательно есть ИНН. Например, у текущего главы нацбанка ИНН нет.

    Так что полагаться на ИНН нельзя. Печалька, да. На номер/серию паспорта тоже полагаться нельзя, ибо паспорт можно новый сделать с новым номером.

    Я бы делал ИНН или ФИО + дата рождения для тех, у кого ИНН нет.

    Comment by Val Petruchek — 15.05.2011 @ 00:37

  29. система учета обращений граждан для одного из управлений ПФ Украины.
    скорее всего сделаю,как вы посоветовали только добалю туды и паспорт(на всякий случай.)
    кстати ФИО то тоже можно поменять. получается идентифицировать гражданина во всех случаях невозможно. соответственно и проконтролировать подмену тоже невозможно.
    спасибо за информацию для размышления.

    Comment by JCD — 15.05.2011 @ 09:45

  30. Сделайте обратный скрипт - мне нужно карточку к интернет-банкингу привязать, а я не знаю свой код))

    Comment by Андрей — 11.12.2011 @ 12:24

  31. Андрей, первые 5 цифр восстановить можно 100% по дате рождения; остаётся 5000 вариантов (нечётные числа от 0000 до 9999 с шестой по девятую), десятая - checksum.

    Comment by Val Petruchek — 13.12.2011 @ 10:25

  32. Проверяли расшифровку кода ИНН вот такого -> 8064226855 . В расшифровке получил ИНН: 8064226855
    Пол: мужской
    Дата рождения: 15.10.2120

    Хотя должно быть зашифровано Пол: мужской и Дата рождения: 01.01.1947
    Интересно наша Налоговая теперь ИНН будущего выдает:). Человек из будущего родился в 2120 году…

    Comment by Владимир — 14.07.2012 @ 12:03

  33. Владимир, ИНН человека, родившегося 01.01.1947 должен начинаться на 17167

    80642-ки будут действительно выдаваться через 108+ лет (я уверен, что не будут - или государства не будет, или ИНН не будет, или ИНН будет по-другому формироваться; спорить всё равно бессмысленно, я столько не проживу).

    Скорее всего пьяные налоговики налажали чего-то.

    Comment by Val Petruchek — 08.08.2012 @ 14:28

  34. =ЕСЛИ(ЕЧЁТН(ПСТР(ячейка_с_ИНН;9;1))=ЛОЖЬ;”м”;”ж”) - пол
    =(ЛЕВСИМВ(ячейка_с_ИНН;5))+1 - дата

    Comment by zavryk — 12.09.2012 @ 18:10

  35. 80642-ки будут действительно выдаваться через 108+ лет (я уверен, что не будут - или государства не будет, или ИНН не будет, или ИНН будет по-другому формироваться; спорить всё равно бессмысленно, я столько не проживу).
    Скорее всего пьяные налоговики налажали чего-то.

    В перших 5 цифрах зашифрована дата народження для перших 5000 осіб одного пола та для 5000 осіб іншого пола, які народилися в одну дату. Для 5001-ї особи і наступних код буде починаться з 8

    Comment by SergeyKorotun — 03.01.2013 @ 10:13

  36. Пол-четность девятой цифры.А если цифра ноль-что это? Пенсионер,бесполый или ожидающий обнуления (пора убить)?

    Comment by Валентина — 11.01.2013 @ 20:57

  37. Ноль - прекрасная чётная цифра, Валюш.

    Comment by Val Petruchek — 11.01.2013 @ 20:59

  38. SergeyKorotun, я не очень понял пассаж про восьмёрку. Предположим, мой код начинается на 12345 по количеству дней с 01.01.1900 до моего рождения. Но я оказываюсь 5001-м мальчиком, родившимся в этот день. И мне что, тупо меняют первую цифру на 8? Мой код начинается на 82345? А как тогда отличить тех, кому поменяли первую двойку (с 22345 на 82345) от таких, как я?

    Comment by Val Petruchek — 16.01.2013 @ 20:49

  39. помогите узнать свой инн 21.04.1969 пол мужской заранее спасибо

    Comment by igor — 28.01.2014 @ 17:46

  40. помогите узнать свой инн 21.04.69 муж

    Comment by igor — 28.01.2014 @ 17:47

  41. Igor, нельзя узнать номер по дате рождения и полу. Хотя бы потому, что кроме вас 21 апреля 1969 года было рождено несколько других мужчин.

    Ваш код должен иметь вид 25313***x*
    x - нечётная цифра

    Дальше - никак.

    Comment by Val Petruchek — 28.01.2014 @ 17:53

RSS feed for comments on this post. TrackBack URI

Leave a comment

  
Реклама::

 
Реклама::