Edited at

15分で勤怠システムをつくる方法

More than 1 year has passed since last update.


これはなに。

Supership株式会社 Advent Calendar 2016 の22日目です。


15分で勤怠システムを作る方法

15分でタイムカード機能を作る方法。(15分はちょっと盛ってる。)


経緯

弊社採用のwebの勤怠管理システム、利用者側から見るとあんまりイケてないなー。操作が面倒。面倒すぎて、ちゃんと打刻した事ない。

そういや昔の (x68k) 某パソコンのコミュニティの合言葉が 「無い物は作る」 だったなー。某perlの壁のように偉大な人も言ってたなー。怠惰であれ。

よし、せめてタイムカードのパンチング部分だけでも作ろう!!!

名づけて、 PunchDrunker !!

ちなみに僕はアルコールを嗜みません。

そして、advent calenderだし、どうせやるなら15分という時間しばりで!!


取り敢えずざっと考える

とにかく15分で作る為に楽出来る処は楽する。


  • いつも持ってるandroidで、会社近くにいる事を検知して、その領域に入った時、出た時に打刻する。


    • 打刻時刻の最初と最後を取って、その日の出勤と退勤にする。



  • 最近仕事で使ってる rails を使う。

  • ログイン部分: oauthにおまかせ。

  • 画面遷移: なんか変でもOK。

  • 画面の装飾: 一切無し

  • 動作環境: 貧乏人に優しい heroku


という事で、作っていみた。

https://github.com/vikke/punch-drunker

ichiro.matsunaga@PC0190:~/vcswork/punch_drunker

[master]$ git log
commit c0d5e67dc17816af1c52a29d4539b5d059f62d94
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:56:55 2016 +0900

token認証通過させわすれてた

commit 89c3cef9b52f51ea428e403b592c9fe5b69fa7bb
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:31:42 2016 +0900

index.

commit 683f9dc8e57a8a10ef9fd8f41167782816903178
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:03:32 2016 +0900

punch一覧。

commit 2e899189e68c3c8456c27688c1472a4a588dfe1e
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Tue Dec 20 14:58:40 2016 +0900

punch 登録。

commit ae1137086f0f8e074e551bccd1aacb4a2b870063
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Tue Dec 20 01:30:01 2016 +0900

heroku接続確認。

commit ff3476cd566cb177452b7ac6cd04495ef41bd824
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Mon Dec 19 00:50:04 2016 +0900

regen punch_token.

commit 3f42b7308bbea3f9bf7f2fd8cd769719ef1f5045
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Mon Dec 19 00:21:34 2016 +0900

punch token.

commit 0b1cd296fc81712e63cbdefc37a483d345b9e372
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sun Dec 18 23:38:31 2016 +0900

login / logout / unauth check.

commit ed28ffe31564063776a181b480fc24b58c4dba6f
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sun Dec 18 22:05:59 2016 +0900

impliments oauth.

commit 7ee20c8d4f04bca7a0729f6c3085573988fd2098
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 01:01:14 2016 +0900

heroku.

commit 2fed602d86b6c21fdd6ebe8ef3495812ff981173
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 00:12:39 2016 +0900

generate sessions.

commit 2f02ab83dd2a6c98b70dac2dae634b5e7cc82d71
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 00:00:29 2016 +0900

generate punch

commit b5bed7145f0e96bd73285813185cd5a23466f633
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Fri Dec 16 23:48:02 2016 +0900

generate user.

commit 46c500b7b45cd092831fa9c63cd9847f5aea9450
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Fri Dec 16 00:30:51 2016 +0900

init.

...15分どころじゃないじゃないか。

いいわけすると、すごく最近急がしいのです。その合間を縫って作りました。

実質は30分くらいです。15分は厳しかったけど、30分では行けた。

はまったのも1箇所だけで、omniauthのcallbackurlを不用意に設定し、ちゃんっと値が帰らなかった時です。


セットアップ


  1. herokuにappを作り、add-onsでheroku-posgresを足しておく。


    • pipelineとかは今回無視。



  2. googleのoauth認証を使っているので、 developer consoleの認証情報でtokenを発行する。


  3. consoleから取得されたCLIENT_IDとSECRET_IDをherokuのconfig_varsに設定する。


  4. git push heroku master


    • deploy



  5. heroku run rails db:mimgrate


セットアップしてみる。


  1. おもむろに https://punch-drunker.herokuapp.com/ (僕の作ったインスタンスの場合) にアクセスする。

  2. googleでログインをクリック

  3. googleのアカウント選択が出てくるので、会社のアカウントを選択する(もちろん個人のアカウトを選んでも良い。但し、あたりまえだけど、oauthで認証しているので、googleで払い出されているアカウントに限る。)

  4. tokenをコピる

だれでも、上記インスタンスを使ってかまいません。が、一切の保証はしません。保持している個人情報はemailアドレスのみです。emailアドレスを個人情報屋に売りはしませんが、流出した場合の保証はしません。


つかってみる。

さて、サービスのセットアップは終わった。クライアントはどうするか。

android ユーザーの皆さんはTaskerを使いましょう。iPhoneは知らん。下記のurlをgetするだけなので、そういう事ができるツールがあればiPhoneでも出来ると思う。

Taskerには、電話のアンテナのidを見て、そのアンテナの範囲に入る/出るをトリガーにタスクを実行出来ます。そのタスクの中にはhttpの発行もあります。

よって、その機能を使いましょう。


Taskerのセットアップ


  1. Profile -> +ボタン -> State -> Phone -> CellNear を選択。


    1. Scanボタンを押して10分くらい放置する。社内をブラブラ歩くのもあり。(これで近くの携帯のアンテナのIDを取得する)

    2. 終わったらStopを押して、確定させる。



  2. 戻るとTaskとのひもづけをうながされるので、NewTaskを選ぶ。


    1. punchと名前を付ける。



  3. Task Editで+を押下して、Net -> HTTP Getを選び、Server:Portに、 https://punch-drunker.herokuapp.com/punches/tokentoketoketokentoekn を入力する。

  4. Profilesに戻って、さっきのprofileを選択、緑の->punchを長押しすると、Add Exit Taskが出てくるのでここでも先程のpunch taskを選択する。

これによりアンテナのあるところに入った時、出た時にpunchを打つようになります。punch-drunkerは一覧で日付でgroup byしているので、最初と最後のエントリーを取り出すようになります。


出来るようになった事。


  • 毎日の打刻時間のメモは、これで自動化された。


TODO


  • Taskerに頼っている部分をnativeアプリ化して、iPhone/androidどれでも簡単に使えるようにする。

  • 打刻した内容をPhantomJSとか使って社内の勤怠システムに自動入力するようにする。

  • 表示対象年月の指定が出来ない。


    • まー、これは、punchesをバッチで過去分を消してしまえば当月だけになるじゃん!! Heroku Postgresの無料分はrow数制約あるし。

    • でもまだそのbatchは作ってない(遠い目l



まー、なんとかなるかな。


感想


  • あらためて思うけど、 rails って強力。 スタートレック見ながら他の仕事しながらでも30分切る勢いで作れてしまう。

  • とは言うものの、型が無いのは後程辛くなるのはわかってるので(経験済み)、他の言語でも作ってみたい。GoとかSwiftとか。

  • 来年はNativeアプリの勉強をする年にする。