LoginSignup
35
25

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-21

これはなに。

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

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

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

経緯

弊社採用のwebの勤怠管理システム、利用者側から見るとあんまりイケてないなー。操作が面倒。面倒すぎて、ちゃんと打刻した事ない。
そういや昔の (x68k) 某パソコンのコミュニティの合言葉が 「無い物は作る」 だったなー。某perlの壁のように偉大な人も言ってたなー。怠惰であれ。

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

名づけて、 PunchDrunker !!
ちなみに僕はアルコールを嗜みません。

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

取り敢えずざっと考える

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

  • いつも持ってるandroidで、会社近くにいる事を検知して、その領域に入った時、出た時に打刻する。
    • 打刻時刻の最初と最後を取って、その日の出勤と退勤にする。
  • 最近仕事で使ってる rails を使う。
  • ログイン部分: oauthにおまかせ。
  • 画面遷移: なんか変でもOK。
  • 画面の装飾: 一切無し
  • 動作環境: 貧乏人に優しい heroku

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

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を発行する。 認証情報_-_My_First_Project.png
  3. consoleから取得されたCLIENT_IDとSECRET_IDをherokuのconfig_varsに設定する。 punch-drunker_·_Settings___Heroku.png
  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アプリの勉強をする年にする。
35
25
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
35
25