設定

勤怠管理システムの自作-協定届帳票

概要

労使協定届の帳票を出力するための機能です。
当システムの場合は、協定届と年間カレンダーをひとまとめにして出力できるようにしました。
協定届の「変形期間中の各日及び各週の労働時間並びに所定休日」という項目に紐付く「別紙」として、年間カレンダーをそのまま流用します。

勤怠管理システムとは無関係に、ただ協定届を作るだけなら下記のようなサイトもあります。
https://www.startup-roudou.mhlw.go.jp/index.html

この帳票の目的

法律で届け出が必須になっている帳票の一部を出力する便利機能です。

変形労働時間制を採用する場合、労使協定の締結が必要になります(一部例外あり)。
労使協定や就業規則を作った場合は、労働基準監督署に届け出る必要があります。
届け出に使う様式については、労働基準法施行規則 第12条の辺りで指定されています。

届け出の方法については、部分的に電子申請ができるようです。
電子申請に対応していない場合は紙で出力する必要があります。

種別条件届出要否様式
第32条の21か月単位の変形労働時間制労使協定で定める場合様式第3号の2
第32条の21か月単位の変形労働時間制就業規則で定める場合
※就業規則の届出は必須
労働基準法 第89条
×
第32条の3フレックスタイム制清算期間 <= 1か月×
第32条の3フレックスタイム制清算期間 > 1か月様式第3号の3
第32条の41年単位の変形労働時間制様式第4号
第32条の51週間単位の変形労働時間制様式第5号

このほかに裁量労働制も有り得ますが、当システムでは裁量労働制はサポートしていません。

勤怠管理システムで変形労働時間制をサポートする場合、必然的に協定届に使うデータが揃うはずです。
あとは会社名や所在地などのデータをDBに持たせれば、元データの用意ができます。

当システムには、36協定届(様式第9号)を出力する機能は付いていません。
勤怠管理システムとしては36協定のデータが入力されていなくても動作するので、無視しています。

レイアウトはどうでも良い

協定届のレイアウトに細かな仕様はありません。
余白、フォント、均等割り付け、文字の改行位置などが少々違う程度なら問題になりません。
極端な話、書くべき事が書かれていれば何でもOKのようです。
労働基準法施行規則 第59条の2
https://elaws.e-gov.go.jp/document?lawid=322M40000100023#Mp-At_59_2

当システムでは厚生労働省のサイトからダウンロードできるファイルを基準として、できるだけ同じレイアウトを再現する方針で進めました。
ただし様式第4号については、協定の当事者名の記入欄が小さすぎて実用的ではなかったため、勝手にラベルの文言を省略しました。

様式は色々なサイトからダウンロードできますが、サイトによって微妙にレイアウトが違う場合があります。

e-Gov 労働基準法施行規則
https://elaws.e-gov.go.jp/document?lawid=322M40000100023

厚生労働省
https://www.mhlw.go.jp/bunya/roudoukijun/roudoujouken01/

東京労働局
https://jsite.mhlw.go.jp/tokyo-roudoukyoku/hourei_seido_tetsuzuki/hourei_youshikishu/youshikishu_zenkoku.html

法改正によって様式のレイアウトが変わることがありますが、上記のサイトには古いバージョンの履歴や差分表示といったサービスは無さそうです。プログラマー各位は古い様式をバックアップしておくと後々便利かもしれません。

余白について

最低5mm以上。20mmあれば安全。
これが私が調べた限りでの結論です。

この帳票の提出先では紙にパンチで穴をあけて、紙のままで保存している可能性があります。
穴あけパンチについて調べたところ、穿孔奥行:13mm、穴径:6mmという商品が多くありました。
紙の端から13mmの位置を円の中心として 直径6mmの穴が開きます。
→用紙の端から16mm以内にある文字列は消える可能性があります。

協定届の場合は特に上下余白が厳しいですが、上端は帳票タイトルやテーブルヘッダーなので、少々欠けるくらいなら問題ないはずです。

オフィスの複合機で印刷することを考えて、複合機の性能限界を意識して余白を確保する必要があります。少し調べた限りでは、余白が5mmあればギリギリ欠けずに印刷できるはずです。

当システムの場合、様式によって余白はバラバラですが、最小値は5mmです。
様式第4号が特に厳しく、厚生労働省のサイトからダウンロードできるファイルも余白が狭くなっています。
e-Govのサイトにあるファイルに至っては改ページが発生しています。

フォントについて

当システムでは厚生労働省のサイトからダウンロードできるファイルを基準にしたため、「MS 明朝」を使っています。

本格的にWebアプリとして運用するなら、Google Fontsを使うとか、サーバー側からフォントを配布するとか、端末にインストールされているフォントに依存しない方法を考える必要があります。

