勤怠管理のベーシックな設計を紹介します。
勤怠管理は打刻まるめや、日を跨いで働いたけど何時までを前日の勤務にするのかであるとか
承認フロー、休憩など、意外と大変です。
参考になればと以下に設計を書きます。
URLツリー
/ (ホーム)
/login (ログイン)
/dashboard (ダッシュボード)
/attendance (勤怠打刻)
/clock-in (出勤)
/clock-out (退勤)
/break-start (休憩開始)
/break-end (休憩終了)
/overtime-start (残業開始)
/attendance/history (勤怠履歴)
/attendance/approval (承認フロー)
/admin (管理者メニュー)
/admin/attendance (全従業員の勤怠管理)
/admin/approval (承認管理)
/admin/reports (CSVダウンロード)
/admin/settings (勤怠設定)
🖥 画面設計
1. ログイン画面 /login
- 入力項目:
- メールアドレス / パスワード
- ログインボタン
- 機能:
- 正しいユーザーのみダッシュボードへリダイレクト
- ログイン情報保持 (Remember Me)
- 管理者 / 従業員で表示を切り替え
2. ダッシュボード /dashboard
- 表示情報:
- 今日の日付・時刻
- 勤怠打刻ボタン(出勤・退勤・休憩開始・休憩終了・残業開始)
- 本日の勤怠ステータス
- 承認待ちの勤怠(管理者のみ)
- 機能:
- 打刻状況に応じてボタンの有効・無効を切り替え
3. 勤怠打刻 /attendance
- ボタン:
- 出勤
/attendance/clock-in
- 退勤
/attendance/clock-out
- 休憩開始
/attendance/break-start
- 休憩終了
/attendance/break-end
- 残業開始
/attendance/overtime-start
- 出勤
- 打刻まるめ設定:
- 例: 15分単位、30分単位など
- 0時をまたいでも前日の勤怠にカウント
- 例: 23:30出勤 → 翌01:00退勤 → 23日の勤務として記録
4. 勤怠履歴 /attendance/history
- 表示情報:
- 日付別の勤怠ログ
- 勤務時間、休憩時間、残業時間
- 承認状況(承認済み・未承認・差戻し)
- 機能:
- フィルタ(期間指定、承認状況)
- 管理者は編集可能(後から修正)
5. 承認フロー /attendance/approval
- 表示情報:
- 承認待ち勤怠リスト
- 承認状況(未承認・承認済み・差戻し)
- 機能:
- 一括承認 / 個別承認
- 差戻しコメント記入
- 承認アラート(承認期限が近い場合、管理者に通知)
- 月末に未承認の勤怠がある場合、管理者へアラート通知
6. 管理者メニュー /admin
📌 勤怠管理 /admin/attendance
- 全従業員の勤怠一覧表示
- 打刻修正機能
- 打刻まるめ設定の適用
📌 承認管理 /admin/approval
- 未承認勤怠の一覧
- 一括承認 / 差戻し
📌 勤怠レポート /admin/reports
- CSVダウンロード
- フィルタ(期間・従業員・承認状況)
- 勤怠データの出力(出勤、退勤、休憩、残業)
📌 勤怠設定 /admin/settings
- 打刻まるめの設定
- 残業開始時間の設定
- 承認フローの設定
- 0時をまたぐ勤怠の処理方法
📂 CSVダウンロード (管理者のみ)
- 出力項目:
- 日付
- 従業員名
- 出勤時間
- 退勤時間
- 休憩時間
- 残業時間
- 承認状況
- 一括ダウンロード
- 月次/週次レポート
🔔 アラート通知
- 従業員
- 出勤・退勤・休憩・残業のリマインダー
- 管理者
- 承認期限のアラート(未承認勤怠がある場合)
- 月末に未承認の勤怠がある場合、アラートを発生
- 修正があった場合、通知
✅ 仕様のポイント
- 出勤・退勤・休憩・残業の打刻
- 出勤・退勤・休憩の時間管理が可能
- 打刻まるめ (例: 15分単位)
- 0時をまたいだ場合も前日扱いで記録
- 承認フロー
- 承認待ちリスト に登録
- 管理者が承認 or 差戻し
- 未承認のものは月末アラート
- レポート・ダウンロード
- CSV出力
- フィルタ機能(期間、従業員)
- 設定・管理者機能
- 残業開始時間の設定
- 承認フローの管理
- 勤怠編集権限
DB設計のサンプル
RDB(MySQL, PostgreSQL, MariaDB など)を想定し、
ユーザー管理・勤怠記録・承認フロー・設定 を考慮した設計です。
📂 テーブル一覧
No | テーブル名 | 用途 |
---|---|---|
1 | users | 従業員情報(ログイン) |
2 | attendances | 勤怠打刻データ |
3 | attendance_approvals | 勤怠承認データ |
4 | attendance_settings | 勤怠設定 |
5 | roles | 権限(管理者・従業員) |
📌 users
(従業員情報)
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL COMMENT '名前',
email VARCHAR(255) UNIQUE NOT NULL COMMENT 'メールアドレス',
password VARCHAR(255) NOT NULL COMMENT 'パスワード(ハッシュ化)',
role_id INT NOT NULL COMMENT '権限 (1=管理者, 2=従業員)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時',
FOREIGN KEY (role_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
📝 説明
role_id
: 1=管理者, 2=従業員(役割を分ける)
📌 attendances
(勤怠打刻)
CREATE TABLE attendances (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL COMMENT '従業員ID',
work_date DATE NOT NULL COMMENT '勤怠日',
clock_in DATETIME NULL COMMENT '出勤時間',
break_start DATETIME NULL COMMENT '休憩開始時間',
break_end DATETIME NULL COMMENT '休憩終了時間',
overtime_start DATETIME NULL COMMENT '残業開始時間',
clock_out DATETIME NULL COMMENT '退勤時間',
total_work_time INT DEFAULT 0 COMMENT '勤務時間(分)',
total_overtime INT DEFAULT 0 COMMENT '残業時間(分)',
total_break_time INT DEFAULT 0 COMMENT '休憩時間(分)',
status ENUM('未承認', '承認済み', '差戻し') DEFAULT '未承認' COMMENT '承認ステータス',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時',
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
📝 説明
- 0時をまたぐ場合 →
work_date
は前日に統一 status
:未承認
: 初回登録承認済み
: 承認後差戻し
: 修正依頼
📌 attendance_approvals
(勤怠承認データ)
CREATE TABLE attendance_approvals (
id INT AUTO_INCREMENT PRIMARY KEY,
attendance_id INT NOT NULL COMMENT '勤怠ID',
approved_by INT NOT NULL COMMENT '承認者(管理者ID)',
approved_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '承認日時',
comment TEXT COMMENT '承認/差戻しコメント',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時',
FOREIGN KEY (attendance_id) REFERENCES attendances(id),
FOREIGN KEY (approved_by) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
📝 説明
- 管理者のみ承認可能
comment
に 差戻し理由 を記録
📌 attendance_settings
(勤怠設定)
CREATE TABLE attendance_settings (
id INT AUTO_INCREMENT PRIMARY KEY,
setting_name VARCHAR(255) NOT NULL COMMENT '設定名',
setting_value VARCHAR(255) NOT NULL COMMENT '設定値',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
📝 説明
設定名 (setting_name ) | 設定値 (setting_value ) |
---|---|
rounding | 15 (15分単位) |
overtime_start | 19:00 (残業開始時刻) |
auto_approval | false (自動承認) |
📌 roles
(権限管理)
CREATE TABLE roles (
id INT AUTO_INCREMENT PRIMARY KEY,
role_name VARCHAR(255) NOT NULL COMMENT '権限名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
📝 データ
sqlコピーする編集するINSERT INTO roles (id, role_name) VALUES (1, '管理者'), (2, '従業員');
🔍 想定されるクエリ
1. 勤怠記録の追加
INSERT INTO attendances (user_id, work_date, clock_in)
VALUES (5, '2025-03-20', NOW());
2. 退勤時の更新
UPDATE attendances
SET clock_out = NOW(), total_work_time = TIMESTAMPDIFF(MINUTE, clock_in, NOW())
WHERE user_id = 5 AND work_date = '2025-03-20';
3. 未承認の勤怠を取得(管理者用)
SELECT a.*, u.name
FROM attendances a
JOIN users u ON a.user_id = u.id
WHERE a.status = '未承認';
4. 勤怠の承認
UPDATE attendances SET status = '承認済み' WHERE id = 10;
INSERT INTO attendance_approvals (attendance_id, approved_by, comment)
VALUES (10, 1, '確認しました');
5. 月末未承認リストを取得
SELECT u.name, a.*
FROM attendances a
JOIN users u ON a.user_id = u.id
WHERE a.status = '未承認' AND a.work_date >= LAST_DAY(CURDATE()) - INTERVAL 1 MONTH;
6. CSVエクスポート用(管理者)
SELECT
u.name AS '従業員名',
a.work_date AS '日付',
a.clock_in AS '出勤時間',
a.clock_out AS '退勤時間',
a.total_work_time AS '勤務時間(分)',
a.total_overtime AS '残業時間(分)',
a.status AS '承認状況'
FROM attendances a
JOIN users u ON a.user_id = u.id
WHERE a.work_date BETWEEN '2025-03-01' AND '2025-03-31';