私の友人、会計士は、次の言葉で私に電話をかけました。
"-こんにちは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のフォームすべてをアップロードしました。
「納税者キャビネット」はどのように見えますか?
![](https://habrastorage.org/files/470/3eb/f3c/4703ebf3cb4543e69f347abfd55b1150.png)
![](https://habrastorage.org/files/cde/5bd/9a5/cde5bd9a513544b68f233bb93665d795.png)
その結果、2016年に5つの宣言を受け取りました。 レギュラー4個と追加1個。 宣言はxml形式でアップロードされます。
それはどのように見えますか
![](https://habrastorage.org/files/7ca/4d8/f32/7ca4d8f322c847fb92617857c3002d2e.png)
![](https://habrastorage.org/files/035/e39/d5c/035e39d5cd644ebb9d6e619c25b35f02.png)
この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)は、ビジネス向け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のフォームで提出された宣言のために小さな会計システムを作りました。
その結果、私がやったことは、私はデザイナーではなく、視覚化は私には向いていません。
![](https://habrastorage.org/files/1ed/432/59d/1ed43259d7a44cfb8a325ab523fe9808.png)
![](https://habrastorage.org/files/a96/d26/0b7/a96d260b7b894f799afeea8db608b1f7.png)
![](https://habrastorage.org/files/411/6bc/bc3/4116bcbc3ef64d3097580ae62ffcb34d.png)
ps顧客は、提出されたフォームの少なくともそのような会計を見て喜んで書き始めました。
ppsしかし、フォーム300では、私は本当に多くの苦しみを味わいました。
2記事はこちら