# LEAVE-001: 休暇申請システム（IM-Workflow）

## 概要

社員が年次有給休暇・半日有給休暇をオンラインで申請し、上長と人事部の2段階承認を経て有給残日数を自動管理するシステム。
申請時に残日数チェック・重複チェック等のバリデーションを行い、最終承認完了時に有給残日数を減算する。

## 対象ユーザ

| ペルソナ   | 説明                                                                 |
| ---------- | -------------------------------------------------------------------- |
| 一般社員   | 休暇を申請する社員。残日数を確認し、手軽に申請したい                 |
| 上長       | 部下の休暇申請を承認する直属の上司。部下の勤務状況を考慮して判断する |
| 人事部担当 | 休暇申請の最終承認を行う。全社の有給取得状況を管理する               |

## ユーザストーリー

### 一般社員として

- 残日数を確認したうえで休暇を申請できる。残日数不足時は申請できない
- 上長が未処理であれば申請を引き戻して修正・再申請できる
- 不要になった申請を取り止めることができる
- 差し戻された申請のコメントを確認し、修正して再申請できる

### 上長として

- 部下の休暇申請内容（種別・期間・理由・残日数）を確認し、承認・差戻し・否認できる
- 差戻し・否認時はコメントで理由を伝えられる
- 処理を一時保留し、後から再開できる
- 人事部が未処理であれば承認を引き戻せる

### 人事部担当として

- 上長承認済みの休暇申請を最終確認し、承認終了・差戻し・否認できる
- 差戻し先を申請者または上長から選択できる
- 最終承認完了時に有給残日数が自動的に減算される

## ワークフロー定義

> 各定義の詳細は個別のドキュメントを参照。
>
> - [フロー定義](flow_definition.md) - 機能設定・フローグループ・機能方針
> - [コンテンツ定義](content_definition.md) - 画面定義・ユーザプログラム・通知定義
> - [ルート定義](route_definition.md) - ノード定義・処理権限者プラグイン・処理フロー

## 機能要件

### F-001: 休暇申請

#### F-001-1: 申請入力

- 申請者は休暇申請フォームに必要事項を入力し、申請を行える
- 申請に必要な情報:
  - 休暇種別（必須、選択式: 年次有給休暇/半日有給休暇）
  - 開始日（必須、当日以降の日付）
  - 終了日（必須、開始日以降の日付。半日有給休暇の場合は開始日と同一）
  - 半日区分（半日有給休暇の場合のみ必須、選択式: 午前/午後）
  - 取得日数（自動計算、土日祝を除く営業日数。半日有給休暇の場合は0.5日）
  - 申請理由（必須、選択式: 私用/通院/冠婚葬祭/家庭事情/リフレッシュ/その他）
  - 緊急連絡先（任意、最大50文字）
  - 備考（任意、最大500文字）
- 申請時に有給残日数を表示し、残日数を超える申請は不可とする（ユーザプログラムでバリデーション）
- 申請完了時にユーザプログラムにより`leave_request`テーブルへデータを保存する
- 申請完了時に上長へ通知メールを送信する

#### F-001-2: 申請の引戻し

- 申請者は上長が未処理の申請を引き戻すことができる
- 引戻し後、申請内容を修正して再申請が可能

#### F-001-3: 申請の取止め

- 申請者は未承認の申請を取り止めることができる
- 取止め後、案件は完了（取止め）となる

#### F-001-4: 差戻し後の再申請

- 差戻しされた申請を修正して再申請できる
- 差戻しコメントを確認したうえで修正を行う
- 再申請時にユーザプログラムにより`leave_request`テーブルを更新し、バリデーションを再実行する

### F-002: 承認処理

#### F-002-1: 上長承認

- 上長は部下の休暇申請を確認し、承認・差戻し・否認・保留・保留解除を行える
- 承認時の確認事項:
  - 申請内容（休暇種別、期間、理由）
  - 部下の有給残日数
