tomoima525's blog

Androidとか技術とかその他気になったことを書いているブログ。世界の秘密はカレーの中にある!サンフランシスコから発信中。

あなたのしらない米国所得申告システム

確定申告の時期なので、米国の一風変わった(?)所得申告システム(Information Return)と連携するアプリケーションを開発した話について書こうと思う。

米国の所得申告

米国で申告義務のある人は、だいたい1月 - 4月の間に確定申告(Tax Return)を行う。この際、所得申告に関する数々の書類を提出する。例えば、雑所得がある場合は 1099-MISC、ギャンブルの収益は W-2G といった具合だ。

書類には膨大な種類がある

じゃあこの書類は誰が用意するのかというと、支払った側になる。例えば契約社員は1099-NECという書類が申告に必要になるのだが、これを発行するのは雇用主側だ。雇用主は1月中に IRS (米国の国税庁)に申告をおこない、かつこの書類を契約社員に送付する、あるいはダウンロードできるようにする必要がある。このプロセスを Information Returns と呼ぶ。

もちろん普通の事業主は代行サービスを利用する。メジャーどころだと Stripe、Turbo Tax など。 Gusto と言ったHRツールでも代行してくれる。

うちの会社のサービスでも1099-NECを申告するのだけど、契約者の個人情報のログを残さないという制約があり、代行サービスは使えず、IRSに直接申告する必要があった。これにはIRSの電子申告システムがある。おそらくどの代行サービスもこのシステムを利用している。*1

所得申告システム、FIRE

このシステムの名前を FIRE という。Filing Information Returns Electronically の略だ。

https://fire.irs.gov/

これが実に奇妙、というか古い。1990年代から運用しているんじゃないか、というレガシーなシステムなのである。

まず、当然のことながら、APIなどというものは存在しない。この古めかしいGUIからログインする。

1990年代風

アカウントを作るためにはIRSの別システムでこのシステム用のコードを発行する必要がある。まぁあんまりうまくいかないので、何度か電話する必要がある。Toll free(無料)電話番号も書いてあって、とっても親切(?)だ。

そして、ログインした後に待つのは、電子申告画面だ。

改めて、1990年代風だが2024年である

フォントもスタイルもバラバラで目がチカチカする。

不思議なファイルフォーマット

さて問題です。FIREではどういう形式で申告を行うでしょう?

フォームやPDF、はたまたJSONXMLで申請できると思ったあなた、残念ながらそんなに甘くないです。電子申告ファイルには ASCII Codeが利用される。

ASCII Code?

ウェブサイトにある説明

すべてのファイルにはスタンダード ASCII codeが必要です。

正直自分も初見では何を言っているのかわからなかった。説明します。

この電子申告にはバイトごとに指定されたASCII文字列を入力したファイルを生成して提出する必要がある。

例えば、書き出しはこんな感じ。

T2023 12345678955AA5       T1ASDF GLOBAL
  • 1文字目: TはTransmitter(送信者)のT。これは決まっている。
  • 2-5文字目: 提出年度
  • 6文字目: もし 2023よりも前の申告を行う場合はPを入れる。あるいは空白。
  • 7-15文字目: 送信者の認識番号(TIN)
  • 16 - 20文字目: IRSから付与された、送信者の制御番号(TCC)
  • 21 - 27文字目:空白
  • 28文字目: テストファイルならT、そうでなければ空白。
  • 29文字目: 送信者が外国の事業者であれば1、そうでなければ空白。
  • 30 - 69文字目: 送信事業者名。左寄せにして、残りは空白にする。

なので、上の書き出しを要約すると、

“送信者(会社名 ASDF GLOBAL、TIN: 123456789、TCC: 55AA5)が2023年の電子申告のテストを行う”

ということになる。

これでこのASCIIコードのヤバさがちょっと伝わっただろうか。自分はこれを見たとき、SI時代に見かけたエクセル方眼紙を思い出して遠い目になった

では、もうちょっと説明を続けよう。このファイルは申請書類に応じて、最大15レコード記載が求められる。1レコード750文字(バイト)だ。

1099に必要なレコードの列

1099-NECで解説してみよう。

1099-NECでは以下のレコードが必要になる。

  • Tレコード - 送信者の情報
  • Aレコード - 発行者の情報
  • Bレコード - 受領者の情報
  • Cレコード - Bレコードのサマリー
  • Kレコード - 州によっては連邦申告と一緒に申告を行うことができる。それらについての申告。
  • Fレコード - 申告の末尾

Bレコードは受領者のため数が変動するが、少なくとも4600 bytes以上の文字列をちまちま入力していく必要がある。

みよ、これがメジャーの仕様書だ

もうこの時点で、何文字目に何を入れたらいいか、途方に暮れるでしょう。大丈夫、IRSは仕様書をばっちり用意してくれています。その名も Publication 1220。

