
パート・派遣・シフト勤務の人が、入社日と週の日数・時間から、次に有給が付く日と日数を出せるブラウザの計算機を、AI(Claude)で作って note で売っています。数え方を条文から決めたこと、月末に入社した人の付与日のずれ、別のエージェントによる答え合わせを、作る人向けに書きます。
※本記事には、筆者が note で販売しているアプリへのリンク(PR)が含まれます。
作ったもの
「有給の付与日・日数 計算機」という、ブラウザで動く計算機です。
入れるのは、入社日(派遣の人は、派遣会社に雇われた日)、週の所定労働日数(週で決まっていない人は1年の日数)、1週間の所定労働時間の3つです。
これで、次に有給が付く日と日数、比例付与(短い時間で働く人向けの少ない日数)になるかとその理由、今の分と前の分がいつ消えるか、会社が年5日を取らせる対象かが出ます。
下は、お試し版をそのまま埋め込んだものです。見本の入社日と働き方が入っているので、自分のものに変えてみてください。
(表示されない場合は お試し版をブラウザで開く)
- お試し版(無料):次に付く日と日数、比例付与かどうか、消える日、年5日の対象か、法律の表での自分の段
- 完全版(note・300円):入社から10年ぶんの一覧、使った日数を入れた今の残りと先に消える日数、途中で働き方が変わったとき、8割未満で付かない回、A4・1枚の印刷、スマホのカレンダー用ファイル(.ics)
題材の選び方:表はあるのに、自分の日付が出ない
同じシリーズで最初に売れたのは、交替勤務の休みを数える道具でした。今回も「働く人の困りごと」を計算する道具から探しました。
「有給 比例付与 計算」で検索すると、10月19日の時点で上位にあったのは、解説の記事と早見表でした。入社日を入れて、付与日と日数まで出す道具はありませんでした。
表を見れば、週3日なら勤続6か月で5日、ということは分かります。でも、「自分は何月何日に何日付くのか」「去年の分はいつ消えるのか」は、入社日から数えないと出ません。ここなら道具が役に立つ、と考えました。
数え方は、条文と行政の資料から先に決める
日付と日数を出す道具でいちばん困るのは、もっともらしく間違うことです。そこで、コードを書く前に、Claude に e-Gov の条文と、厚生労働省・労働局の資料を読ませて、数え方を先に決めました。
決めたのは、次のようなことです。
- 日数は、労働基準法施行規則24条の3の表で決める。週30時間以上なら、週の日数が少なくても通常の日数(30時間ちょうども通常)
- 1回目の付与日は、入社から6か月を超えた日。4月1日入社なら10月1日(入社日を1日目に数える)
- 2回目からは、1回目の付与日から1年ごと
- 使えるのは、付与日から2年(労働基準法115条)。10月1日に付いた分は、2年後の9月30日まで
- 年5日を取らせる決まりは、その回に10日以上付く人だけ。繰り越した分は10日に数えない
表は、そのままの形でコードに置きました。数字は、厚生労働省のリーフレットと e-Gov の条文の両方と突き合わせています。
// 労働基準法施行規則24条の3の表(勤続6か月・1年6か月 … 6年6か月以上の7段)
const TABLE = {
full: [10, 11, 12, 14, 16, 18, 20],
4: [7, 8, 9, 10, 12, 13, 15],
3: [5, 6, 6, 8, 9, 10, 11],
2: [3, 4, 4, 5, 6, 6, 7],
1: [1, 2, 2, 2, 3, 3, 3]
};
// 週で決まらない人(週30時間未満・年216日以下)は、1年の日数で段を決める。47日以下は付かない
const row = p.a >= 169 ? 4 : p.a >= 121 ? 3 : p.a >= 73 ? 2 : p.a >= 48 ? 1 : 0;
月末に入社した人:法律と会社で1日ずれる
いちばん迷ったのは、月末に入社した人の付与日です。
8月31日に入社した人の6か月後には、2月31日がありません。民法143条では、月で決めた期間は、最後の月に同じ日がなければ、その月の末日で終わります。なので6か月は2月の末日で終わり、それを超えた最初の日、3月1日が付与日になります。
一方で、2月28日に付ける会社もあり、人事向けのQ&Aでも答えが分かれていました。法律より早く付けるのは働く人に有利なので、問題にはなりません。
そこで、計算は法律どおり3月1日にして、入社日の日が6か月後の月にないときだけ、結果の下に「会社によっては1日早い2月28日に付けます」のような1行を出すことにしました。
日付は、1970年1月1日からの通し日数(整数)で持っています。時刻を持たないので、端末の時間帯の設定で日付が1日ずれることがありません。月を足す関数は、これだけです。
// 月で決めた期間:同じ日があればその日、なければ翌月1日(8月31日の6か月後 → 3月1日)
function afterMonths(n, months){
const c = fromDn(n), t = c.m + months, y = c.y + Math.floor(t / 12), m = mod(t, 12);
const last = fromDn(dn(y, m + 1, 0)).d;
return c.d <= last ? dn(y, m, c.d) : dn(y, m + 1, 1);
}
// 使える最後の日:付与日を1日目に数えて2年(2年後の同じ日の前日)
const lastUse = g => afterMonths(g, 24) - 1;
使った日数の差し引き:古い分から先に使う
完全版では、付与日ごとの1年に使った日数を入れると、今の残りと「先に消える分」が出ます。
労働基準法には、前の回の残りと今の回の分のどちらから使うかの決まりがありません。この計算機は、前の回の残り(繰り越し)から先に使う前提にして、画面と記事にそう書きました。
// その1年に使った日数 u は、前の回の残り c から先に使い、足りない分をその回の分 r.days から使う
const t1 = Math.min(c, u), t2 = Math.min(r.days, u - t1), over = u - t1 - t2;
// 前の回の残りで使わなかった分(c - t1)は、この1年の終わりに消える
carry = r.days - t2; // この回の残りは、次の1年へ

