Files

227 lines
7.7 KiB
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CRDVAL.
* VALIDATE TRANSACTIONS - CREDIT CARD BATCH SYSTEM
* DEMONSTRATES: COPY REPLACING, OCCURS+SEARCH ALL,
* INSPECT, STRING, 88-LEVEL, REDEFINES IO
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT TX-FILE ASSIGN TO "TRANSIN"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT MEM-FILE ASSIGN TO "MEMBER"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT VALID-OUT ASSIGN TO "VALIDOUT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT REJECT-OUT ASSIGN TO "REJECT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT ERR-OUT ASSIGN TO "REPORTERR"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD TX-FILE.
COPY TXCPY.
FD MEM-FILE.
COPY MEMCPY.
FD VALID-OUT.
01 VALID-RECORD PIC X(100).
FD REJECT-OUT.
01 REJECT-RECORD PIC X(100).
FD ERR-OUT.
01 ERR-RECORD PIC X(120).
WORKING-STORAGE SECTION.
01 WS-SWITCHES.
05 WS-EOF-TX PIC X VALUE 'N'.
88 WS-END-OF-TX VALUE 'Y'.
05 WS-EOF-MEM PIC X VALUE 'N'.
88 WS-END-OF-MEM VALUE 'Y'.
05 WS-VALID PIC X VALUE 'Y'.
88 WS-IS-VALID VALUE 'Y'.
05 WS-FOUND PIC X VALUE 'N'.
88 WS-IS-FOUND VALUE 'Y'.
01 WS-COUNTERS.
05 WS-TOTAL-READ PIC 9(5) VALUE 0.
05 WS-TOTAL-VALID PIC 9(5) VALUE 0.
05 WS-TOTAL-REJECT PIC 9(5) VALUE 0.
05 WS-TOTAL-MEMBERS PIC 9(5) VALUE 0.
* DATESUB COPYBOOK WITH COPY REPLACING DEMO
* GENERATES: WS-RUN-DATE (WS-RUN-YYYY, WS-RUN-MM, WS-RUN-DD)
COPY DATESUB REPLACING ==:TAG:== BY ==WS-RUN==.
* GENERATES: WS-TX-DATE (WS-TX-YYYY, WS-TX-MM, WS-TX-DD)
COPY DATESUB REPLACING ==:TAG:== BY ==WS-TX==.
* INTERNAL TABLE: MEMBER TABLE WITH OCCURS + SEARCH ALL
01 WS-MEMBER-TABLE.
05 WS-MEMBER-ENTRY OCCURS 1 TO 100 TIMES
DEPENDING ON WS-TOTAL-MEMBERS
ASCENDING KEY IS WS-MEM-ID
INDEXED BY WS-MEM-IDX.
10 WS-MEM-ID PIC 9(16).
10 WS-MEM-NAME PIC X(30).
10 WS-MEM-LIMIT PIC 9(9)V99.
10 WS-MEM-TYPE PIC X.
10 WS-MEM-STATUS PIC X.
10 WS-MEM-BALANCE PIC S9(9)V99.
10 WS-MEM-MINPAY PIC 9(9)V99.
10 WS-MEM-ADDR PIC X(60).
01 WS-ERR-MSG.
05 WS-ERR-CARD PIC 9(16).
05 WS-ERR-SP1 PIC X(2) VALUE SPACES.
05 WS-ERR-CODE PIC X(20).
05 WS-ERR-SP2 PIC X(2) VALUE SPACES.
05 WS-ERR-DESC PIC X(80).
01 WS-MERCHANT-CHECK.
05 WS-MC-LEN PIC 9(2).
05 WS-MC-COUNT PIC 9(2).
PROCEDURE DIVISION.
0000-MAIN.
OPEN INPUT TX-FILE
INPUT MEM-FILE
OUTPUT VALID-OUT
OUTPUT REJECT-OUT
OUTPUT ERR-OUT.
ACCEPT WS-RUN-DATE FROM DATE YYYYMMDD.
PERFORM 1000-LOAD-MEMBERS.
PERFORM 2000-PROCESS-TX UNTIL WS-END-OF-TX.
PERFORM 3000-WRITE-SUMMARY.
CLOSE TX-FILE MEM-FILE VALID-OUT REJECT-OUT ERR-OUT.
GOBACK.
* LOAD ALL MEMBERS INTO OCCURS TABLE AT ONCE
1000-LOAD-MEMBERS.
MOVE 0 TO WS-TOTAL-MEMBERS.
PERFORM UNTIL WS-END-OF-MEM
READ MEM-FILE
AT END SET WS-END-OF-MEM TO TRUE
NOT AT END
ADD 1 TO WS-TOTAL-MEMBERS
MOVE MEM-ID
TO WS-MEM-ID(WS-TOTAL-MEMBERS)
MOVE MEM-NAME
TO WS-MEM-NAME(WS-TOTAL-MEMBERS)
MOVE MEM-CREDIT-LIMIT
TO WS-MEM-LIMIT(WS-TOTAL-MEMBERS)
MOVE MEM-TYPE
TO WS-MEM-TYPE(WS-TOTAL-MEMBERS)
MOVE MEM-STATUS
TO WS-MEM-STATUS(WS-TOTAL-MEMBERS)
MOVE MEM-BALANCE
TO WS-MEM-BALANCE(WS-TOTAL-MEMBERS)
MOVE MEM-MIN-PAYMENT
TO WS-MEM-MINPAY(WS-TOTAL-MEMBERS)
MOVE MEM-ADDRESS
TO WS-MEM-ADDR(WS-TOTAL-MEMBERS)
END-READ
END-PERFORM.
2000-PROCESS-TX.
READ TX-FILE
AT END SET WS-END-OF-TX TO TRUE
NOT AT END
ADD 1 TO WS-TOTAL-READ
PERFORM 2100-VALIDATE-TX
END-READ.
2100-VALIDATE-TX.
SET WS-IS-VALID TO TRUE.
* INSPECT DEMO: CHECK MERCHANT NAME FOR INVALID CHARS
MOVE 0 TO WS-MC-COUNT.
INSPECT TX-MERCHANT TALLYING WS-MC-COUNT
FOR CHARACTERS BEFORE INITIAL SPACE.
IF WS-MC-COUNT = 0
MOVE 'INVALID-MERCHANT' TO WS-ERR-CODE
MOVE 'MERCHANT NAME EMPTY' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH
END-IF.
CONTINUE.
IF TX-CARD-NO = 0
MOVE 'INVALID-CARD' TO WS-ERR-CODE
MOVE 'CARD NUMBER IS ZERO' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
IF TX-AMOUNT <= 0 AND NOT TX-REFUND
MOVE 'INVALID-AMOUNT' TO WS-ERR-CODE
MOVE 'AMOUNT MUST BE POSITIVE' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
IF TX-REFUND AND TX-AMOUNT >= 0
MOVE 'INVALID-REFUND' TO WS-ERR-CODE
MOVE 'REFUND AMOUNT MUST BE NEGATIVE' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
MOVE TX-DATE(1:4) TO WS-TX-YYYY
MOVE TX-DATE(5:2) TO WS-TX-MM
MOVE TX-DATE(7:2) TO WS-TX-DD
IF WS-TX-MM NOT = WS-RUN-MM
MOVE 'OUT-OF-MONTH' TO WS-ERR-CODE
MOVE 'TX DATE NOT IN RUN MONTH' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
* SEARCH ALL DEMO: BINARY SEARCH ON MEMBER TABLE
PERFORM 2300-FIND-MEMBER.
IF NOT WS-IS-FOUND
MOVE 'MEMBER-NOT-FOUND' TO WS-ERR-CODE
MOVE 'CARD NOT IN MEMBER FILE' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
IF WS-MEM-STATUS(WS-MEM-IDX) = 'F'
MOVE 'FROZEN-CARD' TO WS-ERR-CODE
MOVE 'CARD STATUS IS FROZEN' TO WS-ERR-DESC
PERFORM 2200-REJECT
EXIT PARAGRAPH.
IF WS-VALID = 'Y'
WRITE VALID-RECORD FROM TX-RECORD
ADD 1 TO WS-TOTAL-VALID.
2200-REJECT.
WRITE REJECT-RECORD FROM TX-RECORD.
MOVE TX-CARD-NO TO WS-ERR-CARD.
WRITE ERR-RECORD FROM WS-ERR-MSG.
ADD 1 TO WS-TOTAL-REJECT.
2300-FIND-MEMBER.
SET WS-MEM-IDX TO 1.
SEARCH ALL WS-MEMBER-ENTRY
AT END
MOVE 'N' TO WS-FOUND
WHEN WS-MEM-ID(WS-MEM-IDX) = TX-CARD-NO
MOVE 'Y' TO WS-FOUND.
3000-WRITE-SUMMARY.
STRING
'CRDVAL SUMMARY - TOTAL READ:' WS-TOTAL-READ
' VALID:' WS-TOTAL-VALID
' REJECT:' WS-TOTAL-REJECT
' MEMBERS LOADED:' WS-TOTAL-MEMBERS
INTO ERR-RECORD
END-STRING.
WRITE ERR-RECORD.
DISPLAY 'CRDVAL: ' WS-TOTAL-READ ' READ, '
WS-TOTAL-VALID ' VALID, '
WS-TOTAL-REJECT ' REJECTS'.