PHP
JavaScript
Slack
slackbot
yellowfin

Slackで勤怠管理して可視化する

これがあればだいたいできます

webserver+php+postgreSQL、よく使うのはPHPの正規表現、あとjavascriptを少しです。あとはSlackでCustom Integrationが使えること。

PostgresにDB・Tableを用意

勤怠登録用と有給管理、カレンダーマスタくらいがあるとおk
運用にもよりますが、今の会社ではフレックスの予実管理と、遅刻早退管理、週休日、在宅などが管理されているので、なかなか大きいテーブルになってしまいました。

ちなみに勤怠登録用のテーブル定義です。
image.png

Slackに勤怠専用のChannelを作成する

勤怠に関する入力は全てここに書き込む
私の社内ではtimesheetというChannelに登録してもらうことにしています。
朝の感じ↓(たまたま朝早い日でした)
image.png

SlackのOutgoingWebhacksで入力された言葉をページに送る

Customize Slack→Configure Apps→Custom Integrationsでこのページまでたどり着きます。
image.png

特にトリガーは設定せず、全てを受け口のphpに送信する
image.png

phpで勤怠コマンドに合致するものかどうかを判断させる

大体コマンドとしては20個位・・・
image.png

コマンドに応じてDBへ登録

とりあえずPOSTされた言葉をキャッチして、

worktime.php
// 受信文字列取得mainmethod
if($_POST["user_name"] != "slackbot"){
    $rcvtext = $_POST["text"];
    $rcvtext = mb_convert_kana($rcvtext,'a');//「全角」英数字を「半角」に変換
    $rcvtext = str_replace(':',':',$rcvtext);//「全角」:を「半角」に変換
    $rcvtext = str_replace('/','/',$rcvtext);//「全角」/を「半角」に変換
    //どのコマンドか判別する
    $analyzetext = analyzeCommand($_POST["user_name"],$rcvtext);

的なところから判別メソッドに飛ばす。

ここから怒涛のpreg_match()祭りである。
連休指定用に2つの日付の判別、フレックス用に2つの時刻の判別、稼働日かどうかの判別など・・・。
様々なコマンド判定・日時の判定をクリアし、Insert、Updateをぶちかましていく。

結果をSlackのIncomingWebhacksで返す

Webhook URLを生成して、送信時のURLに指定する
image.png

こんな感じである。

worktime.php
        // [Webhook URL]欄に表示されているURL
        $webhook_url ='https://hooks.slack.com/services/XXXXXXX/XXXXXXXXX/XXXXXXXXXXXXX';
        // Slackに投稿するメッセージ
        $msg = array(
            'username' => $username,
            'text' => "<@".$_POST["user_name"].">  ".$analyzetext,
            'icon_url' => $icon_url);
        $msg = json_encode($msg);
        $msg = 'payload=' . urlencode($msg);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $webhook_url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $msg);
        curl_exec($ch);
        curl_close($ch);
}

送信できると、名前の後ろにAPPと書いてあるBotチックなやつ(ちゃんと指定してるけど)が返信したように見える。
image.png

コマンドに引っかからなかった場合は、どこかしらのAIBotさんに返信を代わりにお願いしています。

最終的にBIツールの勤怠ダッシュボードを作成して可視化

うわっ…私の勤務時間、足りなすぎ…?(入力してないだけと言う可能性も微レ存)

image.png

こちらを参考にさせて頂きました。

チャットで勤怠管理する「みやもとさん」をリリースしました
http://blog.masuidrive.jp/2014/10/19/miyamoto-san/