プリンターで出力できるかどうかのテストも含めて、地味に面倒な作業になるはずです。

仕様

実現方法

C# ASP.Net MVCで実装してあります。
帳票っぽいレイアウトのHTMLを作って表示するだけです。印刷はブラウザの機能に依存します。

当システムでは以下のような出力方法があります
・協定届と年間カレンダーを同時に出力できる
・協定届や年間カレンダーが複数パターン存在する場合、それぞれをグループ化して一括出力できる

協定届や年間カレンダーを部分ビューとして作成しておき、フレームに相当するビューへ動的に埋め込むことで複数帳票の同時出力を実現しています。

失敗したこと

将来、様式が変更になった場合の事を考えていませんでした。クラウドサービスとして提供する場合はレイアウト差し替えのタイミングが無く、非常に困ります。
基準となる日付に応じて自動的に適切な様式を適用するように配慮すべきでした。

e-Gov電子申請

https://developer.e-gov.go.jp/

届け出の一部はAPI経由でオンライン申請ができるらしいです。
私が調べた当時は変形労働時間制関連の協定届の申請には対応していないように見えました。
現在では1年単位の変形労働時間制に対応しているようです。
申請データについての仕様書が公開されていましたが、難しそうだったので諦めました。
将来、AWSのSESのように、NuGetからライブラリを取得できて、サンプルソースをコピペすれば動くレベルになってから検討するつもりです。

各項目

事業の種類

総務省から「日本標準産業分類」というものが公開されているので、この中から選べば良いはずです。
比較的新しいデータであればCSVファイルとしてダウンロードできます。https://www.soumu.go.jp/toukei_toukatsu/index/seido/sangyo/index.htm

当システムの場合、CSVファイルと同じ構造のテーブルを作って、システム内で標準産業分類を選べるようにしています。誰がメンテナンスするのかは考えていません。

将来の更新に備えて「改定番号」というカラムをPKに加えて、常に改定番号が最大のデータのみを取得するようにしています。※改定番号ではなく、改定日をキーにするべきでした。

常時使用する労働者数

法律によって数え方が異なりますが、勤怠管理システムでは単純な人数のカウントで良いはずです。
労使協定は事業場ごとに作るため、全労働者の人数ではなく、事業場に属する労働者だけのカウントです。

WHERE
        ユーザー契約マスタ.事業場ID = 印刷対象データの事業場ID
    AND ユーザー契約マスタ.契約開始日時 <= 印刷対象データの起算日
    AND (ユーザー契約マスタ.契約終了日時 > 印刷対象データの起算日 
        OR ユーザー契約マスタ.契約終了日時 IS NULL)
    AND ユーザー.管理監督者フラグ = FALSE

該当労働者数

※下記に「起算日時点」とありますが、法的に正しいかどうかは不明です。

起算日時点で事業場に属しており、かつ、協定届の元になっている変形労働時間制の対象となる労働者のカウントです。

DB構造としては、「誰」が「いつ」「どの事業場に」「どの契約で」という情報を持っている必要があります。

該当労働者数(満18歳未満の者)

満年齢の計算が曲者です。
協定届の文脈では時刻要素を考慮しないため、誕生日の前日に年を取る方式にしました。

明治35年法律第50号(年齢計算ニ関スル法律) ←起算日についての記載あり
民法第143条 ←誕生日の前日に年を取る件が書かれている

    /// <summary>
    /// 基準日時点での満年齢を取得する。
    /// 時刻要素は考慮しない。
    /// </summary>
    /// <param name="baseDate">基準日</param>
    /// <param name="birthday">生年月日</param>
    /// <returns>満年齢</returns>
    public static int GetAge(DateTime baseDate, DateTime birthday)
    {
        var today = baseDate.Date.AddDays(1);
        var age = today.Year - birthday.Year;

        if (today.AddYears(-age) < birthday.Date)
        {
            age--;
        }
        return age;
    }

協定の当事者

項目名は「協定の当事者である労働組合(事業場の労働者の過半数で組織する労働組合)の名称又は労働者の過半数を代表する者の氏名」

労使協定の成立日時点での職名や氏名を書けばOKです。当システムの場合は単純な文字列として持っています。ユーザーマスタとの紐付けはありません。

労使協定が成立した時点での値が重要なので、当事者が途中で退職した場合でも書き換えは必要ありません。
「労働者の過半数」についても、労使協定が成立した時点での人数が重要で、その後人数が変化したとしても、都度書き直すような事は必要ありません。

出力結果の例

様式3号の2 1か月単位の変形労働時間制↓

様式3号の3 フレックスタイム制↓

様式4号 1年単位の変形労働時間制↓

様式5号 1週間単位の変形労働時間制↓

タイトルとURLをコピーしました