Initial commit: COBOL+JCL credit card billing system with COMP-3, OCCURS, COPY REPLACING, INSPECT, and JCL runner
This commit is contained in:
@@ -0,0 +1,259 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. CRDCALC.
|
||||
|
||||
* CALCULATE INTEREST AND FEES - CREDIT CARD BATCH SYSTEM
|
||||
* DEMONSTRATES: OCCURS+SEARCH, KEY BREAK, COMPUTE,
|
||||
* EVALUATE, COMP-3, COPY REPLACING
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
INPUT-OUTPUT SECTION.
|
||||
FILE-CONTROL.
|
||||
SELECT VALID-IN ASSIGN TO "VALIDIN"
|
||||
ORGANIZATION IS LINE SEQUENTIAL.
|
||||
SELECT RATE-FILE ASSIGN TO "RATE"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT CALC-OUT ASSIGN TO "CALCOUT"
|
||||
ORGANIZATION IS LINE SEQUENTIAL.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
FD VALID-IN.
|
||||
COPY TXCPY.
|
||||
|
||||
FD RATE-FILE.
|
||||
COPY RATECPY.
|
||||
|
||||
FD CALC-OUT.
|
||||
01 CALC-RECORD PIC X(200).
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-SWITCHES.
|
||||
05 WS-EOF-VALID PIC X VALUE 'N'.
|
||||
88 WS-END-OF-VALID VALUE 'Y'.
|
||||
05 WS-EOF-RATE PIC X VALUE 'N'.
|
||||
88 WS-END-OF-RATE VALUE 'Y'.
|
||||
|
||||
01 WS-COUNTERS.
|
||||
05 WS-TOTAL-IN PIC 9(5) VALUE 0.
|
||||
05 WS-TOTAL-OUT PIC 9(5) VALUE 0.
|
||||
05 WS-RATE-COUNT PIC 9(5) VALUE 0.
|
||||
|
||||
* INTERNAL TABLE: RATE TABLE WITH OCCURS + SEARCH
|
||||
01 WS-RATE-TABLE.
|
||||
05 WS-RATE-ENTRY OCCURS 1 TO 5 TIMES
|
||||
DEPENDING ON WS-RATE-COUNT
|
||||
INDEXED BY WS-RT-IDX.
|
||||
10 WS-RT-TYPE PIC X.
|
||||
10 WS-RT-PCT PIC 9(1)V9(8) COMP-3.
|
||||
10 WS-RT-EFF-DATE PIC 9(8).
|
||||
|
||||
* COPY REPLACING DEMO: STATEMENT DATE
|
||||
COPY DATESUB REPLACING ==:TAG:== BY ==WS-STMT==.
|
||||
|
||||
01 WS-CARD-ACCUM.
|
||||
05 WS-CURRENT-CARD PIC 9(16) VALUE 0.
|
||||
05 WS-CARD-PURCHASES PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-CARD-CASH PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-CARD-REFUNDS PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-CARD-INTEREST PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-CARD-FEE PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-CARD-TOTAL PIC S9(9)V99 COMP-3 VALUE 0.
|
||||
05 WS-TX-COUNT PIC 9(4) VALUE 0.
|
||||
|
||||
01 WS-CALC-DETAIL.
|
||||
05 WS-D-CARD PIC 9(16).
|
||||
05 WS-D-SEP1 PIC X VALUE SPACE.
|
||||
05 WS-D-TYPE PIC X.
|
||||
05 WS-D-SEP2 PIC X VALUE SPACE.
|
||||
05 WS-D-AMOUNT PIC -(9)9.99.
|
||||
05 WS-D-SEP3 PIC X VALUE SPACE.
|
||||
05 WS-D-INTEREST PIC -(7)9.99.
|
||||
05 WS-D-SEP4 PIC X VALUE SPACE.
|
||||
05 WS-D-FEE PIC -(7)9.99.
|
||||
05 WS-D-SEP5 PIC X VALUE SPACE.
|
||||
05 WS-D-DESC PIC X(30).
|
||||
|
||||
01 WS-SUMMARY.
|
||||
05 WS-S-CARD PIC 9(16).
|
||||
05 WS-S-SEP1 PIC X VALUE SPACE.
|
||||
05 WS-S-TOTAL-AMT PIC -(9)9.99.
|
||||
05 WS-S-SEP2 PIC X VALUE SPACE.
|
||||
05 WS-S-TOTAL-INT PIC -(9)9.99.
|
||||
05 WS-S-SEP3 PIC X VALUE SPACE.
|
||||
05 WS-S-TOTAL-FEE PIC -(9)9.99.
|
||||
05 WS-S-SEP4 PIC X VALUE SPACE.
|
||||
05 WS-S-GRAND-TOTAL PIC -(9)9.99.
|
||||
05 WS-S-SEP5 PIC X VALUE SPACE.
|
||||
05 WS-S-TX-COUNT PIC Z(4)9.
|
||||
|
||||
01 WS-GRAND-TOTAL PIC S9(12)V99 COMP-3 VALUE 0.
|
||||
01 WS-GRAND-INT PIC S9(12)V99 COMP-3 VALUE 0.
|
||||
01 WS-GRAND-FEE PIC S9(12)V99 COMP-3 VALUE 0.
|
||||
01 WS-GRAND-DISP.
|
||||
05 WS-GD-TOTAL PIC -(12)9.99.
|
||||
05 WS-GD-SP1 PIC X VALUE SPACE.
|
||||
05 WS-GD-INT PIC -(12)9.99.
|
||||
05 WS-GD-SP2 PIC X VALUE SPACE.
|
||||
05 WS-GD-FEE PIC -(12)9.99.
|
||||
|
||||
01 WS-DAYS-DIFF PIC 9(4).
|
||||
01 WS-INT-AMOUNT PIC S9(9)V99 COMP-3.
|
||||
01 WS-FEE-AMOUNT PIC S9(9)V99 COMP-3.
|
||||
01 WS-DAILY-RATE PIC 9(1)V9(8) COMP-3.
|
||||
01 WS-CASH-RATE PIC 9(1)V9(4) COMP-3.
|
||||
01 WS-OVERDUE-RATE PIC 9(1)V9(4) COMP-3.
|
||||
01 WS-STATEMENT-DATE PIC 9(8).
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
0000-MAIN.
|
||||
OPEN INPUT VALID-IN
|
||||
INPUT RATE-FILE
|
||||
OUTPUT CALC-OUT.
|
||||
|
||||
ACCEPT WS-STATEMENT-DATE FROM DATE YYYYMMDD.
|
||||
MOVE WS-STATEMENT-DATE(1:4) TO WS-STMT-YYYY.
|
||||
MOVE WS-STATEMENT-DATE(5:2) TO WS-STMT-MM.
|
||||
MOVE WS-STATEMENT-DATE(7:2) TO WS-STMT-DD.
|
||||
|
||||
* LOAD RATES INTO OCCURS TABLE
|
||||
PERFORM 1000-LOAD-RATES.
|
||||
|
||||
* PROCESS TRANSACTIONS (KEY BREAK: CARD CHANGE)
|
||||
PERFORM 2000-PROCESS-VALID UNTIL WS-END-OF-VALID.
|
||||
|
||||
* WRITE FINAL CARD SUMMARY IF DATA REMAINS
|
||||
IF WS-TX-COUNT > 0
|
||||
PERFORM 3000-WRITE-CARD-SUMMARY.
|
||||
|
||||
* WRITE GRAND TOTAL
|
||||
PERFORM 4000-WRITE-GRAND-TOTAL.
|
||||
|
||||
CLOSE VALID-IN RATE-FILE CALC-OUT.
|
||||
DISPLAY 'CRDCALC: ' WS-TOTAL-IN ' READ, '
|
||||
WS-TOTAL-OUT ' WRITTEN'.
|
||||
GOBACK.
|
||||
|
||||
* LOAD RATES INTO OCCURS TABLE
|
||||
1000-LOAD-RATES.
|
||||
MOVE 0 TO WS-RATE-COUNT.
|
||||
PERFORM UNTIL WS-END-OF-RATE
|
||||
READ RATE-FILE
|
||||
AT END SET WS-END-OF-RATE TO TRUE
|
||||
NOT AT END
|
||||
ADD 1 TO WS-RATE-COUNT
|
||||
MOVE RATE-TYPE
|
||||
TO WS-RT-TYPE(WS-RATE-COUNT)
|
||||
MOVE RATE-PCT
|
||||
TO WS-RT-PCT(WS-RATE-COUNT)
|
||||
MOVE RATE-EFF-DATE
|
||||
TO WS-RT-EFF-DATE(WS-RATE-COUNT)
|
||||
END-READ
|
||||
END-PERFORM.
|
||||
|
||||
* SEARCH TABLE FOR CASH RATE
|
||||
SET WS-RT-IDX TO 1.
|
||||
SEARCH WS-RATE-ENTRY
|
||||
AT END MOVE 0.0005 TO WS-CASH-RATE
|
||||
WHEN WS-RT-TYPE(WS-RT-IDX) = 'C'
|
||||
MOVE WS-RT-PCT(WS-RT-IDX) TO WS-CASH-RATE
|
||||
END-SEARCH.
|
||||
|
||||
* SEARCH TABLE FOR OVERDUE RATE
|
||||
SET WS-RT-IDX TO 1.
|
||||
SEARCH WS-RATE-ENTRY
|
||||
AT END MOVE 0.0500 TO WS-OVERDUE-RATE
|
||||
WHEN WS-RT-TYPE(WS-RT-IDX) = 'O'
|
||||
MOVE WS-RT-PCT(WS-RT-IDX) TO WS-OVERDUE-RATE
|
||||
END-SEARCH.
|
||||
|
||||
IF WS-CASH-RATE = 0 MOVE 0.0005 TO WS-CASH-RATE END-IF.
|
||||
IF WS-OVERDUE-RATE = 0 MOVE 0.0500 TO WS-OVERDUE-RATE
|
||||
END-IF.
|
||||
MOVE 0 TO WS-TOTAL-IN.
|
||||
|
||||
2000-PROCESS-VALID.
|
||||
READ VALID-IN
|
||||
AT END SET WS-END-OF-VALID TO TRUE
|
||||
NOT AT END
|
||||
ADD 1 TO WS-TOTAL-IN
|
||||
IF WS-CURRENT-CARD = 0
|
||||
MOVE TX-CARD-NO TO WS-CURRENT-CARD
|
||||
END-IF
|
||||
* KEY BREAK: WHEN CARD CHANGES, OUTPUT SUMMARY
|
||||
IF TX-CARD-NO NOT = WS-CURRENT-CARD
|
||||
PERFORM 3000-WRITE-CARD-SUMMARY
|
||||
MOVE TX-CARD-NO TO WS-CURRENT-CARD
|
||||
MOVE 0 TO WS-CARD-PURCHASES
|
||||
WS-CARD-CASH
|
||||
WS-CARD-REFUNDS
|
||||
WS-CARD-INTEREST
|
||||
WS-CARD-FEE
|
||||
WS-CARD-TOTAL
|
||||
WS-TX-COUNT
|
||||
END-IF
|
||||
PERFORM 2500-ACCUMULATE-TX
|
||||
END-READ.
|
||||
|
||||
2500-ACCUMULATE-TX.
|
||||
MOVE 0 TO WS-INT-AMOUNT WS-FEE-AMOUNT.
|
||||
ADD 1 TO WS-TX-COUNT.
|
||||
EVALUATE TRUE
|
||||
WHEN TX-PURCHASE
|
||||
ADD TX-AMOUNT TO WS-CARD-PURCHASES
|
||||
MOVE 'PURCHASE' TO WS-D-DESC
|
||||
WHEN TX-CASH
|
||||
ADD TX-AMOUNT TO WS-CARD-CASH
|
||||
MOVE 'CASH ADVANCE' TO WS-D-DESC
|
||||
COMPUTE WS-INT-AMOUNT = TX-AMOUNT *
|
||||
WS-CASH-RATE * 30
|
||||
ADD WS-INT-AMOUNT TO WS-CARD-INTEREST
|
||||
WHEN TX-REFUND
|
||||
ADD TX-AMOUNT TO WS-CARD-PURCHASES
|
||||
MOVE 'REFUND' TO WS-D-DESC
|
||||
END-EVALUATE.
|
||||
|
||||
* FEE CALCULATION: 1% OF CASH ADVANCE (MIN 100)
|
||||
IF TX-CASH
|
||||
COMPUTE WS-FEE-AMOUNT = TX-AMOUNT * 0.01
|
||||
IF WS-FEE-AMOUNT < 100
|
||||
MOVE 100 TO WS-FEE-AMOUNT
|
||||
END-IF
|
||||
ADD WS-FEE-AMOUNT TO WS-CARD-FEE
|
||||
END-IF.
|
||||
|
||||
* WRITE DETAIL LINE
|
||||
MOVE TX-CARD-NO TO WS-D-CARD
|
||||
MOVE TX-TYPE TO WS-D-TYPE
|
||||
MOVE TX-AMOUNT TO WS-D-AMOUNT
|
||||
MOVE WS-INT-AMOUNT TO WS-D-INTEREST
|
||||
MOVE WS-FEE-AMOUNT TO WS-D-FEE
|
||||
WRITE CALC-RECORD FROM WS-CALC-DETAIL.
|
||||
|
||||
3000-WRITE-CARD-SUMMARY.
|
||||
COMPUTE WS-CARD-TOTAL = WS-CARD-PURCHASES + WS-CARD-CASH
|
||||
+ WS-CARD-INTEREST + WS-CARD-FEE - WS-CARD-REFUNDS.
|
||||
ADD WS-CARD-TOTAL TO WS-GRAND-TOTAL.
|
||||
ADD WS-CARD-INTEREST TO WS-GRAND-INT.
|
||||
ADD WS-CARD-FEE TO WS-GRAND-FEE.
|
||||
|
||||
MOVE WS-CURRENT-CARD TO WS-S-CARD
|
||||
MOVE WS-CARD-PURCHASES TO WS-S-TOTAL-AMT
|
||||
MOVE WS-CARD-INTEREST TO WS-S-TOTAL-INT
|
||||
MOVE WS-CARD-FEE TO WS-S-TOTAL-FEE
|
||||
MOVE WS-CARD-TOTAL TO WS-S-GRAND-TOTAL
|
||||
MOVE WS-TX-COUNT TO WS-S-TX-COUNT
|
||||
WRITE CALC-RECORD FROM WS-SUMMARY.
|
||||
ADD 1 TO WS-TOTAL-OUT.
|
||||
|
||||
4000-WRITE-GRAND-TOTAL.
|
||||
MOVE WS-GRAND-TOTAL TO WS-GD-TOTAL.
|
||||
MOVE WS-GRAND-INT TO WS-GD-INT.
|
||||
MOVE WS-GRAND-FEE TO WS-GD-FEE.
|
||||
STRING
|
||||
'GRAND TOTAL CARDS:' WS-TOTAL-OUT
|
||||
' AMOUNT:' WS-GD-TOTAL
|
||||
' INTEREST:' WS-GD-INT
|
||||
' FEE:' WS-GD-FEE
|
||||
INTO CALC-RECORD
|
||||
END-STRING.
|
||||
WRITE CALC-RECORD.
|
||||
Reference in New Issue
Block a user