こんにちは!ウーオインターン生のはやしです!
プロダクト関係の投稿は前回からだいぶ日が経ってしまったのですが、その間様々なプロダクトに携わっていて、
今回は直近で開発を行った納品書自動登録Botについて紹介したいと思います!
前回の記事はこちら
AI技術を魚種の画像分類に応用してみた!
https://www.wantedly.com/companies/uuuo/post_articles/177281
プロローグ
ウーオでは、多くのバイヤーさんと魚の取引を行っており、
毎日のように納品書や請求書を作成しなければなりません。
ウーオに限らず、毎日取引を行う商品を扱っている多くの会社でもそうだと思います。
その際、バイヤーの方から取引情報が送られ、
それらの情報から見積もり・納品書・請求書を作成するツールに手入力し、pdfなどで作成します。
上図のように、たくさんの取引先に対して、様々な魚種、単価、規格など大量のタブに入力していく作業は意外と時間がかかります。
ウーオでは複数人のバイヤーチームからそれぞれの担当先ごとの取引データをSlackで送り、
広島のコーポレートチームがその情報から、自社ツールを使って納品書のpdfを作成します。
ここで僕はこう思いました。
「今後さらに取引が増えていった場合、データを入力する人と時間が増えてしまって、より本質的な課題にフォーカスできないのでは、、、」
「Slackに取引情報を書き込んで、さらに納品書作成のためにタブに入力して、同じ情報を複数回、別の人が入力することが原因で、抜け漏れや金額・数字・取引先名の打ち間違いなどのミスに繋がるのでは、、、」
閃きました。
「ほいじゃあ、わしが効率化するBot作るけえ、待っときんさい!!!(唐突の広島弁)」
はやしはBotを作ることを決意しました。
まずはSlackでBotを作成
Slackにはコミュニケーションツールとして以外にも他のツールと連携して使える
便利な機能がたくさんあります。
GitHubと連携して、コードレビューやPRなどを通知してくれたり、
Googleカレンダーと連携して予定時間になったらリマインドしてくれたり、効率化するための便利なAPIを提供してくれています。
その中の1つがBotがあって、今回はそれを活用していきます。
全体の流れはこんな感じ
hayashi_bot
まずRubyでSlackに常在するbotを作成します。
名前は「hayashi-bot」です。かわいい。
ここから新しいアプリとしてbotを作成し、tokenを発行します。
次にRubyでSlackの特定のチャンネルに常在させ、リアルタイムでキーワード(今回では「納品書お願いします」)が含まれる投稿をキャッチし、自社ツールにデータをPOSTします。そのために以下のGemを使用しました。
https://github.com/slack-ruby/slack-ruby-client
これをHerokuにデプロイしてRubyアプリとして起動させれば、リアルタイムで常在させることができます。
自社ツール側
Ruby on RailsにSlackからのPOSTを受け取るエンドポイントを作成し、
受け取ったtextの内容を正規表現を駆使して情報を抽出していきます。
僕は正規表現をきちんと活用したことがなかったので、ここが一番苦労しました、、、
/\b\d{1,3}(,\d{3})*\b/
上記のようなメタ文字と呼ばれる特殊文字を駆使しました。
例えば「ケース」という文字列の前にある数桁の数字を抽出したり、
「kg」や「キロ」という文字列の前にある整数、あるいは小数点以下の数字を抽出したりして、
自社アプリの納品書データベースに登録します。
登録された納品書idから登録先のURLを取得し、今度は自社アプリ側からSlackに対してそのURLを投稿させます。
Bot作成を通した気付き
Botに納品書作成を任せられると、今まで手入力していた時間が削減されて効率が爆上げされます。
が、Botは人間みたく柔軟な対応をしてくれないので、納品書作成Botに依頼する際に最低限の制約などを設ける必要がありました。
例えば
・入力フォーマットを統一すること。
これは1行目に「納品書お願いします」と記入したり、
魚種毎に改行を行うことであったり、きちんと単位をつけること。
人間だと
「納品書お願いします
〇〇さん
赤ガレイ3番 4ケース 3,000」
と書かれていたら「3,000の部分はおそらく単価のことだろうな」と察することができるのですが、
Botは「円」という単位を基に単価を抽出するため、融通が効かないという側面もあります。
もちろんこういったケースにコードに落とし込んで、対応することも可能なのですが、あらゆる例外的なケースに対応していたらキリがありません。
なので、現場の人たちが今までやっていたやり方から工数が増えないようにした上で、
入力の方法を少し変えるだけでBotが活用できるようになるための制約の線引きをきちんと行う必要がありました。
いくら自動で登録できて便利とはいえ、結局使い手に多くの工数をかけてさせてしまっては使いたくないと思われてしまうので、使い手のオペレートと現状をしっかりと把握し、意見をもらうことが大切だなぁと思いました!
まとめ
SlackのBotを活用することで、Slackに納品データを投稿すると、
わずか数秒でデータが登録され、pdfを発行することができました!
最近「退屈なことはPythonにやらせよう」という本を読んだのですが、
僕たちの身の回りには単調な作業や、繰り返し行っていることがたくさんあると思います。
今まで当たり前だったから、ではなくて常にそういった課題に気付き、考え、技術によって解決できることがエンジニアとしての楽しみだったり喜びなのかなぁと感じています。
皆さんも身の回りの作業にフォーカスして、単調な業務を効率化してみてはいかがでしょうか!
以上です。