👏
Pleasanter で残業管理
これは2023 個人アドベントカレンダーの 3 日目の記事です。
tl;dr
- 出退勤と入退室ログを突合するサンプル
- 実際に相談を受けたケースをもとに、あれこれ pleasanter ならお手軽にできるんじゃね?と思ったのでやってみた
- レコードレベルの閲覧権限制御がビルトインで存在することが Pleasanter の大きなメリット
想定する状況
- 出退勤の打刻とある SaaS で管理しています
- このシステムは CSV でデータを出せます
- オフィスへの入退室をロックと個人を特定できる NFC キーとを組み合わせた IoT で管理しています
- 入室退室のログが CSV で出せます
- というときに、コンプライアンスの要請でサービス残業的な居残りがないか検査したい
- 異常値となった場合は、顧客訪問や半休など正当な理由がある場合もあるので従業員に理由を書いてほしい
- 従業員は自分の勤務記録のみが見え、バックオフィスは横断的に勤務記録をみたい
といった状況。システムを自作することもできるが Pleasanter ってあっさり実現できそうと思ったのでやってみた。
実装
サイトパッケージはgistに公開しています。
データ
打刻ログ
- 実際の例を参考にポイントを絞って抜粋したものです
- ユーザを識別できるコードがあります(社員番号的なもの)
- 勤務日と始業の時間および終業の時間をあわせて 1 日分が 1 レコードとなります
"ユーザ","ユーザコード","勤務日","始業","終業","完了"
"佐藤 由香","user2","2023/12/01","10:00","17:00","2000/1/1"
"高橋 一郎","user3","2023/12/01","10:00","17:00","2000/1/1"
"斎藤 美樹","user4","2023/12/01","10:00","17:00","2000/1/1"
"佐藤 由香","user2","2023/12/02","10:00","17:00","2000/1/1"
"高橋 一郎","user3","2023/12/02","10:00","17:00","2000/1/1"
"斎藤 美樹","user4","2023/12/02","10:00","17:00","2000/1/1"
- なお、期限付きテーブルにインポートする都合で完了をつけています。
入退室ログ
- 実際の例を参考にポイントを絞って抜粋したものです
- ユーザを識別できるコードがあります(社員番号的なもの)
- いつどこに入室(もしくは退室)したかが 1 レコードで表現されます
- ある人について見たとき、ある日の最初の入室と最後の退室が、出退勤打刻とズレがあるかを判定
"ユーザ","場所","入退室","ユーザコード","操作時刻"
佐藤 由香,ルームA,入室,user2,2023/12/01 09:55:55
高橋 一郎,ルームA,入室,user3,2023/12/01 09:26:56
斎藤 美樹,ルームB,入室,user4,2023/12/01 09:57:57
佐藤 由香,ルームA,退室,user2,2023/12/01 12:00:00
高橋 一郎,ルームA,退室,user3,2023/12/01 12:00:02
斎藤 美樹,ルームB,退室,user4,2023/12/01 12:00:04
佐藤 由香,ルームA,入室,user2,2023/12/01 12:55:55
高橋 一郎,ルームA,入室,user3,2023/12/01 12:56:56
斎藤 美樹,ルームB,入室,user4,2023/12/01 12:57:57
佐藤 由香,ルームA,退室,user2,2023/12/01 17:01:00
高橋 一郎,ルームA,退室,user3,2023/12/01 17:01:30
斎藤 美樹,ルームB,退室,user4,2023/12/01 17:02:00
佐藤 由香,ルームA,入室,user2,2023/12/02 09:55:55
高橋 一郎,ルームA,入室,user3,2023/12/02 09:56:56
斎藤 美樹,ルームB,入室,user4,2023/12/02 09:57:57
佐藤 由香,ルームA,退室,user2,2023/12/02 12:00:00
高橋 一郎,ルームA,退室,user3,2023/12/02 12:00:02
斎藤 美樹,ルームB,退室,user4,2023/12/02 12:00:04
佐藤 由香,ルームA,入室,user2,2023/12/02 12:55:55
高橋 一郎,ルームA,入室,user3,2023/12/02 12:56:56
斎藤 美樹,ルームB,入室,user4,2023/12/02 12:57:57
佐藤 由香,ルームA,退室,user2,2023/12/02 17:01:00
高橋 一郎,ルームA,退室,user3,2023/12/02 17:01:30
斎藤 美樹,ルームB,退室,user4,2023/12/02 18:02:00
サイト-入退室ログ
入退室ログをインポートしておき、あとから打刻とつきあわせするためのサイトとなります。
設定のポイント
- 権限設定
- サイトのアクセス権限で、バックオフィスの部門に書き込み権限とインポート/エクスポート ▼ 権限を付与します
- サイトのアクセス権限で、全てのユーザを項目として追加し、全ての権限を外します
- レコードのアクセス権限で、
[項目]担当者
に読取りと更新権限を付与します- サイト設定とあわせて、自分が担当者になっているレコードのみ参照したり更新したりできるようになります。
- サーバスクリプト
- インポートするデータのユーザコードを Pleasanter のユーザ情報のユーザコードを引いて、担当者項目を埋めます
- CSV の「ユーザ」列が担当者項目になりますが、これはコード値である必要があるので、引き直しています。
- インポートするデータのユーザコードを Pleasanter のユーザ情報のユーザコードを引いて、担当者項目を埋めます
なお、ビジネスネームの利用の観点からあえてユーザコードでの辞書引きをしていますが Pleasanter のユーザ情報の名前表記と CSV の名前表記が合致する場合は、サーバスクリプトで手当しなくても、名前からコード値の担当者に置換する機能があります。Pleasanter 最高!
インポート後
最初の CSV をインポートして、「佐藤由香」のユーザで見た図が次のとおりです
サイト-勤怠
出退勤の打刻をインポートする先であるとともに、時刻差分の検知や状況管理をします。
設定のポイント
アクセス権限およびユーザコードからのユーザ割り当ては入退室ログのサイトと同じなので割愛します。
- サーバスクリプトでインポート時に欲しいデータのかたちになるよう手当してます
- 入退室ログから、担当者のその勤務日のログを取得して、入退室時刻を転記します
- この関係で先に入退室のログを入れておく必要があります(改善ポイント)
- 出退勤の打刻は日付と時刻が分離しているので、あらかじめ as-is で入れる項目は別に日時型の項目を用意しておき、出勤日と時刻を組みあわせて日時をくみたてます
- 前の 2 つで手に入れた日時を比較して、それが一定の範囲を超えていればチェックを付け、チェックがあればレビュー、なければ完了、とするようにします。
- 入退室ログから、担当者のその勤務日のログを取得して、入退室時刻を転記します
- 状況による制御
- 最低限の設定として、完了ステータスでは読取専用にしています
インポート後
最初の CSV をインポートするとこうなります。
応用案
- 実際のリクエストにもあったが、従業員に理由を書き込んで欲しいので、通知の仕組みがあると良さそう
- この点 Pleasanter はメール通知がデフォルトで柔軟に設定できるのが大きな魅力(ここでも、メールアドレスのマスタ管理が課題にはなってくるが)。
- もしくは Teams/Slack とかに、ここみてね、と通知するだけでも良いようには思う
- 同じサイトの URL をチャットツールにポストしてもアクセス制御によって、各人が自身のレコードだけ見えるので、それなりに回りそう
- この方式のネックは、逸脱がない人も見に来ないといけないこと
- サーバスクリプトで期限を設定して近づいたときにメールしたり、プロセス機能でワークフロー化したり、といった方法も考えられそう
まとめ
- Pleasanter の基本機能が高く、結構なシステムが必要になりそうなものがあっさり作れた
- インポートとレコード単位のアクセス制御がデフォルトで利用可能なのほ大きなアドバンテージだと感じた
- プラスでスクリプトで機能を上乗せできるので CSV を前処理、みたいな過程が不要なので、作ってしまえばバックオフィス部門に渡しても運用が回りそう
- 本当に Pleasanter で行けるかという点ではユーザマスタの管理は結構辛みがあるように思った
- AD 連携があれば良いがそうでないと、わざわざこのために Pleasanter で従業員の名簿の管理もしないといけないし、利用者もこの作業のためにログインをしないといけない
- もっと Pleasanter が広まってほしい
- AD 連携があれば良いがそうでないと、わざわざこのために Pleasanter で従業員の名簿の管理もしないといけないし、利用者もこの作業のためにログインをしないといけない
Discussion