kk
Default banner
Разное
426 297 постов48 подписчиков
Всяко-разно
5

ИИН. Алгоритм расчета и проверки

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

Сегодня мы с вами попытаемся разобраться в этом вопросе с точки зрения Казахстанского законодательства, а также набросаем простой скрипт проверки ИИН на Javascript.

ИИН - индивидуальный идентификационный номер. Это понятие очень схоже с другой аббревиатурой: БИН - бизнес идентификационный номер. Мы будем рассматривать оба понятия.

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

Постановление Правительства Республики Казахстан от 11 июня 2003 года №565 "Об утверждении Программы перехода на единый номер физического (юридического) лица (идентификационный номер (бизнес-идентификационный номер) в целях создания Национальных реестров Республики Казахстан"

Здесь нас интересуют подразделы 2, 3, 4 раздела 5.

2. Структура ИИН (БИН)
За основу структуры ИИН предлагается взять двенадцатизначный идентификационный код гражданина, используемый в настоящее время Министерством внутренних дел Республики Казахстан. По информации Министерства внутренних дел похожие структуры кода применяются в Дании, Финляндии, Японии, Германии, США, Франции, Кувейте, Малайзии, Мальте, Ботсване, Кипре, Египте, Латвии, Литве, Эстонии, Белоруссии и других странах. В Казахстане данный код используется с 1997 года.
Преимущество этого кода заключается в его хорошей запоминаемости и информативности для физических лиц, поскольку в структуре действующего идентификационного кода гражданина присутствуют в определенной комбинации известные гражданину сведения, такие как дата, месяц и год рождения, а также пол и век физического лица.
При разработке структуры БИН предлагается использовать двенадцатиразрядный код, контрольный разряд которого будет рассчитываться аналогично расчету контрольного разряда ИИН.
В структуре ИИН (БИН) предлагается использовать только цифровые значения. Структура представляет собой характеристику последовательности цифр слева направо. Для удобства описания несколько разрядов, имеющих сходную и (или) одинаковую характеристику, могут быть объединены в один фасет.

3. Алгоритм генерирования ИИН
Предлагается следующий алгоритм генерирования ИИН:
1) первый фасет - содержит 6 разрядов (с а1 по а6) и характеризует год (две последние цифры), месяц и дату рождения физического лица;
2) второй фасет - содержит 1 (а7) разряд и характеризует пол физического лица и век его рождения. Причем при определении значения разряда для мужчин используются нечетные цифры, а для женщин - четные цифры.
Конкретные значения данного разряда выглядят следующим образом:
1 - для мужчин, родившихся в 19 веке;
2 - для женщин, родившихся в 19 веке;
3 - для мужчин, родившихся в 20 веке;
4 - для женщин, родившихся в 20 веке;
5 - для мужчин, родившихся в 21 веке;
6 - для женщин, родившихся в 21 веке.
Следовательно, в данном разряде имеются резервные значения 7, 8, 9 и 0;
3) третий фасет - содержит 4 разряда (с а8 по а11) и характеризует порядковый номер регистрации в системе. По данным Агентства по статистике Республики Казахстан максимальное количество родившихся в один день (начиная с 1999 года) - 1229 человек, поэтому 4 знака для порядкового номера регистрации вполне достаточно. Порядковый номер регистрации проставляется сплошной нумерацией в рамках одной группы (года рождения);
4) четвертый фасет - содержит 1 разряд (а12) и является контрольным разрядом ИИН. Алгоритм расчета контрольного разряда ИИН приведен в параграфе 5 главы 5 Программы.

Индивидуальные предприниматели, осуществляющие свою деятельность в форме личного предпринимательства (далее - ИП(Л)), будут использовать ИИН, который был присвоен физическому лицу при рождении.

4. Алгоритм генерирования БИН
Предлагается следующий алгоритм генерирования БИН:
1) первый фасет - содержит 4 разряда (с а1 по а4) и характеризует год (две последние цифры) и месяц регистрации юридического лица или индивидуального предпринимателя, осуществляющего деятельность на основе совместного предпринимательства (далее - ЮЛ или ИП(С));
2) второй фасет - содержит 1 разряд (а5) и характеризует тип ЮЛ или ИП(С). Кроме того, алгоритм задания значения данного разряда также используется для исключения возможности совпадения БИН с ИИН.
Поскольку в структуре ИИН а5 (пятый разряд) означает первую цифру даты рождения, то, учитывая, что дата рождения может начинаться только с 0, 1, 2 или 3 (например, 01, 11, 21, 31), обязательным условием в генерировании в структуре БИН а5 (пятого разряда) будет исключение использования цифр 0, 1, 2 и 3.
Предлагается использовать следующие конкретные значения данного разряда:
4 - для юридических лиц-резидентов;
5 - для юридических лиц-нерезидентов;
6 - для индивидуальных предпринимателей, осуществляющих деятельность на основе совместного предпринимательства.
Следовательно, в данном разряде имеются резервные значения 7, 8 и 9;
3) третий фасет - содержит 1 разряд (а6) и характеризует специальный признак, являющийся дополнительной детализацией разряда а5:
0 - признак головного подразделения ЮЛ или ИП(С);
1 - признак филиала ЮЛ или ИП(С);
2 - признак представительства ЮЛ или ИП(С);
3 - признак иного обособленного структурного подразделения ЮЛ или ИП(С);
4 - признак крестьянского (фермерского) хозяйства, осуществляющего деятельность на основе совместного предпринимательства;
4) четвертый фасет - содержит 5 разрядов (с а7 по а11) и характеризует порядковый номер регистрации в системе ЮЛ или ИП(С), а также их структурных подразделений;
5) пятый фасет - содержит 1 разряд (а12) и является контрольным разрядом БИН. Алгоритм расчета контрольного разряда БИН приведен в параграфе 5 главы 5 Программы и аналогичен расчету контрольного разряда ИИН.

