*> ============================================================ *> 14-online-cics : 客户在线照会 (Online Inquiry) *> Input : MAP-FILE (map-data.dat: 模拟CICS MAP入出力) *> Output: OUTPUT-FILE (cics-output.txt: 照会结果出力) *> TXN-AUDIT-FILE (txn-audit.log: 取引監査記録) *> Coverage: OL-N001~N004, OL-A001, OL-R001 *> MAP building, audit logging, response time, *> error severity handling *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. Main14OnlineCics. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MAP-FILE ASSIGN TO "map-data.dat" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-MAP-FILE-STATUS. SELECT OUTPUT-FILE ASSIGN TO "cics-output.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-OUT-FILE-STATUS. *> Additional files for expanded processing SELECT TXN-AUDIT-FILE ASSIGN TO "txn-audit.log" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-AUD-FILE-STATUS. SELECT TXN-REPORT ASSIGN TO "txn-report.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-RPT-FILE-STATUS. DATA DIVISION. FILE SECTION. FD MAP-FILE. 01 MAP-RECORD PIC X(80). FD OUTPUT-FILE. 01 OUTPUT-LINE PIC X(80). FD TXN-AUDIT-FILE. 01 AUDIT-RECORD PIC X(100). FD TXN-REPORT. 01 REPORT-LINE PIC X(100). WORKING-STORAGE SECTION. *> ===== PRESERVED ORIGINAL ITEMS ===== 01 WS-TELECOM-REC. COPY "telecom/TEL-INVOICE.cpy". *> Simulated COMMAREA structure 01 WS-COMMAREA. 05 WS-CA-USERID PIC X(08). 05 WS-CA-FUNCTION PIC X(04). 05 WS-CA-INPUT-DATA PIC X(40). 05 WS-CA-RETURN-CODE PIC 9(02). 05 WS-CA-MESSAGE PIC X(40). 01 WS-COUNTERS. 05 WS-READS PIC 9(02) VALUE 0. 05 WS-WRITES PIC 9(02) VALUE 0. 01 WS-MAP-LINE PIC X(80). 01 WS-MAP-EOF PIC X(01) VALUE "N". 88 MAP-EOF VALUE "Y". 01 WS-RESPONSE. 05 WS-RESP-TEXT PIC X(60). 01 WS-INVOICE-REC. COPY "telecom/TEL-INVOICE.cpy". *> ===== END PRESERVED ORIGINAL ITEMS ===== *> ===== NEW ITEMS ===== *> Timestamp tracing 01 WS-TIMESTAMP. 05 WS-TS-YEAR PIC 9(04). 05 WS-TS-MONTH PIC 9(02). 05 WS-TS-DAY PIC 9(02). 05 WS-TS-HOUR PIC 9(02). 05 WS-TS-MINUTE PIC 9(02). 05 WS-TS-SECOND PIC 9(02). 05 WS-TS-MS PIC 9(02). 01 WS-TIMESTAMP-STR PIC X(26). 01 WS-TRACE-PREFIX PIC X(40). *> File status fields (additional) 01 WS-MAP-FILE-STATUS PIC X(02). 01 WS-OUT-FILE-STATUS PIC X(02). 01 WS-AUD-FILE-STATUS PIC X(02). 01 WS-RPT-FILE-STATUS PIC X(02). *> Session state management 01 WS-SESSION-STATE. 05 WS-SESS-USERID PIC X(08). 05 WS-SESS-STATUS PIC X(01). 88 WS-SESS-ACTIVE VALUE 'A'. 88 WS-SESS-LOCKED VALUE 'L'. 88 WS-SESS-TERMINATED VALUE 'T'. 05 WS-SESS-LOGIN-TIME PIC X(20). 05 WS-SESS-TXN-COUNT PIC 9(04) VALUE ZERO. 05 WS-SESS-LAST-FUNC PIC X(04). 05 WS-SESS-ERRORS PIC 9(03) VALUE ZERO. *> Response time tracking 01 WS-RESPONSE-TIME. 05 WS-RT-START-M PIC 9(08). 05 WS-RT-START-S PIC 9(08). 05 WS-RT-END-M PIC 9(08). 05 WS-RT-END-S PIC 9(08). 05 WS-RT-ELAPSED PIC S9(08). 05 WS-RT-DISP PIC Z(9)9. *> Map building fields (simulated CICS BMS) 01 WS-MAP-BUILD. 05 WS-MAP-MAPNAME PIC X(08). 05 WS-MAP-TITLE PIC X(40). 05 WS-MAP-BODY PIC X(80). 05 WS-MAP-MSG-LINE PIC X(40). 05 WS-MAP-CURSOR PIC 9(04). 05 WS-MAP-ATTR PIC X(01). 88 WS-MAP-PROT VALUE 'P'. 88 WS-MAP-UNPROT VALUE 'U'. 88 WS-MAP-BRIGHT VALUE 'B'. 05 WS-MAP-FIELD-TABLE. 10 WS-MAP-FLD OCCURS 5 TIMES. 15 WS-MAP-FLD-NAME PIC X(10). 15 WS-MAP-FLD-VALUE PIC X(20). 15 WS-MAP-FLD-ATTR PIC X(01). *> Transaction history (in-memory log) 01 WS-TXN-HISTORY. 05 WS-TXN-COUNT PIC 9(02) VALUE ZERO. 05 WS-TXN-TABLE. 10 WS-TXN-ENTRY OCCURS 20 TIMES. 15 WS-TXN-FUNC PIC X(04). 15 WS-TXN-USER PIC X(08). 15 WS-TXN-TIME PIC X(20). 15 WS-TXN-RC PIC 9(02). *> Error severity and handling 01 WS-ERR-SEVERITY PIC 9(01). 88 WS-ERR-INFO VALUE 0. 88 WS-ERR-WARN VALUE 1. 88 WS-ERR-ERROR VALUE 2. 88 WS-ERR-FATAL VALUE 3. 01 WS-ERR-MSG PIC X(60). 01 WS-ERR-COUNT PIC 9(04) VALUE ZERO. 01 WS-ERR-RESP-CODE PIC X(04). 01 WS-ERR-RESP-MSG PIC X(40). *> Hash totals 01 WS-HASH-TOTAL. 05 WS-HASH-TXN-COUNT PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-MAP PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-INQY PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-UPDT PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-DEL PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-ADDN PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-CANC PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-SUSP PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-BILL PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-DISP PIC 9(09) VALUE ZERO. 05 WS-HASH-FUNC-OTHER PIC 9(09) VALUE ZERO. 05 WS-HASH-ERROR-COUNT PIC 9(09) VALUE ZERO. 05 WS-HASH-CHECKSUM PIC 9(15) VALUE ZERO. *> Audit fields 01 WS-AUDIT-ENTRIES PIC 9(04) VALUE ZERO. 01 WS-AUDIT-LINE PIC X(100). *> Report fields 01 WS-RPT-DATE PIC X(10). 01 WS-RPT-TIME PIC X(08). *> Separator lines 01 WS-SEP-STARS PIC X(100) VALUE ALL '*'. 01 WS-SEP-DASHES PIC X(100) VALUE ALL '-'. 01 WS-SEP-EQUALS PIC X(100) VALUE ALL '='. *> Edited numeric fields 01 WS-ED-COUNT PIC Z(9)9. 01 WS-ED-TOTAL PIC Z(9)9. 01 WS-ED-TIME PIC Z(9)9. *> Billing data (for BILL transaction) 01 WS-BILL-DATA. 05 WS-BD-INV-ID PIC X(10). 05 WS-BD-AMOUNT PIC 9(09). 05 WS-BD-STATUS PIC X(01). 05 WS-BD-MONTH PIC 9(06). 05 WS-BD-BALANCE PIC 9(09). *> Configuration constants 01 WS-CONFIG-MAX-ERRORS PIC 9(03) VALUE 50. 01 WS-CONFIG-MAX-TXNS PIC 9(02) VALUE 20. *> ============================================================ *> LINKAGE SECTION removed — LK-COMMAREA replaced by WS-COMMAREA PROCEDURE DIVISION. MAIN SECTION. MB-PROCESS. PERFORM 1000-INIT PERFORM 2000-OPEN-FILES PERFORM 3000-PROCESS PERFORM 4000-REPORT PERFORM 5000-AUDIT PERFORM 6000-ERROR-HANDLE PERFORM 9000-EXIT GOBACK. 1000-INIT SECTION. *> DISPLAY "Main14OnlineCics: Initializing...". MOVE FUNCTION CURRENT-DATE TO WS-TIMESTAMP. STRING WS-TS-YEAR '-' WS-TS-MONTH '-' WS-TS-DAY ' ' WS-TS-HOUR ':' WS-TS-MINUTE ':' WS-TS-SECOND INTO WS-TIMESTAMP-STR. DISPLAY "Main14OnlineCics: Start time=" WS-TIMESTAMP-STR. *> *> Initialize session state MOVE SPACES TO WS-SESSION-STATE. MOVE 'A' TO WS-SESS-STATUS. MOVE WS-TIMESTAMP-STR TO WS-SESS-LOGIN-TIME. MOVE ZERO TO WS-SESS-TXN-COUNT. MOVE ZERO TO WS-SESS-ERRORS. *> *> Initialize hash totals MOVE ZERO TO WS-HASH-TOTAL. MOVE ZERO TO WS-ERR-COUNT. MOVE ZERO TO WS-AUDIT-ENTRIES. *> *> Initialize response time MOVE ZERO TO WS-RESPONSE-TIME. *> *> Initialize transaction history MOVE ZERO TO WS-TXN-COUNT. *> *> Build date/time for reports MOVE WS-TS-YEAR TO WS-RPT-DATE(1:4). MOVE '-' TO WS-RPT-DATE(5:1). MOVE WS-TS-MONTH TO WS-RPT-DATE(6:2). MOVE '-' TO WS-RPT-DATE(8:1). MOVE WS-TS-DAY TO WS-RPT-DATE(9:2). STRING WS-TS-HOUR ':' WS-TS-MINUTE ':' WS-TS-SECOND INTO WS-RPT-TIME. *> DISPLAY "Main14OnlineCics: INIT complete. Session=" WS-SESS-USERID " Status=" WS-SESS-STATUS. *> 2000-OPEN-FILES SECTION. *> DISPLAY "Main14OnlineCics: Opening files...". *> OPEN INPUT MAP-FILE. IF WS-MAP-FILE-STATUS NOT = '00' MOVE 2 TO WS-ERR-SEVERITY STRING "WARN: MAP-FILE open status=" WS-MAP-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT END-IF. *> OPEN EXTEND OUTPUT-FILE. IF WS-OUT-FILE-STATUS NOT = '00' OPEN OUTPUT OUTPUT-FILE IF WS-OUT-FILE-STATUS NOT = '00' MOVE 3 TO WS-ERR-SEVERITY STRING "ERROR: OUTPUT-FILE open status=" WS-OUT-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG PERFORM 6000-ERROR-HANDLE END-IF END-IF. *> OPEN EXTEND TXN-AUDIT-FILE. IF WS-AUD-FILE-STATUS NOT = '00' OPEN OUTPUT TXN-AUDIT-FILE IF WS-AUD-FILE-STATUS NOT = '00' MOVE 1 TO WS-ERR-SEVERITY STRING "WARN: TXN-AUDIT open status=" WS-AUD-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT END-IF END-IF. *> OPEN OUTPUT TXN-REPORT. IF WS-RPT-FILE-STATUS NOT = '00' MOVE 1 TO WS-ERR-SEVERITY STRING "WARN: TXN-REPORT open status=" WS-RPT-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT END-IF. *> DISPLAY "Main14OnlineCics: Files opened." " MAP=" WS-MAP-FILE-STATUS " OUT=" WS-OUT-FILE-STATUS " AUD=" WS-AUD-FILE-STATUS. *> 3000-PROCESS SECTION. *> DISPLAY "Main14OnlineCics: Processing COMMAREA...". *> *> Capture response time start (seconds portion) MOVE WS-TS-SECOND TO WS-RT-START-S. MOVE WS-TS-MS TO WS-RT-START-M. *> *> ============================================================ *> === PRESERVED ORIGINAL CODE === *> ============================================================ DISPLAY "=== CICS Online Simulation ===". DISPLAY "COMMAREA received:". *> *> LK data removed — using WS-COMMAREA directly *> DISPLAY " UserID: " WS-CA-USERID. DISPLAY " Function: " WS-CA-FUNCTION. DISPLAY " Input: " WS-CA-INPUT-DATA. *> *> Simulate MAPRECV: read from map file OPEN INPUT MAP-FILE. IF WS-MAP-FILE-STATUS NOT = '00' MOVE 2 TO WS-ERR-SEVERITY STRING "WARN: MAP-FILE reopen status=" WS-MAP-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT END-IF. *> PERFORM UNTIL MAP-EOF READ MAP-FILE INTO WS-MAP-LINE AT END SET MAP-EOF TO TRUE NOT AT END DISPLAY " MAP RECV: " WS-MAP-LINE ADD 1 TO WS-READS END-READ END-PERFORM. CLOSE MAP-FILE. IF WS-MAP-FILE-STATUS NOT = '00' MOVE 1 TO WS-ERR-SEVERITY STRING "INFO: MAP-FILE close status=" WS-MAP-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG END-IF. *> *> Update session state with current user MOVE WS-CA-USERID TO WS-SESS-USERID. ADD 1 TO WS-SESS-TXN-COUNT. MOVE WS-CA-FUNCTION TO WS-SESS-LAST-FUNC. *> *> Validate COMMAREA before processing PERFORM 3100-VALIDATE-COMMAREA. *> *> Process based on function code *> --- PRESERVED ORIGINAL EVALUATE with added transactions --- EVALUATE WS-CA-FUNCTION WHEN "INQY" MOVE "INQUIRY processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-INQY WHEN "UPDT" MOVE "UPDATE processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-UPDT WHEN "DEL " MOVE "DELETE processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-DEL *> === NEW TRANSACTION CODES === WHEN "ADDN" MOVE "ADDN processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-ADDN PERFORM 3200-PROCESS-TRANSACTION WHEN "CANC" MOVE "CANC processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-CANC PERFORM 3200-PROCESS-TRANSACTION WHEN "SUSP" MOVE "SUSP processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-SUSP PERFORM 3200-PROCESS-TRANSACTION WHEN "BILL" MOVE "BILL processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-BILL PERFORM 3200-PROCESS-TRANSACTION WHEN "DISP" MOVE "DISP processed" TO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-DISP PERFORM 3200-PROCESS-TRANSACTION WHEN OTHER MOVE "UNKNOWN function" TO WS-CA-MESSAGE MOVE 99 TO WS-CA-RETURN-CODE ADD 1 TO WS-HASH-FUNC-OTHER END-EVALUATE. *> *> Build map and format response for all transactions PERFORM 3300-BUILD-MAP. PERFORM 3400-FORMAT-RESPONSE. *> *> Simulate MAPSEND: write to output file *> === PRESERVED ORIGINAL OUTPUT CODE === OPEN OUTPUT OUTPUT-FILE. IF WS-OUT-FILE-STATUS NOT = '00' MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: OUTPUT-FILE reopen status=" WS-OUT-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT END-IF. *> MOVE SPACES TO OUTPUT-LINE. STRING "USER=" WS-CA-USERID " FUNC=" WS-CA-FUNCTION " RC=" WS-CA-RETURN-CODE " MSG=" WS-CA-MESSAGE DELIMITED BY SIZE INTO OUTPUT-LINE. WRITE OUTPUT-LINE. ADD 1 TO WS-WRITES. *> MOVE SPACES TO OUTPUT-LINE. STRING "MAPSEND: Received " WS-READS " map lines, sent " WS-WRITES " responses" DELIMITED BY SIZE INTO OUTPUT-LINE. WRITE OUTPUT-LINE. CLOSE OUTPUT-FILE. IF WS-OUT-FILE-STATUS NOT = '00' MOVE 1 TO WS-ERR-SEVERITY STRING "INFO: OUTPUT-FILE close status=" WS-OUT-FILE-STATUS INTO WS-ERR-MSG DISPLAY WS-ERR-MSG END-IF. *> *> Set return values in LINKAGE *> Return values already in WS-COMMAREA *> DISPLAY " Return-Code: " WS-CA-RETURN-CODE. DISPLAY " Message: " WS-CA-MESSAGE. DISPLAY "Output written to cics-output.txt". *> === END PRESERVED ORIGINAL CODE === *> *> Update transaction history IF WS-TXN-COUNT < WS-CONFIG-MAX-TXNS ADD 1 TO WS-TXN-COUNT MOVE WS-CA-FUNCTION TO WS-TXN-FUNC(WS-TXN-COUNT) MOVE WS-CA-USERID TO WS-TXN-USER(WS-TXN-COUNT) MOVE WS-TIMESTAMP-STR TO WS-TXN-TIME(WS-TXN-COUNT) MOVE WS-CA-RETURN-CODE TO WS-TXN-RC(WS-TXN-COUNT) END-IF. *> *> Update hash totals ADD 1 TO WS-HASH-TXN-COUNT. ADD WS-READS TO WS-HASH-CHECKSUM. ADD WS-WRITES TO WS-HASH-CHECKSUM. *> EXIT. *> 3100-VALIDATE-COMMAREA SECTION. *> DISPLAY "Main14OnlineCics: Validating COMMAREA...". *> *> Validate user ID IF WS-CA-USERID = SPACES OR WS-CA-USERID = LOW-VALUES MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: Invalid UserID [" WS-CA-USERID "]" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT ADD 1 TO WS-SESS-ERRORS END-IF. *> *> Validate function code length/content IF WS-CA-FUNCTION = SPACES OR WS-CA-FUNCTION = LOW-VALUES MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: Empty function code" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT ADD 1 TO WS-SESS-ERRORS END-IF. *> *> Check session state IF WS-SESS-LOCKED MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: Session locked for " WS-SESS-USERID INTO WS-ERR-MSG DISPLAY WS-ERR-MSG MOVE 99 TO WS-CA-RETURN-CODE MOVE "Session locked" TO WS-CA-MESSAGE PERFORM 6000-ERROR-HANDLE END-IF. IF WS-SESS-TERMINATED MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: Session terminated for " WS-SESS-USERID INTO WS-ERR-MSG DISPLAY WS-ERR-MSG MOVE 99 TO WS-CA-RETURN-CODE MOVE "Session terminated" TO WS-CA-MESSAGE PERFORM 6000-ERROR-HANDLE END-IF. *> *> Check for excessive errors IF WS-SESS-ERRORS > WS-CONFIG-MAX-ERRORS MOVE 'L' TO WS-SESS-STATUS MOVE 2 TO WS-ERR-SEVERITY STRING "ERROR: Too many errors, session locked" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG MOVE 99 TO WS-CA-RETURN-CODE MOVE "Session locked" TO WS-CA-MESSAGE END-IF. *> DISPLAY "Main14OnlineCics: COMMAREA validated." " User=" WS-CA-USERID " Func=" WS-CA-FUNCTION. *> 3200-PROCESS-TRANSACTION SECTION. *> DISPLAY "Main14OnlineCics: Processing transaction..." WS-CA-FUNCTION. *> *> Route to specific transaction processing EVALUATE WS-CA-FUNCTION WHEN "ADDN" PERFORM 3210-PROCESS-ADDN WHEN "CANC" PERFORM 3220-PROCESS-CANC WHEN "SUSP" PERFORM 3230-PROCESS-SUSP WHEN "BILL" PERFORM 3240-PROCESS-BILL WHEN "DISP" PERFORM 3250-PROCESS-DISP WHEN OTHER CONTINUE END-EVALUATE. *> 3210-PROCESS-ADDN SECTION. *> *> Add new invoice/record processing DISPLAY "Main14OnlineCics: ADDN - Adding new record...". IF WS-CA-INPUT-DATA = SPACES MOVE 1 TO WS-ERR-SEVERITY STRING "WARN: ADDN with empty input data" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT MOVE "ADDN: no input data" TO WS-CA-MESSAGE MOVE 01 TO WS-CA-RETURN-CODE ELSE STRING "ADDN: record added [" WS-CA-INPUT-DATA "]" INTO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE END-IF. *> *> Build map fields for ADDN response MOVE "ADDNMAP " TO WS-MAP-MAPNAME. MOVE "ADD NEW RECORD" TO WS-MAP-TITLE. MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY. MOVE "ADD processing OK" TO WS-MAP-MSG-LINE. *> 3220-PROCESS-CANC SECTION. *> *> Cancel transaction processing DISPLAY "Main14OnlineCics: CANC - Cancelling...". IF WS-CA-INPUT-DATA = SPACES MOVE 1 TO WS-ERR-SEVERITY STRING "WARN: CANC with empty input data" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT MOVE "CANC: no input data" TO WS-CA-MESSAGE MOVE 01 TO WS-CA-RETURN-CODE ELSE STRING "CANC: cancelled [" WS-CA-INPUT-DATA "]" INTO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE END-IF. *> *> Build map fields for CANC response MOVE "CANCMAP " TO WS-MAP-MAPNAME. MOVE "CANCEL TRANSACTION" TO WS-MAP-TITLE. MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY. MOVE "CANCEL processing OK" TO WS-MAP-MSG-LINE. *> 3230-PROCESS-SUSP SECTION. *> *> Suspend account processing DISPLAY "Main14OnlineCics: SUSP - Suspending account...". IF WS-CA-INPUT-DATA = SPACES MOVE 1 TO WS-ERR-SEVERITY STRING "WARN: SUSP with empty input data" INTO WS-ERR-MSG DISPLAY WS-ERR-MSG ADD 1 TO WS-ERR-COUNT MOVE "SUSP: no input data" TO WS-CA-MESSAGE MOVE 01 TO WS-CA-RETURN-CODE ELSE STRING "SUSP: account suspended [" WS-CA-INPUT-DATA "]" INTO WS-CA-MESSAGE MOVE 00 TO WS-CA-RETURN-CODE MOVE 'L' TO WS-SESS-STATUS END-IF. *> *> Build map fields for SUSP response MOVE "SUSPMAP " TO WS-MAP-MAPNAME. MOVE "SUSPEND ACCOUNT" TO WS-MAP-TITLE. MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY. MOVE "SUSPEND processing OK" TO WS-MAP-MSG-LINE. *> 3240-PROCESS-BILL SECTION. *> *> Billing inquiry processing DISPLAY "Main14OnlineCics: BILL - Billing inquiry...". MOVE WS-CA-INPUT-DATA(1:10) TO WS-BD-INV-ID. COMPUTE WS-BD-AMOUNT = FUNCTION RANDOM * 100000. MOVE '1' TO WS-BD-STATUS. MOVE 202506 TO WS-BD-MONTH. COMPUTE WS-BD-BALANCE = WS-BD-AMOUNT * 80 / 100. *> MOVE WS-BD-AMOUNT TO WS-ED-TOTAL. STRING "BILL: invoice=" WS-BD-INV-ID " amount=" WS-ED-TOTAL " balance=" WS-BD-BALANCE INTO WS-CA-MESSAGE. MOVE 00 TO WS-CA-RETURN-CODE. *> *> Build map fields for BILL response MOVE "BILLMAP " TO WS-MAP-MAPNAME. MOVE "BILLING INQUIRY" TO WS-MAP-TITLE. MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY. STRING "BALANCE=" WS-BD-BALANCE INTO WS-MAP-MSG-LINE. *> 3250-PROCESS-DISP SECTION. *> *> Display detail processing DISPLAY "Main14OnlineCics: DISP - Display detail...". MOVE WS-CA-INPUT-DATA TO WS-BD-INV-ID. MOVE 50000 TO WS-BD-AMOUNT. MOVE '1' TO WS-BD-STATUS. MOVE 202506 TO WS-BD-MONTH. *> MOVE WS-BD-AMOUNT TO WS-ED-TOTAL. STRING "DISP: invoice=" WS-BD-INV-ID " amount=" WS-ED-TOTAL " status=" WS-BD-STATUS INTO WS-CA-MESSAGE. MOVE 00 TO WS-CA-RETURN-CODE. *> *> Build map fields for DISP response MOVE "DISPMAP " TO WS-MAP-MAPNAME. MOVE "DISPLAY DETAIL" TO WS-MAP-TITLE. MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY. STRING "AMOUNT=" WS-BD-AMOUNT INTO WS-MAP-MSG-LINE. *> 3300-BUILD-MAP SECTION. *> DISPLAY "Main14OnlineCics: Building response map...". *> *> Populate map field table based on transaction MOVE 1 TO WS-MAP-CURSOR. MOVE 'U' TO WS-MAP-ATTR. *> *> Fill map field entries MOVE "USERID " TO WS-MAP-FLD-NAME(1). MOVE WS-CA-USERID TO WS-MAP-FLD-VALUE(1). MOVE 'P' TO WS-MAP-FLD-ATTR(1). *> MOVE "FUNCTION " TO WS-MAP-FLD-NAME(2). MOVE WS-CA-FUNCTION TO WS-MAP-FLD-VALUE(2). MOVE 'P' TO WS-MAP-FLD-ATTR(2). *> MOVE "RETURNCOD" TO WS-MAP-FLD-NAME(3). MOVE WS-CA-RETURN-CODE TO WS-MAP-FLD-VALUE(3). MOVE 'P' TO WS-MAP-FLD-ATTR(3). *> MOVE "MESSAGE " TO WS-MAP-FLD-NAME(4). MOVE WS-CA-MESSAGE TO WS-MAP-FLD-VALUE(4). MOVE 'U' TO WS-MAP-FLD-ATTR(4). *> MOVE "INPUTDATA" TO WS-MAP-FLD-NAME(5). MOVE WS-CA-INPUT-DATA TO WS-MAP-FLD-VALUE(5). MOVE 'U' TO WS-MAP-FLD-ATTR(5). *> DISPLAY "Main14OnlineCics: Map built." " Mapname=" WS-MAP-MAPNAME " Title=" WS-MAP-TITLE. *> 3400-FORMAT-RESPONSE SECTION. *> DISPLAY "Main14OnlineCics: Formatting response...". *> *> Capture response time end MOVE FUNCTION CURRENT-DATE TO WS-TIMESTAMP. MOVE WS-TS-SECOND TO WS-RT-END-S. MOVE WS-TS-MS TO WS-RT-END-M. *> *> Calculate elapsed time in milliseconds COMPUTE WS-RT-ELAPSED = (WS-RT-END-S - WS-RT-START-S) * 1000 + (WS-RT-END-M - WS-RT-START-M). IF WS-RT-ELAPSED < 0 COMPUTE WS-RT-ELAPSED = WS-RT-ELAPSED + 60000 END-IF. MOVE WS-RT-ELAPSED TO WS-RT-DISP. *> *> Build response text with map details STRING "MAP=" WS-MAP-MAPNAME " TITLE=" WS-MAP-TITLE " MSG=" WS-MAP-MSG-LINE " RESP-TIME=" WS-RT-DISP "ms" INTO WS-RESP-TEXT. *> *> Build formatted output line with response time MOVE SPACES TO OUTPUT-LINE. STRING "RESPONSE: " WS-RESP-TEXT DELIMITED BY SIZE INTO OUTPUT-LINE. *> DISPLAY "Main14OnlineCics: Response formatted." " Time=" WS-RT-DISP "ms". *> 4000-REPORT SECTION. *> DISPLAY "Main14OnlineCics: Generating session report...". *> *> Write report header MOVE SPACES TO REPORT-LINE. STRING "TELECOM CICS TRANSACTION REPORT" " " WS-RPT-DATE " " WS-RPT-TIME INTO REPORT-LINE. WRITE REPORT-LINE. WRITE REPORT-LINE FROM WS-SEP-STARS. *> *> Write session summary MOVE SPACES TO REPORT-LINE. STRING "SESSION: User=" WS-SESS-USERID " Status=" WS-SESS-STATUS " Txns=" WS-SESS-TXN-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> *> Write transaction hash breakdown MOVE WS-HASH-FUNC-INQY TO WS-ED-COUNT. STRING "HASH: INQY=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-UPDT TO WS-ED-COUNT. STRING "HASH: UPDT=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-DEL TO WS-ED-COUNT. STRING "HASH: DEL =" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-ADDN TO WS-ED-COUNT. STRING "HASH: ADDN=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-CANC TO WS-ED-COUNT. STRING "HASH: CANC=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-SUSP TO WS-ED-COUNT. STRING "HASH: SUSP=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-BILL TO WS-ED-COUNT. STRING "HASH: BILL=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-DISP TO WS-ED-COUNT. STRING "HASH: DISP=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-FUNC-OTHER TO WS-ED-COUNT. STRING "HASH: OTHER=" WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. *> *> Write total summary MOVE WS-HASH-TXN-COUNT TO WS-ED-TOTAL. STRING "TOTAL TRANSACTIONS: " WS-ED-TOTAL INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-HASH-CHECKSUM TO WS-ED-TOTAL. STRING "HASH CHECKSUM: " WS-ED-TOTAL INTO REPORT-LINE. WRITE REPORT-LINE. *> MOVE WS-ERR-COUNT TO WS-ED-COUNT. STRING "ERRORS: " WS-ED-COUNT INTO REPORT-LINE. WRITE REPORT-LINE. WRITE REPORT-LINE FROM WS-SEP-DASHES. *> *> Write transaction history MOVE SPACES TO REPORT-LINE. STRING "TRANSACTION HISTORY (" WS-TXN-COUNT " entries)" INTO REPORT-LINE. WRITE REPORT-LINE. WRITE REPORT-LINE FROM WS-SEP-STARS. *> PERFORM VARYING WS-TXN-COUNT FROM 1 BY 1 UNTIL WS-TXN-COUNT > 20 OR WS-TXN-FUNC(WS-TXN-COUNT) = SPACES MOVE WS-TXN-RC(WS-TXN-COUNT) TO WS-ED-COUNT STRING " " WS-TXN-FUNC(WS-TXN-COUNT) " USER=" WS-TXN-USER(WS-TXN-COUNT) " RC=" WS-ED-COUNT " TIME=" WS-TXN-TIME(WS-TXN-COUNT) INTO REPORT-LINE WRITE REPORT-LINE END-PERFORM. *> WRITE REPORT-LINE FROM WS-SEP-EQUALS. *> DISPLAY "Main14OnlineCics: Report written to txn-report.txt". *> 5000-AUDIT SECTION. *> DISPLAY "Main14OnlineCics: Writing audit trail...". *> *> Build audit record MOVE WS-HASH-TXN-COUNT TO WS-ED-COUNT. MOVE WS-ERR-COUNT TO WS-ED-COUNT. *> STRING "AUDIT:" WS-TIMESTAMP-STR " PROG=Main14OnlineCics" " TXNS=" WS-HASH-TXN-COUNT " ERRS=" WS-ERR-COUNT " USER=" WS-CA-USERID " FUNC=" WS-CA-FUNCTION " RC=" WS-CA-RETURN-CODE INTO AUDIT-RECORD. WRITE AUDIT-RECORD. IF WS-AUD-FILE-STATUS NOT = '00' DISPLAY "ERROR: Audit write failed, status: " WS-AUD-FILE-STATUS ADD 1 TO WS-ERR-COUNT END-IF. *> *> Second audit line — response time STRING "AUDIT:RESPTIME=" WS-RT-DISP "ms" " MAP=" WS-MAP-MAPNAME " CURSOR=" WS-MAP-CURSOR INTO AUDIT-RECORD. WRITE AUDIT-RECORD. *> *> Third audit line — session state STRING "AUDIT:SESSION=" WS-SESS-USERID " STATUS=" WS-SESS-STATUS " TCNT=" WS-SESS-TXN-COUNT " ERRS=" WS-SESS-ERRORS INTO AUDIT-RECORD. WRITE AUDIT-RECORD. *> ADD 1 TO WS-AUDIT-ENTRIES. DISPLAY "Main14OnlineCics: Audit trail written." " Entries=" WS-AUDIT-ENTRIES. *> 6000-ERROR-HANDLE SECTION. *> ADD 1 TO WS-ERR-COUNT. ADD 1 TO WS-HASH-ERROR-COUNT. *> *> Set error response code based on severity EVALUATE WS-ERR-SEVERITY WHEN 0 MOVE '0000' TO WS-ERR-RESP-CODE MOVE 'Informational' TO WS-ERR-RESP-MSG DISPLAY 'INFO: ' WS-ERR-MSG WHEN 1 MOVE '0001' TO WS-ERR-RESP-CODE MOVE 'Warning' TO WS-ERR-RESP-MSG DISPLAY 'WARN: ' WS-ERR-MSG WHEN 2 MOVE '0002' TO WS-ERR-RESP-CODE MOVE 'Error' TO WS-ERR-RESP-MSG DISPLAY 'ERROR: ' WS-ERR-MSG WHEN 3 MOVE '0003' TO WS-ERR-RESP-CODE MOVE 'Fatal' TO WS-ERR-RESP-MSG DISPLAY 'FATAL: ' WS-ERR-MSG PERFORM 9000-EXIT GOBACK WHEN OTHER MOVE '9999' TO WS-ERR-RESP-CODE MOVE 'Unknown severity' TO WS-ERR-RESP-MSG DISPLAY 'UNKN: ' WS-ERR-MSG END-EVALUATE. *> *> Check error threshold IF WS-ERR-COUNT > WS-CONFIG-MAX-ERRORS MOVE 3 TO WS-ERR-SEVERITY STRING 'FATAL: Error threshold ' WS-CONFIG-MAX-ERRORS ' exceeded' INTO WS-ERR-MSG DISPLAY WS-ERR-MSG PERFORM 9000-EXIT GOBACK END-IF. *> 9000-EXIT SECTION. *> DISPLAY "Main14OnlineCics: Cleanup and exit...". *> *> Close all files with status checks CLOSE MAP-FILE. IF WS-MAP-FILE-STATUS NOT = '00' DISPLAY "WARN: MAP-FILE close status=" WS-MAP-FILE-STATUS END-IF. *> CLOSE OUTPUT-FILE. IF WS-OUT-FILE-STATUS NOT = '00' DISPLAY "WARN: OUTPUT-FILE close status=" WS-OUT-FILE-STATUS END-IF. *> CLOSE TXN-AUDIT-FILE. IF WS-AUD-FILE-STATUS NOT = '00' DISPLAY "WARN: TXN-AUDIT close status=" WS-AUD-FILE-STATUS END-IF. *> CLOSE TXN-REPORT. IF WS-RPT-FILE-STATUS NOT = '00' DISPLAY "WARN: TXN-REPORT close status=" WS-RPT-FILE-STATUS END-IF. *> *> Final summary display DISPLAY "Main14OnlineCics: Transactions=" WS-HASH-TXN-COUNT. DISPLAY "Main14OnlineCics: Hash checksum=" WS-HASH-CHECKSUM. DISPLAY "Main14OnlineCics: Errors=" WS-ERR-COUNT. DISPLAY "Main14OnlineCics: Response time=" WS-RT-DISP "ms". DISPLAY "Main14OnlineCics: Audit entries=" WS-AUDIT-ENTRIES. DISPLAY "Main14OnlineCics: End at " WS-TIMESTAMP-STR. *> EXIT.