国税庁の適格請求書発行事業者公表システムWeb-API(以下インボイスシステム)をMicrosoftが提供するRPAツールPower Automate Desktopで使ってみました。インボイスシステムは制度対応に必要となる、適格請求書発行事業者の公表情報の取得が可能なシステムです。
インボイスシステムには主に以下3つの機能が利用可能です。
- 登録番号を指定して情報を取得する機能
- 取得期間を指定して情報を取得する機能
- 登録番号と日付を指定して情報を取得する機能
今回は「取得期間を指定して情報を取得する機能」を試してみました。
例えば以下のような簡単なURL指定をGETメソッドで実行するとcsv形式でデータ取得が可能です。
https://web-api.invoice-kohyo.nta.go.jp/1/diff?id=アプリケーションID&from=2023-04-20&to=2023-04-25&type=01
データ形式はcsvだけではなくxml、jsonでの取得も可能です。
詳しい仕様は国税庁サイトから入手可能なPDFファイル「適格請求書発行事業者公表システムWeb-API機能のリクエストの設定方法及び提供データの内容について」の参照をお願いいたします。
法人番号Web-APIとの違い
以前のブログで紹介した国税庁の似たようなシステムである「法人番号システム」と比較して、個人的に「今回のインボイスシステムとここは違うなー」と感じた事を下記に列挙いたしました。
- json形式でデータ取得が可能になった
- 文字コードがsjisからutf-8になった
- 2000行単位だった分割数が500行単位になった
- 1カラム目の「一連番号」が、個々に取得した分割ファイル単位で1から500を繰り返す
- 7カラム目に「最新履歴」が追加され「1」は最新「0」は過去情報として識別可能になった
設定概要
今回使用した「取得期間を指定して情報を取得する機能」は、データが500行以上存在する場合、500行単位に数回に分けてダウンロードする必要があります。ですので設定は以下のようにしました。
- 変数宣言と環境設定
- 分割数の入手
- ファイルダウンロード
- 分割されたファイルを1つに合体
1.変数宣言と環境設定
①「applId」は国税庁から申請受理されたアプリケーションIDを指定。
②「interval」は本日を起点に何日前からのデータが欲いのかマイナス記号付きで数字指定、図の例では-3なので3日前を指定している。
③「folderNmae」はダウンロードしたcsvを保存するフォルダー名をドライブ名付で指定
④ダウンロードしたcsvファイルを蓄積しない仕様なので、csv保存フォルダーfolderNmae内の過去のゴミcsvファイルを削除しています。
⑤期間指定するfromとtoを生成するため一旦「現在の日時」を取得し「CurrentDateTime」に格納しています。
⑥fromを算出するため⑤で取得した「現在の日時」が入っている変数「CurrentDateTime」とintervalを加算(intervalはマイナスの数字なので結局は引算)し、from値の元ネタ変数「ResultedDate」に格納しています。fromとtoはYYYY-MM-DD形式なので、⑦日付型変数「CurrentDateTime」をテキストに変換する際にYYYY-MM-DD指定し変数「toDate」に格納しています。
⑧同様にfrom値の元ネタ変数「ResultedDate」をテキストに変換する際にYYYY-MM-DD指定し変数「fromDate」に格納しています。
2.分割数の入手
分割数はダウンロードしたファイルの1行目の4列目から入手可能です。下記例の場合、全行数は807行で分割数は2です。
⑨のURL指定では変数指定を多用しています。アプリケーションIDの変数名はapplId、期間指定のfromの変数名はfromDate、toの変数名はtoDateなのでURLは下図のように指定し「宛先ファイルのパス」にファイル名getHeader.csvと指定しダウンロードしています。
⑩getHeader.csvの1行目の4桁目に入っている分割数を取得します。文字コードがUTF-8なので「csvファイルから読み取る」場合エンコードをUTF-8を指定しデータテーブルCSVtableに格納します。
⑪データテーブルCSVtableの行桁指定は0から開始するので、csvファイルの分割数が入っている1行目4桁目の指定は「%CSVTable[0][3]%」となります。取得した値が明示的に数字として扱えるように「テキストを数値に変換」アクションを使って分割数を変数dividNumに数値型に変換して格納しています。
⑫では取得した分割数を画面表示し確認しているだけなので、本番運用では「アクションを無効にする」で実行しないようにします。
⑬では分割数を取得し用済みになったgetHeader.csvを削除しています。
3.ファイルダウンロード
ファイルダウンロードでは分割数の数ループ処理でファイルをダウンロードしています。
⑭ループでは上記⑪で取得した分割数を格納した変数「dividNum」を「終了」に指定しています。
⑮は分割数の何番目を処理しているのか確認表示しているだけなので、本番運用では「アクションを無効にする」で実行しないようにします。
下図⑯のURL指定では⑨同様に変数指定を多用しています。「宛先ファイルのパス」では分割数に応じたファイル名を指定するため「取得期間指定2023-05-02_1.csv」のように「取得期間指定」は固定値で「2023-05-02」はデータ取得した当日の変数toDate、最後の「_1」はファイル分割数連番を指定するため生成された変数のLoopIndexを用い「%folderName%\取得期間指定%toDate%_%LoopIndex%.csv」としています。
4.分割されたファイルを1つに合体
分割してダウンロードした個々のファイルを1つのファイルに合体させています。
⑰ループでは上記⑪で取得した分割数を格納した変数「dividNum」を「終了」に指定しています。
下図⑱では合体準備のため、個々のcsvファイルをデータテーブルCSVTableに読み込んでいます。その際エンコードはUTF-8を指定します。
個々のファイルには下図のように1行目に余計なデータが入っていますので・・・・
⑲では「データテーブルから行を削除する」アクションで行インデックスに0を指定して1行目を削除しています。
⑳では「csvファイルに書き込む」アクションを用い、上記⑲で余計な1行目を削除したデータテーブルCSVTableを、指定したファイルパスに対して「ファイルが存在する場合」を「内容を追加する」に指定する事で次々に合体させています。
終わりに
今回はRPAツールで実装しました。次回はIBMiをRESTサーバー/クライアント化するi-Cross APIを活用しインボイスシステムを使ってみます。
関連リンク
お問合せ
https://alpcom.co.jp/contact/
アルファー・コミュニケーションズ公式YouTube
https://www.youtube.com/channel/UCTqwZsRRpAs9NPTUz2yH3ow/videos