はじめに
こんにちは、ギフティの阿部(@memetics10)です。
普段の仕事では web エンジニアとして giftee for business の価値を最大化すべく、新規プロダクトや社内システムの開発に携わっています。
giftee for business とは、弊社が提供している B to B サービスです。
ギフティといえば C to C サービス のイメージが強いかもしれません(自分も入社前は B to B をやってるとは知りませんでした)が、実際には B to B でも多くの e ギフトが流通しています。
さて、今回はそんな B to B 案件を管理している社内システムで、請求書の作成を自動化したお話をご紹介します。
giftee for business の案件管理システム
giftee for business では、ギフティの発行する e ギフトを利用して、販売促進キャンペーンやアンケート謝礼などを行うことができます。
社内では、giftee for business の利用を申し込まれたお客様の案件を管理するシステムを運用しているのですが、事業の立ち上げ期で案件数が多くない間の対応として、 Excel を用いた手動請求していました。 しかし、事業が成長し、案件数も増加していった結果、請求書作成を自動化する需要が高まっていきました。
ここからは、これまでどのような請求書作成手順を踏んでいたのか、そして、どのように自動化を行なったのかをご紹介します。
これまでの Excel を利用した請求書作成手順
毎月月初になると以下のような流れで請求書作成業務が進んでいきます。
- 請求対象となる案件を、Re:dash を利用して案件管理システムから取得します。
- Re:dash で取得した情報をコピーし、Excel のシートに貼り付けて案件の担当者に渡します。
- 案件担当者は、案件管理システムに表示された商品や価格をコピーし、請求書作成用の Excel テンプレートにペーストします。
- 出来上がった Excel の請求書を、経理担当者に連携します。
- 最後に、経理担当者が印刷をして、捺印をしてから再度スキャンし、pdf に変換して先方に送付します。
この話を聞いただけで、ちょっとつらい気持ちになってきますね…
請求書自動作成
前述した従来の請求書作成を自動化するにあたり、求められる要件は主に以下の 2 つでした。
- 商品代などの請求項目が記載された請求書帳票 pdf を生成できること
- 毎月月初に稼働中の全案件に対して請求書帳票が自動で吐き出されること
ここからは、この 2 つをどう実現したかについてお話しします。
商品代などの請求項目が記載された請求書帳票の pdf を生成できること
請求書帳票を自動で作るにあたり、まず検討したのは利用するライブラリです。
案件管理システムが Rails で作られていたため、pdf を書き出すことができる gem を探しました。
検討の結果、候補として上がったのは以下の 3 つでした。
- wicked pdf (https://github.com/mileszs/wicked_pdf)
- PDFKit (https://github.com/pdfkit/pdfkit)
- Prawn (https://github.com/prawnpdf/prawn)
それぞれの gem の特徴をまとめると、このようになります。
gem | pure ruby | 特徴 | カスタマイズ性 | 開発コスト |
---|---|---|---|---|
wicked_pdf | No | HTML を pdf 変換する | 低 | 低 |
PDFKit | No | HTML を pdf 変換する | 低 | 低 |
Prawn | Yes | Ruby のコードで pdf を作成する | 高 | 高 |
今回は、prawn を利用することに決めました。
採用理由は、「複雑なレイアウトの請求書帳票を作成でき、長期的にメンテナンス可能」という要件がある中で、
- Pure Ruby であること
- 工数はかかるが Ruby のコードとして綺麗に書けそうだったこと
- カスタマイズ性が高く、細かい調整が可能なこと
の Prawn の特徴が最もマッチしていたからです。
ちなみに、wicked_pdf と PDFKit は 内部的に wkhtmltopdf-binary (https://github.com/pallymore/wkhtmltopdf-binary) を利用しているそうです。
さて、prawn 自体の使い方は簡単です。
まず gem を install し、
gem 'prawn' gem 'prawn-table'
以下のようにするだけで hello, world の記載がある pdf を書き出すことができます
pdf = Prawn::Document.new pdf.text “hello, world” pdf.render
やや悩ましいのが、複雑なレイアウトを実現するための設計です。
prawn は全て Ruby のコードで pdf を作ることができるため、柔軟性が高いのですが、その分正しいクラス設計を要求されます。
試行錯誤を重ねた結果、pdf のレイアウトをセクションごとに分割し、それぞれのセクションをクラスとして切り出していくことである程度綺麗に書くことができました。
以下が、完成した請求書 pdf のイメージ図です。(サンプルのため実際のものとは異なる箇所があります)
請求項目の名前や金額はデータベースから取得し、消費税や合計金額はサーバー側で計算を行なっています。
prawn を利用して請求書帳票を自動作成できるようになったことで、従来の Excel 運用や印刷、社判の捺印の業務を行う必要がなくなりました 🎉
毎月月初に稼働中の全案件に対して請求書が自動で吐き出されること
請求書帳票を自動できるようになったとて、毎月請求書帳票の自動作成作業を行っていては、あまり業務効率化にはつながりません。 そこで、毎月月初に全ての案件に対して請求書を自動で作成する必要がありました。
利用した技術は以下の 2 つです。
- ActiveJob (queue adapter Sidekiq)
- Kubernetes CronJob
全案件に対する請求書作成は処理時間が長くなりがちなため、ActiveJob を利用してジョブをキューイングし、非同期処理を行うようにしています。 ジョブを定期実行する Cron としては、Kubernetes CronJob を利用し、毎月月初にジョブを自動実行させています。
こうして、弊社のビジネスサイドは毎月月初に発生する請求書作成作業に追われることもなくなり、業務が格段に効率化されました 🎉
課題とこれから
請求書が自動で作られるようになり、全てがうまくいったように思えますが、これで完成!というわけではありません。
今後は社内でこの機能を使ってもらいつつ、フィードバックを元に改善していくことが重要です。
2020 年 8 月現在、すでに見えている課題は以下の 2 つです。
- 月初以外にも請求書を自動作成できるようにしたい
- 1ヶ月単位ではなく、月を跨いだ請求書も作れるようにしたい
ギフティには、「ギークスーツ」という文化があります。 これは、エンジニアはビジネスサイドの業務を理解し、ビジネスサイドはエンジニアの業務を理解する、という文化です。
よい社内システムを作るためには、ビジネスサイドとエンジニアがよく対話をすることが大切だと気づかされる場面が多々あります。
こういった機能改善や機能追加も、ビジネスサイドとのコミュニケーションの中で生まれ、ヒアリングを重ねた末に実装に落とし込まれていきます。
これからも「ギークスーツ」を大切にしながら、ビジネスサイドとエンジニアのコミュニケーションの中で最適なシステムを探っていきたいですね!
おわりに
さて、今回はギフティの社内案件管理システムで請求書を自動作成できるようにしたお話をご紹介しました。 社内システムというと地味なイメージもありますが、運用の効率化ができれば結果的に利益に繋がるため、非常に重要な役割を持っています。
また、社内システムの開発には、「ユーザーが近くにいる」という面白さがあります。 リリースした新機能のフィードバックをすぐに貰えるだけでなく、「ありがとう!」「便利になった!」という声を直接聞くことができます。
今回ご紹介した機能では、実際にこんな声を貰うことができました。
・案件画面に表示された商品や価格をコピーして Excel に貼り付ける作業がなくなったので、ミスが減った!
・そもそも Excel の計算式が間違っていることがあったりしたので、それがなくなるのは嬉しい…
・請求書を印刷して、捺印して、スキャンして…といった手間がなくなったので楽になった!
こういった声を直接いただけるのも、開発の楽しみの一つだなと実感します。
今回の記事で少しでもギフティに関心を持っていただけたら幸いです。最後まで読んでいただき、ありがとうございました!