- 差戻し時は差戻しコメントの入力が必須（最大300文字）
- 差戻し先は申請ノードとする
- 否認時は否認理由の入力が必須（最大300文字）
- 保留時は本人以外の処理対象者の処理が禁止される
- 人事部が未処理の場合、上長は引戻しが可能
- 処理完了時に申請者へ結果通知メールを送信する

#### F-002-2: 人事部最終承認

- 人事部担当者は上長承認済みの休暇申請を確認し、承認終了・差戻し・否認・保留・保留解除を行える
- 最終承認時の確認事項:
  - 申請内容（休暇種別、期間、理由）
  - 申請者の有給残日数
  - 社内規定との整合性
- 差戻し時は差戻しコメントの入力が必須（最大300文字）
- 差戻し先は申請ノードまたは上長承認ノード（任意の処理済みノード）を選択可能
- 否認時は否認理由の入力が必須（最大300文字）
- 保留時は本人以外の処理対象者の処理が禁止される
- 承認終了時にユーザプログラムにより`leave_balance`テーブルの有給残日数を減算する
- 処理完了時に申請者へ結果通知メールを送信する

### F-003: 有給残日数表示

- 申請画面に有給残日数を表示する
- 残日数 = 年間付与日数 + 前年繰越日数 − 取得済日数

## 非機能要件

### 性能要件

- 画面表示: 3秒以内
- 申請・承認処理: 2秒以内
- 同時接続ユーザ数: 500人

## ビジネスルール

| ID     | ルール                                                                                              |
| ------ | --------------------------------------------------------------------------------------------------- |
| BR-001 | 有給残日数を超える休暇申請は不可                                                                    |
| BR-002 | 半日有給休暇の場合、開始日と終了日は同一でなければならない                                          |
| BR-003 | 取得日数は土日祝を除く営業日数で自動計算する（半日有給休暇の場合は0.5日）                           |
| BR-004 | 開始日は申請日以降でなければならない                                                                |
| BR-005 | 最終承認完了時にユーザプログラムにより`leave_balance`の有給残日数を減算する                         |
| BR-006 | 否認・取止めされた申請は有給残日数に影響しない。`leave_request`のデータは削除せず履歴として保持する |
| BR-007 | 同一期間に重複する休暇申請は不可                                                                    |

## 画面一覧

| 画面ID  | 画面名   | IM-Workflow画面種別   | 概要                                                                     |
| ------- | -------- | --------------------- | ------------------------------------------------------------------------ |
| SCR-001 | 休暇申請 | 申請画面 / 再申請画面 | 休暇申請の入力フォーム。有給残日数を表示。再申請時は差戻しコメントを表示 |
| SCR-002 | 処理     | 処理画面              | 承認者が申請内容を確認し、承認・差戻し・否認・保留を行う画面             |
| SCR-003 | 処理詳細 | 処理詳細画面          | 処理対象者が案件の詳細を参照する画面                                     |
| SCR-004 | 参照詳細 | 参照詳細画面          | 参照者が案件の詳細を参照する画面                                         |

## 画面項目定義

### SCR-001: 休暇申請画面（申請画面 / 再申請画面）

| 項目名         | 入力種別 | 必須 | 備考                                            |
| -------------- | -------- | ---- | ----------------------------------------------- |
| 申請者         | 表示のみ | -    | ログインユーザ名を自動表示                      |
| 所属組織       | 表示のみ | -    | ログインユーザの所属組織を自動表示              |
| 有給残日数     | 表示のみ | -    | 現在の有給休暇残日数を表示                      |
| 休暇種別       | セレクト | ○    | 年次有給休暇/半日有給休暇                       |
| 開始日         | 日付     | ○    | カレンダーピッカー。当日以降                    |
| 終了日         | 日付     | ○    | カレンダーピッカー。開始日以降                  |
| 半日区分       | ラジオ   | △    | 午前/午後。半日有給休暇の場合のみ表示・必須     |
| 取得日数       | 表示のみ | -    | 営業日数を自動計算して表示                      |
| 申請理由       | セレクト | ○    | 私用/通院/冠婚葬祭/家庭事情/リフレッシュ/その他 |
| 緊急連絡先     | テキスト | -    | 最大50文字                                      |
| 備考           | テキスト | -    | 最大500文字                                     |
| 差戻しコメント | 表示のみ | -    | 再申請時のみ表示。承認者の差戻しコメントを表示  |

