従来、スマートショッピングでは特段カードリーダーでの出勤管理等はなく、ブラウザから勤怠管理画面を開き、手動で勤怠打刻する必要がありました。
そのため勤怠打刻忘れをする社員が多く、結果としてチームの勤怠管理をする立場であるマネージャーや管理部門のコストに大きく影響していました。
(特にエンジニアはそういうのが苦手な人多い気がするんですが、スマートショッピングにおいてもその例に漏れずといった感じでした。。)
そこで、従業員の端末の社内ネットワークへの接続を検知、履歴に記録していき、その履歴をもとに出勤または退勤勤怠打刻をするツールを開発しました。
以下3つのユースケースに切り分けてバッチを実装しています。
ここの処理がこのツールの肝の部分です。
「Wi-Fi 勤怠打刻」のような検索キーワードで引っかかる他社さんの事例を参考にさせてもらいました。
具体的には、何らかの方法で社内ネットワークに接続されているMACアドレスを取得 & 各人に申請してもらったMACアドレスと突き合わせるという処理を作りました。
当初は同じネットワークに接続されているIPアドレスとMACアドレスを取得できる、arp-scanをプログラムの中で実行しようかと思っていたのですが、Googleが提供しているgopacketというオープンソースで同じことができたので、そちらを利用しています。
ネットワークには詳しくないので恐縮ですが、
exampleにあるソースコードだけでネットワークに接続されてるIP & MACアドレスが取得できちゃいます。
ハマりポイントとしては、MacOSでこのプログラムを実行した際に、以下のような権限エラーに引っかかるところです。
en0: You don't have permission to capture on that device
((cannot open BPF device) /dev/bpf0: Permission denied)
/dev/bp*
の所有権を変えてあげることで解決しました。
user=whoami
cd /dev
sudo chown $user:admin bp*
ここで取得したMACアドレスを、従業員テーブルに紐づけておいたIPアドレスと照合して、一致すれば接続履歴テーブルに記録していきます。
この処理が朝の出勤&夕方の退勤が多い時間帯には1分ごと、それ以外では10分ごとの頻度で動くようになってます。
注意点としては、実行端末が接続状態を取得したい端末と同じネットワークに接続している必要がある、つまりオンプレサーバーで実行する必要があるため、クラウド化が難しい点です。
接続履歴テーブルをもとに、その日初めて接続があった時間に出勤打刻をする処理をします。
具体的には、スマートショッピングでは KING OF TIME という勤怠管理ツールを利用しているので、そちらで提供されているAPIを実行する形です。
朝の時間帯に短めの間隔で動いています。
ここが面倒なのですが、ランチ等で外出した時間帯に退勤となってしまってはいけないので、翌日の朝、前日の最終接続時刻を持って退勤打刻をする処理をしています。
こちらも出勤打刻と同じく、KING OF TIMEで提供されているAPIを実行して退勤処理する形です。
退勤打刻にはあまりリアルタイム性が求められていないかつ、これが間違いの少ない方法かと思います。
結構な精度で接続されている端末を拾うことができており、勤怠打刻の自動化に成功しました。
使うリソースとしても、オンプレサーバー、データベース(そんなに大層なものでなくてもいい)くらいで済むのでおすすめです。
このツールはどうしても接続状態を取得したい端末と同じネットワークに接続しているオンプレサーバーが必要になります。
スマートショッピングでは現在オフィスが3フロアに分かれており、全フロアにこのツールを展開するためにはそれぞれで接続履歴を記録するための母艦が必要になってきます。
その母艦としてRaspberry Piを活用するためのプロジェクトも進めていたのですが、こちらは新型コロナウイルスの影響により直近でのニーズがなくなったためPendingしてしまっています(オフィスにラズパイ置いたまま)。
こちらについても当記事で紹介できたらと目論んでいたのですが、それはまたの機会で達成できたらといったところです。
一刻も早く平穏な日々が訪れることを祈ります。