# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 1 | システム名 | 勤怠休暇管理システム | | 2 | プログラムID | KIN07DAI | | 3 | プログラム名 | 日別勤怠計算処理 | | 4 | PGMタイプ | メイン | | 5 | PGMパターン | マッチング(1:N) + EVALUATE 4パターン分岐 | | 6 | 機能概要 | WORK-DAY-FILE(主駆動)とKIN-LEAVE/LEAVE-DAILYを社員番号+日付で照合し、 | | 7 | | 4パターンに分岐して日別勤怠記録(DAILY-RECORD)を出力する。 | | 8 | | パターンA: 打刻+休暇あり / B: 打刻のみ / C: 休暇のみ / D: 欠勤 | | 9 | | 休暇時間はランチ除外+0.1h切上丸め。MULTIPLY/SUBTRACT時間計算。 | ### 前提条件 | NO | 対象ファイル | 条件 | |----|-------------|------| | 1 | R01(WORK-DAY-FILE) | 社員番号+日付の昇順でソートされていること | | 2 | R02(KIN-LEAVE) | 社員番号+日付の昇順でソートされていること | | 3 | R03(LEAVE-DAILY) | 社員番号+日付の昇順でソートされていること | ### 使用ファイル一覧 | NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | |----|---------------|--------|------|-----|--------|------|---------|-----------|------|------| | 1 | WORK-DAY-FILE | R01 | KIN07R01 | I | KIN06REC | FB | | 80 | PS | 出勤日カレンダー(COPY句定義書.md参照) | | 2 | KIN-LEAVE | R02 | KIN07R02 | I | KIN03REC | FB | | 160 | PS | 打刻+休暇照合結果(COPY句定義書.md参照) | | 3 | LEAVE-DAILY | R03 | KIN07R03 | I | KIN02REC | FB | | 80 | PS | 日別展開休暇(COPY句定義書.md参照) | | 4 | DAILY-RECORD | W01 | KIN07W01 | O | KIN07REC | FB | | 200 | PS | 日別勤怠計算結果(COPY句定義書.md参照) | | 5 | ERROR-LOG | W02 | KIN07E01 | O | KIN05REC | VB | | 200 | PS | エラーログ(COPY句定義書.md参照) | ### キー項目一覧 | NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | |----|-----------|---------------------|-------------------------------------------| | 1 | ファイルR01 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) | | 2 | ファイルR02 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) | | 3 | ファイルR03 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) | ### 使用モジュール一覧 | NO | 機能 | プログラムID | 使用COPY名 | |----|------|-------------|-----------| | 1 | メッセージ編集出力 | SUB02MSG | ZANMSGAC | | 2 | ABEND処理 | SUB03END | ZANENDAC | | 3 | 時刻丸め計算(0.1h切上) | SUB05TIM | ZANTIMAC | --- ## 処理詳細 ``` 1.初期処理 (1000ITTSOR) 1-1.開始メッセージ出力 【メッセージ編集】 メッセージ番号:1(開始メッセージ) 1-2.コンパイル日時出力 【メッセージ編集】 メッセージ番号:33(コンパイル日時) PARM1:コンパイル日時 PARM2:'COMPILED' 1-3.ワークエリアの初期化(INITIALIZE WRKARA) 1-4.入出力ファイルOPEN INPUT: R01INNFIL, R02INNFIL, R03INNFIL OUTPUT: W01OUTFIL, W02OUTFIL 1-5.R01を読み込む。(1100R01INNSOR)(1回目) 1-6.R02を読み込む。(1200R02INNSOR)(1回目) 1-7.R03を読み込む。(1300R03INNSOR)(1回目) 2.主処理 (2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) 2-1.キー比較:R01とR02/R03のキーを比較し、PATTERN-NUMを設定 【MULTIPLY使用】時間→分換算時にMULTIPLY文を使用 【SUBTRACT使用】ランチ除外時にSUBTRACT文を使用 2-2.パターン判定(EVALUATE) EVALUATE PATTERN-NUM WHEN 1 → PERFORM 6100PATTERNASOR (打刻+休暇) WHEN 2 → PERFORM 6200PATTERNSOR (打刻のみ) WHEN 3 → PERFORM 6300PATTERNSOR (休暇のみ) WHEN 4 → PERFORM 6400PATTERNSOR (欠勤) END-EVALUATE 2-3.【パターンA(6100PATTERNASOR)】:R01+R02+R03(打刻+休暇) 2-3-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定 2-3-2.休暇時間計算:R03の開始時刻/終了時刻からランチ除外+丸め計算 MULTIPLY: WRK-START-HOUR × 60 GIVING WRK-START-MIN(時→分変換) SUBTRACT: ランチ時間(60分)をWRK-START-MINから除外 2-3-3.SUB05TIM呼出(モード1:0.1h切上) 【CALL 'SUB05TIM'】 CALL 'SUB05TIM' USING T01TIMPAR T01TIMHRS=WRK-LEAVE-HOURS, T01TIMRRC=1(0.1h切上モード) T01TIMOUTをWRK-LEAVE-HOURSに退避 2-3-4.DAILY-RECORD出力 2-3-5.R01/R02/R03次読込 2-4.【パターンB(6200PATTERNSOR)】:R01+R02のみ(打刻のみ) 2-4-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定 2-4-2.休暇時間=0, 欠勤=0 2-4-3.DAILY-RECORD出力 2-4-4.R01/R02次読込(R03はキー不一致のため読込済み) 2-5.【パターンC(6300PATTERNSOR)】:R01+R03のみ(休暇のみ) 2-5-1.打刻情報=0000 2-5-2.休暇時間計算:ランチ除外+丸め(所定労働時間8h上限) MULTIPLY/SUBTRACT使用(パターンAと同様) WRK-LEAVE-HOURS > 8.0 → 8.0に制限 2-5-3.SUB05TIM呼出(モード1:0.1h切上) 2-5-4.DAILY-RECORD出力 2-5-5.R01/R03次読込(R02はキー不一致のため読込済み) 2-6.【パターンD(6400PATTERNSOR)】:R01のみ(欠勤) 2-6-1.打刻情報=0000, 休暇=0 2-6-2.未申請欠勤=8.0h 2-6-3.DAILY-RECORD出力 2-6-4.R01次読込(R02/R03はキー不一致のため読込済み) 2-7.各パターンセクションはPERFORMで呼び出され、EXITで自動復帰 主処理ループ(2000MAJSOR)に戻り、次のR01レコードを処理する。 3.終了処理(3000STPSOR) 3-1.入出力ファイルのクローズ 3-2.入出力件数出力 【メッセージ編集】 メッセージ番号:6(入力件数) PARM1:該当ファイルDD名 PARM2:該当ファイル件数 メッセージ番号:7(出力件数) PARM1:該当ファイルDD名 PARM2:該当ファイル件数 3-3.終了メッセージ出力 【メッセージ編集】 メッセージ番号:2(終了メッセージ) 4.メッセージ出力(4000MSGOUTSOR) SUB02MSG呼出し 9.ABEND処理(9999ABDSOR) SUB03END呼出し ``` --- ## 出力レコード定義 ### 出力ファイル1(W01: DAILY-RECORD) | No | 項目名 | 設定元 | 備考 | |----|--------|--------|------| | 1 | SD-EMP-ID | SW-EMP-ID(R01) | 社員番号 | | 2 | SD-DATE | SW-DATE(R01) | YYYYMMDD | | 3 | SD-TIME-IN | SR-STR-TIME(R02) or '0000' | 出勤時刻(パターンC/Dは0000) | | 4 | SD-TIME-OUT | SR-END-TIME(R02) or '0000' | 退勤時刻(パターンC/Dは0000) | | 5 | SD-ANNUAL-H | R03(LEAVE-TYPE='01')より計算 | 年休使用時間(ランチ除外+丸め) | | 6 | SD-PERSONAL-H | R03(LEAVE-TYPE='02')より計算 | 事假時間 | | 7 | SD-OFFICIAL-H | R03(LEAVE-TYPE='03')より計算 | 因公特批假時間 | | 8 | SD-SICK-H | R03(LEAVE-TYPE='04')より計算 | 病欠時間 | | 9 | SD-ABSENT-H | パターンDのみ8.0固定 | 未申請欠勤時間 | | 10 | SD-FILLER | SPACE | 予備領域 | ### 出力ファイル2(W02: ERROR-LOG) | No | 項目名 | 設定元 | 備考 | |----|--------|--------|------| | 1 | WEERR-CATEGORY | '99'固定 | エラー区分(未使用だが予約) | | 2 | WEERR-DETAIL | STRING編集 | エラー詳細(SUB05TIM異常時等) |