はじめに
ざっと自己紹介をすると
きっかけ
現在僕は給料計算とカレンダーのwebアプリを開発中で、カレンダーについてはFullCalendarで行けたんですが給料計算に関しては国ごとに法律が違うこともあってライブラリやモジュールがありませんでした。モジュールが無いなら自分で作るしかなくて、どうせならnpmパッケージにして公開しようと思い立ったので開発しました。
沼ったところ
そもそも僕はnpmパッケージとかモジュールなんて一度も作ったことがなく、どうやってパッケージにするかも全くわからなかったので、ローカルでinitするところからGoogle先生の力を借りなければならなかった訳です。参考にしたサイトは以下のような感じです。
これからモジュール作ろうかなぁと思っている方は是非参考にしてください。
労働基準法を読む
モジュールを作るには僕自身が日本の労働システムについて理解しなくてはいけないんでですね、とにかく1時間くらいかけて労働基準法を読破しました。実際役に立ったのは三十六,三十七条くらいなんですが、そもそもどこを読めば良いかもわからなかったのでとりあえず全部読みました。アホですね。労働基準法以外に役に立ったサイトはこんな感じ
割増賃金を理解する
上のような記事を読んで、3種類ある割増賃金の該当ケースと重複した場合の割増%を理解するのもかなりキツかったです。
時間外労働による割増賃金
- 1.25倍
- 実働時間が1日8時間を超えた場合
- 実働時間が週40時間を超えた場合
- 上記の時間外労働が月45時間or年360時間を超えた場合
- 1.5倍
- 上記の時間外労働が月60時間を超えた場合(2023年に廃止)
- 1.25倍
法定休日出勤による割増賃金
- 1.35倍
- 週1日or月4日に定められた法定休日に出勤した場合
- 1.35倍
深夜勤務による割増賃金
- 1.25倍
- 22:00~05:00の間
- 1.25倍
時間外労働と深夜勤務の重複...可能。1.5倍or1.75倍
法定休日出勤と深夜勤務の重複...可能。1.6倍
時間外労働と法定休日出勤の重複...不可。時間外労働による割増が1.5倍の時を除いて法定休日出勤割増が優先される。1.35倍or1.5倍
時間外労働、法定休日出勤、深夜勤務全てが重複した場合...法定休日出勤と深夜勤務の割増が加算され、時間外労働は考慮されない。1.6倍
これを理解すればあとはコードを書くだけ...
スパゲッティコードになる
僕のスキルの問題なのかJSの限界なのか(多分前者)このシステムをコードに変えるとめっちゃ理想的なスパゲッティコードになります。
"use strict";//overwork...年360時間、月45時間、週40時間を超えている場合は1と記入、月60時間を超えている場合は2と記入//overworktime...overworkで超過している時間を記入//holiday...決められている法定休日(通常は日曜日)や月ごとに決められている法定休日に出勤する場合はtrueを記入//midnight...実働時間のうち22~5時に働いている時間を記入//overworkとmidnight重複は1.5倍、holidayとmidnightの重複は1.6倍でoverworkとholidayはholiday優先。3つ重複した場合はholidayとmidnightfunctionpayrox(wage,workinghours,overwork,overworktime,holiday,midnight){letresult=0;//深夜勤務している上に休日出勤の場合if(midnight!==0&&holiday==true){//実働時間から深夜勤務時間を引いた値に時給*1.35result+=(workinghours-midnight)*wage*1.35;//深夜勤務時間に時給*1.6result+=midnight*wage*1.6;//深夜勤務しているが休日出勤はしていない場合}elseif(midnight!==0&&holiday==false){//時間外労働1で時間外労働が深夜勤務時間より長い場合if(overwork==1&&overworktime>=midnight){//実働時間から時間外労働を引いた値に時給をかけるresult+=(workinghours-overworktime)*wage;//時間外労働から深夜勤務時間を引いた値に時給*1.25result+=(overworktime-midnight)*wage*1.25;//深夜勤務時間に時給*1.5result+=midnight*wage*1.5;//時間外労働1で時間外労働が深夜勤務時間より短い場合}elseif(overwork==1&&overworktime<midnight){//実働時間から深夜勤務時間を引いた値に時給をかけるresult+=(workinghours-midnight)*wage;//深夜勤務時間から時間外労働を引いた値に時給*1.25result+=(midnight-overworktime)*wage*1.25;//時間外労働に時給*1.5result+=overworktime*wage*1.5;//時間外労働2で時間外労働が深夜勤務時間より長い場合}elseif(overwork==2&&overworktime>=midnight){//実働時間から時間外労働を引いた値に時給をかけるresult+=(workinghours-overworktime)*wage;//時間外労働から深夜勤務時間を引いた値に時給*1.5result+=(overworktime-midnight)*wage*1.5;//深夜勤務時間に時給*1.75result+=midnight*wage*1.75;//時間外労働2で時間外労働が深夜勤務時間より短い場合}elseif(overwork==2&&overworktime<midnight){//実働時間から深夜勤務時間を引いた値に時給をかけるresult+=(workinghours-midnight)*wage;//深夜勤務時間から時間外労働を引いた値に時給*1.25result+=(midnight-overworktime)*wage*1.25;//時間外労働に時給*1.75result+=overworktime*wage*1.75;//深夜勤務のみの場合}elseif(overwork===0){//実働時間から深夜勤務時間を引いた値に時給をかけるresult+=(workinghours-midnight)*wage;//深夜勤務時間に時給*1.25result+=midnight*wage*1.25;}//深夜勤務はしていないが休日出勤をしている場合}elseif(midnight===0&&holiday==true){//休日出勤で時間外労働2の場合if(overwork==2){//実働時間から時間外労働を引いた値に時給*1.35result+=(workinghours-overworktime)*wage*1.35;//時間外労働に時給*1.5result+=overworktime*wage*1.5;//休日出勤で時間外労働1または時間外労働していない場合}else{//実働時間に時給*1.35result+=workinghours*wage*1.35}//深夜勤務も休日出勤もしていない上で時間外労働1の場合}elseif(holiday==false&&overwork==1){result+=(workinghours-overworktime)*wage;result+=overworktime*wage*1.25;//深夜勤務も休日出勤もしていない上で時間外労働2の場合}elseif(holiday==false&&overwork==2){result+=(workinghours-overworktime)*wage;result+=overworktime*wage*1.5;}else{result+=workinghours*wage;}letanswer=Math.round(result);returnanswer;}module.exports={add:payrox}
コメントアウトを除けば大した量ではありませんがとにかくif文の主張が凄いので、もっと良いコードが書けるという方はプルリク待ってます。プルリクカモン
テスト童貞
僕は今までWebサイトだったりWebアプリの開発しかしてこなかったのでnode.jsのテストに触れたことがありませんでした。今回テストするにあたってmochaとかchaiとかmocha-sinonとか初耳のパッケージばかり使ったので色々勉強になりました。参考にしたサイトはこんな感じ
この二つを見ながらちょいちょいアレンジすれば初心者でも簡単なテストはできます。
npmアカウント作成
gitでpushして
$npm publish ./
でパッケージ公開完了!
と思いきや、npmのアカウントを作っておらず、しかもそれに気付かず30分くらい沼るという初心者プレイをかましました。僕のnpmアカウント
README.mdのUsageがめんどい
僕が作ったモジュールは
constpayrox=require("payrox-cal");//payrox-calをインポートpayrox.add(1000,9,1,4,false,0);//payrox.add(時給(整数),実働時間(数値),時間外労働(0~2),時間外労働の時間(数値),法定休日出勤(真偽値),深夜勤務時間(数値))//数値が小数点以下になる場合は小数第一位で四捨五入(4.2343=>4.2)
こんな感じで6個も引数を指定しなければいけないので、Usageが命なんです。そんな訳で、Usageにまた1時間くらいかけてわかりやすく書いたのでご覧ください。(https://github.com/kota-yata/Payrox-cal#usage)
完成品
終わりに
労働基準法関係以外の沼りに関しては完全に初心者ならではなので、僕と同じく初めてnpmパッケージを作る方は、貼りまくった参考webサイトも一緒に見ながら作ってみてください!
ツイッターフォローオナシャス (https://twitter.com/AlGoRiT94422608)