Files
cobol-tna-system/src/KYU04CAL.cbl
T

468 lines
20 KiB
COBOL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU04CAL.
*****************************************************************
* システム名 : 給与計算システム *
* プログラムID : KYU04CAL *
* プログラム名 : 給与計算処理 *
* 作成日 : 2026-07-01 *
* 処理概要 : 欠勤集約 + EMP-MASTER + OVT-MONTHLY を *
* 参照し給与計算を実行 *
* 勤怠区分×手当種別の複合分岐はEVALUATE ALSO *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-01 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R02INNFIL ASSIGN TO EXTERNAL KYU04R02
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT R03INNFIL ASSIGN TO EXTERNAL KYU04R03
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT W03OUTFIL ASSIGN TO EXTERNAL KYU04W03
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT W04OUTFIL ASSIGN TO EXTERNAL KYU04W04
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R02: ABSENCE-AGGREGATE80B 社員単位) *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
COPY KYU02REC REPLACING ==(A)== BY ==R02==.
*
*****************************************************************
* R03: PAY-PARAM80B FB *
*****************************************************************
FD R03INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R03INNREC PIC X(080).
*
*****************************************************************
* W03: SALARY-DETAIL240B FB *
*****************************************************************
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W03OUTREC.
COPY KYU03REC REPLACING ==(A)== BY ==W03==.
*
*****************************************************************
* W04: ERROR-LOGVB *
*****************************************************************
FD W04OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W04OUTREC.
COPY KYU99REC REPLACING ==(A)== BY ==W04==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KYU04CAL'.
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-OVERTIME-RATE PIC 9(002)V9(002)
VALUE 01.25.
03 CNS-HOLIDAY-RATE PIC 9(001)V9(02)
VALUE 1.35.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R02INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W04OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
*** パラメータ
03 WRK-PARAM.
05 WRK-PARAM-BASE PIC X(080).
05 WRK-PARAM-FILLER PIC X(080).
*** 給与計算
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-EMP-ID PIC X(008).
03 WRK-EMP-NAME PIC X(040).
03 WRK-DEPT-CODE PIC X(002).
03 WRK-REGION-CODE PIC X(002).
03 WRK-CATEGORY-CODE PIC X(003).
03 WRK-BASE-SALARY PIC 9(009).
03 WRK-HOURLY-RATE PIC 9(007).
03 WRK-DEPENDENT-COUNT PIC 9(002).
03 WRK-ABSENT-HOURS PIC 9(004)V9(001).
03 WRK-OVT-HOURS PIC 9(004)V9(001).
03 WRK-ABSENT-DEDUCT PIC 9(009).
03 WRK-OVT-AMOUNT PIC 9(009).
03 WRK-GROSS-PAYMENT PIC 9(009).
03 WRK-ALLOWANCE-TYPE PIC X(003).
03 WRK-ATTEND-TYPE PIC X(001).
03 WRK-AMOUNT PIC 9(009).
03 WS-PAD-CHAR PIC X(001) VALUE SPACE.
03 WS-FILE-STATUS PIC X(002).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-EMP-ID PIC X(008).
03 DBV-BASE-SALARY PIC 9(009).
03 DBV-HOURLY-RATE PIC 9(007).
03 DBV-DEPENDENT-COUNT PIC 9(002).
03 DBV-EMPLOYEE-NAME PIC X(040).
03 DBV-DEPT-CODE PIC X(002).
03 DBV-OVT-HOURS PIC 9(004)V9(001).
03 DBV-STATUS PIC X(001).
*
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY ZANDATAC.
COPY ZANMSGAC.
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
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 NOT = ZERO
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** PAY-PARAM読込
OPEN INPUT R03INNFIL.
READ R03INNFIL
INTO WRK-PARAM-BASE
END-READ.
CLOSE R03INNFIL.
*
*** パラメータ解析
UNSTRING WRK-PARAM-BASE
DELIMITED BY ','
INTO WRK-YEAR-MONTH
END-UNSTRING.
*
OPEN INPUT R02INNFIL.
OPEN OUTPUT W03OUTFIL
W04OUTFIL.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/SALARY.db'
END-EXEC.
*
PERFORM 1100R02INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R02読込処理 *
*****************************************************************
1100R02INNSOR SECTION.
*
READ R02INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R02INN
END-READ.
*
1100R02INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
*** ホスト変数セット
MOVE R02EMP-ID TO DBV-EMP-ID.
*
*** DB2 EMP-MASTER参照
EXEC SQL
SELECT EMP-NAME, DEPT-CODE, REGION-CODE,
CATEGORY-CODE, BASE-SALARY, HOURLY-RATE,
DEPENDENT-COUNT, STATUS
INTO :DBV-EMPLOYEE-NAME,
:DBV-DEPT-CODE,
:WRK-REGION-CODE,
:WRK-CATEGORY-CODE,
:DBV-BASE-SALARY,
:DBV-HOURLY-RATE,
:DBV-DEPENDENT-COUNT,
:DBV-STATUS
FROM EMP-MASTER
WHERE EMP-ID = :DBV-EMP-ID
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 2200ERROUTSOR
PERFORM 1100R02INNSOR
EXIT SECTION
END-IF.
*
MOVE DBV-EMPLOYEE-NAME TO WRK-EMP-NAME.
MOVE DBV-BASE-SALARY TO WRK-BASE-SALARY.
MOVE DBV-HOURLY-RATE TO WRK-HOURLY-RATE.
MOVE DBV-DEPT-CODE TO WRK-DEPT-CODE.
MOVE R02YEAR-MONTH TO WRK-YEAR-MONTH.
MOVE R02TOTAL-HOURS TO WRK-ABSENT-HOURS.
*
*** OVT-MONTHLY参照(残業時間)
EXEC SQL
SELECT SUM(OVT-HOURS)
INTO :DBV-OVT-HOURS
FROM OVT-MONTHLY
WHERE EMP-ID = :DBV-EMP-ID
AND YEAR-MONTH = :WRK-YEAR-MONTH
END-EXEC.
IF SQLCODE = 0
CONTINUE
ELSE
MOVE ZERO TO DBV-OVT-HOURS
END-IF.
*
*** 給与計算
PERFORM 2100CALCSOR.
*
*** SALARY-DETAIL出力
PERFORM 2110WRITOUTSOR.
*
PERFORM 1100R02INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: 給与計算処理 *
*****************************************************************
2100CALCSOR SECTION.
*
*** 欠勤控除額
COMPUTE WRK-ABSENT-DEDUCT ROUNDED =
DBV-HOURLY-RATE * WRK-ABSENT-HOURS
ON SIZE ERROR
MOVE ZERO TO WRK-ABSENT-DEDUCT
END-COMPUTE.
*
*** 残業手当
COMPUTE WRK-OVT-AMOUNT ROUNDED =
DBV-HOURLY-RATE * DBV-OVT-HOURS * CNS-OVERTIME-RATE
ON SIZE ERROR
MOVE ZERO TO WRK-OVT-AMOUNT
END-COMPUTE.
*
*** EVALUATE ALSO(勤怠区分×手当種別)
MOVE 'OVT' TO WRK-ALLOWANCE-TYPE.
MOVE 'W' TO WRK-ATTEND-TYPE.
*
EVALUATE WRK-ALLOWANCE-TYPE
ALSO WRK-ATTEND-TYPE
WHEN 'OVT' ALSO 'W'
COMPUTE WRK-AMOUNT ROUNDED =
DBV-HOURLY-RATE * DBV-OVT-HOURS * 1.25
END-COMPUTE
WHEN 'OVT' ALSO 'H'
COMPUTE WRK-AMOUNT ROUNDED =
DBV-HOURLY-RATE * DBV-OVT-HOURS * 1.35
END-COMPUTE
WHEN 'LATE' ALSO ANY
COMPUTE WRK-AMOUNT ROUNDED =
DBV-HOURLY-RATE * DBV-OVT-HOURS * 0.50
END-COMPUTE
WHEN OTHER
MOVE ZERO TO WRK-AMOUNT
END-EVALUATE.
*
*** 支給総額
COMPUTE WRK-GROSS-PAYMENT =
DBV-BASE-SALARY + WRK-OVT-AMOUNT
- WRK-ABSENT-DEDUCT
END-COMPUTE.
*
2100CALCSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: SALARY-DETAIL出力処理 *
*****************************************************************
2110WRITOUTSOR SECTION.
*
INITIALIZE W03OUTREC.
MOVE R02EMP-ID TO W03EMP-ID.
MOVE WRK-EMP-NAME TO W03EMP-NAME.
MOVE WRK-DEPT-CODE TO W03DEPT-CODE.
MOVE DBV-BASE-SALARY TO W03BASE-SALARY.
MOVE WRK-OVT-AMOUNT TO W03OVT-AMOUNT.
MOVE ZERO TO W03HOLIDAY-AMOUNT.
MOVE WRK-ABSENT-DEDUCT TO W03ABSENT-DEDUCT.
MOVE WRK-GROSS-PAYMENT TO W03GROSS-PAYMENT.
MOVE DBV-OVT-HOURS TO W03OVT-HOURS.
MOVE WRK-ABSENT-HOURS TO W03ABSENT-HOURS.
MOVE WRK-ATTEND-TYPE TO W03ATTEND-TYPE.
MOVE WRK-ALLOWANCE-TYPE TO W03ALLOWANCE-TYPE.
WRITE W03OUTREC.
ADD 1 TO CUN-W03OUT.
*
2110WRITOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: エラー出力処理 *
*****************************************************************
2200ERROUTSOR SECTION.
*
MOVE 'DB-ERR' TO W04ERR-CATEGORY.
MOVE R02EMP-ID TO W04ERR-DETAIL.
WRITE W04OUTREC.
ADD 1 TO CUN-W04OUT.
*
2200ERROUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
CLOSE R02INNFIL
W03OUTFIL
W04OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KYU04R02' TO M00UMKDATS22-01.
MOVE CUN-R02INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KYU04W03' TO M00UMKDATS22-01.
MOVE CUN-W03OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KYU04W04' TO M00UMKDATS22-01.
MOVE CUN-W04OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
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処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.