Мы не стали брать из этого постановления подраздел 5 раздела 5, где приводится алгоритм проверки контрольного разряда (a12), потому что он был изменен в другом постановлении.

Постановление Правительства Республики Казахстан от 30 апреля 2007 года № 352 "О внесении изменений и дополнений в некоторые решения Правительства Республики Казахстан"

Здесь нас интересует часть пункта 11 - алгоритм расчета значения контрольного разряда:

подраздел 5 изложить в следующей редакции:
«5. Алгоритм расчета значения контрольного разряда
В целях осуществления контроля и снижения ошибок клавиатурного ввода в составе ИИН (БИН) предусматривается наличие контрольного 12-го разряда, при расчете которого будет использоваться следующий алгоритм в два цикла:
а12=(а1*b1+а2*b2+а3*b3+а4*b4+а5*b5+а6*b6+а7*b7+а8*b8+а9*b9+a10*b10+a11*b11) mod 11,
где: ai - значение i-гo разряда;
bi - вес i-гo разряда.
разряд ИИН: 1 2 3 4 5 6 7 8 9 10 11
вес разряда: 1 2 3 4 5 6 7 8 9 10 11.
1. Если полученное число равно 10, то расчет контрольного разряда производится с другой последовательностью весов:
разряд ИИН: 1 2 3 4 5 6 7  8   9   10 11
вес разряда: 3 4 5 6 7 8 9 10 11  1    2.
2. Если полученное число также равно 10, то данный ИИН не используется.
3. Если полученное число имеет значение от 0 до 9, то данное число берется в качестве контрольного разряда.».

В итоге у нас вполне достойное понимание того, что такое ИИН, и как можно проверить правильность его ввода.

Привожу пример алгоритма на javascript, который позволит проверить правильность ввода ИИН:

   
Валидация ИИН/БИН
  1. function iinCheck(iin, clientType, birthDate, sex, isResident) {
  2. //clientType: 1 - Физ. лицо (ИИН), 2 - Юр. лицо (БИН)
  3. //birthDate: дата рождения (в формате Javascript Date)
  4. //sex: true - м, false - ж
  5. //isResident: true - резидент, false: нерезидент (true: по умолчанию)
  6. isResident = isResident || true;
  7. if(!iin) return false;
  8. if(iin.length!=12) return false;
  9. if(!(/[0-9]{12}/.test(iin))) return false;
  10. switch(clientType){
  11. case 1:
  12. //Физ. лицо
  13. //Проверяем первый фасет на совпадение с датой рождения ГГММДД
  14. if(iin.substring(0, 6)!=(
  15. "" +
  16. (birthDate.getYear()) +
  17. ((birthDate.getMonth()+1)<10?"0":"")+
  18. (birthDate.getMonth()+1)+
  19. (birthDate.getDate()<10?"0":"")+
  20. birthDate.getDate())) return false;
  21. //Проверяем пол и век рождения
  22. var s = parseInt(iin.substring(6, 7));
  23. if(((s%2)==1)!=sex) return false;
  24. if(
  25. birthDate.getFullYear()<(1800+parseInt(s/2)*100)
  26. || birthDate.getFullYear()>(1900+parseInt(s/2)*100)) return false;
  27. break;
  28. case 2:
  29. //Юр. лицо
  30. //Проверяем корректность даты (насколько это возможно)
  31. var m = parseInt(iin.substring(2, 4));
  32. if(m>12) return false;
  33. //Проверяем признак резидентства
  34. var r = parseInt(iin.substring(4, 5));
  35. if(r<4 || r>6 || (r==4 && !isResident) || (r==5 && isResident)) return false;
  36. break;
  37. }
  38. //Проверяем контрольный разряд
  39. var b1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
  40. var b2 = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2 ];
  41. var a = [];
  42. var controll = 0;
  43. for(var i=0; i<12; i++){
  44. a[i] = parseInt(iin.substring(i, i+1));
  45. if(i<11) controll += a[i]*b1[i];
  46. }
  47. controll = controll % 11;
  48. if(controll==10) {
  49. alert("s");
  50. controll = 0;
  51. for(var i=0; i<11; i++)
  52. controll += a[i]*b2[i];
  53. controll = controll % 11;
  54. }
  55. if(controll!=a[11]) return false;
  56. return true;
  57. }