Расшифровка РНН и проверка контрольного разряда

Мар. 27, 2012| 18:03

Так как РНН с 1 января не отменили, напишу ка я еще и про РНН.

Регистрационный номер налогоплательщика (РНН) — это документ, необходимый для администрирования налогоплательщиков в Республике Казахстан.

Структура РНН

РНН представляет собой 12-тиразрядное число. 

  • Первый фасет (2 разряда) - код области. Для кодирования используются 3, 4 разряды кода классификатора "Система обозначения административнотерриториальных органов" (СОАТО).
  • Второй фасет (2 разряда) - код района. Перечень и номера налоговых комитетов соответствуют кодам районов области, принятые в системе Министерства финансов Республики Казахстан.
  • Третий фасет (1 разряд) - имеет значение: 0 - для юридических лиц, с 1 до 9 - для физических лиц.
  • Четвертый фасет (6 разрядов) - порядковый номер налогоплательщика, присваиваемый налоговым органом.
  • Пятый фасет (1 разряд) - контрольный разряд

Алгоритм проверки контрольного разряда

Каждому разряду РНН (счет слева направо), исключая последний 12-ый разряд, присваивается вес от 1 до 10. 11-ый разряд имеет вес равный 1. Определяется сумма произведений значений каждого разряда на его вес (S = r1*1 + r2*2 + ... + r10*10 + r11*1). Полученная сумма делится на 11 и выделяется целая часть C (т.е. максимальное целое число, на которое S делится без остатка). Определяется разница между суммой произведений и целочисленным вхождением по модулю 11 в эту сумму ( i = S - C*11). Если полученная разница меньше 10, то она является значением контрольного разряда. Если после первого прохода контрольное число получается больше или равное 10, расчет повторяется, но каждому разряду вес присваивается, начиная с 2. Для третьего прохода соответственно с 3 и т.д. Если результат при 10 циклах повторения расчета всегда имеет значение большее или равное 10, то данное число для регистрационного номера налогоплательщика исключается.

Реализация на PHP

<?php
function valid_rnn($rnn)
{
    for (
$i 1$i <= 10$i++)
    {
        
$s 0;
        
$t $i 1;
        for (
$j 1$j <= 11$j++)
        {
            ++
$t;
            if (
$t == 11)
                
$t 1;
            
$s $s $t substr($rnn,$j 1,1);
        }
        
$k $s 11;
        if (
$k 10)
            break;
    }

    return (
$k == substr($rnn,11,1));
}

PS. справочник "Коды областей и районов Республики Казахстан", по которому сопоставляются первые 4 разряда РНН и область/район. Справочник устарел, а закон, которым он принят утратил силу, но хоть так.

 

