diff --git a/bin/KIN02UPD.exe b/bin/KIN02UPD.exe index d5f9fff..31a7cbc 100644 Binary files a/bin/KIN02UPD.exe and b/bin/KIN02UPD.exe differ diff --git a/bin/KIN03EXP.exe b/bin/KIN03EXP.exe index 9b1fc64..01f96a8 100644 Binary files a/bin/KIN03EXP.exe and b/bin/KIN03EXP.exe differ diff --git a/bin/KIN04CHK.exe b/bin/KIN04CHK.exe new file mode 100644 index 0000000..a53745a Binary files /dev/null and b/bin/KIN04CHK.exe differ diff --git a/bin/KIN05MAT.exe b/bin/KIN05MAT.exe new file mode 100644 index 0000000..049c847 Binary files /dev/null and b/bin/KIN05MAT.exe differ diff --git a/bin/KIN06CLD.exe b/bin/KIN06CLD.exe new file mode 100644 index 0000000..bad2152 Binary files /dev/null and b/bin/KIN06CLD.exe differ diff --git a/bin/KIN07DAI.exe b/bin/KIN07DAI.exe new file mode 100644 index 0000000..a1a6bd2 Binary files /dev/null and b/bin/KIN07DAI.exe differ diff --git a/cpy/KIN04REC.cpy b/cpy/KIN04REC.cpy new file mode 100644 index 0000000..44cf615 --- /dev/null +++ b/cpy/KIN04REC.cpy @@ -0,0 +1,10 @@ + * + * 勤怠: 打刻編集レコード EDITED-PUNCH 80B + * + 03 (A)EMP-ID PIC X(008). + 03 (A)WORK-DATE PIC 9(008). + 03 (A)STR-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)DEPT-ID PIC X(004). + 03 (A)TERMINAL PIC X(006). + 03 (A)FILLER PIC X(046). diff --git a/cpy/KIN05REC.cpy b/cpy/KIN05REC.cpy new file mode 100644 index 0000000..99208a9 --- /dev/null +++ b/cpy/KIN05REC.cpy @@ -0,0 +1,5 @@ + * + * 勤怠: エラーログレコード KERR-LOG VB可変長 + * + 03 (A)ERR-CATEGORY PIC 9(002). + 03 (A)ERR-DETAIL PIC X(198). diff --git a/cpy/KIN06REC.cpy b/cpy/KIN06REC.cpy new file mode 100644 index 0000000..726aa7d --- /dev/null +++ b/cpy/KIN06REC.cpy @@ -0,0 +1,7 @@ + * + * 勤怠: 出勤日カレンダーレコード WORK-DAY-FILE 80B + * + 03 (A)EMP-ID PIC X(008). + 03 (A)DATE PIC 9(008). + 03 (A)DAY-OF-WEEK PIC 9(001). + 03 (A)FILLER PIC X(063). diff --git a/cpy/KIN07REC.cpy b/cpy/KIN07REC.cpy new file mode 100644 index 0000000..d57a544 --- /dev/null +++ b/cpy/KIN07REC.cpy @@ -0,0 +1,13 @@ + * + * 勤怠: 日別勤怠計算レコード DAILY-RECORD 200B + * + 03 (A)EMP-ID PIC 9(008). + 03 (A)DATE PIC 9(008). + 03 (A)TIME-IN PIC 9(004). + 03 (A)TIME-OUT PIC 9(004). + 03 (A)ANNUAL-H PIC 9(004)V9(001). + 03 (A)PERSONAL-H PIC 9(004)V9(001). + 03 (A)OFFICIAL-H PIC 9(004)V9(001). + 03 (A)SICK-H PIC 9(004)V9(001). + 03 (A)ABSENT-H PIC 9(004)V9(001). + 03 (A)FILLER PIC X(151). diff --git a/src/KIN02UPD.cbl b/src/KIN02UPD.cbl index 7feb5ee..79c056d 100644 --- a/src/KIN02UPD.cbl +++ b/src/KIN02UPD.cbl @@ -1,22 +1,22 @@ IDENTIFICATION DIVISION. PROGRAM-ID. KIN02UPD. ***************************************************************** - * システム名 : 勤怠休暇管理システム * - * プログラムID : KIN02UPD * - * プログラム名 : 休暇申請DB更新処理 * - * 作成日 : 2026-06-17 * - * 処理概要 : WORK-LEAVEの各レコードをDB2テーブル * - * LEAVE_RECORDSに反映する。 * - * ステータスに応じて新規登録(INSERT)、 * + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN02UPD * + * プログラム名 : 休暇申請DB更新処理 * + * 作成日 : 2026-06-17 * + * 処理概要 : WORK-LEAVEの各レコードをDB2テーブル * + * LEAVE_RECORDSに反映する。 * + * ステータスに応じて新規登録(INSERT)、 * * 変更(DELETE+INSERT)、取消(DELETE)を行う。 * - * * + * * ***************************************************************** - * 更新履歴 * + * 更新履歴 * *---------------------------------------------------------------* - * 更新日付 担当者 更新内容 * + * 更新日付 担当者 更新内容 * *---------------------------------------------------------------* - * 26-06-17 @@@ 新規作成 * - * * + * 26-06-17 @@@ 新規作成 * + * * ***************************************************************** ENVIRONMENT DIVISION. CONFIGURATION SECTION. @@ -32,7 +32,7 @@ FILE SECTION. * ***************************************************************** - * R01 (WORK-LEAVE) 80B FB * + * R01 (WORK-LEAVE) 80B FB * ***************************************************************** FD R01INNFIL LABEL RECORD IS STANDARD @@ -43,7 +43,7 @@ * * ***************************************************************** - * W01 (ERROR-LOG) 200B VB * + * W01 (ERROR-LOG) 200B VB * ***************************************************************** FD W01OUTFIL LABEL RECORD IS STANDARD @@ -55,12 +55,12 @@ WORKING-STORAGE SECTION. * ***************************************************************** - * SQLCA * + * SQLCA * ***************************************************************** EXEC SQL INCLUDE SQLCA END-EXEC. * ***************************************************************** - * コンスタント領域 * + * コンスタント領域 * ***************************************************************** 01 CNSARA. 03 CNS-PRGIDX PIC X(008) VALUE 'KIN02UPD'. @@ -74,7 +74,7 @@ 03 CNS-KN0002 PIC 9(001) VALUE 2. * ***************************************************************** - * カウンタ領域 * + * カウンタ領域 * ***************************************************************** 01 CUNARA. 03 CUN-R01INN PIC S9(009) COMP-3 @@ -89,15 +89,16 @@ VALUE ZERO. * ***************************************************************** - * 作業領域 * + * 作業領域 * ***************************************************************** 01 WRKARA. *** EOF判定 03 WRK-R01EOF PIC X(001). 88 WRK-R01-EOF VALUE '1'. *** SQL用ホスト変数 - 03 WS-APPL-ID PIC 9(009). - 03 WS-EMP-ID PIC X(008). + 03 WS-APPL-ID PIC 9(009). + 03 WS-NEXT-APPL-ID PIC 9(009). + 03 WS-EMP-ID PIC X(008). 03 WS-LEAVE-TYPE PIC X(002). 03 WS-START-DATE PIC X(008). 03 WS-START-TIME PIC X(004). @@ -111,7 +112,7 @@ 03 WRK-ERR-DETAIL PIC X(198). * ***************************************************************** - * サブプログラム連絡領域 * + * サブプログラム連絡領域 * ***************************************************************** *** メッセージ編集出力SR用 COPY ZANMSGAC. @@ -120,9 +121,9 @@ * PROCEDURE DIVISION. ***************************************************************** - * サブモジュールNO: (0.0) * - * サブモジュール名: 制御処理 * - * 処理概要 : メインコントロール処理 * + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * ***************************************************************** 0000MAJCOLSOR SECTION. * @@ -139,9 +140,9 @@ 0000MAJCOLSOR-EXT. GOBACK. ***************************************************************** - * サブモジュールNO: (1.0) * - * サブモジュール名: 初期処理 * - * 処理概要 : 開始メッセージ出力・各種初期化処理 * + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * ***************************************************************** 1000ITTSOR SECTION. * @@ -164,19 +165,30 @@ EXEC SQL CONNECT TO 'data/kin.db' END-EXEC. * *** R01ファイルOPEN - OPEN INPUT R01INNFIL. + OPEN INPUT R01INNFIL. *** W01ファイルOPEN - OPEN OUTPUT W01OUTFIL. - * + OPEN OUTPUT W01OUTFIL. + + *** 最大APPLICATION_ID取得(新規ID生成用) + MOVE ZERO TO WS-NEXT-APPL-ID. + EXEC SQL + SELECT COALESCE(MAX(APPLICATION_ID), 0) + 1 + FROM LEAVE_RECORDS + INTO :WS-NEXT-APPL-ID + END-EXEC. + IF SQLCODE NOT = 0 + MOVE ZERO TO WS-NEXT-APPL-ID + END-IF. + *** R01を初回読込 - PERFORM 1100R01INNSOR. + PERFORM 1100R01INNSOR. * 1000ITTSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(1.1) * - * サブモジュール名:R01読込処理 * - * 処理概要 : WORK-LEAVE読込 * + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : WORK-LEAVE読込 * ***************************************************************** 1100R01INNSOR SECTION. * @@ -190,9 +202,9 @@ 1100R01INNSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(2.0) * - * サブモジュール名:主処理 * - * 処理概要 : R01(WORK-LEAVE)→DB更新処理 * + * サブモジュールNO:(2.0) * + * サブモジュール名:主処理 * + * 処理概要 : R01(WORK-LEAVE)→DB更新処理 * ***************************************************************** 2000MAJSOR SECTION. * @@ -205,9 +217,9 @@ 2000MAJSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(2.1) * - * サブモジュール名:レコード判定処理 * - * 処理概要 : ステータス判定→各DB更新処理分岐 * + * サブモジュールNO:(2.1) * + * サブモジュール名:レコード判定処理 * + * 処理概要 : ステータス判定→各DB更新処理分岐 * ***************************************************************** 2100PROCSOR SECTION. * @@ -236,36 +248,39 @@ 2100PROCSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(2.1.1) * - * サブモジュール名:INSERT処理(新規登録) * - * 処理概要 : LEAVE_RECORDSに新規レコード追加 * + * サブモジュールNO:(2.1.1) * + * サブモジュール名:INSERT処理(新規登録) * + * 処理概要 : LEAVE_RECORDSに新規レコード追加 * ***************************************************************** - 2110INSERTSOR SECTION. + 2110INSERTSOR SECTION. * - EXEC SQL - INSERT INTO LEAVE_RECORDS - (EMP_ID, LEAVE_TYPE, - START_DATE, START_TIME, - END_DATE, END_TIME, - STATUS) - VALUES - (:WS-EMP-ID, :WS-LEAVE-TYPE, - :WS-START-DATE, :WS-START-TIME, - :WS-END-DATE, :WS-END-TIME, - :WS-STATUS) - END-EXEC. + EXEC SQL + INSERT INTO LEAVE_RECORDS + (APPLICATION_ID, + EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME, + STATUS) + VALUES + (:WS-NEXT-APPL-ID, + :WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + END-EXEC. * - IF SQLCODE NOT = 0 - PERFORM 9100DBERRSOR - END-IF. + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. * - ADD 1 TO CUN-DBXINS. + ADD 1 TO WS-NEXT-APPL-ID. + ADD 1 TO CUN-DBXINS. * - 2110INSERTSOR-EXT. - EXIT. + 2110INSERTSOR-EXT. + EXIT. ***************************************************************** - * サブモジュールNO:(2.1.2) * - * サブモジュール名:UPDATE処理(変更) * + * サブモジュールNO:(2.1.2) * + * サブモジュール名:UPDATE処理(変更) * * 処理概要 : DELETE(旧レコード)→INSERT(新レコード) * ***************************************************************** 2120UPDATESOR SECTION. @@ -279,31 +294,33 @@ PERFORM 9100DBERRSOR END-IF. * - EXEC SQL - INSERT INTO LEAVE_RECORDS - (EMP_ID, LEAVE_TYPE, - START_DATE, START_TIME, - END_DATE, END_TIME, - STATUS) - VALUES - (:WS-EMP-ID, :WS-LEAVE-TYPE, - :WS-START-DATE, :WS-START-TIME, - :WS-END-DATE, :WS-END-TIME, - :WS-STATUS) - END-EXEC. + EXEC SQL + INSERT INTO LEAVE_RECORDS + (APPLICATION_ID, + EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME, + STATUS) + VALUES + (:WS-APPL-ID, + :WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + END-EXEC. * - IF SQLCODE NOT = 0 - PERFORM 9100DBERRSOR - END-IF. + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. * - ADD 1 TO CUN-DBXUPD. + ADD 1 TO CUN-DBXUPD. * 2120UPDATESOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(2.1.3) * - * サブモジュール名:DELETE処理(取消) * - * 処理概要 : APPL-ID一致レコードをDELETE * + * サブモジュールNO:(2.1.3) * + * サブモジュール名:DELETE処理(取消) * + * 処理概要 : APPL-ID一致レコードをDELETE * ***************************************************************** 2130DELETESOR SECTION. * @@ -321,9 +338,9 @@ 2130DELETESOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(3.0) * - * サブモジュール名:終了処理 * - * 処理概要 : COMMIT・ファイルクローズ・件数出力 * + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : COMMIT・ファイルクローズ・件数出力 * ***************************************************************** 3000STPSOR SECTION. * @@ -375,9 +392,9 @@ 3000STPSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(4.0) * - * サブモジュール名:メッセージ編集出力処理 * - * 処理概要 : メッセージ編集出力サブPGM呼出 * + * サブモジュールNO:(4.0) * + * サブモジュール名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * ***************************************************************** 4000MSGOUTSOR SECTION. * @@ -389,8 +406,8 @@ 4000MSGOUTSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(9.1) * - * サブモジュール名:DBエラー処理 * + * サブモジュールNO:(9.1) * + * サブモジュール名:DBエラー処理 * * 処理概要 : SQLエラー→ROLLBACK+メッセージ出力+ABEND * ***************************************************************** 9100DBERRSOR SECTION. @@ -426,9 +443,9 @@ 9100DBERRSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(9.9) * - * サブモジュール名:ABEND処理 * - * 処理概要 : ABENDサブPGM呼出 * + * サブモジュールNO:(9.9) * + * サブモジュール名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * ***************************************************************** 9999ABDSOR SECTION. * diff --git a/src/KIN03EXP.cbl b/src/KIN03EXP.cbl index 8c92299..7ea3d14 100644 --- a/src/KIN03EXP.cbl +++ b/src/KIN03EXP.cbl @@ -1,4 +1,4 @@ - IDENTIFICATION DIVISION. + IDENTIFICATION DIVISION. PROGRAM-ID. KIN03EXP. ***************************************************************** * システム名 : 勤怠休暇管理システム * @@ -24,7 +24,8 @@ * INPUT-OUTPUT SECTION. FILE-CONTROL. - SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT". + SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT" + FILE STATUS IS WS-W01-STATUS. * DATA DIVISION. FILE SECTION. @@ -85,7 +86,9 @@ ***************************************************************** * 作業領域 * ***************************************************************** - 01 WRKARA. + 01 WRKARA. + *** ファイルステータス + 03 WS-W01-STATUS PIC X(002). *** EOF判定 03 WRK-R01EOF PIC X(001). 88 WRK-R01-EOF VALUE '1'. @@ -191,7 +194,13 @@ PERFORM 1200HDINNSOR. * *** 出力ファイルOPEN - OPEN OUTPUT W01OUTFIL. + OPEN OUTPUT W01OUTFIL. + * + *** OPENチェック + IF WS-W01-STATUS NOT = '00' + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. * *** C1カーソル初回FETCH(SELECT INTO) PERFORM 1100C1INITSOR. diff --git a/src/KIN04CHK.cbl b/src/KIN04CHK.cbl new file mode 100644 index 0000000..988686d --- /dev/null +++ b/src/KIN04CHK.cbl @@ -0,0 +1,472 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN04CHK. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN04CHK * + * プログラム名 : 打刻項目チェック処理 * + * 作成日 : 2026-06-19 * + * 処理概要 : CSV形式の打刻データファイルを読み込み、 * + * IF多重ネスト(句)で4段階チェックを実施、 * + * 正常はWRITE FROMでEDITED-PUNCHに出力、 * + * 異常はERROR-LOGに出力する。 * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-19 @@@ 新規作成 * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO KIN04R01. + SELECT W01OUTFIL ASSIGN TO KIN04W01. + SELECT W02OUTFIL ASSIGN TO KIN04W02. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + 03 R01LINE PIC X(80). + * + ***************************************************************** + * ##W01## * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY KIN04REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * ##W02## * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W02OUTREC. + COPY KIN05REC REPLACING ==(A)== BY ==W02==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN04CHK'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-ERR-PUNCH PIC 9(002) VALUE 02. + 03 CNS-FIELD-COUNT-6 PIC 9(002) VALUE 6. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + *** CSV分解用 + 03 WRK-COMMA-CNT PIC 9(002) COMP. + 03 WRK-CSV-EMP-ID PIC X(008). + 03 WRK-CSV-DATE PIC X(008). + 03 WRK-CSV-TIME-IN PIC X(004). + 03 WRK-CSV-TIME-OUT PIC X(004). + 03 WRK-CSV-DEPT-ID PIC X(004). + 03 WRK-CSV-TERMINAL PIC X(006). + *** 時刻数値変換用 + 03 WRK-TIME-IN-NUM PIC 9(004). + 03 WRK-TIME-OUT-NUM PIC 9(004). + *** DISPLAY変換用 + 03 WRK-COMMA-DISP PIC 9(002). + *** EMPIDチェック結果 + 03 WRK-EMPID-OK PIC X(001). + 88 WRK-EMPID-IS-OK VALUE '1'. + * + ***************************************************************** + * WRITE FROM用 出力レコード領域 * + ***************************************************************** + 01 WS-W01REC. + COPY KIN04REC REPLACING ==(A)== BY ==O1==. + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + *** 項目チェックSR用 + COPY ZANCHKAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + CONTINUE + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + OUTPUT W01OUTFIL + W02OUTFIL. + * + *** R01を読み込み + PERFORM 1100R01INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : CSV分解・IF多重ネスト(句)で4段階チェック * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** CSV分解 + PERFORM 2010CSVSOR. + * + *** 社員番号チェック + PERFORM 2021EMPIDSOR. + * + *** 項目チェック(IF多重ネスト 句) + PERFORM 2020VALIDATESOR. + * + *** 次のレコード読込 + PERFORM 1100R01INNSOR. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: CSV分解処理 * + * 処理概要 : UNSTRINGでCSVを6項目に分解する * + ***************************************************************** + 2010CSVSOR SECTION. + * + MOVE ZERO TO WRK-COMMA-CNT. + INITIALIZE WRK-CSV-EMP-ID + WRK-CSV-DATE + WRK-CSV-TIME-IN + WRK-CSV-TIME-OUT + WRK-CSV-DEPT-ID + WRK-CSV-TERMINAL. + UNSTRING R01INNREC + DELIMITED BY ',' + INTO WRK-CSV-EMP-ID + WRK-CSV-DATE + WRK-CSV-TIME-IN + WRK-CSV-TIME-OUT + WRK-CSV-DEPT-ID + WRK-CSV-TERMINAL + TALLYING IN WRK-COMMA-CNT + END-UNSTRING. + * + 2010CSVSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1.5) * + * サブモジュール名: 社員番号チェック * + * 処理概要 : SUB04CHK EMPIDで社員番号の妥当性チェック * + ***************************************************************** + 2021EMPIDSOR SECTION. + * + MOVE '0' TO WRK-EMPID-OK. + IF WRK-COMMA-CNT = CNS-FIELD-COUNT-6 + INITIALIZE C01CHKPAR + MOVE WRK-CSV-EMP-ID TO C01CHKDAT + MOVE 'EMPID' TO C01CHKTYP + CALL 'SUB04CHK' USING C01CHKPAR + IF C01CHKRRC = ZERO + MOVE '1' TO WRK-EMPID-OK + END-IF + END-IF. + * + 2021EMPIDSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: 項目チェック(IF多重ネスト 句) * + * 処理概要 : フィールド数→社員番号→日付→時刻→時刻順の * + * 4段階ネストチェックを句で記述 * + ***************************************************************** + 2020VALIDATESOR SECTION. + * + *** IF多重ネスト 句 (4段階) + *** 第1段階: フィールド数 + 社員番号必須 + IF WRK-COMMA-CNT = CNS-FIELD-COUNT-6 + AND WRK-EMPID-IS-OK + + *** 第2段階: 日付チェック(SUB04CHK) + INITIALIZE C01CHKPAR + MOVE WRK-CSV-DATE TO C01CHKDAT + MOVE 'DATE' TO C01CHKTYP + CALL 'SUB04CHK' USING C01CHKPAR + IF C01CHKRRC = ZERO + + *** 第3段階: 出勤時刻チェック(SUB04CHK) + INITIALIZE C01CHKPAR + MOVE WRK-CSV-TIME-IN TO C01CHKDAT + MOVE 'TIME' TO C01CHKTYP + CALL 'SUB04CHK' USING C01CHKPAR + IF C01CHKRRC = ZERO + + *** 第3段階: 退勤時刻チェック(SUB04CHK) + INITIALIZE C01CHKPAR + MOVE WRK-CSV-TIME-OUT + TO C01CHKDAT + MOVE 'TIME' TO C01CHKTYP + CALL 'SUB04CHK' USING C01CHKPAR + IF C01CHKRRC = ZERO + + *** 第4段階: 出勤<退勤チェック + MOVE WRK-CSV-TIME-IN + TO WRK-TIME-IN-NUM + MOVE WRK-CSV-TIME-OUT + TO WRK-TIME-OUT-NUM + IF WRK-TIME-IN-NUM + < WRK-TIME-OUT-NUM + + PERFORM 2050NORMSOR + ELSE + PERFORM 2090ERRORSOR + END-IF + ELSE + PERFORM 2090ERRORSOR + END-IF + ELSE + PERFORM 2090ERRORSOR + END-IF + ELSE + PERFORM 2090ERRORSOR + END-IF + ELSE + PERFORM 2090ERRORSOR + END-IF. + * + 2020VALIDATESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.5) * + * サブモジュール名: 正常出力処理 * + * 処理概要 : WRITE FROMでEDITED-PUNCHに出力 * + ***************************************************************** + 2050NORMSOR SECTION. + * + *** WORKING-STORAGEに編集 + MOVE WRK-CSV-EMP-ID TO O1EMP-ID. + MOVE WRK-CSV-DATE TO O1WORK-DATE. + MOVE WRK-CSV-TIME-IN TO O1STR-TIME. + MOVE WRK-CSV-TIME-OUT TO O1END-TIME. + MOVE WRK-CSV-DEPT-ID TO O1DEPT-ID. + MOVE WRK-CSV-TERMINAL TO O1TERMINAL. + *** WRITE FROM (新規カバレッジ) + WRITE W01OUTREC + FROM WS-W01REC. + ADD 1 TO CUN-W01OUT. + * + 2050NORMSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.9) * + * サブモジュール名: エラー処理 * + * 処理概要 : エラーレコードをW02(ERROR-LOG)に出力 * + ***************************************************************** + 2090ERRORSOR SECTION. + * + *** W02レコード初期化 + INITIALIZE W02OUTREC. + MOVE CNS-ERR-PUNCH TO W02ERR-CATEGORY. + * + *** エラー種別判定 + IF WRK-COMMA-CNT NOT = CNS-FIELD-COUNT-6 + MOVE WRK-COMMA-CNT TO WRK-COMMA-DISP + STRING + 'FIELD COUNT ERR CNT=' + WRK-COMMA-DISP + DELIMITED BY SIZE + INTO W02ERR-DETAIL + ELSE IF WRK-CSV-EMP-ID = SPACE + STRING + 'EMP-ID EMPTY' + DELIMITED BY SIZE + INTO W02ERR-DETAIL + ELSE + STRING + 'VALIDATION ERR EMP=' + WRK-CSV-EMP-ID + ' DATE=' + WRK-CSV-DATE + ' TI=' + WRK-CSV-TIME-IN + ' TO=' + WRK-CSV-TIME-OUT + DELIMITED BY SIZE + INTO W02ERR-DETAIL + END-IF. + * + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + 2090ERRORSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL + W02OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN04R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN04W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN04W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. \ No newline at end of file diff --git a/src/KIN05MAT.cbl b/src/KIN05MAT.cbl new file mode 100644 index 0000000..95af97d --- /dev/null +++ b/src/KIN05MAT.cbl @@ -0,0 +1,488 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN05MAT. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN05MAT * + * プログラム名 : 打刻休暇照合処理 * + * 作成日 : 2026-06-20 * + * 処理概要 : EDITED-PUNCH(打刻側,R01)とLEAVE-DAILY * + * (休暇側,R02)を社員番号+日付キーで照合し、 * + * 1:Nマッチング結果をKIN-LEAVEに出力。 * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-20 @@@ 新規作成 * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO KIN04W01 + FILE STATUS IS WS-R01-STATUS. + SELECT R02INNFIL ASSIGN TO KIN02W01 + FILE STATUS IS WS-R02-STATUS. + SELECT W01OUTFIL ASSIGN TO KIN05W01 + FILE STATUS IS WS-W01-STATUS. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## EDITED-PUNCH * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY KIN04REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * ##R02## LEAVE-DAILY * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02OUTREC. + COPY KIN02REC REPLACING ==(A)== BY ==R02==. + * + ***************************************************************** + * ##W01## KIN-LEAVE * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY KIN03REC REPLACING ==(A)== BY ==W01==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN05MAT'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-NO-LEAVE PIC X(002) VALUE '99'. + 03 CNS-LEAVE-01 PIC X(002) VALUE '01'. + 03 CNS-LEAVE-02 PIC X(002) VALUE '02'. + 03 CNS-LEAVE-03 PIC X(002) VALUE '03'. + 03 CNS-LEAVE-04 PIC X(002) VALUE '04'. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** ファイルステータス + 03 WS-R01-STATUS PIC X(002). + 03 WS-R02-STATUS PIC X(002). + 03 WS-W01-STATUS PIC X(002). + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01-EOF VALUE '1'. + 03 WRK-R02EOF PIC X(001). + 88 WRK-R02-EOF VALUE '1'. + *** マッチングキー領域 + 03 WRK-R01KEY. + 05 WRK-R01K-EMP-ID PIC X(008). + 05 WRK-R01K-DATE PIC 9(008). + 03 WRK-R02KEY. + 05 WRK-R02K-EMP-ID PIC X(008). + 05 WRK-R02K-DATE PIC 9(008). + *** マッチング選定用 + 03 WRK-BEST-TYPE PIC X(002). + 03 WRK-BEST-STR-TIME PIC 9(004). + 03 WRK-BEST-END-TIME PIC 9(004). + 03 WRK-BEST-APPL-ID PIC 9(009). + 03 WRK-BEST-FOUND PIC X(001). + 88 WRK-BEST-IS-FOUND VALUE '1'. + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01-EOF. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + *** BEST領域初期化(R01のみ出力時に使用) + MOVE CNS-NO-LEAVE TO WRK-BEST-TYPE. + MOVE ZERO TO WRK-BEST-STR-TIME + WRK-BEST-END-TIME + WRK-BEST-APPL-ID. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + OUTPUT W01OUTFIL. + * + *** OPENチェック + IF WS-R01-STATUS NOT = '00' + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. + IF WS-R02-STATUS NOT = '00' + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. + IF WS-W01-STATUS NOT = '00' + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. + * + *** R01/R02を読み込み + PERFORM 1100R01INNSOR. + PERFORM 1200R02INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:R02読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1200R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + NOT AT END + ADD 1 TO CUN-R02INN + END-READ. + * + 1200R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理(マッチング制御) * + * 処理概要 : EVALUATE TRUEで3分岐マッチング制御 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** R01キー設定 + MOVE R01EMP-ID TO WRK-R01K-EMP-ID. + MOVE R01WORK-DATE TO WRK-R01K-DATE. + * + *** R02キー設定(有効な場合) + IF NOT WRK-R02-EOF + MOVE R02EMP-ID TO WRK-R02K-EMP-ID + MOVE R02DATE TO WRK-R02K-DATE + END-IF. + * + *** EVALUATE TRUE マッチング3分岐 + EVALUATE TRUE + WHEN WRK-R02-EOF + PERFORM 2100R01ONLYSOR + PERFORM 1100R01INNSOR + WHEN WRK-R01KEY < WRK-R02KEY + PERFORM 2100R01ONLYSOR + PERFORM 1100R01INNSOR + WHEN WRK-R01KEY = WRK-R02KEY + PERFORM 2020MATCHSOR + PERFORM 1100R01INNSOR + WHEN WRK-R01KEY > WRK-R02KEY + PERFORM 2200R02ONLYSOR + PERFORM 1200R02INNSOR + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: マッチング処理(N:1ループ) * + * 処理概要 : 一致キーの全R02を読込み、最適休暇を選定 * + ***************************************************************** + 2020MATCHSOR SECTION. + * + *** 選定領域初期化 + MOVE '0' TO WRK-BEST-FOUND. + MOVE CNS-NO-LEAVE TO WRK-BEST-TYPE. + MOVE ZERO TO WRK-BEST-STR-TIME + WRK-BEST-END-TIME + WRK-BEST-APPL-ID. + * + *** N:1ループ 一致するR02を全件処理 + PERFORM UNTIL WRK-R02-EOF + OR WRK-R01KEY < WRK-R02KEY + OR WRK-R01KEY > WRK-R02KEY + * + *** ベスト選定 + IF NOT WRK-BEST-IS-FOUND + MOVE '1' TO WRK-BEST-FOUND + MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + ELSE + PERFORM 2030PRIOSOR + END-IF + * + *** R02次読込 + PERFORM 1200R02INNSOR + * + *** R02キー再設定(有効な場合) + IF NOT WRK-R02-EOF + MOVE R02EMP-ID TO WRK-R02K-EMP-ID + MOVE R02DATE TO WRK-R02K-DATE + END-IF + END-PERFORM. + * + *** KIN-LEAVE出力 + PERFORM 2100R01ONLYSOR. + * + 2020MATCHSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名: 優先順位判定 * + * 処理概要 : 現在のR02レコードとベストを比較し、 * + * より優先度の高いものを保持 * + ***************************************************************** + 2030PRIOSOR SECTION. + * + *** 優先順位: 01 > 02 > 03 > 04 + *** 同種別はAPPL-IDの小さい方を採用 + EVALUATE TRUE + WHEN R02LEAVE-TYPE = CNS-LEAVE-01 + IF WRK-BEST-TYPE NOT = CNS-LEAVE-01 + MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + ELSE IF R02APPL-ID < WRK-BEST-APPL-ID + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + WHEN R02LEAVE-TYPE = CNS-LEAVE-02 + IF WRK-BEST-TYPE = CNS-LEAVE-01 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02 + IF R02APPL-ID < WRK-BEST-APPL-ID + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + ELSE + MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + WHEN R02LEAVE-TYPE = CNS-LEAVE-03 + IF WRK-BEST-TYPE = CNS-LEAVE-01 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-03 + IF R02APPL-ID < WRK-BEST-APPL-ID + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + ELSE + MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + WHEN R02LEAVE-TYPE = CNS-LEAVE-04 + IF WRK-BEST-TYPE = CNS-LEAVE-01 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-03 + CONTINUE + ELSE IF WRK-BEST-TYPE = CNS-LEAVE-04 + IF R02APPL-ID < WRK-BEST-APPL-ID + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + ELSE + MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE + MOVE R02START-TIME TO WRK-BEST-STR-TIME + MOVE R02END-TIME TO WRK-BEST-END-TIME + MOVE R02APPL-ID TO WRK-BEST-APPL-ID + END-IF + WHEN OTHER + CONTINUE + END-EVALUATE. + * + 2030PRIOSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: R01のみ出力 * + * 処理概要 : 打刻のみ(休暇なし)またはマッチ結果を出力 * + ***************************************************************** + 2100R01ONLYSOR SECTION. + * + *** KIN-LEAVEレコード編集 + INITIALIZE W01OUTREC. + *** 打刻情報(1-80B) + MOVE R01EMP-ID TO W01EMP-ID. + MOVE R01WORK-DATE TO W01WORK-DATE. + MOVE R01STR-TIME TO W01STR-TIME. + MOVE R01END-TIME TO W01END-TIME. + MOVE R01DEPT-ID TO W01DEPT-ID. + MOVE R01TERMINAL TO W01TERMINAL. + *** 休暇情報(81-160B) + MOVE WRK-BEST-TYPE TO W01LEAVE-TYPE. + MOVE WRK-BEST-STR-TIME TO W01LEAVE-STR-TIME. + MOVE WRK-BEST-END-TIME TO W01LEAVE-END-TIME. + MOVE ZERO TO W01LEAVE-HOURS. + MOVE WRK-BEST-APPL-ID TO W01APPLICATION-ID. + * + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 2100R01ONLYSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: R02のみスキップ * + * 処理概要 : 該当打刻のない休暇レコードはスキップ * + ***************************************************************** + 2200R02ONLYSOR SECTION. + * + *** R02のみは出力なし(スキップ) + CONTINUE. + * + 2200R02ONLYSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + R02INNFIL + W01OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN04W01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN02W01' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN05W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + diff --git a/src/KIN06CLD.cbl b/src/KIN06CLD.cbl new file mode 100644 index 0000000..148d09e --- /dev/null +++ b/src/KIN06CLD.cbl @@ -0,0 +1,437 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN06CLD. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN06CLD * + * プログラム名 : 出勤日カレンダー生成処理 * + * 作成日 : 2026-06-20 * + * 処理概要 : PARM指定年月の出勤日カレンダーを生成。 * + * 在籍社員×当月全日をループし、休日判定 * + * (SEARCH ALL + 曜日)を行い出勤日のみ出力。 * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-20 @@@ 新規作成 * + * 26-06-21 @@@ GnuCOBOL CONTINUE-in-ELSE-IF 回避 * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT OUTRECFIL ASSIGN TO "data\KIN06W01.DAT". + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##OUTREC## WORK-DAY-FILE * + ***************************************************************** + FD OUTRECFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 OUTREC. + COPY KIN06REC REPLACING ==(A)== BY ==OUT==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * SQLCA * + ***************************************************************** + EXEC SQL INCLUDE SQLCA END-EXEC. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN06CLD'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + * + ***************************************************************** + * 月日数テーブル * + ***************************************************************** + 01 MONTH-DAYS. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 28. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 30. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 30. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 30. + 03 FILLER PIC 9(002) VALUE 31. + 03 FILLER PIC 9(002) VALUE 30. + 03 FILLER PIC 9(002) VALUE 31. + 01 MONTH-DAYS-R REDEFINES MONTH-DAYS. + 03 MONTH-DAY PIC 9(002) OCCURS 12. + * + ***************************************************************** + * 休日テーブル(SEARCH ALL用) * + ***************************************************************** + 01 HOLIDAY-TABLE. + 03 HOLIDAY-ENTRIES OCCURS 50 TIMES + ASCENDING KEY IS HOLIDAY-DATE-ENT + INDEXED BY HOLIDAY-IDX. + 05 HOLIDAY-DATE-ENT PIC X(008). + 03 HOLIDAY-COUNT PIC 9(002). + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUN-OUTREC PIC S9(009) COMP-3 VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + * PARM解析 + 03 WRK-CMDLINE PIC X(200). + 03 WRK-PARM-POS PIC 9(004). + 03 WRK-PARM-OK PIC X(001). + 88 WRK-PARM-FOUND VALUE '1'. + 03 WRK-PARM-CHECK PIC X(006). + 03 WRK-YEARMONTH PIC 9(006). + 03 WRK-YEAR PIC 9(004). + 03 WRK-MONTH PIC 9(002). + 03 WRK-LAST-DAY PIC 9(002). + * 日付ループ + 03 WRK-DAY PIC 9(002). + 03 WRK-DATE-INT PIC S9(009). + 03 WRK-DOW PIC 9(001). + 88 WRK-IS-SUNDAY VALUE 0. + 88 WRK-IS-SATURDAY VALUE 6. + 03 WRK-DATE-STR PIC 9(008). + 03 WRK-DATE-STR-X PIC X(008). + * 社員CURSOR + 03 WRK-EMP-EOF PIC X(001). + 88 WRK-EMP-EOF-Y VALUE '1'. + * 休日判定 + 03 WRK-HOLIDAY-FOUND PIC X(001). + 88 WRK-IS-HOLIDAY VALUE '1'. + * + ***************************************************************** + * DBホスト変数 * + ***************************************************************** + 01 HV-EMP-ID PIC X(008). + 01 HV-HOLIDAY-DATE PIC X(008). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + * メッセージ編集出力SR用 + COPY ZANMSGAC. + * ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + PERFORM 1000ITTSOR. + PERFORM 2000MAJSOR + UNTIL WRK-EMP-EOF-Y. + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・PARM解析・DB接続・ * + * 休日読込・社員CURSOR OPEN * + ***************************************************************** + 1000ITTSOR SECTION. + * + * 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + * コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + * ワークエリア初期化 + INITIALIZE WRKARA + HOLIDAY-TABLE. + * + * PARM解析 + PERFORM 1100PARMSOR. + * + * DB接続(bridge直接→EXEC SQLはWAで追加変数生成) + EXEC SQL + CONNECT TO 'data/kin.db' + END-EXEC. + * + * 休日データ読込(bridge直接→EXEC SQL変換回避) + PERFORM 1200HOLIDAYSOR. + * + * 出力ファイルOPEN + OPEN OUTPUT OUTRECFIL. + * + * 社員CURSOR OPEN + PERFORM 1300EMPOPNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名: PARM解析 * + * 処理概要 : コマンドラインからYEARMONTH=を解析 * + ***************************************************************** + 1100PARMSOR SECTION. + * + INITIALIZE WRK-CMDLINE. + ACCEPT WRK-CMDLINE FROM COMMAND-LINE. + * + * YEARMONTH=を検索(PERFORM VARYINGでスキャン) + MOVE '0' TO WRK-PARM-OK. + MOVE 1 TO WRK-PARM-POS. + PERFORM UNTIL WRK-PARM-POS > 190 + IF WRK-CMDLINE(WRK-PARM-POS:10) = 'YEARMONTH=' + COMPUTE WRK-PARM-POS = + WRK-PARM-POS + 10 + MOVE WRK-CMDLINE(WRK-PARM-POS:6) + TO WRK-PARM-CHECK + MOVE WRK-PARM-CHECK TO WRK-YEARMONTH + IF WRK-YEARMONTH NUMERIC + MOVE WRK-YEARMONTH + TO WRK-PARM-CHECK + IF WRK-CMDLINE(WRK-PARM-POS:6) + = WRK-PARM-CHECK + MOVE '1' TO WRK-PARM-OK + END-IF + END-IF + EXIT PERFORM + END-IF + ADD 1 TO WRK-PARM-POS + END-PERFORM. + * + * PARM必須チェック + IF NOT WRK-PARM-FOUND + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. + * + * 年・月分解 + MOVE WRK-YEARMONTH(1:4) TO WRK-YEAR. + MOVE WRK-YEARMONTH(5:2) TO WRK-MONTH. + * + * 月チェック(1-12) + IF WRK-MONTH < 1 OR WRK-MONTH > 12 + MOVE CNS-ABD999 TO E01ABDCOD + CALL 'SUB03END' USING E01ABDPAR + END-IF. + * + * 月の日数計算(閏年対応) + MOVE MONTH-DAY(WRK-MONTH) TO WRK-LAST-DAY. + * + * 閏年判定(2月のみ) + IF WRK-MONTH = 02 + IF (FUNCTION MOD(WRK-YEAR, 400) = 0) + OR (FUNCTION MOD(WRK-YEAR, 4) = 0 + AND FUNCTION MOD(WRK-YEAR, 100) NOT = 0) + MOVE 29 TO WRK-LAST-DAY + END-IF + END-IF. + * + 1100PARMSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名: 休日データ読込 * + * 処理概要 : HOLIDAY_CALENDARから全祝日をSELECT * + ***************************************************************** + 1200HOLIDAYSOR SECTION. + * + INITIALIZE HOLIDAY-TABLE. + * + * 休日SELECT(カーソル) + EXEC SQL + DECLARE C_HOL CURSOR FOR + SELECT HOLIDAY_DATE + FROM HOLIDAY_CALENDAR + ORDER BY HOLIDAY_DATE + END-EXEC. + * + EXEC SQL + OPEN C_HOL + END-EXEC. + * + EXEC SQL + FETCH C_HOL INTO :HV-HOLIDAY-DATE + END-EXEC. + * + * 休日テーブルに全件読込 + PERFORM UNTIL SQLCODE NOT = 0 + IF HOLIDAY-COUNT < 50 + ADD 1 TO HOLIDAY-COUNT + MOVE HV-HOLIDAY-DATE TO + HOLIDAY-DATE-ENT(HOLIDAY-COUNT) + END-IF + EXEC SQL + FETCH C_HOL INTO :HV-HOLIDAY-DATE + END-EXEC + END-PERFORM. + * + EXEC SQL + CLOSE C_HOL + END-EXEC. + * + 1200HOLIDAYSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.3) * + * サブモジュール名: 社員CURSOR OPEN * + * 処理概要 : EMP_MASTERから在籍社員一覧を取得 * + ***************************************************************** + 1300EMPOPNSOR SECTION. + * + EXEC SQL + DECLARE C_EMP CURSOR FOR + SELECT EMP_ID + FROM EMP_MASTER + WHERE STATUS = '1' + ORDER BY EMP_ID + END-EXEC. + * + EXEC SQL + OPEN C_EMP + END-EXEC. + * + EXEC SQL + FETCH C_EMP INTO :HV-EMP-ID + END-EXEC. + * + IF SQLCODE NOT = 0 + MOVE '1' TO WRK-EMP-EOF + END-IF. + * + 1300EMPOPNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理(社員ループ) * + * 処理概要 : 各社員について当月1日〜月末日をループ * + ***************************************************************** + 2000MAJSOR SECTION. + * + * 当月1日〜月末日をループ + MOVE 1 TO WRK-DAY. + PERFORM UNTIL WRK-DAY > WRK-LAST-DAY + * + * 日付文字列構築(COMPUTE演算→参照変更バグ回避) + COMPUTE WRK-DATE-STR = WRK-YEAR * 10000 + + WRK-MONTH * 100 + WRK-DAY + MOVE WRK-DATE-STR TO WRK-DATE-STR-X + * + * 曜日計算 + COMPUTE WRK-DATE-INT = + FUNCTION INTEGER-OF-DATE(WRK-DATE-STR) + COMPUTE WRK-DOW = + FUNCTION MOD(WRK-DATE-INT, 7) + * + * 休日判定(部分埋め→PERFORM VARYING) + MOVE '0' TO WRK-HOLIDAY-FOUND + PERFORM VARYING WS-COL-IDX FROM 1 BY 1 + UNTIL WS-COL-IDX > HOLIDAY-COUNT + IF HOLIDAY-DATE-ENT(WS-COL-IDX) = WRK-DATE-STR-X + MOVE '1' TO WRK-HOLIDAY-FOUND + END-IF + END-PERFORM + * + * 出勤日のみ出力(単一IF+ORで記述→GnuCOBOL対策) + IF WRK-IS-HOLIDAY OR WRK-IS-SUNDAY + OR WRK-IS-SATURDAY + CONTINUE + ELSE + INITIALIZE OUTREC + MOVE HV-EMP-ID TO OUTEMP-ID + MOVE WRK-DATE-STR TO OUTDATE + * MOD(7):0=日…6=土 → 1=月…7=日に変換 + IF WRK-DOW = 0 + MOVE 7 TO OUTDAY-OF-WEEK + ELSE + MOVE WRK-DOW TO OUTDAY-OF-WEEK + END-IF + WRITE OUTREC + ADD 1 TO CUN-OUTREC + END-IF + * + ADD 1 TO WRK-DAY + END-PERFORM. + * + * 次の社員をFETCH(カーソル) + EXEC SQL + FETCH C_EMP INTO :HV-EMP-ID + END-EXEC. + * + IF SQLCODE = 0 + CONTINUE + ELSE + MOVE '1' TO WRK-EMP-EOF + END-IF. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルCLOSE・件数出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + * カーソルCLOSE + EXEC SQL + CLOSE C_EMP + END-EXEC. + * + * 出力ファイルCLOSE + CLOSE OUTRECFIL. + * + * 出力件数メッセージ + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN06W01' TO M00UMKDATS22-01. + MOVE CUN-OUTREC TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + * 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. diff --git a/src/KIN07DAI.cbl b/src/KIN07DAI.cbl new file mode 100644 index 0000000..f53c620 --- /dev/null +++ b/src/KIN07DAI.cbl @@ -0,0 +1,608 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN07DAI. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN07DAI * + * プログラム名 : 日別勤怠計算処理 * + * 作成日 : 2026-06-23 * + * 処理概要 : WORK-DAY-FILE(R01)を主駆動にKIN-LEAVE(R02) * + * とLEAVE-DAILY(R03)を社員番号+日付キーで * + * 照合し、4パターン(EVALUATE)で * + * 日別勤怠記録(DAILY-RECORD)を出力する。 * + * 休暇時間はランチ除外+0.1h切上丸め。 * + * MULTIPLY/SUBTRACTで時間計算。 * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-23 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO KIN07R01. + SELECT R02INNFIL ASSIGN TO KIN07R02. + SELECT R03INNFIL ASSIGN TO KIN07R03. + SELECT W01OUTFIL ASSIGN TO KIN07W01. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## WORK-DAY-FILE * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY KIN06REC REPLACING ==(A)== BY ==SW==. + * + ***************************************************************** + * ##R02## KIN-LEAVE * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02INNREC. + COPY KIN03REC REPLACING ==(A)== BY ==SR==. + * + ***************************************************************** + * ##R03## LEAVE-DAILY * + ***************************************************************** + FD R03INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R03INNREC. + COPY KIN02REC REPLACING ==(A)== BY ==SL==. + * + ***************************************************************** + * ##W01## DAILY-RECORD * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY KIN07REC REPLACING ==(A)== BY ==SD==. + * + ***************************************************************** + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN07DAI'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + *** 休暇種別定数 + 03 CNS-LEAVE-01 PIC X(002) VALUE '01'. + 03 CNS-LEAVE-02 PIC X(002) VALUE '02'. + 03 CNS-LEAVE-03 PIC X(002) VALUE '03'. + 03 CNS-LEAVE-04 PIC X(002) VALUE '04'. + *** 時刻定数 + 03 CNS-TIME-ZERO PIC 9(004) VALUE 0000. + *** 時間定数(分) + 03 CNS-LUNCH-START-MIN PIC 9(004) VALUE 0720. + 03 CNS-LUNCH-END-MIN PIC 9(004) VALUE 0780. + 03 CNS-DAILY-HOURS PIC 9(004)V9(001) VALUE 8.0. + 03 CNS-MINUTES-PER-HOUR PIC 9(003) VALUE 060. + 03 CNS-RND-MODE-UP PIC 9(004) VALUE 1. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R03INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01-EOF VALUE '1'. + 03 WRK-R02EOF PIC X(001). + 88 WRK-R02-EOF VALUE '1'. + 03 WRK-R03EOF PIC X(001). + 88 WRK-R03-EOF VALUE '1'. + *** マッチングキー領域 + 03 WRK-R01KEY. + 05 WRK-R01K-EMP-ID PIC X(008). + 05 WRK-R01K-DATE PIC 9(008). + 03 WRK-R02KEY. + 05 WRK-R02K-EMP-ID PIC X(008). + 05 WRK-R02K-DATE PIC 9(008). + 03 WRK-R03KEY. + 05 WRK-R03K-EMP-ID PIC X(008). + 05 WRK-R03K-DATE PIC 9(008). + *** パターン番号 + 03 PATTERN-NUM PIC 9(001). + 88 PATTERN-A VALUE 1. + 88 PATTERN-B VALUE 2. + 88 PATTERN-C VALUE 3. + 88 PATTERN-D VALUE 4. + *** 出力編集領域 + 03 WRK-TIME-IN PIC 9(004). + 03 WRK-TIME-OUT PIC 9(004). + 03 WRK-ABSENT-H PIC 9(004)V9(001). + *** 休暇時間積算領域 + 03 WRK-ANNUAL-H PIC 9(004)V9(001). + 03 WRK-PERSONAL-H PIC 9(004)V9(001). + 03 WRK-OFFICIAL-H PIC 9(004)V9(001). + 03 WRK-SICK-H PIC 9(004)V9(001). + *** 時間計算領域(MULTIPLY/SUBTRACT使用) + 03 WRK-START-HOUR PIC 9(002). + 03 WRK-START-MIN PIC 9(002). + 03 WRK-END-HOUR PIC 9(002). + 03 WRK-END-MIN PIC 9(002). + 03 WRK-START-MIN-TOTAL PIC 9(004). + 03 WRK-END-MIN-TOTAL PIC 9(004). + 03 WRK-TOTAL-MIN PIC 9(004). + 03 WRK-LUNCH-OVERLAP PIC 9(004). + 03 WRK-LEAVE-HOURS PIC 9(004)V9(001). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + *** 時刻丸め計算SR用 + COPY ZANTIMAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** 主処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01-EOF. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + R03INNFIL + OUTPUT W01OUTFIL. + * + *** R01/R02/R03初回読込 + PERFORM 1100R01INNSOR. + PERFORM 1200R02INNSOR. + PERFORM 1300R03INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : WORK-DAY-FILE読込・EOF判定 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:R02読込処理 * + * 処理概要 : KIN-LEAVE読込・EOF判定 * + ***************************************************************** + 1200R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + NOT AT END + ADD 1 TO CUN-R02INN + END-READ. + * + 1200R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.3) * + * サブモジュール名:R03読込処理 * + * 処理概要 : LEAVE-DAILY読込・EOF判定 * + ***************************************************************** + 1300R03INNSOR SECTION. + * + READ R03INNFIL + AT END + MOVE '1' TO WRK-R03EOF + NOT AT END + ADD 1 TO CUN-R03INN + END-READ. + * + 1300R03INNSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(2.0) * + * サブプログラム名:主処理 * + * 処理概要 : R01駆動でR02/R03照合、4パターン分岐 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** R01キー設定 + MOVE SWEMP-ID TO WRK-R01K-EMP-ID. + MOVE SWDATE TO WRK-R01K-DATE. + * + *** パターン・積算領域初期化 + MOVE 4 TO PATTERN-NUM. + MOVE ZERO TO WRK-TIME-IN + WRK-TIME-OUT + WRK-ANNUAL-H + WRK-PERSONAL-H + WRK-OFFICIAL-H + WRK-SICK-H + WRK-ABSENT-H. + * + *** R02: 追越レコードをスキップ + PERFORM UNTIL WRK-R02-EOF + MOVE SREMP-ID TO WRK-R02K-EMP-ID + MOVE SRWORK-DATE TO WRK-R02K-DATE + IF WRK-R02KEY >= WRK-R01KEY + EXIT PERFORM + END-IF + PERFORM 1200R02INNSOR + END-PERFORM. + * + *** R02マッチ判定 + IF NOT WRK-R02-EOF + AND WRK-R01KEY = WRK-R02KEY + MOVE SRSTR-TIME TO WRK-TIME-IN + MOVE SREND-TIME TO WRK-TIME-OUT + MOVE 2 TO PATTERN-NUM + PERFORM 1200R02INNSOR + END-IF. + * + *** R03: 追越レコードをスキップ + PERFORM UNTIL WRK-R03-EOF + MOVE SLEMP-ID TO WRK-R03K-EMP-ID + MOVE SLDATE TO WRK-R03K-DATE + IF WRK-R03KEY >= WRK-R01KEY + EXIT PERFORM + END-IF + PERFORM 1300R03INNSOR + END-PERFORM. + * + *** R03マッチループ(0〜N件の全休暇を処理) + IF NOT WRK-R03-EOF + AND WRK-R01KEY = WRK-R03KEY + PERFORM UNTIL WRK-R03-EOF + OR WRK-R01KEY NOT = WRK-R03KEY + PERFORM 5000CALCLVSOR + EVALUATE SLLEAVE-TYPE + WHEN CNS-LEAVE-01 + ADD WRK-LEAVE-HOURS TO WRK-ANNUAL-H + WHEN CNS-LEAVE-02 + ADD WRK-LEAVE-HOURS TO WRK-PERSONAL-H + WHEN CNS-LEAVE-03 + ADD WRK-LEAVE-HOURS TO WRK-OFFICIAL-H + WHEN CNS-LEAVE-04 + ADD WRK-LEAVE-HOURS TO WRK-SICK-H + WHEN OTHER + CONTINUE + END-EVALUATE + PERFORM 1300R03INNSOR + IF NOT WRK-R03-EOF + MOVE SLEMP-ID TO WRK-R03K-EMP-ID + MOVE SLDATE TO WRK-R03K-DATE + END-IF + END-PERFORM + IF PATTERN-NUM = 2 + MOVE 1 TO PATTERN-NUM + ELSE + MOVE 3 TO PATTERN-NUM + END-IF + END-IF. + * + *** EVALUATE 4パターン分岐 + EVALUATE TRUE + WHEN PATTERN-A + PERFORM 6100PATTERNASOR + WHEN PATTERN-B + PERFORM 6200PATTERNSOR + WHEN PATTERN-C + PERFORM 6300PATTERNSOR + WHEN PATTERN-D + PERFORM 6400PATTERNSOR + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(5.0) * + * サブプログラム名:休暇時間計算 * + * 処理概要 : R03レコードの開始/終了時刻から * + * ランチ除外+MULTIPLY/SUBTRACT計算し、 * + * SUB05TIM(0.1h切上)で丸める * + ***************************************************************** + 5000CALCLVSOR SECTION. + * + *** 開始時刻を時と分に分解 + DIVIDE SLSTART-TIME BY 100 + GIVING WRK-START-HOUR + REMAINDER WRK-START-MIN. + *** 終了時刻を時と分に分解 + DIVIDE SLEND-TIME BY 100 + GIVING WRK-END-HOUR + REMAINDER WRK-END-MIN. + * + *** MULTIPLY: 時→分変換 + MULTIPLY WRK-START-HOUR BY CNS-MINUTES-PER-HOUR + GIVING WRK-START-MIN-TOTAL. + ADD WRK-START-MIN TO WRK-START-MIN-TOTAL. + * + MULTIPLY WRK-END-HOUR BY CNS-MINUTES-PER-HOUR + GIVING WRK-END-MIN-TOTAL. + ADD WRK-END-MIN TO WRK-END-MIN-TOTAL. + * + *** 総分数算出 + COMPUTE WRK-TOTAL-MIN = + WRK-END-MIN-TOTAL - WRK-START-MIN-TOTAL. + * + *** ランチ除外判定 (12:00-13:00 = 720-780分) + MOVE ZERO TO WRK-LUNCH-OVERLAP. + IF WRK-END-MIN-TOTAL > CNS-LUNCH-START-MIN + AND WRK-START-MIN-TOTAL < CNS-LUNCH-END-MIN + COMPUTE WRK-LUNCH-OVERLAP = + FUNCTION MIN(WRK-END-MIN-TOTAL, + CNS-LUNCH-END-MIN) + - FUNCTION MAX(WRK-START-MIN-TOTAL, + CNS-LUNCH-START-MIN) + END-IF. + * + *** SUBTRACT: ランチ時間除外 + SUBTRACT WRK-LUNCH-OVERLAP + FROM WRK-TOTAL-MIN. + * + *** 時間(小数)に変換 + COMPUTE WRK-LEAVE-HOURS = WRK-TOTAL-MIN + / CNS-MINUTES-PER-HOUR. + * + *** SUB05TIM呼出(0.1h切上) + MOVE WRK-LEAVE-HOURS TO T01TIMHRS. + MOVE CNS-RND-MODE-UP TO T01TIMRRC. + CALL 'SUB05TIM' USING T01TIMPAR. + * + *** 丸め結果を退避 + MOVE T01TIMOUT TO WRK-LEAVE-HOURS. + * + 5000CALCLVSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(6.1) * + * サブモジュール名:パターンA(打刻+休暇)出力 * + * 処理概要 : 打刻情報+R03休暇時間を出力 * + ***************************************************************** + 6100PATTERNASOR SECTION. + * + PERFORM 7000W01OUTSOR. + * + *** 次R01読込(R02/R03は処理済み) + PERFORM 1100R01INNSOR. + * + 6100PATTERNASOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(6.2) * + * サブプログラム名:パターンB(打刻のみ)出力 * + * 処理概要 : 打刻情報のみ出力(休暇=0) * + ***************************************************************** + 6200PATTERNSOR SECTION. + * + *** 休暇/欠勤はゼロのまま + PERFORM 7000W01OUTSOR. + * + *** 次R01/R02読込 + PERFORM 1100R01INNSOR. + * + 6200PATTERNSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(6.3) * + * サブプログラム名:パターンC(休暇のみ)出力 * + * 処理概要 : 打刻なし、R03休暇時間を出力(8h上限) * + ***************************************************************** + 6300PATTERNSOR SECTION. + * + *** 打刻なし + MOVE CNS-TIME-ZERO TO WRK-TIME-IN + WRK-TIME-OUT. + * + *** 休暇時間上限チェック(所定労働時間8h) + IF WRK-ANNUAL-H > CNS-DAILY-HOURS + MOVE CNS-DAILY-HOURS TO WRK-ANNUAL-H + END-IF. + IF WRK-PERSONAL-H > CNS-DAILY-HOURS + MOVE CNS-DAILY-HOURS TO WRK-PERSONAL-H + END-IF. + IF WRK-OFFICIAL-H > CNS-DAILY-HOURS + MOVE CNS-DAILY-HOURS TO WRK-OFFICIAL-H + END-IF. + IF WRK-SICK-H > CNS-DAILY-HOURS + MOVE CNS-DAILY-HOURS TO WRK-SICK-H + END-IF. + * + PERFORM 7000W01OUTSOR. + * + *** 次R01/R03読込 + PERFORM 1100R01INNSOR. + * + 6300PATTERNSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(6.4) * + * サブプログラム名:パターンD(欠勤)出力 * + * 処理概要 : 打刻なし、休暇なし、未申請欠勤=8.0h * + ***************************************************************** + 6400PATTERNSOR SECTION. + * + *** 打刻なし + MOVE CNS-TIME-ZERO TO WRK-TIME-IN + WRK-TIME-OUT. + *** 未申請欠勤=8.0h + MOVE CNS-DAILY-HOURS TO WRK-ABSENT-H. + * + PERFORM 7000W01OUTSOR. + * + *** 次R01読込(R02/R03は次R01次第) + PERFORM 1100R01INNSOR. + * + 6400PATTERNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(7.0) * + * サブモジュール名:DAILY-RECORD出力 * + * 処理概要 : W01(DAILY-RECORD)に編集出力 * + ***************************************************************** + 7000W01OUTSOR SECTION. + * + MOVE SWEMP-ID TO SDEMP-ID. + MOVE SWDATE TO SDDATE. + MOVE WRK-TIME-IN TO SDTIME-IN. + MOVE WRK-TIME-OUT TO SDTIME-OUT. + MOVE WRK-ANNUAL-H TO SDANNUAL-H. + MOVE WRK-PERSONAL-H TO SDPERSONAL-H. + MOVE WRK-OFFICIAL-H TO SDOFFICIAL-H. + MOVE WRK-SICK-H TO SDSICK-H. + MOVE WRK-ABSENT-H TO SDABSENT-H. + * + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 7000W01OUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + R02INNFIL + R03INNFIL + W01OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN07R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN07R02' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN07R03' TO M00UMKDATS22-01. + MOVE CUN-R03INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN07W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(4.0) * + * サブプログラム名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブプログラムNO:(9.9) * + * サブプログラム名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/使用資源一覧/KIN04CHK_使用資源一覧.md b/使用資源一覧/KIN04CHK_使用資源一覧.md new file mode 100644 index 0000000..c7c9ecb --- /dev/null +++ b/使用資源一覧/KIN04CHK_使用資源一覧.md @@ -0,0 +1,50 @@ +# KIN04CHK 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN04CHK +- **プログラム名**: 打刻項目チェック処理 +- **処理概要**: CSV形式の打刻データファイルを読み込み、IF多重ネスト(THEN句)による項目チェックを行い、正常レコードをEDITED-PUNCHへ、異常レコードをERROR-LOGへ振り分ける。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN04R01 | RAW-PUNCH | 順編成 | F (固定長) | 80B | なし(自前定義) | +| KIN04W01 | EDITED-PUNCH | 順編成 | F (固定長) | 80B | KIN04REC | +| KIN04W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | KIN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN04REC | レコード定義(W01出力ファイル) | FILE SECTION / WORKING-STORAGE(WRITE FROM用) | +| KIN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| ZANCHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| SUB04CHK | 日付/時刻/社員番号妥当性チェック | 2020VALIDATESOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→初回読込) +2. CSV分解(UNSTRINGで6項目に分解) +3. IF多重ネスト(THEN句)で4段階チェック + - フィールド数=6 AND 社員番号 NOT = SPACE + - SUB04CHK日付チェック + - SUB04CHK時刻チェック(出勤/退勤) + - 出勤時刻 < 退勤時刻 +4. 正常→WRITE FROMでW01出力 +5. 異常→W02出力(エラー区分='02') +6. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/使用資源一覧/KIN05MAT_使用資源一覧.md b/使用資源一覧/KIN05MAT_使用資源一覧.md new file mode 100644 index 0000000..685b22f --- /dev/null +++ b/使用資源一覧/KIN05MAT_使用資源一覧.md @@ -0,0 +1,43 @@ +# KIN05MAT 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN05MAT +- **プログラム名**: 打刻休暇照合処理 +- **処理概要**: EDITED-PUNCH(打刻側)とLEAVE-DAILY(休暇側)を社員番号+日付キーで照合し、1:Nマッチング結果をKIN-LEAVE(160B)に出力する。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN04W01 | EDITED-PUNCH | 順編成 | F (固定長) | 80B | KIN04REC | +| KIN02W01 | LEAVE-DAILY | 順編成 | F (固定長) | 80B | KIN02REC | +| KIN05W01 | KIN-LEAVE | 順編成 | F (固定長) | 160B | KIN03REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN04REC | R01入力レコード定義 | FILE SECTION | +| KIN02REC | R02入力レコード定義 | FILE SECTION | +| KIN03REC | W01出力レコード定義 | FILE SECTION | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +## 使用DB2テーブル + +なし(ファイルマッチングのみ) + +## 処理フロー +1. 初期処理(開始メッセージ→OPEN→R01/R02初回読込) +2. EVALUATE TRUE マッチング3分岐制御 + - R01key < R02key OR R02-EOF:打刻のみ出力(LEAVE-TYPE='99') + - R01key = R02key:マッチング(N:1ループ)、休暇種別優先順位で選定 + - R01key > R02key:R02のみスキップ +3. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/使用資源一覧/KIN06CLD_使用資源一覧.md b/使用資源一覧/KIN06CLD_使用資源一覧.md new file mode 100644 index 0000000..eeef681 --- /dev/null +++ b/使用資源一覧/KIN06CLD_使用資源一覧.md @@ -0,0 +1,45 @@ +# KIN06CLD 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN06CLD +- **プログラム名**: 出勤日カレンダー生成処理 +- **処理概要**: PARM指定年月の出勤日カレンダーを生成。在籍社員全員 × 当月全日をループし、休日判定を行って出勤日のみ出力。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN06W01 | WORK-DAY-FILE | 順編成 | F (固定長) | 80B | KIN06REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN06REC | OUTREC出力レコード定義 | FILE SECTION | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +> 注: DBブリッジ変数(WS-SQL-STR, SQLCODE, WS-COL-IDX, WS-COL-LEN)はCOPY句`DB-COMMON`ではなく、プリプロセッサ`convert-sql.mjs`によりWORKING-STORAGEに注入される。`cpy/DB-COMMON.cpy`は存在しない。 + +## 使用DBテーブル + +| テーブル名 | 種別 | 操作 | 備考 | +|-----------|------|------|------| +| EMP_MASTER | 参照 | SELECT (CURSOR) | 在籍社員一覧(STATUS='1') | +| HOLIDAY_CALENDAR | 参照 | SELECT | 対象月の休日一覧 | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 1100PARMSOR (直接CALL、9999ABDSORセクション廃止) | + +## 処理フロー +1. PARM解析(YEARMONTH取得) +2. DB接続 → 休日データ読込 → 社員CURSOR OPEN +3. 社員ループ(PERFORM UNTIL EOF) + - 日付ループ(PERFORM VARYING 当月1日〜月末日) + - PERFORM VARYING 線形探索で休日判定 + 曜日判定(部分埋めテーブルのためSEARCH ALL不使用) + - 出勤日 → WRITE FROM出力 +4. CURSOR CLOSE → DB切断 → 終了処理 diff --git a/使用資源一覧/KIN07DAI_使用資源一覧.md b/使用資源一覧/KIN07DAI_使用資源一覧.md new file mode 100644 index 0000000..34be169 --- /dev/null +++ b/使用資源一覧/KIN07DAI_使用資源一覧.md @@ -0,0 +1,60 @@ +# KIN07DAI 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN07DAI +- **プログラム名**: 日別勤怠計算処理 +- **処理概要**: WORK-DAY-FILE(出勤日カレンダー)を主駆動とし、社員番号+日付キーでKIN-LEAVE(打刻+休暇)と照合。4パターン(A/B/C/D)のEVALUATE分岐で休暇時間計算を実行し、DAILY-RECORD(200B)に出力する。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | 定義参照先 | +|------|---------------|------|-------------|-----------|--------|-----------| +| KIN07R01 | WORK-DAY-FILE | 順編成 | F (固定長) | 80B | KIN06REC | COPY句定義書.md | +| KIN07R02 | KIN-LEAVE | 順編成 | F (固定長) | 160B | KIN03REC | COPY句定義書.md | +| KIN07R03 | LEAVE-DAILY | 順編成 | F (固定長) | 80B | KIN02REC | COPY句定義書.md | +| KIN07W01 | DAILY-RECORD | 順編成 | F (固定長) | 200B | KIN07REC | COPY句定義書.md | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN06REC | R01入力レコード定義(WORK-DAY-REC) | FILE SECTION | +| KIN03REC | R02入力レコード定義(KIN-LEAVE-REC) | FILE SECTION | +| KIN02REC | R03入力レコード定義(LEAVE-DAILY-REC) | FILE SECTION | +| KIN07REC | W01出力レコード定義(DAILY-REC) | FILE SECTION | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| ZANTIMAC | 丸めサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| SUB05TIM | 休暇時間丸め(0.1h切上) | 6100PATTERNASOR / 6300PATTERNSOR | + +## 使用DB2テーブル + +なし(ファイル処理のみ) + +## 処理フロー +1. 初期処理(開始メッセージ→OPEN→R01/R02/R03初回読込) +2. メインループ:R01(主駆動)を基準にEVALUATEで4パターン分岐 + - PATTERN-A (1): R01+R02+R03全てあり → 打刻+休暇時間計算 + - PATTERN-B (2): R01+R02あり、R03なし → 打刻のみ(休暇=0) + - PATTERN-C (3): R01+R03あり、R02なし → 休暇時間計算(打刻=0000) + - PATTERN-D (4): R01のみ → 未申請欠勤=8.0h +3. 各パターン内でMULTIPLY/SUBTRACT/COMPUTE併用による時間計算、CALL SUB05TIM丸め +4. 終了処理(CLOSE→件数出力→終了メッセージ) + +## 使用構文(特記事項) + +| 構文 | 使用箇所 | 備考 | +|------|---------|------| +| EVALUATE | 5000PROCESS | 4パターン分岐(GO TO DEPENDING ONから変更) | +| MULTIPLY | 6100PATTERNASOR/6300PATTERNSOR | 時間→分変換 | +| SUBTRACT | 6100PATTERNASOR/6300PATTERNSOR | ランチ時間除外 | +| DIVIDE | 6100PATTERNASOR/6300PATTERNSOR | 分→時間変換 | +| COMPUTE | 6100PATTERNASOR/6300PATTERNSOR | 休暇時間端数処理 | +| CALL SUB05TIM | 6100PATTERNASOR/6300PATTERNSOR | 0.1h単位切上丸め | diff --git a/詳細設計書/詳細設計書_KIN04CHK.md b/詳細設計書/詳細設計書_KIN04CHK.md new file mode 100644 index 0000000..dd6f452 --- /dev/null +++ b/詳細設計書/詳細設計書_KIN04CHK.md @@ -0,0 +1,155 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN04CHK | +| 3 | プログラム名 | 打刻項目チェック処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | 項目チェック(重複なし) | +| 6 | 機能概要 | CSV形式の打刻データファイルを読み込み、項目チェックを行い、正常レコードをEDITED-PUNCHへ、異常レコードをERROR-LOGへ振り分ける。 | +| 7 | | チェックはIF多重ネスト(THEN句)で4段階:社員番号必須→日付妥当性→時刻妥当性→出勤<退勤 | +| 8 | | 正常出力はWRITE FROMを使用する(新規カバレッジ) | + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | KIN04R01(CSV) | ソート不要。CSV形式(カンマ区切り、6項目) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | RAW-PUNCH | R01 | KIN04R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 | +| 2 | EDITED-PUNCH | W01 | KIN04W01 | O | KIN04REC | FB | | 80 | PS | WRITE FROM使用 | +| 3 | ERROR-LOG | W02 | KIN04W02 | O | KIN05REC | VB | | 200 | PS | | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | RAW-PUNCH | なし | なし | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | +| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-5.使用ファイルのオープン(R01:入力、W01/W02:出力) + 1-6.R01を読み込む。(1100R01INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.CSVの分解(2010CSVSOR) + UNSTRINGでカンマ区切りのCSVを6項目に分解する。 + (EMP-ID, DATE, TIME-IN, TIME-OUT, DEPT-ID, TERMINAL) + 2.1.5.社員番号チェック(2021EMPIDSOR) + SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。 + SUB04CHKの復帰コードにより正常/異常を判定する。 + 2-2.IF多重ネストチェック(2020VALIDATESOR) + 第1段階: フィールド数チェック + 社員番号チェック(2021EMPIDSOR) + IF フィールド数=6 THEN + 2021EMPIDSORを実行 + IF 社員番号正常 THEN + SUB04CHK('DATE')で日付チェック + IF 正常 THEN + SUB04CHK('TIME')で時刻チェック(出勤) + IF 正常 THEN + SUB04CHK('TIME')で時刻チェック(退勤) + IF 正常 THEN + IF 出勤時刻 < 退勤時刻 THEN + WRITE FROMでW01出力(2050NORMSOR) + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + ELSE + エラー区分='02'でW02出力(2090ERRORSOR) + END-IF + + 2021EMPIDSOR (社員番号チェック) + 本Paragraphは2020VALIDATESORの第1段階(フィールド数OK時)に + PERFORMされる。 + SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。 + 復帰コード=ZEROなら正常、≠ZEROなら異常として呼び出し元に戻る。 + + 2-3.R01を読み込む。(1100R01INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:'KIN04R01' + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:'KIN04W01'、'KIN04W02' + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/EDITED-PUNCH) KIN04REC 80B FB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | EMP-ID | WRK-CSV-EMP-ID | 社員番号 | +| 2 | WORK-DATE | WRK-CSV-DATE | YYYYMMDD | +| 3 | STR-TIME | WRK-CSV-TIME-IN | HHMM | +| 4 | END-TIME | WRK-CSV-TIME-OUT | HHMM | +| 5 | DEPT-ID | WRK-CSV-DEPT-ID | 部署ID | +| 6 | TERMINAL | WRK-CSV-TERMINAL | 端末ID | +| 7 | FILLER | SPACE | 46B | + +### 出力ファイル2(W02/ERROR-LOG) KIN05REC 200B VB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | '02'固定 | 打刻エラー | +| 2 | ERR-DETAIL | STRING編集 | エラー内容(198B) | diff --git a/詳細設計書/詳細設計書_KIN05MAT.md b/詳細設計書/詳細設計書_KIN05MAT.md new file mode 100644 index 0000000..88e1ea2 --- /dev/null +++ b/詳細設計書/詳細設計書_KIN05MAT.md @@ -0,0 +1,128 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN05MAT | +| 3 | プログラム名 | 打刻休暇照合処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | マッチング(1:N) | +| 6 | 機能概要 | EDITED-PUNCH(打刻側、R01)とLEAVE-DAILY(休暇側、R02)を社員番号+日付キーで照合し、KIN-LEAVE(160B)に出力する。R01側が主駆動で、1件の打刻に対してN件の休暇レコードが存在しうる(1:N)。 | +| 7 | | マッチング制御はEVALUATE TRUEで3分岐:R01keyR02key(休暇のみスキップ)。 | +| 8 | | マッチ時は休暇種別優先順位(01>02>03>04)で最適な1件を選定し、KIN-LEAVEに出力する。 | + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | KIN04W01(R01) | 社員番号+日付で昇順ソート済み(JCL SORT KINJ022) | +| 2 | KIN02W01(R02) | 社員番号+日付で昇順ソート済み(KIN03EXP出力保証) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | EDITED-PUNCH | R01 | KIN04W01 | I | KIN04REC | FB | | 80 | PS | 打刻側、主駆動 | +| 2 | LEAVE-DAILY | R02 | KIN02W01 | I | KIN02REC | FB | | 80 | PS | 休暇側、N件あり | +| 3 | KIN-LEAVE | W01 | KIN05W01 | O | KIN03REC | FB | | 160 | PS | 照合結果 | + +### ファイルステータス + +| ファイル | DD名 | ファイルステータス項目 | +|---------|------|---------------------| +| EDITED-PUNCH(R01) | KIN04W01 | WS-R01-STATUS | +| LEAVE-DAILY(R02) | KIN02W01 | WS-R02-STATUS | +| KIN-LEAVE(W01) | KIN05W01 | WS-W01-STATUS | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | EDITED-PUNCH | 社員番号(1-8B)+日付(9-16B) | 主キー(R01) | +| 2 | LEAVE-DAILY | 社員番号(1-8B)+日付(9-16B) | 従キー(R02)、N件あり | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.使用ファイルのオープン(R01/R02:入力、W01:出力) + 1-4-1.OPENチェック + 各ファイルのFILE STATUS(WS-R01-STATUS/WS-R02-STATUS/WS-W01-STATUS)を確認 + ステータス≠00の場合、SUB03END(ZANENDAC)で異常終了 + 1-5.R01を読み込む。(1100R01INNSOR)(1回目) + 1-6.R02を読み込む。(1200R02INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.R02キー設定 + R02が有効な場合、R02レコードからWRK-R02KEYを設定。 + 2-2.EVALUATE TRUE マッチング制御 + WHEN R01key < R02key OR R02-EOF: + 打刻のみ(休暇なし)→ KIN-LEAVE出力(LEAVE-TYPE='99', HOURS=0) + R01を次へ読み込み + WHEN R01key = R02key: + マッチング処理実行(2020MATCHSOR) + R01を次へ読み込み + R02も次へ読み込み(N:1の場合はループ内で全R02処理) + WHEN R01key > R02key: + R02のみ(該当打刻なし)→ スキップ + R02を次へ読み込み + 2-3.上記をR01終了まで繰り返す。 + +3.マッチング処理(2020MATCHSOR) + R02がEOFになるか、キーが変わるまで、以下のループを実行: + 3-1.現在のR02レコードから休暇種別・時刻・申請IDを取得 + 3-2.選定ロジック: + - 初回 → ベストとして保持 + - 既にベストあり → 優先順位で比較(01>02>03>04) + - 同種別 → 申請IDの小さい方を採用 + 3-3.R02を次へ読み込み + 3-4.キーが一致しなくなるかR02-EOFまで3-1〜3-3を繰り返す + 3-5.ベストの休暇情報をKIN-LEAVEに出力 + ベストがない場合は'99'として出力 + +4.終了処理(3000STPSOR) + 4-1.入出力ファイルのクローズ + 4-2.入出力件数出力メッセージ出力 + 4-3.終了メッセージ出力 +``` + +--- + +## 出力レコード定義 + +### 出力ファイル(W01/KIN-LEAVE) KIN03REC 160B FB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | EMP-ID | R01EMP-ID | 打刻情報(1-80BはEDITED-PUNCHと同一) | +| 2 | WORK-DATE | R01WORK-DATE | | +| 3 | STR-TIME | R01STR-TIME | | +| 4 | END-TIME | R01END-TIME | | +| 5 | DEPT-ID | R01DEPT-ID | | +| 6 | TERMINAL | R01TERMINAL | | +| 7-13 | 休暇情報 | マッチ結果 | 81-160B | +| 7 | LEAVE-TYPE | 選定結果 | '01'〜'04' or '99' | +| 8 | LEAVE-STR-TIME | 選定したR02START-TIME | | +| 9 | LEAVE-END-TIME | 選定したR02END-TIME | | +| 10 | LEAVE-HOURS | ZERO | KIN07DAIで後に計算 | +| 11 | APPLICATION-ID | 選定したR02APPL-ID | 該当なしはZERO | diff --git a/詳細設計書/詳細設計書_KIN06CLD.md b/詳細設計書/詳細設計書_KIN06CLD.md new file mode 100644 index 0000000..c0e80e3 --- /dev/null +++ b/詳細設計書/詳細設計書_KIN06CLD.md @@ -0,0 +1,116 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN06CLD | +| 3 | プログラム名 | 出勤日カレンダー生成処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | レイアウト編集のみ(GETPUT) | +| 6 | 機能概要 | PARMで指定された年月の出勤日カレンダーを生成する。在籍社員一覧をDBから取得し、各社員について当月1日〜月末日をPERFORM VARYINGでループ。休日判定(PERFORM VARYING線形探索 + 曜日判定)を行い、出勤日のみWORK-DAY-FILEに出力する。 | + +### 前提条件 + +| NO | 対象ファイル/DB | 条件 | +|----|----------------|------| +| 1 | EMP_MASTER | 在籍社員(STATUS='1')が登録済みであること | +| 2 | HOLIDAY_CALENDAR | 対象年月の休日が登録済みであること | + +### PARM引数 + +コマンドラインで `YEARMONTH=YYYYMM` 形式で指定。必須。 + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------| +| 1 | WORK-DAY-FILE | OUTREC | KIN06W01 | O | KIN06REC | FB | | 80 | PS | + +### 使用DBテーブル + +| NO | テーブル名 | 処理内容 | +|----|-----------|---------| +| 1 | EMP_MASTER | SELECT EMP_ID WHERE STATUS='1' ORDER BY EMP_ID (CURSOR) | +| 2 | HOLIDAY_CALENDAR | SELECT HOLIDAY_DATE WHERE HOLIDAY_DATE LIKE 'YYYYMM%' → WORKING-STORAGE格納 | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.PARM解析(YEARMONTH=YYYYMM から対象年月を抽出) + 必須チェック:PARMなし→ABEND + 形式チェック:YEARMONTH= から始まること + 値範囲:XXXX01〜XXXX12 + 月チェック(1-12): WRK-MONTH < 1 OR > 12 → ABEND(CALL SUB03END) + 1-4.ワークエリア初期化 + 1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db') + 1-6.休日データ読込(HOLIDAY_CALENDARから対象月の祝日をSELECT) + テーブルに格納(PERFORM VARYING線形探索用) + 【ガード】HOLIDAY-COUNTが50未満の場合のみADD+参照を行う(テーブル溢れ防止) + ループ条件で HOLIDAY-COUNT < 50 をチェック(HOLIDAY-COUNT PIC 9(2)対応) + 1-7.出力ファイルOPEN + 1-8.社員一覧取得(EMP_MASTER CURSOR OPEN→初回FETCH) + +2.主処理(2000MAJSOR)(社員EOFまで下記を繰り返す) + 2-1.当月1日〜月末日をループ(PERFORM VARYING) + 2-1-1.日付文字列構築(YYYYMMDD) + 2-1-2.曜日計算(INTEGER-OF-DATE) + - INTEGER-OF-DATE('YYYYMMDD') で通算日数を取得 + - MOD(通算日数, 7) で曜日:0=日, 1=月, 2=火, …, 6=土 + 2-1-3.休日判定(PERFORM VARYING線形探索) + 祝日テーブルを先頭から線形探索(部分埋めテーブル対応のためSEARCH ALL不使用) + 2-1-4.曜日判定 + 土曜(0) または 日曜(6)→休日としてスキップ(CONTINUE) + 2-1-5.出勤日 → WRITE FROMで出力(社員番号+日付+曜日) + 2-2.次の社員をFETCH + +3.終了処理(3000STPSOR) + 3-1.CURSOR CLOSE + 3-2.DB切断 + 3-3.出力ファイルCLOSE + 3-4.出力件数メッセージ出力 + 3-5.終了メッセージ出力 +``` + +### 曜日計算 + +INTEGER-OF-DATE('YYYYMMDD') は1601-01-01からの通算日数を返す。 +- 1601-01-01 = Monday → MOD(x,7):0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat + +### 休日判定ロジック + +1. HOLIDAY_CALENDARに日付が存在する → 休日(PERFORM VARYING線形探索) +2. 曜日が土曜(6)または日曜(0) → 休日 +3. 上記以外 → 出勤日 + +--- + +## 出力レコード定義 + +### 出力ファイル(OUTREC/WORK-DAY-FILE)KIN06REC 80B FB + +| No | 項目名 | 設定元 | 属性 | 備考 | +|----|--------|--------|------|------| +| 1 | EMP-ID | 社員マスタのEMP_ID | X(8) | 社員番号 | +| 2 | DATE | ループ変数 | 9(8) | YYYYMMDD | +| 3 | DAY-OF-WEEK | 曜日計算結果 | 9(1) | 1=月…7=日 | +| 4 | FILLER | SPACE | X(63) | | diff --git a/詳細設計書/詳細設計書_KIN07DAI.md b/詳細設計書/詳細設計書_KIN07DAI.md new file mode 100644 index 0000000..ca59723 --- /dev/null +++ b/詳細設計書/詳細設計書_KIN07DAI.md @@ -0,0 +1,167 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 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異常時等) |