見出し画像

【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いただければと思います。
この記事が何かあなたのお役に立てると嬉しいです。
それでは。

いいなと思ったら応援しよう!