г. Астана
г. Астана 6201
Алматинский район 6202
Сарыаркинский район 6203
г. Астана Новый город 6301
Акмолинская область
Акмолинская область 0301
Аккольский район 0302
Астраханский район 0303
Атбасарский район 0304
Сандыктауский район 0305
Аршалынский район 0306
Ерейментауский район 0307
Егиндыкольский район 0308
Коргалжынский район 0309
Буландинский район 0310
Целиноградский район 0312
Шортандинский район 0313
Степногорский район 0316
Жаркаинский район 0317
Есильский район 0318
Жаксынский район 0321
Зерендинский район 0323
Щучинский район 0324
Енбекшилдерский район 0325
г. Кокшетау 0326
Актюбинская область
Актюбинская область 0601
Алгинский район 0604
Байганинский район 0605
Айтекебийский район 0606
Иргизский район 0607
Каргалинский район 0609
Мартукский район 0610
Mугалжарский район 0612
Темирский район 0613
Уилский район 0614
Кобдинский район 0615
Хромтауский район 0616
Шалкарский район 0617
г. Актобе 0618
г. Алматы
г. Алматы 6001
Ауэзовский район 6003
Бостандыкский район 6004
Жетысуйский район 6005
Турксибский район 6008
Алмалинский район 6007
Медеуский район 6009
Алматинская область
Алматинская область 0901
Балхашский район 0902
Жамбылский район 0903
Илийский район 0904
Карасайский район 0905
Раимбекский район 0908
Талгарский район 0909
Уйгурский район 0910
Енбекшиказахский район 0912
г. Капчагай 0913
Аксуский район 0914
Алакольский район 0915
Каратальский район 0916
Кербулакский район 0917
Коксуский район 0918
Панфиловский район 0919
Саркандский район 0920
Ескельдинский район 0921
г. Талдыкорган 0922
г. Текели 0923
Атырауская область
Атырауская область 1501
Курмангазинский район 1503
Индерский район 1504
Исатайский район 1505
Кзылкогинский район 1506
Макатский район 1507
Махамбетский район 1508
Жалойский район 1509
Жамбылская область
Жамбылская область 2101
Жамбылский район 2102
Жуалынский район 2103
Кордайский район 2104
Район Турара Рыскулова 2105
Меркенский район 2106
Мойынкумский район 2107
Сарысуйский район 2108
Байзакский район 2109
Таласский район 2110
Шусский район 2111
г. Тараз 2115
Восточно Казахстанская область
Восточно Казахстанская область 1801
Катон Карагайский район 1802
Глубоковский район 1803
Зайсанский район 1804
Курчумский район 1806
Тарбагатайский район 1810
Уланский район 1811
Шемонаихинский район 1812
Зыряновский район 1813
г. Лениногорск 1814
г. Усть Каменогорск 1816
Абайский район 1819
Аягузский район 1820
Бескарагайский район 1821
Бородулихинский район 1822
Жарминский район 1823
Кокпектинский район 1824
г. Курчатов 1825
Урджарский район 1826
г. Семипалатинск 1827
Западно Казахстанская область
Западно Казахстанская область 2701
Бурлинский район 2703
Жанибекский район 2704
Джангалинский район 2705
Зеленовский район 2707
Казталовский район 2708
Каратобинский район 2709
Сырымский район 2711
Таскалинский район 2712
Теректинский район 2714
Бокейординский район 2715
Акжаикский район 2716
Чингирлауский район 2717
Карагандинская область
Карагандинская область 3001
Абайский район 3002
г. Караганда 3004
Каркаралинский район 3005
Нуринский район 3008
Осакаровский район 3009
г. Сарань 3010
г. Темиртау 3012
Бухар Жырауский район 3013
г. Шахтинск 3014
Октябрьский район г. Караганды 3019
Район Казыбек би г. Караганды 3020
Актогайский район 3021
Жана Аркинский район 3022
Улытауский район 3023
Шетский район 3024
г. Балхаш 3025
г. Жезказган 3026
г. Приозерск 3027
г. Каражал 3028
Кызылординская область
Кызылординская область 3301
Аральский район 3302
Казалинский район 3303
Кармакчинский район 3304
Жалагашский район 3305
Сырдарьинский район 3306
Шиелийский район 3308
Жанаркорганский район 3309
Костанайская область
Костанайская область 3901
Алтынсаринский район 3902
Мендыкаринский район 3903
Житикаринский район 3904
Камыстинский район 3905
Карасуский район 3906
Карабалыкский район 3907
Костанайский район 3908
Узункольский район 3909
Наурзумский район 3910
Денисовский район 3911
Аулиекольский район 3912
Тарановский район 3913
Сарыкольский район 3914
Федоровский район 3915
г. Костанай 3917
г. Лисаковск 3918
г. Рудный 3919
Амангельдинский район 3920
Жангеладинский район 3923
г. Аркалык 3925
Мангистауская область
Мангистауская область 4301
Бейнеуский район 4302
Каракиянский район 4303
Мангистауский район 4304
Тупкараганский район 4305
г. Жанаозен 4307
Северо Казахстанская область
Северо Казахстанская область 4801
Кызылжарский район 4802
Булаевский район 4803
Жамбылский район 4805
Есильский район 4806
Мамлютский район 4807
Район Шал акына 4810
Аккаинский район 4811
Тимирязевский район 4813
Айыртауский район 4815
Акжарский район 4816
Тайыншинский район 4818
Уалихановский район 4819
Целинный район 4820
Павлодарская область
Павлодарская область 4501
Актогайский район 4503
Байнаульский район 4504
Железинский район 4505
Иртышский район 4506
Качирский район 4507
Лебяжинский район 4508
Майский район 4509
Павлодарский район 4510
Успенский район 4511
Щербактинский район 4512
г. Аксу 4514
г. Павлодар 4515
г. Экибастуз 4516
Южно Казахстанская область
Южно Казахстанская область 5801
Байдибехский район 5802
Ордабасинский район 5803
Отрарский район 5805
Казгуртский район 5808
Толебийский район 5809
Мактааральский район 5810
Сайрамский район 5811
Сарыагашский район 5812
Сузакский район 5813
Тюлькубасский район 5815
Шардаринский район 5816
г. Арысь 5817
г. Кентау 5818
г. Туркестан 5820
г. Шымкент 5821



