リバネスの勤怠管理はTeamspiritを使って行われています。スタッフの勤務状況を記録する為に必要な要素は揃っています。
一方で、勤怠打刻は当然手動で行う必要があります。手段としては
- 出社時、オフィスエントランスにある非接触ICカードリーダーにSuica等をかざして打刻
- Salesforceのモバイルアプリから打刻:参照
といった、2パターンを用意していますが、ここにもう一つ打刻手段を追加してみました。
slackはリバネススタッフが恐らく一番使っているコミュニケーションハブとなっています。だったら、その中でできちゃったほうが楽だよねというのが発想の原点です。
勤怠打刻のためのslack appを作る
では、その実現方法はどうすればよいだろうと考えたとき、過去にbotkitを使ってちょっとしたbotを作ったことがあったので、それで良いかなとも思ったのですが、botkitで設置するbotで実現しようとすると、チャンネル上にbotがinviteされている必要があり、面倒でした。slackのどこのチャンネルからでも勤怠打刻がしたい!という熱意に応えるには、slackのスラッシュコマンドを使うしかありません。
これを設置することで、 /ts と打ち込めば勤怠打刻ができる。そんな状態を作ります。
では、そのスラッシュコマンドを使うには何が必要かというとslack appです。botkitを使ってbotを設置するにはbotを生成すればよかったのですが、アプリはもう少しできることが拡張されています。
- スラッシュコマンド
- インタラクティブコンポーネント
- webhook
みたいなものが使えるようになります。
開発環境
参考にしたのはこちらです
Slack のコマンドを使って TeamSpirit に打刻する
元はGoで書かれているのですが、著者はGoが分かりません。そのために
- node.js
- botkit:slack純正chatbotフレームワーク
- express:slackからのコマンドのやり取りをするためにWebサーバが必要になる
- mongodb:各種データの保存先
- heroku:上述のサービスを可動させるための基盤
という環境に移植しました。
細かい設定等はGithubへ
geeorgey/ts-dakoku-node-express
デプロイボタンから、herokuにデプロイすればすぐに使えると思います。
一つApexクラスを設置しているので、そちらのSalesforce本番環境へのデプロイも必要ですが、クラス・テストクラスも揃っているのでコピペで使えます。
ハマったところ
このアプリの肝は、slackのOAuth情報とSalesforceのOAuth情報をmongodbに保持して使うという部分です。それぞれバラバラな情報は見かけるのですが、両者ともに実現するのに苦戦しました。
Salesforceに関しては恐らくセキュリティの都合上、セッションの持続時間が短めに設定されているはずです。slackから利用する場合にいちいちセッション貼り直すのは面倒なので、mongodbに入れたデータを元にして、再度アクセストークンを生成しています。参照情報
また、node.jsは非同期処理が成されます。しかし著者はそのような言語を使ったことがありませんでした。mongodbに問い合わせた結果を使って次の処理を行うには、Promiseというやり方が必要になるのです。理解するのに時間を要しました…
なぜこれが必要だったのか
実はこんなことを書いているのですが
共有・意識喚起のslackと、実行催促のsalesforce chatterという使い分け 弊社リバネスでは、長らくSalesforce chatterを放置し続けてきたという事情もあり、chatterからのアクションが行動に繋がりませんでした。現状で実効性が一番高いのはslackからのアクションであろうということから開発されています。
今後の展開
基本的なやり方については把握が出来ました。スラッシュコマンドを使った処理も追加しやすいように設計されています。(server.jsにエンドポイントを追加し、modules/ にエンドポイントの処理を書き、modules/response.js にインタラクティブコンポーネントから入ってくる処理を書けば良い)
リバネスでは、データの蓄積はSalesforce上に成されています。適切なタイミングでトリガーを設置し、slackに通知するということはこれまでも出来たのですが、通知のあとの処理は結局Salesforceの画面を開いて行う必要があったのです。slackアプリ上から処理が実現できれば、Salesforce→slackへ通知→通知を受けた画面でインタラクティブコンポーネント(つまり、ボタンですね)を表示してボタンを押せば処理完了という流れが出来ます。
例えば、月末の請求処理を一例にすると
- リバネスでは、毎月25日及び末日のお昼12時にSalesforceアプリのジョブが走るようになっていて、slackに未請求商談及び担当者へのメンション付きメッセージが投下されます
- そのメッセージを見た担当者が、付帯情報を見た上で請求書の発行というインタラクティブコンポーネントボタンを押せば請求処理が完了する
- ここは実装中なので将来的な話になりますが、ボタンからのアクションがSalesforce側のApexへ@HTTPGetで渡り、請求処理を受け取ったSalesforce側で書類の発送・メール送信等が実行される
といったイメージです。
必要なアクションをSalesforce上のデータを起点として発行し、slackで該当者へ通知。該当者は通知を受けた画面でそのまま処理を実行できる。便利じゃないですか?