Казахстан: Как я помогал сдать 100 форму налоговой отчетности. Начало 200 форма

Приветствую социум!

Давным-давно (пару дней назад числа 25 марта), в далекой-далекой галактике (в Алматы. Казахстан)…

Моя знакомая, бухгалтер, позвонила мне со словами:
» — Привет Ринат! Ты же увлекаешься программированием! Я тут устроилась на новую работу, в ТОО-шку. За прошлый год тут сменилось несколько бухгалтеров по налогам. А мне нужно сдать годовой отчет. Я продление уже запросила, и у меня есть месяц чтобы разобраться в цифрах. Я то конечно разберусь, за недельку, но не факт что все будет правильно. Помоги. Нужно немного автоматизировать проверку уже сданных деклараций.»

Я не долго думая решил помочь, девушка то не плохая, а иногда и полезная, в прикладном смысле.

И вот тут меня ждала засада…

Ремарка к статье: Всего будет 3 статьи, 200 форма, 300 форма и учет счет фактур.

trouble:
Системы автоматизации бухгалтерского учёта такие как 1С: Предприятие, показывают ситуацию в целом никак не связывая ее со сданными налоговыми декларациями. Они могут создать файл для импорта в действующие онлайн сервисы, но проверить правильно ли сдана отчетность не могут.

problem solution:
Пришлось изучить азы бух учета.

У нас в Казахстане с 2009 года налоговые декларации можно сдать в онлайн режиме. Есть два варианта:
1. КАБИНЕТ НАЛОГОПЛАТЕЛЬЩИКА cabinet.salyk.kz/sonoweb
2. СИСТЕМА ОБРАБОТКИ НАЛОГОВОЙ ОТЧЕТНОСТИ (далее по тексту СОНО) kgd.gov.kz/ru/section/sono

Для ТОО имеются несколько режимов налогообложения:

  • Общеустановленный порядок налогообложения;
  • На основе упрощенной декларации;
  • Специальный налоговый режим для юридических лиц.

Мне был нужен Общеустановленный порядок налогообложения.

При этом режиме сдаются три основных вида деклараций, в большинстве своем, также как и в моем случае:
100.00 Декларация по корпоративному подоходному налогу
200.00 Декларация по индивидуальному подоходному налогу и социальному налогу, по гражданам Республики Казахстан
300.00 Декларация по налогу на добавленную стоимость

100 форма сдается раз в год.
200 и 300 формы сдаются раз в квартал.

Мне нужно было дать сводную по 200 и 300 формам.

Первым делом я начал искать API для доступа к онлайн сервисам. К сожалению в обслуживающей портал компании ни какого API никогда не существовало. Замкнутая система. Можно запросить публичные данные о налогоплательщике, но декларации к сожалению не получится.

Так как я не ищу легких путей, решил хватит открытого поиска.

Зашел в «КАБИНЕТ НАЛОГОПЛАТЕЛЬЩИКА» и выгрузил все 200 формы для начала работы.

Как выглядит 'КАБИНЕТ НАЛОГОПЛАТЕЛЬЩИКА'
4703ebf3cb4543e69f347abfd55b1150.png
cde5bd9a513544b68f233bb93665d795.png

В итоге получил 5 деклараций за 2016 год. 4 очередных и 1 дополнительную. Декларации выгрузились в xml формате.

Как это выглядит
7ca4d8f322c847fb92617857c3002d2e.png
035e39d5cd644ebb9d6e619c25b35f02.png

Основной элемент в этом xml это fno.

Тут нужно выделить два свойства:

var version =  "26";
var formatVersion = "1";

Остальные свойства мне не нужны, так как от них внутренняя структура не меняется. После проверки всех xml 200 формы, я обнаружил что в них имеются два значения version, это »25» и »26». А formatVersion только одно значение,»1».

Далее уточнив у знакомой (далее заказчик), какую именно информацию ей нужно из 200 форм я приступил к написанию кода. Кстати, заказчик изменил начальное тех задание, и вместо одной ТОО-шки попросил написать код для учета нескольких ТОО-шек.

Понятия РНН, ИИН и прочие бухгалтерские сокращения
Регистрационный номер налогоплательщика (РНН)
Индивидуальный Идентификационный Номер (ИИН)
бизнес-идентификационный номер (БИН) полный аналог ИИН для бизнеса.
Индивидуальный подоходный налог (ИПН)
Обязательные пенсионные взносы (ОПВ)
Обязательные профессиональные пенсионные взносы (ОППВ)
Социальный налог (СН)
Социальные отчисления (СО)

Я решил сделать фильтрацию по ИИН/БИН и РНН. Они заложены внутри xml