Вот здесь РНН можно проверить на корректность онлайн


Метки: php, howto

Откомментить {49}

Что такое ИИН и как проверить его корректность

Дек. 31, 2010| 16:27

ИИН - Индивидуальный Идентификационный Номер, 12-значный цифровой код, который присваивается физическому лицу один раз и пожизненно. с 1 января 2012 года заменит РНН и СИК.

Расшифровка ИИН :

  • первые 6 разрядов - это дата рождения ггммдд, то есть 12 августа 1985 года в ИИНе будет 850812
  • 7 разряд отвечает за век рождения и пол. Если цифра нечетная - пол мужской, четная - женский. 1,2 - девятнадцатый век, 3,4 - двадцатый, 5,6 - двадцать первый.
  • 8-11 разряды - заполняет орган Юстиции.
  • 12 разряд - контрольная цифра, которая расчитывается по определенному алгоритму

Проверка корректности ИИН :

Вспомогательная проверка. Строится на расшифровке.

  • вычленяем дату рождения из ИИН и проверяем её. Если дата неверна, то ИИН может быть не верен
  • если 7 разряд равен 0 или больше 6, то ИИН может быть не верен

Почему я пишу "может быть не верен", да потому что все решает человеческий фактор! Руки у операторов не всегда откуда надо растут, в итоге появляются ИИН с неправильно написанными датами, вместо 850812 например напишут 120885. Или опечатаются где-нибудь.

Основная проверка. По контрольной цифре, 12 разряду. Алгоритм формирования

  1. Формируем сумму. Сумма произведения порядка разряда на его значение. То есть для 850812 сумма начнется с (1*8+2*5+3*0+4*8+5*1+5*2+...). Берем остаток от делния суммы на 11. если остаток оказывается равен 10, то идем на второй шаг. Если не равен 10, то сравниваем контрольный разряд с остатком. Если равны - ИИН корректный.
  2. Сюда мы попадаем если в результате первого шага мы получили остаток 10. Здесь мы тоже будем суммировать произведения значений разрядов, только на этот раз не с порядковыми номерами, а с весами разрядов. Вес формируется следующим образом - остаток от деления на 11  суммы (порядковый номер разряда + 2). То есть для 850812, первый вес равен 3, второй 4 и так далее. Если вес оказывается равным 0, то вес приравнивают к 11. ну а дальше также. берем остаток от деления получившейся суммы на 11, если получаем 10, то данный ИИН не используется. Если не 10 сравниваем с контрольным разрядом.

В общем, вот так это все выглядит на php :