お試し版と完全版を1つのソースから作る
ソースは src/app.html の1枚だけです。完全版だけに入れる行を、//#full と //#end のような1行の印ではさんでおき、build.py がお試し版と完全版の2つのページに分けます。お試し版に完全版のコードやURLが残っていないかは、作り直したあとにテストで見ています。
書体(Zen Kaku Gothic New と Zen Old Mincho)は、そのページに出てくる文字だけを切り出して、ページの中に埋め込みました。外へは何も読みに行かないので、入力した入社日などが、どこかへ送られることはありません。
完全版の設定は、端末には保存せず、URLの「#」の後ろに入れます(入社日・週の日数・時間・使った日数など)。ブックマークしたり、LINE やメールで自分に送ったりしておけば、次も同じ状態で開けます。
確かめ方:計算を、別のエージェントに一から書かせる
自分のテストは、Playwright(Python)で両方の版を開いて確かめるものです。
- 計算:5,465項目。条文と資料の例(4月1日入社 → 10月1日、8月31日入社 → 3月1日、10月1日に付いた分 → 2年後の9月30日まで)を手で書いた答えと、入社日965通り×すべての区分
- 操作:283項目。入力の決まり、URLの往復、A4・1枚の印刷、カレンダー用ファイル(.ics)、幅320〜1280ピクセル、明るい画面とダークモードの文字の読みやすさ
- ランダムな操作を続けて、ときどきURLを開き直しても同じ画面になるか、ページにエラーが出ないか
テストが本当に誤りを見つけるかも試しました。アプリにわざと5種類の誤り(月末を切り詰める、期限を1日のばす、30時間ちょうどを比例付与にする、今の回の分から先に使う、年216日を通常にする)を入れると、どれもテストが落ちました。
ただ、答え合わせの計算も、作ったのと同じAIが書いています。同じ思い込みを持っているかもしれません。そこで、別のエージェント(同じ Claude ですが、作ったときの会話を見ていないもの)に、アプリのコードを見る前に、条文と資料から計算のモデルを一から書かせました。そのモデルと、アプリの画面に出た文字を比べると、38,925件すべて一致しました。
それでも、重い問題が2つ見つかりました。どちらも計算ではなく、画面の案内の文でした。
- 「入社のころの働き方を入れて」と書いていた。日数は付与日の時点の働き方で決まるので、入社から6か月のあいだに週3日から週5日に変わった人は、1回目が5日と出てしまう(法律では10日)。「1回目の付与日のころの働き方」に直した
- 「前の年と、その前の年の分も入れると、今の残りが正しくなります」と書いていた。古い分から先に使う前提では、今の残りはもっと前の年の使い方にも左右されるので、3年分だけ入れた人の残りが最大19日多く出る例があった。「分かる回は、すべて入れてください」に直し、使った日数が空いている回があれば知らせを出すようにした
ほかに、「設定をすべて最初に戻す」の2回押しが、ページを開いて4秒以内だと1回で効いてしまうことも見つかりました。1回目を押した時刻を performance.now() で持ち、最初の値を0にしていたためです。performance.now() はページを開いた時から数えるので、開いてすぐは「4秒以内にもう一度押した」ことになっていました。最初の値を -Infinity にして直しました。
note の記事の原稿も、別のエージェントに、条文と画面の文言と1文ずつ突き合わせさせて直しました。
かかった時間と、やってみて思ったこと
作業は1晩です。10月19日の23時に題材を決め、作る・確かめる・別のエージェントの点検・直し・note の記事までをして、10月20日の朝に公開しました。
いちばん時間を使ったのは、コードではなく、「どの日を付与日とするか」「どちらの分から使うか」を決めるところでした。条文を読めば決まることと、会社ごとに違うことを分けて、違うことは画面に「会社に確かめてください」と書く。計算の道具の中身は、ほとんどこの線引きだと思いました。
もう1つは、重い問題が、計算ではなく案内の文にあったことです。作った側は「こう読んでくれるはず」と思って案内を書くので、そのとおりに入れたらどうなるかを、別のエージェントに試させて初めて見つかりました。
お試し版と完全版
お試し版は、ブラウザで開くだけで使えます。登録もインストールもいりません。
完全版(入社から10年ぶんの一覧・使った日数を入れた残り・働き方の変更・印刷・.ics)は、note「余白の実験室」の記事の有料部分にURLがあります(300円・買い切り)。
同じ「働く人の困りごと」の道具として、交替勤務カレンダーメーカーと、ふたりの休み合わせカレンダーも作っています。
※この記事は、AI(Claude)でブラウザのアプリを作って売るまでの記録です。計算機が出すのは、法律で決まっている最低限の日数と付与日の目安で、法律の助言ではありません。実際の日数は、会社(派遣は派遣元)に確かめてください。動きは Chromium(パソコンとスマホの幅)で確かめました。実機のスマホでの .ics の取り込みと印刷は、まだ確かめていません。



