【DX施策】freee APIで請求書を自動で作成
こんにちは、はじめまして。ゴリラです。
私はプログラマー歴10年超の経験を持ち、これまで社外CTOとして多数のDXプロジェクトに携わってきました。
Twitterアカウントはこちら👇
https://twitter.com/dxsoudan
先程ちょうどfreeeで請求書を自動で作成するタスクを終えました。
せっかくなので、今日はそのコードを共有したいと思います。
意外とQiitaの記事にもなかったので、誰かの役に立てば嬉しいです。
ユースケースとしては、データベースに受注データ(orders)が追加されたタイミングで、freeeに請求書を自動登録することを想定しています。
言語はRuby (on Rails)です。
class FreeeManager
COMPANY_ID = 12345678
CALLBACK_URL = "YOUR_CALLBACK_URL"
TOKEN_URL = "https://accounts.secure.freee.co.jp/public_api/token"
attr_reader :access_token, :refresh_token
def initialize
@client_id = "YOUR_CLIENT_ID"
@client_secret = "YOUR_CLIENT_SECRET"
@code = "YOUR_AUTHORIZATION_CODE"
@access_token = nil
@refresh_token = nil
end
def create_invoice(order)
template_id = 1234567
invoice_params = {
"company_id": COMPANY_ID,
"template_id": template_id,
"invoice_number": "#{order.project.id} #{order.project.slug}",
"billing_date": Date.today.strftime("%Y-%m-%d"),
"payment_date": Date.today.next_month.end_of_month.strftime("%Y-%m-%d"),
"payment_type": "transfer",
"subject": order.project.title,
"tax_entry_method": "out",
"tax_fraction": "omit",
"line_amount_fraction": "round_up",
"withholding_tax_entry_method": "out",
"include_amount_brought_forward": false,
"memo": order.supplier.name,
"partner_id": 12345678,
"partner_title": "御中",
"partner_display_name": order.buyer.name,
"partner_bank_account": "普通",
"company_name": "Your Company Name",
"company_description": "Your Company Address\nTEL: Your Company Phone",
"bank_account_to_transfer": "Your Bank Account Details",
"lines": order.send_quote.quote_items.map { |item|
{
"type" => "item",
"description" => item.name,
"quantity" => item.count,
"unit_price" => item.unit_price.to_s,
"tax_rate" => 10,
"reduced_tax_rate" => false,
"withholding" => false,
}
} + [{
"type" => "item",
"description" => "送料",
"quantity" => 1.0,
"unit_price" => order.send_quote.shipping_charge.to_s,
"tax_rate" => 10,
"reduced_tax_rate" => false,
"withholding" => false,
}],
}
response = post_invoice(invoice_params)
response
end
def get_access_token
params = {
grant_type: "authorization_code",
redirect_uri: CALLBACK_URL,
client_id: @client_id,
client_secret: @client_secret,
code: @code,
}
response = make_request(params)
update_tokens(response)
end
def refresh_access_token
params = {
grant_type: "refresh_token",
redirect_uri: CALLBACK_URL,
client_id: @client_id,
client_secret: @client_secret,
refresh_token: @refresh_token,
}
response = make_request(params)
update_tokens(response)
end
private
def make_request(params)
uri = URI.parse(TOKEN_URL)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.path)
request.set_form_data(params)
request["Content-Type"] = "application/x-www-form-urlencoded"
response = http.request(request)
JSON.parse(response.body)
end
def update_tokens(response)
@access_token = response["access_token"]
@refresh_token = response["refresh_token"]
end
def post_invoice(data)
uri = URI.parse("https://api.freee.co.jp/iv/invoices")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.path)
request["Authorization"] = "Bearer #{@access_token}"
request["Content-Type"] = "application/json"
request.body = data.to_json
response = http.request(request)
JSON.parse(response.body)
end
end
このコードを使う前に、freeeアプリストアで諸々登録を済ませ、認証コードの発行などを済ませましょう。
また、access_token, refresh_tokenを適宜扱うコードは書いていませんので、そちらも別途実装しましょう。
詳しくはfreeeのAPIリファレンスを見てくださいね。
さいごに
最後までお読みいただきありがとうございました。
freee APIを使えば、このような請求書発行や見積書発行などのペーパーワークをどんどん自動化することができます。
次回もまた、具体的なDXなどについて共有していきます。
お読みいただいている方の中には、APIについてよくわからない方も多いのではないかと思います。
そんな方のために、次回は「世界一わかりやすいWeb APIの解説」というテーマで書きたいと思います。
お楽しみに。
さて、さいごに宣伝させてください。
読者の中には、
「ゴリラの言っていることが全然わからんのだが・・・?」
「そんなDX人材身近にいないんだけど・・・?」
という方もいるかもしれません。
そんな方に、ゴリラが無料で相談に乗りたいと思います。
これからDXをはじめようとしている方、
DXをはじめたけど行き詰まっている方、
DXがそもそも何か分からない方、
どんな方でも歓迎です。
Xで気軽にDMいただければと思います。
この記事が何かあなたのお役に立てると嬉しいです。
それでは。