30
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

勤怠打刻をmacアドレス検知方式に変えた話

Last updated at Posted at 2019-03-15

##概要
今働いている会社では勤怠管理システムに自社開発製のrailsアプリケーションを使っています。
出入り口にfelicaにて打刻可能なPC端末を置いているので社員はそれにカードを出退勤の時間にピッとやります。
そこで取得した出退勤データを定期的に勤怠管理システムへ投げてるわけですが、打刻可能なPC端末が壊れました( ´ ▽ ` )

一応ブラウザからなら勤怠管理システムから打刻できますが、さすがにめんどくさいし、不満がめちゃ出たので何かしら対策が必要ということで、別の方法を提案。

###ローカルネットワークのMacアドレス検知する。

社内にある何かしらの端末で下記で作成したシェルをバッチで実行し、同一ローカルネットワークのmacアドレスと最初の接続時刻と最終接続時刻をCSVに書き込んでいきます。

  • attendance_list$DATE.csv ・・・ 出力結果を保存するCSV
  • member_list.csv ・・・ メンバーID,name,マックアドレスが入ったCSV
member_list.csv
id,name,mac_address
0,Aさん,00:cc:47:aa:7f:ff
1,Bさん,2c:bb:a1:cc:41:aa
2,Cさん,38:bb:2c:cc:3c:aa
3,Dさん,00:bb:fe:cc:20:aa
4,Eさん,08:e6:89:cc:de:aa

ここではmember_listに記載してあるMacアドレスだけを読み取ってますが、member_list作らずとりあえず全て読み取って、サーバ側で名寄せした方がいいと思います。
日の区切りに関しては会社ごとに違うと思いますので、考慮してCSVファイルを分けて作ると良いと思います。

#!/bin/sh
echo "START check_mac_address connecting wi-fi"
cd /app/dir
TIME=`date "+%H%M"`
DATE=`date "+%Y%m%d"`
EXPORT_CSV="./attendance_list$DATE.csv"
MEMBER_LIST_CSV='./member_list.csv'
ADDRESS_SCANS=`echo 'PASSWORD' | sudo -S /usr/local/bin/arp-scan -l --interface en0`
if [ -f ./$EXPORT_CSV ] ;then
    echo 'There is a test file.'
else
    touch $EXPORT_CSV
fi
RECORD_SCANS=`cat $EXPORT_CSV`
while read row; do
    USER_ID=`echo ${row} | cut -d , -f 1`
    USER_NAME=`echo ${row} | cut -d , -f 2`
    MAC_ADDRESS=`echo ${row} | cut -d , -f 3`
    if echo $ADDRESS_SCANS | grep $MAC_ADDRESS >/dev/null ; then
        if ! echo $RECORD_SCANS | grep $MAC_ADDRESS >/dev/null ; then ##初めて認識した時刻
            echo "出勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME" >> $EXPORT_CSV
            echo "退勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME" >> $EXPORT_CSV
        elif echo $RECORD_SCANS | grep "退勤:$MAC_ADDRESS" >/dev/null ; then ##二回目以降の時刻:随時上書きしていく
            sed -i -e "s/.*退勤:$MAC_ADDRESS.*/退勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME/" $EXPORT_CSV
        fi
    fi
done < $MEMBER_LIST_CSV
echo "END check_mac_address connecting wi-fi"

###Macアドレスと社員を紐づける。
・勤怠サーバのメンバーテーブルにmacアドレスのカラムを追加して、管理者のみその項目を編集可能にする。
・上記のattendance_list.csvを勤怠サーバが取得して、社員とmacアドレスの紐付けを行い、勤怠時間を取得します。

###打刻された時刻を通知する。
・勤怠システムにアクセスすれば誰でも閲覧できるが、打刻時刻を通知して欲しいという要望があるならばchat系のAPIを使って通知したり、メールを送信してもよいでしょう。今回は要望なかったのでやりませんでした。

###直行や直帰や休憩の取り扱い
直行直帰の手動申請機能が勤怠サーバある場合、多くは問題ないでしょう。
手動申請によって上書きできない仕様なのであれば注意が必要ですね。
休憩に関しては最終時刻を取得してるので関係なし。

##まとめ
これのメリットは
打刻の手間がなくなり、いつまでも無駄話して会社にいるような居残りが減ること。
結構簡単でしたので、皆さんも上長へ提案してみてくださいね。

30
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?