<?php
function valid_nn($nn)
{    
    
$s 0;
    for (
$i 0$i 11$i++)
    {
        
$s $s + ($i 1) * $nn{$i};
    }
    
$k $s 11;
    if (
$k == 10)
    {
        
$s 0;
        for (
$i 0$i 11$i++)
        {
            
$t = ($i 3) % 11;
            if(
$t == 0)
            {
                
$t 11;
            }
            
$s $s $t $nn{$i};
        }
        
$k $s 11;
        if (
$k == 10)
            return 
false;

        return (
$k == substr($nn,11,1));
    }
    return (
$k == substr($nn,11,1));
}

Кстати, алгоритм для проверки контрольного разряда подходит и к БИНам.

Ну а нужно это например, чтобы применить на сайте http://census.kz

UPDATE от 28.03.2012. Вот здесь ИИН можно проверить на корректность онлайн


Метки: php, howto

Откомментить {43}

file_get_contents() : failed to open stream: Connection timed out

Дек. 13, 2010| 21:15

Пишу сейчас один замечательный сервис, где приходится для получения информации парсить html-страницы из-за отсутсвия api. Странички получал просто file_get_contents. Через месяц тестирования парсинг начал занимать в 2-3 раза больше времени чем было. В логи писалось следующее : PHP Warning:  file_get_contents(адрес страницы): failed to open stream: Connection timed out in /var/www/parser/parser.php on line 24. Как раз в это время писал другой модуль, где работал с cURL. Поэтому не стал заморачиваться с тем, откуда растут ноги у этой ошибки и сделал вместо :

$data file_get_contents('адрес страницы');

стал использовать cURL:

$ch curl_init();
curl_setopt($chCURLOPT_URL'адрес страницы');
curl_setopt($chCURLOPT_HEADERfalse);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_CONNECTTIMEOUT5);
$data curl_exec($ch);   
curl_close($ch);

Работать стало даже быстрее


Метки: php

Откомментить {2}

PHP Simple HTML DOM Parser пример использования

Ноя. 17, 2010| 22:49

Наверное, любой php-разработчик рано или поздно сталкивается с задачей написания html парсера. Задачи разнообразные : вытащить телефоны и адреса поставщиков с сайта желтых страниц, расписание кинотеатра на день или даже просто распарсить большой справочник (двухколоночную таблицу), который почему-то прислали в html, а не в excel-файле. Способов море : с использованием регулярных выражений, строковых функций (strpos, strstr и т.д.), с помощью DOM и так далее. Один из моих парсеров загружал страницу, обрезал начало и конец, конвертил из cp1251 в utf8, присоединял в начало и конец xml узлы и дальше все парсилось с помощью SimpleXML и XPath.

А потом в один рабочий день я нашел PHP Simple HTML DOM Parser универсальный (пока не было задач, с которыми он бы не справился), удобный в использовании, хороший парсер. На сайте есть хорошая и понятная документация, а я покажу пример всего из 60-70 строк кода, который вытащит нам 1000 последних добавленных машин в Астане с сайта kolesa.kz (1000 потому что сайт выдает 1000 машин максимум на запрос).

Читать далее


Метки: php

Откомментить {4}

Получаем данные с помощью lastfm api REST requests.

Авг. 13, 2010| 18:43

То, о чем я дальше напишу можно будет использовать в работе с любыми REST-сервисами, да и вообще с любыми сервисами где на URI-запрос отвечают XML-ответом (та же самая RSS технически REST-сервис).

Читать далее


Метки: php, howto, simplexml, rest, lastfm api

Откомментить {0}

реализация разделителя страниц (cut, кат) на php + mysql

Авг. 2, 2010| 23:46

На одном из старых сайтов Олега для создания ката использовалась комбинация из четырех или более знаков дефис "-". При создании данного блога я решил использовать их же для разделения страниц.

Процесс:

  1. Создание записи (с катом или без него)
  2. Отображение списка записей (полных или текста только до ката)
  3. Отображение записи полностью

Читать далее


Метки: php, mysql, howto

Откомментить {2}