### SCR-002: 処理画面（承認者向け）

| 項目名     | 入力種別 | 必須 | 備考                              |
| ---------- | -------- | ---- | --------------------------------- |
| 申請者     | 表示のみ | -    | 申請者名                          |
| 所属組織   | 表示のみ | -    | 申請者の所属組織                  |
| 有給残日数 | 表示のみ | -    | 申請者の有給休暇残日数            |
| 休暇種別   | 表示のみ | -    | 申請内容を表示                    |
| 開始日     | 表示のみ | -    | 申請内容を表示                    |
| 終了日     | 表示のみ | -    | 申請内容を表示                    |
| 半日区分   | 表示のみ | -    | 半日有給休暇の場合のみ表示        |
| 取得日数   | 表示のみ | -    | 申請内容を表示                    |
| 申請理由   | 表示のみ | -    | 申請内容を表示                    |
| 緊急連絡先 | 表示のみ | -    | 申請内容を表示                    |
| 備考       | 表示のみ | -    | 申請内容を表示                    |
| コメント   | テキスト | △    | 差戻し・否認時は必須。最大300文字 |

### SCR-003: 処理詳細画面（処理対象者向け）

| 項目名     | 入力種別 | 備考                       |
| ---------- | -------- | -------------------------- |
| 申請者     | 表示のみ | 申請者名                   |
| 所属組織   | 表示のみ | 申請者の所属組織           |
| 有給残日数 | 表示のみ | 申請者の有給休暇残日数     |
| 休暇種別   | 表示のみ | 申請内容を表示             |
| 開始日     | 表示のみ | 申請内容を表示             |
| 終了日     | 表示のみ | 申請内容を表示             |
| 半日区分   | 表示のみ | 半日有給休暇の場合のみ表示 |
| 取得日数   | 表示のみ | 申請内容を表示             |
| 申請理由   | 表示のみ | 申請内容を表示             |
| 緊急連絡先 | 表示のみ | 申請内容を表示             |
| 備考       | 表示のみ | 申請内容を表示             |
| 処理履歴   | 表示のみ | 各ノードの処理履歴を表示   |

### SCR-004: 参照詳細画面（参照者向け）

SCR-003（処理詳細画面）と同一のレイアウト・項目を使用する。

## データモデル（概要）

### ユーザデータ（ユーザコンテンツ管理範囲）

```
休暇申請 (leave_request)
├── ユーザデータID (PK)
├── 申請者ユーザID
├── 休暇種別 (annual/half_day)
├── 開始日
├── 終了日
├── 半日区分 (am/pm, nullable)
├── 取得日数
├── 申請理由区分
├── 緊急連絡先
├── 備考
├── 作成日時
└── 更新日時

有給残日数 (leave_balance)
├── ユーザID (PK)
├── 年度 (PK)
├── 付与日数
├── 繰越日数
├── 取得済日数
├── 残日数 (= 付与日数 + 繰越日数 − 取得済日数)
├── 作成日時
└── 更新日時
```

### 案件プロパティ

| プロパティキー | 設定タイミング | 用途                             |
| -------------- | -------------- | -------------------------------- |
| leave_days     | 申請時         | 取得日数。メール置換文字列で使用 |

## 用語集

| 用語         | 説明                                                                         |
| ------------ | ---------------------------------------------------------------------------- |
| 年次有給休暇 | 労働基準法に基づき、勤続年数に応じて付与される有給の休暇                     |
| 半日有給休暇 | 1日の有給休暇を午前・午後に分割して取得する休暇。0.5日として計算する         |
| 有給残日数   | 当年度に取得可能な有給休暇の残り日数（付与日数 + 前年繰越日数 − 取得済日数） |
| 営業日       | 土曜日・日曜日・祝日を除いた稼働日                                           |