ババーン

150ページの大著です。

150p

この仕様書には年度ごとの更新事項、FIREシステムへのアクセス方法、各書類の詳細と各文字番目に何が入るべきかがみっちり書かれている。

目がやばい

月は1月が2で始まるパターンと1で始まるパターンがあるから油断すると即死亡だ!

2から始まるコード

1から始まるコード

歴史的経緯でコードが抜け落ちているのかな?というところもある。

???

とまあ、若干突っ込みつつ例を書いたけど、実のところ、仕様書としてはお手本のような出来なんじゃないかと思う。細部わたって誤解のないように記載されており、初心者でもじっくり読めば理解できるし、さらにアメリカの税制についても学べるようになっている。よっぽど暇なときにでもぜひ一度目を通してみてほしいです。

レスポンス(多分速達のほうが早い)

ところでFIREで申告して、処理結果はどう確認するんだ? 誤っていたらどうなるんだ? と疑問に感じた人もいるかもしれない。その点も非常にユニーク(皮肉です)なので、説明しよう。

ASCIIファイルをアップロード後、ユーザーはウェブページでアップロード結果を確認することができる。

Not yet processed

Resultsに Not Yet Processed と書いてあるとおり、ファイルは処理がスタートしていない。

ではいつ処理され、結果がわかるかというと…3日後である。あれ、どっか他の星と通信してるのかな…?って正直思った。

なんらかのバッチ処理が走るんだろうけど、なんで3日おかないといけないのか、正直逐次処理でもいけそうなのになぜしないのか、謎は深まるばかりである。

その結果であるが、当然のことながら(?)メールで返ってくる。フォーマットや内容に問題があると、こんな具合。

赤くて間違っている感でている

…しかし何が問題あるのかはウェブサイトにいかないとみられない。

そして、これが実際の結果。

結果

おわかりだろうか。ご丁寧にバイト位置でエラー内容を指摘してくれるのである。これを参考に、ちまちまASCIIファイルの位置を確認しながら修正をかけていくことになる。単純に入力バイトがずれてると何十件とエラーがでるので、まさに地獄である

初心者には厳しすぎるテスト環境

ここまで読んで、まぁ正しく仕様を理解してデータをASCIIフォーマットにおこし、かつ内容にミスなく提出することは非常に困難だとみなさんも気づいたと思う。IRSも同感のようで、なんとテスト環境を用意してくれている。

https://fire.test.irs.gov/

この環境では本番と同じ条件でファイルを提出することができる。テスト環境ではバリデーションが行われているらしく、これで通れば、本番でも問題なく通る、ということらしい。

やった!と喜び勇むのはまだはやい。この環境、稼働期間が異常に短いのである。

実質1ヶ月しか稼働してない

1ヶ月も更新でシステムダウンするってどういうこと…?米国では11月末から年末はもうおやすみモードで仕事しないんだが、1ヶ月しか本番の申告期間ないんだから、もうちょっとがんばって仕事してほしい。

しかも前述したとおり、申告したデータの確認には3日かかる。なので、実質9回しかテストできない。システムに慣れた人ならいざしらず、初見の人には厳しすぎるでしょ…。

FIREへの申告自動化ツールを開発する

冒頭でも書いた通り、データのログを残さずにFIREに申告を行うという要件のために、データ生成から申告までを自動化するツールを開発した。

ざっくりダイアグラム

ざっくりとした仕組みとしては、

  • 1099-NEC対象者の申告に必要なデータを各所からかき集める
  • 仕様に基づき所得額や州ごとの支払金額の総計などの計算を行い、JSONを生成する
  • JSONから各レコードにASCIIバイトコードを打ち込む
  • PlayWright による自動化ボットでFIREにログインしてファイルをアップロード

という一連の処理を Step Functions によるバッチで動かすようにした。

Step functions のフロー

もちろん所得計算のビジネスロジックも煩雑だったが、FIREへの自動投稿も入力項目や画面遷移が多く、面倒だった。もう二度とやりたくない

おわりに

ここまでこの珍妙なシステムについておもしろおかしく書いてきたが、ようやく新しいシステムに置き換わるらしい。

E-file Forms 1099 with IRIS | Internal Revenue Service

こっちの申告サービスの内容は確認してないが、おそらくFIREよりはずっとモダンなんだろう。(そうだと願いたい)

となると、FIREを覚えている人はもうこの先いなくなるだろう。そう考えると、このコンピューター界の遺物を記録に残さねば、という謎の義務感がわき、今回筆をとった次第だ。

ちなみに、日本人でここまでこのシステムの仕様を読み込んでツールを実装した人もいないと思うので、なにか質問があれば、いつでも受け付けます!(いないと思うけど)

*1:大手と実績があれば別のツールが提供されるようなのだけど、IRSに問い合わせてもツールに関する返答は得られなかった。