会計freeeとネクストエンジンを連携した話

## はじめに

Qiita夏祭り企画参加の記事です。
freee API に関するTipsを投稿しよう！
こちらのテーマに参加します。

## 会計freeeってなに？

[クラウド会計ソフト freee](https://www.freee.co.jp)
企業や個人事業主のお金まわりをサポートするツール
企業の家計簿的存在

## ネクストエンジンってなに？

[ネクストエンジン](https://next-engine.net/)
ネットショップ運営の裏側をサポートするツール
楽天やAmazonなどのモール・カートへの連携が楽になる
受注や仕入、在庫などを管理できる

## 会計freee x ネクストエンジン

![スクリーンショット 2020-06-25 10.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/abb266f9-1e31-4574-574b-9bd9a8531503.png)

ネクストエンジンで管理している仕入情報、受注情報を会計freeeへ送り、売上管理などを会計freee上で行うことができます。
会計freeeにもネクストエンジンにもそれぞれAPIが存在するので、
ネクストエンジンからAPI経由で受注情報を取得 → それをfreeeAPI経由で会計freeeに送信
というのが基本的な流れです。

## freeeAPI Tips

[freeeAPIリファレンス](https://developer.freee.co.jp/docs/accounting/reference)
基本的な使い方・流れは公式ドキュメントを見るととても詳しく書いてあるのでよく分かります。

[freeeAPIチュートリアル](https://developer.freee.co.jp/tutorials)
このページを参考にアプリケーションの登録、アクセストークンの発行を実施します。

アクセストークンさえ取れてしまえばあとは普通にエンドポイント叩けば様々な処理が可能となります。

```bash
企業情報の取得
$ curl -i -X GET -H "Authorization:Bearer 発行されたアクセストークン" -H "Content-Type:application/json" 'https://api.freee.co.jp/api/1/companies'
取引一覧の取得
$ curl -i -X GET -H "Authorization:Bearer 発行されたアクセストークン" -H "Content-Type:application/json" 'https://api.freee.co.jp/api/1/deals?company_id=上で取得した企業ID'
account_item_id一覧
$ curl -i -X GET -H "Authorization:Bearer 発行されたアクセストークン" -H "Content-Type:application/json" 'https://api.freee.co.jp/api/1/account_items?company_id=上で取得した企業ID'
tax_code一覧
$ curl -i -X GET -H "Authorization:Bearer 発行されたアクセストークン" -H "Content-Type:application/json" 'https://api.freee.co.jp/api/1/taxes/codes'
取引情報のPOST
$ curl -i -X POST -H "Authorization:Bearer 発行されたアクセストークン" -H "Content-Type:application/json" 'https://api.freee.co.jp/api/1/deals' -d '{"company_id" : "上で取得した企業ID", "type" : "expense", "issue_date" : "2020-06-25", "details" : [{"amount" : "777", "account_item_id" : "169898529", "tax_code" : "2"}]}'
```

僕がこの開発をしていた頃はまだAPIの整備もあまり追いついておらず、自分でcurlして色々やってましたが、今はリファレンスのページで「Try it out」から実行できるようで、非常に便利になっているようでした。

ちなみに余談ですがこのドキュメントのページ更新頻度が相当高く、見る度に更新されてる気がしますｗ
勉強会も頻繁に開催されているようで、freeeさんのAPIへの力の入りようが感じられますね。

### アクセストークンの更新

freeeAPIのアクセストークンの有効期限は1日です。
1日経つと使えなくなってしまうのでリフレッシュトークンで更新します。
ちなみにリフレッシュトークンには有効期限はないらしいです。

```bash
アクセストークンの有効期限(1日)が切れた際の再発行
$ curl -i -X POST -H "Content-Type:application/x-www-form-urlencoded" -d "grant_type=refresh_token" -d "client_id=自分のclient_id" -d "client_secret=自分のclient_secret" -d "refresh_token=自分のリフレッシュトークン" 'https://api.freee.co.jp/oauth/token'
再発行されたアクセストークン/リフレッシュトークン
{"access_token":"新しいアクセストークン","token_type":"bearer","expires_in":86400,"refresh_token":"新しいリフレッシュトークン","scope":"read write"}
```

本連携では裏側に日次のバッチ処理があり、アクセストークンが切れないように毎日リフレッシュするように組んでいます。

### ここが気になるよfreeeAPI

#### [create_deal: 取引作成エンドポイント](https://developer.freee.co.jp/docs/accounting/reference#/Deals/create_deal)

detailsは40件分しか入れられない。
また、detailsの外側にissue_dateがあるので取引日同日のものを最大40件同時に作成可能という意味。
なので例えば1月1日、2日、3日の3つの取引を作るにはAPIを3回コールする必要がある。
（このあたりも1回のコールで作成できるようなエンドポイントにならないかなぁ）

これらを実現するために裏側で受注情報を以下の感じに整形している。
・取引日毎に集計
・同日の取引が40件以上ある場合は40件毎に分割

```php
     * 例:
     * 2020年1月30日:85件、2020年1月31日:6件の場合
     * array(
     *      '2020-01-30' => array(
     *                         array[40],
     *                         array[40],
     *                         array[5]
     *                      ),
     *      '2020-01-31' => array(
     *                         array[6]
     *                      )
     * )
     * 計4回のAPIコールが必要
```

取引をたくさん作成するには若干不便だなと感じています。

#### [get_account_items: 勘定科目一覧取得エンドポイント](https://developer.freee.co.jp/docs/accounting/reference#/Account%20items/get_account_items)
また、勘定科目に関して全件取得しか選択肢がない。
勘定科目の選択肢はたくさんあり、会計freee上では「使用する/未使用」が選択でき、画面上は「使用する」で選んだものしか選択肢にあがりません。
APIでも「使用する」の勘定科目だけを取得したい需要があったのですが残念ながらそれはできないようでした。
このエンドポイントにオプションつけられると使ってる勘定科目のみ取得になるのでより良くなるんだけどなぁ。

#### 取引の「登録した方法」がAPIから操作できない
freeeの画面上に「登録した方法」という項目があるが、APIからは変更できない項目のようでした。
「ネクストエンジンから登録されました」という設定にしたかったのですが…残念。

## ネクストエンジンAPI Tips

本記事はfreeeの話がメインなのでネクストエンジン側は割愛します。
以下が参考になります。

[ネクストエンジンAPIの使い方 基礎（開発環境構築編）](https://qiita.com/hamee-dev/items/114aa0e45bf8d01861bd)
[ネクストエンジンAPIの使い方（アプリ実装編）](https://qiita.com/hamee-dev/items/fd8b51eba26240b73bd4)

## おわりに

会計freeeもネクストエンジンも大変便利なツールなので是非使ってみてください！