カザフスタン:私がどのように100税申告フォームを渡すのを手伝ったか。 200フォームを開始

社会への挨拶! むかしむかし(数日前の3月25日)、遠く、遠くの銀河(カザフスタンのアルマトイ)で...



私の友人、会計士は、次の言葉で私に電話をかけました。



"-こんにちはRinat!あなたはプログラミングが好きです。私はここでLLPで新しい仕事を得ました。昨年ここでいくつかの税理士がここに変わりました。しかし、私は年次報告書を提出する必要があります。もちろん、私は1週間で解決しますが、すべてが正しいという事実ではありません。



ためらうことなく、私は助けることにしました、女の子は適用された意味で悪くはなく、時には有用です。



そして、ここで待ち伏せが私を待っていました...

記事への注意:合計3つの記事があります。200のフォーム、300のフォーム、請求書の会計です。



トラブル



1C:Enterpriseなどの会計自動化システムは、提出された納税申告書にリンクせずに、全体として状況を示します。 既存のオンラインサービスにインポートするファイルを作成できますが、レポートが正しく送信されたかどうかを確認できません。



問題解決策:



私は会計の基礎を学ばなければなりませんでした。



2009年以降、カザフスタンでは、納税申告書をオンラインで提出できます。 次の2つのオプションがあります。



1. 納税者キャビネット

2. 税務申告処理システム (以下SONOと呼びます)



LLPにはいくつかの課税制度があります。





一般に確立された課税手続きが必要でした。



このモードでは、私の場合と同様に、主に3種類の宣言が送信されます。



100.00法人所得税の申告

200.00カザフスタン共和国国民の個人所得税および社会税に関する宣言

300.00付加価値税の申告



年に一度、100のフォームがレンタルされます。

200および300のフォームが四半期に1回レンタルされます。



200と300のフォームの要約を提出する必要がありました。



まず、オンラインサービスにアクセスするためのAPIを探し始めました。 残念ながら、ポータルを提供している会社にはAPIが存在していません。 クローズドシステム。 納税者に関する公開情報を要求できますが、残念ながら申告は機能しません。



簡単な方法を探していないので、十分なオープン検索を行うことにしました。



「納税者のオフィス」に行き、仕事を始めるために200のフォームすべてをアップロードしました。



「納税者キャビネット」はどのように見えますか?






その結果、2016年に5つの宣言を受け取りました。 レギュラー4個と追加1個。 宣言はxml形式でアップロードされます。



それはどのように見えますか






このxmlの主要な要素はfnoです。



<fno code="200.00" version="26" id="83970683" documentId="304374645967031219" formatVersion="1">
      
      





ここでは、2つのプロパティを区別する必要があります。



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





内部構造は変更されないため、他のプロパティは必要ありません。 すべてのxml 200フォームを確認したところ、2つのバージョン値があり、「25」と「26」であることがわかりました。 また、formatVersionの値は「1」のみです。



さらに、200のフォームから必要な情報を友人(以下、顧客と呼びます)に明らかにして、コードを書き始めました。 ところで、顧客は最初の技術タスクを変更し、1つのLLPの代わりに、複数のLLPを説明するコードを書くように依頼しました。



RNN、IIN、およびその他の会計略語
納税者登録番号(TRN)

個人識別番号(IIN)

ビジネス識別番号(BIN)は、ビジネス向けIINの完全な類似物です。

個人所得税(PIT)

強制年金拠出額(OPV)

義務的な年金拠出

社会税(CH)

社会保障貢献



IIN / BINおよびTRNでフィルタリングすることにしました。 それらはxml内に埋め込まれています:



 <field name="iin">      </field>
      
      





要約が必要なフィールドでのタスク:



いん

RNN

四半期

完成年(はい、はい、顧客はすべてがうまくいくかどうかを決定し、過去の期間を経てすべてを整理します)

報告日。

IIT(申告額)

OPV(申告額)

OPVA(申告額)

CH(申告額)

SO(申告額)

宣言のタイプ。



最初に、要素を作成します。



 <input type="file" id="file" onchange="seeXML();">
      
      





バージョン26および25のサマリーデータに必要な供給構造を検討した結果、これらのデータの供給に違いはないことがわかりました。

データ 名前フィールド
いん いん
RNN rnn
四半期 period_quarter
完成年 period_year
報告日。 submit_date
IIT(申告額) field_200_00_001_4
OPV(申告額) field_200_00_002_4 +

field_200_00_004_4
OPVA(申告額) field_200_00_003_4
SO(申告額) 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のフォームで提出された宣言のために小さな会計システムを作りました。



その結果、私がやったことは、私はデザイナーではなく、視覚化は私には向いていません。








ps顧客は、提出されたフォームの少なくともそのような会計を見て喜んで書き始めました。

ppsしかし、フォーム300では、私は本当に多くの苦しみを味わいました。



2記事はこちら



All Articles