Files
cobol-java-v3/benchmark-programs/05-branch-if/main-05-branch-if.cbl
NB-076 94400d50d4 feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 09:53:21 +08:00

701 lines
29 KiB
COBOL

*> main-05-branch-if.cbl : 料金阶梯判定 v2 (IF Rate Determination)
*> STANDARD BILLING - Expanded. 8 TIER outputs:
*> A(0-60) B(61-300) C(301-900) D(901-1800) E(1801-3600)
*> F(3601-7200) G(>7200) ERR(invalid)
*> Coverage: B-N001~N005, B-N010, B-R001
IDENTIFICATION DIVISION.
PROGRAM-ID. BranchIf.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-IN ASSIGN TO "FILE-IN.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-IN.
SELECT FILE-OUT-A ASSIGN TO "FILE-OUT-A.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-A.
SELECT FILE-OUT-B ASSIGN TO "FILE-OUT-B.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-B.
SELECT FILE-OUT-C ASSIGN TO "FILE-OUT-C.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-C.
SELECT FILE-OUT-D ASSIGN TO "FILE-OUT-D.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-D.
SELECT FILE-OUT-E ASSIGN TO "FILE-OUT-E.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-E.
SELECT FILE-OUT-F ASSIGN TO "FILE-OUT-F.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-F.
SELECT FILE-OUT-G ASSIGN TO "FILE-OUT-G.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-G.
SELECT FILE-OUT-ERR ASSIGN TO "FILE-OUT-ERR.DAT"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-ERR.
SELECT FILE-AUDIT ASSIGN TO "audit-report.txt"
ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-AUDIT.
DATA DIVISION.
FILE SECTION.
FD FILE-IN.
01 FILE-IN-REC.
05 IN-KEY PIC X(10).
05 IN-DATA1 PIC X(20).
05 IN-DATA2 PIC 9(10).
FD FILE-OUT-A.
01 FILE-OUT-A-REC.
05 OUT-A-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-A-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-A-DATA2 PIC 9(10).
FD FILE-OUT-B.
01 FILE-OUT-B-REC.
05 OUT-B-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-B-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-B-DATA2 PIC 9(10).
FD FILE-OUT-C.
01 FILE-OUT-C-REC.
05 OUT-C-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-C-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-C-DATA2 PIC 9(10).
FD FILE-OUT-D.
01 FILE-OUT-D-REC.
05 OUT-D-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-D-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-D-DATA2 PIC 9(10).
FD FILE-OUT-E.
01 FILE-OUT-E-REC.
05 OUT-E-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-E-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-E-DATA2 PIC 9(10).
FD FILE-OUT-F.
01 FILE-OUT-F-REC.
05 OUT-F-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-F-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-F-DATA2 PIC 9(10).
FD FILE-OUT-G.
01 FILE-OUT-G-REC.
05 OUT-G-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-G-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-G-DATA2 PIC 9(10).
FD FILE-OUT-ERR.
01 FILE-OUT-ERR-REC.
05 OUT-ERR-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 OUT-ERR-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 OUT-ERR-DATA2 PIC 9(10).
FD FILE-AUDIT.
01 FILE-AUDIT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-TELECOM-REC.
COPY "telecom/TEL-BILLING.cpy".
01 FS-IN PIC X(2).
01 FS-OUT-A PIC X(2).
01 FS-OUT-B PIC X(2).
01 FS-OUT-C PIC X(2).
01 FS-OUT-D PIC X(2).
01 FS-OUT-E PIC X(2).
01 FS-OUT-F PIC X(2).
01 FS-OUT-G PIC X(2).
01 FS-OUT-ERR PIC X(2).
01 FS-AUDIT PIC X(2).
01 WS-STATUS.
05 WS-EOF-FLAG PIC X VALUE 'N'.
88 WS-EOF VALUE 'Y' FALSE 'N'.
01 WS-COUNTERS.
05 WS-COUNT-A PIC 9(5) VALUE 0.
05 WS-COUNT-B PIC 9(5) VALUE 0.
05 WS-COUNT-C PIC 9(5) VALUE 0.
01 WS-TIER-COUNTERS.
05 WS-TIER-1-CNT PIC 9(5) VALUE 0.
05 WS-TIER-2-CNT PIC 9(5) VALUE 0.
05 WS-TIER-3-CNT PIC 9(5) VALUE 0.
05 WS-COUNT-D PIC 9(5) VALUE 0.
05 WS-COUNT-E PIC 9(5) VALUE 0.
05 WS-COUNT-F PIC 9(5) VALUE 0.
05 WS-COUNT-G PIC 9(5) VALUE 0.
05 WS-COUNT-ERR PIC 9(5) VALUE 0.
01 WS-HASH-TOTALS.
05 WS-HASH-IN PIC 9(12) VALUE 0.
05 WS-HASH-OUT-A PIC 9(12) VALUE 0.
05 WS-HASH-OUT-B PIC 9(12) VALUE 0.
05 WS-HASH-OUT-C PIC 9(12) VALUE 0.
05 WS-HASH-OUT-D PIC 9(12) VALUE 0.
05 WS-HASH-OUT-E PIC 9(12) VALUE 0.
05 WS-HASH-OUT-F PIC 9(12) VALUE 0.
05 WS-HASH-OUT-G PIC 9(12) VALUE 0.
05 WS-HASH-OUT-ERR PIC 9(12) VALUE 0.
01 WS-BATCH-TOTALS.
05 WS-RECORDS-READ PIC 9(5) VALUE 0.
05 WS-RECORDS-WRITTEN PIC 9(5) VALUE 0.
05 WS-ERROR-COUNT PIC 9(5) VALUE 0.
05 WS-WARN-COUNT PIC 9(5) VALUE 0.
01 WS-DATE-TIME.
05 WS-DATE PIC X(10).
05 WS-TIME PIC X(10).
01 WS-TIMESTAMP PIC X(20).
01 WS-DATA2-NUM PIC 9(10).
01 WS-DISPLAY-LINE.
05 WS-DISP-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 WS-DISP-DATA1 PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 WS-DISP-DATA2 PIC 9(10).
05 FILLER PIC X VALUE SPACE.
05 WS-DISP-BRANCH PIC X(10).
01 WS-TARIFF-RULES.
05 WS-PEAK-FLAG PIC X VALUE 'N'.
88 WS-PEAK VALUE 'Y' FALSE 'N'.
05 WS-WEEKEND-FLAG PIC X VALUE 'N'.
88 WS-WEEKEND VALUE 'Y' FALSE 'N'.
05 WS-ROAM-FLAG PIC X VALUE 'N'.
88 WS-ROAMING VALUE 'Y' FALSE 'N'.
05 WS-RATE-TYPE PIC X(10).
05 WS-CALC-AMT PIC 9(9)V99.
05 WS-MIN-CHARGE PIC 9(5)V99 VALUE 10.00.
05 WS-CAP-AMOUNT PIC 9(9)V99 VALUE 99999.99.
05 WS-FALLBACK-RATE PIC 9(5)V99 VALUE 1.50.
01 WS-AUDIT-LINE.
05 AU-TIMESTAMP PIC X(20).
05 FILLER PIC X VALUE SPACE.
05 AU-TIER PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 AU-KEY PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 AU-AMOUNT PIC Z(9)9.
05 FILLER PIC X VALUE SPACE.
05 AU-STATUS PIC X(10).
01 WS-SEVERITY PIC X(10).
01 WS-ERROR-MSG PIC X(60).
PROCEDURE DIVISION.
*> ============================================================
*> 1000-INIT-SECTION: Initialize all counters
*> ============================================================
1000-INIT-SECTION.
1000-INIT.
MOVE 0 TO WS-COUNT-A WS-COUNT-B WS-COUNT-C
MOVE 0 TO WS-TIER-1-CNT WS-TIER-2-CNT WS-TIER-3-CNT
MOVE 0 TO WS-COUNT-D WS-COUNT-E WS-COUNT-F
MOVE 0 TO WS-COUNT-G WS-COUNT-ERR
MOVE 0 TO WS-RECORDS-READ WS-RECORDS-WRITTEN
MOVE 0 TO WS-ERROR-COUNT WS-WARN-COUNT
MOVE 0 TO WS-HASH-IN WS-HASH-OUT-A WS-HASH-OUT-B
MOVE 0 TO WS-HASH-OUT-C WS-HASH-OUT-D WS-HASH-OUT-E
MOVE 0 TO WS-HASH-OUT-F WS-HASH-OUT-G WS-HASH-OUT-ERR
MOVE 'N' TO WS-EOF-FLAG WS-PEAK-FLAG
MOVE 'N' TO WS-WEEKEND-FLAG WS-ROAM-FLAG
MOVE FUNCTION CURRENT-DATE (1:10) TO WS-DATE
MOVE FUNCTION CURRENT-DATE (12:8) TO WS-TIME
STRING WS-DATE ' ' WS-TIME INTO WS-TIMESTAMP
DISPLAY 'Timestamp: ' WS-TIMESTAMP
DISPLAY '== TELECOM BILLING - BranchIf v2.0 =='
.
*> ============================================================
*> 2000-OPEN-FILES-SECTION: Open all files, check status
*> ============================================================
2000-OPEN-FILES-SECTION.
2000-OPEN-FILES.
OPEN INPUT FILE-IN
IF FS-IN NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Open FILE-IN failed FS=' FS-IN INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
STOP RUN
END-IF
OPEN OUTPUT FILE-OUT-A FILE-OUT-B FILE-OUT-C
FILE-OUT-D FILE-OUT-E FILE-OUT-F
FILE-OUT-G FILE-OUT-ERR
IF FS-OUT-A NOT = '00' OR FS-OUT-B NOT = '00'
OR FS-OUT-C NOT = '00' OR FS-OUT-D NOT = '00'
OR FS-OUT-E NOT = '00' OR FS-OUT-F NOT = '00'
OR FS-OUT-G NOT = '00' OR FS-OUT-ERR NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Open output files failed' INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
STOP RUN
END-IF
OPEN OUTPUT FILE-AUDIT
IF FS-AUDIT NOT = '00'
DISPLAY '[WARN] Audit open FS=' FS-AUDIT
END-IF
DISPLAY 'All files opened OK.'
.
3000-PROCESS-SECTION.
3000-PROCESS.
DISPLAY 'Processing...'
PERFORM UNTIL WS-EOF
PERFORM 3100-READ-INPUT-SECTION
IF NOT WS-EOF
PERFORM 3200-VALIDATE-SECTION
PERFORM 3300-APPLY-RULES-SECTION
END-IF
END-PERFORM
.
3100-READ-INPUT-SECTION.
3100-READ-INPUT.
READ FILE-IN INTO FILE-IN-REC
AT END SET WS-EOF TO TRUE
NOT AT END
ADD 1 TO WS-RECORDS-READ
ADD IN-DATA2 TO WS-HASH-IN
IF FS-IN NOT = '00'
MOVE 'WARNING' TO WS-SEVERITY
STRING 'Read FS=' FS-IN INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
END-READ
.
*> ============================================================
*> 3200-VALIDATE-SECTION: Validate and classify business rules
*> ============================================================
3200-VALIDATE-SECTION.
3200-VALIDATE.
MOVE IN-DATA2 TO WS-DATA2-NUM
IF IN-DATA1 (1:4) = 'PEAK'
MOVE 'Y' TO WS-PEAK-FLAG MOVE 'PEAK' TO WS-RATE-TYPE
ELSE
IF IN-DATA1 (1:4) = 'OFFP'
MOVE 'N' TO WS-PEAK-FLAG
MOVE 'OFF-PEAK' TO WS-RATE-TYPE
ELSE
IF IN-DATA1 (1:4) = 'WKND'
MOVE 'Y' TO WS-WEEKEND-FLAG
MOVE 'WEEKEND' TO WS-RATE-TYPE
ELSE
IF IN-DATA1 (1:4) = 'ROAM'
MOVE 'Y' TO WS-ROAM-FLAG
MOVE 'ROAMING' TO WS-RATE-TYPE
ELSE
MOVE 'STANDARD' TO WS-RATE-TYPE
END-IF
END-IF
END-IF
END-IF
.
*> ============================================================
*> 3300-APPLY-RULES-SECTION: Calls original PROCESS-RECORD,
*> then adds new 8-way tariff tiers and validation checks
*> ============================================================
3300-APPLY-RULES-SECTION.
3300-APPLY-RULES.
PERFORM PROCESS-RECORD
*> NEW 8-way tariff tier IF/ELSE IF chain
IF WS-DATA2-NUM <= 0
MOVE 'ERR' TO WS-DISP-BRANCH
DISPLAY ' [TIER-8] Invalid <= 0'
ADD 1 TO WS-ERROR-COUNT
PERFORM ROUTE-TO-ERR
ELSE IF WS-DATA2-NUM <= 60
MOVE 'A' TO WS-DISP-BRANCH
DISPLAY ' [TIER-1] Free tier 0-60'
PERFORM ROUTE-TO-TIER-A
ELSE IF WS-DATA2-NUM <= 300
MOVE 'B' TO WS-DISP-BRANCH
DISPLAY ' [TIER-2] Basic 61-300'
PERFORM ROUTE-TO-TIER-B
ELSE IF WS-DATA2-NUM <= 900
MOVE 'C' TO WS-DISP-BRANCH
DISPLAY ' [TIER-3] Standard 301-900'
PERFORM ROUTE-TO-TIER-C
ELSE IF WS-DATA2-NUM <= 1800
MOVE 'D' TO WS-DISP-BRANCH
DISPLAY ' [TIER-4] High vol 901-1800'
PERFORM ROUTE-TO-D
ELSE IF WS-DATA2-NUM <= 3600
MOVE 'E' TO WS-DISP-BRANCH
DISPLAY ' [TIER-5] Premium 1801-3600'
PERFORM ROUTE-TO-E
ELSE IF WS-DATA2-NUM <= 7200
MOVE 'F' TO WS-DISP-BRANCH
DISPLAY ' [TIER-6] Business 3601-7200'
PERFORM ROUTE-TO-F
ELSE
MOVE 'G' TO WS-DISP-BRANCH
DISPLAY ' [TIER-7] Enterprise >7200'
PERFORM ROUTE-TO-G
END-IF
*> ELSE IF for 8+ DATA1 prefix check conditions
IF IN-DATA1 (1:2) = 'SP'
DISPLAY ' [8-WAY] SPECIAL'
ELSE IF IN-DATA1 (1:2) = 'HI'
DISPLAY ' [8-WAY] HIGH'
ELSE IF IN-DATA1 (1:2) = 'LO'
DISPLAY ' [8-WAY] LOW'
ELSE IF IN-DATA1 (1:2) = 'ME'
DISPLAY ' [8-WAY] MEDIUM'
ELSE IF IN-DATA1 (1:2) = 'UR'
DISPLAY ' [8-WAY] URGENT'
ELSE IF IN-DATA1 (1:2) = 'RO'
DISPLAY ' [8-WAY] ROAM'
ELSE IF IN-DATA1 (1:2) = 'PE'
DISPLAY ' [8-WAY] PEAK'
ELSE
DISPLAY ' [8-WAY] Unmapped'
END-IF
*> Nested IFs for rate lookup validation
IF WS-ROAM-FLAG = 'Y'
IF WS-RATE-TYPE = 'ROAMING'
MOVE 2.50 TO WS-CALC-AMT
DISPLAY ' [RATE] Roaming: 2.50'
ELSE
MOVE 1.00 TO WS-CALC-AMT
DISPLAY ' [RATE] Off-peak roam: 1.00'
END-IF
ELSE
MOVE 0.50 TO WS-CALC-AMT
DISPLAY ' [RATE] Standard: 0.50'
END-IF
*> Minimum charge check
IF WS-CALC-AMT < WS-MIN-CHARGE
MOVE WS-MIN-CHARGE TO WS-CALC-AMT
DISPLAY ' [MIN-CHG] Min applied: ' WS-MIN-CHARGE
ADD 1 TO WS-WARN-COUNT
END-IF
*> Cap check
IF WS-CALC-AMT > WS-CAP-AMOUNT
MOVE WS-CAP-AMOUNT TO WS-CALC-AMT
DISPLAY ' [CAP] Cap applied: ' WS-CAP-AMOUNT
ADD 1 TO WS-WARN-COUNT
END-IF
*> Fallback default rate for unmapped
IF WS-CALC-AMT = 0
MOVE WS-FALLBACK-RATE TO WS-CALC-AMT
DISPLAY ' [FALLBACK] Default rate'
END-IF
*> Error logging for unmapped cases
IF WS-DISP-BRANCH = 'ERR'
MOVE 'ERROR' TO WS-SEVERITY
STRING 'Unmapped duration ' WS-DATA2-NUM
INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
.
*> ============================================================
*> 3400-WRITE-OUTPUT-SECTION: Output routing (via ROUTE sections)
*> ============================================================
3400-WRITE-OUTPUT-SECTION.
3400-WRITE-OUTPUT.
CONTINUE.
.
*> ============================================================
*> 4000-REPORT-SECTION: Summary display
*> ============================================================
4000-REPORT-SECTION.
4000-REPORT.
DISPLAY ' '
DISPLAY '=== RESULTS ==='
DISPLAY 'A (1-60): ' WS-COUNT-A '+' WS-TIER-1-CNT
DISPLAY 'B (61-300): ' WS-COUNT-B '+' WS-TIER-2-CNT
DISPLAY 'C (301-900): ' WS-COUNT-C '+' WS-TIER-3-CNT
DISPLAY 'D (TIER-4 901-1800): ' WS-COUNT-D
DISPLAY 'E (TIER-5 1801-3600): ' WS-COUNT-E
DISPLAY 'F (TIER-6 3601-7200): ' WS-COUNT-F
DISPLAY 'G (TIER-7 >7200): ' WS-COUNT-G
DISPLAY 'ERR (Invalid): ' WS-COUNT-ERR
DISPLAY 'Batch: Read=' WS-RECORDS-READ ' Written='
WS-RECORDS-WRITTEN ' Err=' WS-ERROR-COUNT
' Warn=' WS-WARN-COUNT
DISPLAY 'Hash: IN=' WS-HASH-IN ' A=' WS-HASH-OUT-A
' B=' WS-HASH-OUT-B ' C=' WS-HASH-OUT-C
DISPLAY 'Hash: D=' WS-HASH-OUT-D ' E=' WS-HASH-OUT-E
' F=' WS-HASH-OUT-F ' G=' WS-HASH-OUT-G
' ERR=' WS-HASH-OUT-ERR
.
*> ============================================================
*> 5000-AUDIT-SECTION: Audit log to audit-report.txt
*> ============================================================
5000-AUDIT-SECTION.
AUDIT-START.
MOVE WS-TIMESTAMP TO AU-TIMESTAMP
MOVE 'START' TO AU-TIER MOVE 'PROGRAM' TO AU-KEY
MOVE 0 TO AU-AMOUNT MOVE 'OK' TO AU-STATUS
WRITE FILE-AUDIT-REC FROM WS-AUDIT-LINE
IF FS-AUDIT NOT = '00'
DISPLAY '[WARN] Audit write FS=' FS-AUDIT
END-IF
.
AUDIT-FINISH.
MOVE WS-TIMESTAMP TO AU-TIMESTAMP
MOVE 'END' TO AU-TIER MOVE 'PROGRAM' TO AU-KEY
MOVE WS-RECORDS-READ TO AU-AMOUNT
STRING 'REC=' WS-RECORDS-READ ' ERR=' WS-ERROR-COUNT
INTO AU-STATUS
WRITE FILE-AUDIT-REC FROM WS-AUDIT-LINE
IF FS-AUDIT NOT = '00'
DISPLAY '[WARN] Audit write FS=' FS-AUDIT
END-IF
.
*> ============================================================
*> 6000-ERROR-HANDLE-SECTION: Handle errors by severity
*> ============================================================
6000-ERROR-HANDLE-SECTION.
6000-ERROR-HANDLE.
DISPLAY '[' WS-TIMESTAMP '] [' WS-SEVERITY '] '
WS-ERROR-MSG
IF WS-SEVERITY = 'FATAL'
PERFORM 9000-EXIT-SECTION
STOP RUN
ELSE
IF WS-SEVERITY = 'ERROR'
ADD 1 TO WS-ERROR-COUNT
ELSE
IF WS-SEVERITY = 'WARNING'
ADD 1 TO WS-WARN-COUNT
END-IF
END-IF
END-IF
.
*> ============================================================
*> 9000-EXIT-SECTION: Close files and terminate
*> ============================================================
9000-EXIT-SECTION.
9000-EXIT.
MOVE FUNCTION CURRENT-DATE (1:10) TO WS-DATE
MOVE FUNCTION CURRENT-DATE (12:8) TO WS-TIME
STRING WS-DATE ' ' WS-TIME INTO WS-TIMESTAMP
PERFORM 4000-REPORT-SECTION
PERFORM 5000-AUDIT-SECTION THRU AUDIT-FINISH
CLOSE FILE-IN FILE-OUT-A FILE-OUT-B FILE-OUT-C
FILE-OUT-D FILE-OUT-E FILE-OUT-F
FILE-OUT-G FILE-OUT-ERR FILE-AUDIT
DISPLAY '[' WS-TIMESTAMP '] BranchIf COMPLETED'
.
*> ============================================================
*> MAIN SECTION (enhanced entry point)
*> ============================================================
MAIN SECTION.
MAIN-PROCEDURE.
PERFORM 1000-INIT-SECTION
PERFORM 2000-OPEN-FILES-SECTION
PERFORM 5000-AUDIT-SECTION THRU AUDIT-START
PERFORM 3000-PROCESS-SECTION
PERFORM 9000-EXIT-SECTION
STOP RUN.
*> ============================================================
*> ORIGINAL PROCESS-RECORD SECTION (PRESERVED AS-IS)
*> ============================================================
PROCESS-RECORD SECTION.
*
PROCESS-RECORD-PROC.
MOVE IN-DATA2 TO WS-DATA2-NUM
IF WS-DATA2-NUM < 1000
MOVE "A" TO WS-DISP-BRANCH
PERFORM ROUTE-TO-A
ELSE
IF WS-DATA2-NUM <= 5000
MOVE "B" TO WS-DISP-BRANCH
PERFORM ROUTE-TO-B
ELSE
MOVE "C" TO WS-DISP-BRANCH
PERFORM ROUTE-TO-C
END-IF
END-IF
MOVE IN-KEY TO WS-DISP-KEY
MOVE IN-DATA1 TO WS-DISP-DATA1
MOVE IN-DATA2 TO WS-DISP-DATA2
DISPLAY " -> " WS-DISP-KEY " / "
WS-DISP-DATA1 " / "
WS-DISP-DATA2 " => FILE-OUT-" WS-DISP-BRANCH
IF IN-DATA1 (1:7) = 'SPECIAL'
DISPLAY " [2-way ELSE] DATA1 starts with SPECIAL"
ELSE
DISPLAY " [2-way ELSE] DATA1 not start with SPECIAL"
END-IF
IF IN-KEY = 'A'
DISPLAY " [88-LEVEL] Key is A (88-level name)"
END-IF
IF (WS-DATA2-NUM < 500 OR WS-DATA2-NUM > 9000)
AND WS-DATA2-NUM NOT = 0
DISPLAY " [AND/OR] Compound condition met"
END-IF
IF WS-DATA2-NUM > 100
IF WS-DATA2-NUM < 9000
IF IN-KEY (1:1) = 'A'
DISPLAY " [NESTED] 3-level: DATA2(100,9000)"
END-IF
END-IF
END-IF
.
*> ============================================================
*> ORIGINAL ROUTE-TO-A (PRESERVED AS-IS)
*> ============================================================
ROUTE-TO-A SECTION.
ROUTE-TO-A-PROC.
MOVE IN-KEY TO OUT-A-KEY
MOVE IN-DATA1 TO OUT-A-DATA1
MOVE IN-DATA2 TO OUT-A-DATA2
WRITE FILE-OUT-A-REC
ADD 1 TO WS-COUNT-A
.
*> ============================================================
*> ORIGINAL ROUTE-TO-B (PRESERVED AS-IS)
*> ============================================================
ROUTE-TO-B SECTION.
ROUTE-TO-B-PROC.
MOVE IN-KEY TO OUT-B-KEY
MOVE IN-DATA1 TO OUT-B-DATA1
MOVE IN-DATA2 TO OUT-B-DATA2
WRITE FILE-OUT-B-REC
ADD 1 TO WS-COUNT-B
.
*> ============================================================
*> ORIGINAL ROUTE-TO-C (PRESERVED AS-IS)
*> ============================================================
ROUTE-TO-C SECTION.
ROUTE-TO-C-PROC.
MOVE IN-KEY TO OUT-C-KEY
MOVE IN-DATA1 TO OUT-C-DATA1
MOVE IN-DATA2 TO OUT-C-DATA2
WRITE FILE-OUT-C-REC
ADD 1 TO WS-COUNT-C
.
*> ============================================================
*> NEW ROUTE-TO-TIER-A (TIER-1 0-60s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-TIER-A SECTION.
ROUTE-TO-TIER-A-PROC.
MOVE IN-KEY TO OUT-A-KEY
MOVE IN-DATA1 TO OUT-A-DATA1
MOVE IN-DATA2 TO OUT-A-DATA2
WRITE FILE-OUT-A-REC
IF FS-OUT-A NOT = '00'
MOVE 'ERROR' TO WS-SEVERITY
STRING 'Write A FS=' FS-OUT-A INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-TIER-1-CNT
ADD WS-DATA2-NUM TO WS-HASH-OUT-A
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-TIER-B (TIER-2 61-300s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-TIER-B SECTION.
ROUTE-TO-TIER-B-PROC.
MOVE IN-KEY TO OUT-B-KEY
MOVE IN-DATA1 TO OUT-B-DATA1
MOVE IN-DATA2 TO OUT-B-DATA2
WRITE FILE-OUT-B-REC
IF FS-OUT-B NOT = '00'
MOVE 'ERROR' TO WS-SEVERITY
STRING 'Write B FS=' FS-OUT-B INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-TIER-2-CNT
ADD WS-DATA2-NUM TO WS-HASH-OUT-B
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-TIER-C (TIER-3 301-900s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-TIER-C SECTION.
ROUTE-TO-TIER-C-PROC.
MOVE IN-KEY TO OUT-C-KEY
MOVE IN-DATA1 TO OUT-C-DATA1
MOVE IN-DATA2 TO OUT-C-DATA2
WRITE FILE-OUT-C-REC
IF FS-OUT-C NOT = '00'
MOVE 'ERROR' TO WS-SEVERITY
STRING 'Write C FS=' FS-OUT-C INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-TIER-3-CNT
ADD WS-DATA2-NUM TO WS-HASH-OUT-C
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-D (TIER-4 901-1800s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-D SECTION.
ROUTE-TO-D-PROC.
MOVE IN-KEY TO OUT-D-KEY
MOVE IN-DATA1 TO OUT-D-DATA1
MOVE IN-DATA2 TO OUT-D-DATA2
WRITE FILE-OUT-D-REC
IF FS-OUT-D NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Write D FS=' FS-OUT-D INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-COUNT-D
ADD WS-DATA2-NUM TO WS-HASH-OUT-D
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-E (TIER-5 1801-3600s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-E SECTION.
ROUTE-TO-E-PROC.
MOVE IN-KEY TO OUT-E-KEY
MOVE IN-DATA1 TO OUT-E-DATA1
MOVE IN-DATA2 TO OUT-E-DATA2
WRITE FILE-OUT-E-REC
IF FS-OUT-E NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Write E FS=' FS-OUT-E INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-COUNT-E
ADD WS-DATA2-NUM TO WS-HASH-OUT-E
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-F (TIER-6 3601-7200s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-F SECTION.
ROUTE-TO-F-PROC.
MOVE IN-KEY TO OUT-F-KEY
MOVE IN-DATA1 TO OUT-F-DATA1
MOVE IN-DATA2 TO OUT-F-DATA2
WRITE FILE-OUT-F-REC
IF FS-OUT-F NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Write F FS=' FS-OUT-F INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-COUNT-F
ADD WS-DATA2-NUM TO WS-HASH-OUT-F
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-G (TIER-7 >7200s, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-G SECTION.
ROUTE-TO-G-PROC.
MOVE IN-KEY TO OUT-G-KEY
MOVE IN-DATA1 TO OUT-G-DATA1
MOVE IN-DATA2 TO OUT-G-DATA2
WRITE FILE-OUT-G-REC
IF FS-OUT-G NOT = '00'
MOVE 'FATAL' TO WS-SEVERITY
STRING 'Write G FS=' FS-OUT-G INTO WS-ERROR-MSG
PERFORM 6000-ERROR-HANDLE-SECTION
END-IF
ADD 1 TO WS-COUNT-G
ADD WS-DATA2-NUM TO WS-HASH-OUT-G
ADD 1 TO WS-RECORDS-WRITTEN
.
*> ============================================================
*> NEW ROUTE-TO-ERR (TIER-8 invalid, FILE STATUS + hash)
*> ============================================================
ROUTE-TO-ERR SECTION.
ROUTE-TO-ERR-PROC.
MOVE IN-KEY TO OUT-ERR-KEY
MOVE IN-DATA1 TO OUT-ERR-DATA1
MOVE IN-DATA2 TO OUT-ERR-DATA2
WRITE FILE-OUT-ERR-REC
IF FS-OUT-ERR NOT = '00'
DISPLAY '[ERROR] Write ERR FS=' FS-OUT-ERR
END-IF
ADD 1 TO WS-COUNT-ERR
ADD WS-DATA2-NUM TO WS-HASH-OUT-ERR
ADD 1 TO WS-RECORDS-WRITTEN
.