Здесь ИИН или БИН лица сдавшего декларацию

Тех задание по полям по которым требуется сводная:
ИИН
РНН
Квартал
Год сдачи (да, да Заказчик решил если все получится и по прошедшим периодам пройтись чтобы все привести в порядок)
Дата сдачи отчетности.
ИПН (сумма по декларации)
ОПВ (сумма по декларации)
ОППВ (сумма по декларации)
СН (сумма по декларации)
СО (сумма по декларации)
Вид декларации.

Для начала создаю элементы:


Изучив структуру подачи требуемых для сводной данных по версиям 26 и 25, понял что именно в подаче этих данных разницы нет.

Данные name поля
ИИН iin
РНН rnn
Квартал period_quarter
Год сдачи period_year
Дата сдачи отчетности. submit_date
ИПН (сумма по декларации) field_200_00_001_4
ОПВ (сумма по декларации) field_200_00_002_4 + 
field_200_00_004_4
ОППВ (сумма по декларации) field_200_00_003_4
СО (сумма по декларации) field_200_00_005_4 +
field_200_00_006_4 + 
field_200_00_007_4
Вид декларации. field_200_00_008_4 +
field_200_00_009_4

В итоге у меня получилась функция которая возвращает объект со всеми требуемыми данными.

var frame = document.createElement("IFRAME");
function getValue(a,b,fnoVersion = "25",fnoFormatVersion = "1") {
    try {
        switch(true) {
            case((fnoVersion == "25")&&(fnoFormatVersion == "1")):
                return frame.contentWindow.document.querySelector("form[name='form_200_0" + a + "'] field[name='" + b + "']").innerHTML.split("<")[0];;
                break;
        }
        return "";
    } catch (ex) {
        return "";
    }
}


function seeXML() {
    var fno = {};
    if (document.querySelector("#file").files.length < 1)
        return;
	var fReader = new FileReader();
	fReader.addEventListener("load", function(){
        frame.contentWindow.document.documentElement.innerHTML = fReader.result;
        fno["iin"] = getValue(0,"iin");
        fno["rnn"] = getValue(0,"rnn");
        fno["period_quarter"] = getValue(0,"period_quarter");
        fno["period_year"] = getValue(0,"period_year");
        fno["submit_date"] = getValue(0,"submit_date");           
        fno["ipn"] = (getValue(0,"field_200_00_001_4") - 1) + 1;                         
        fno["opv"] = (getValue(0,"field_200_00_002_4") - 1) + (getValue(0,"field_200_00_004_4") - 1) + 2;                          
        fno["oppv"] = (getValue(0,"field_200_00_003_4") - 1) + 1;                       
        fno["sn"] = (getValue(0,"field_200_00_005_4")) - 1 + (getValue(0,"field_200_00_006_4") - 1) + (getValue(0,"field_200_00_007_4") - 1) + 3;                         
        fno["so"] = (getValue(0,"field_200_00_008_4") - 1) + (getValue(0,"field_200_00_009_4") - 1) + 2;                     
        switch(true) {                                    
            case (getValue(0,"dt_main") == "true"):
                fno["dt"] = "dt_main/первоначальная";
                break;
            case (getValue(0,"dt_regular") == "true"):
                fno["dt"] = "dt_regular/очередная";
                break;
            case (getValue(0,"dt_additional") == "true"):
                fno["dt"] = "dt_additional/дополнительная";
                break;
            case (getValue(0,"dt_notice") == "true"):
                fno["dt"] = "dt_notice/дополнительная по уведомлению";
                break;
            case (getValue(0,"dt_final") == "true"):
                fno["dt"] = "dt_final/ликвидационная";
                break; 
        }
        console.log(fno);
	}, false);
	fReader.readAsText(document.querySelector("#file").files[0]);
}

Далее с этим объектом можно делать все что угодно. Кому как нравиться, а я сделал маленькую систему учета сданных деклараций по 200 форме.

В итоге что у меня получилось, я не дизайнер, по визуализации не ко мне.
1ed43259d7a44cfb8a325ab523fe9808.png
a96d260b7b894f799afeea8db608b1f7.png
4116bcbc3ef64d3097580ae62ffcb34d.png

p.s. Заказчик начал писаться от радости при виде хотя бы такого учета сданных форм.
p.p.s. А вот с формой 300 я очень сильно намучился.

Комментарии (2)

  • 31 марта 2017 в 00:13

    0

    к черту код, код мы все тут умеем рассказывать и показывать,
    напишите лучше что у вас с девушкой вышло в итоге — вот что действительно интересно! :)
    • 31 марта 2017 в 09:03

      0

      так он же намекнул
      Заказчик начал писаться от радости

© Habrahabr.ru