Welcome to the AWS CardDemo developer documentation! This guide serves as your comprehensive entry point to understanding and working with this mainframe credit card management system.
AWS CardDemo is a production-quality mainframe credit card management system that demonstrates modern patterns for AWS Mainframe Modernization. This comprehensive COBOL/CICS application showcases real-world enterprise development including:
This documentation provides developers with everything needed to:
This developer documentation is designed for:
The system processes credit card operations at scale:
| Capability | Description | Scale |
|---|---|---|
| Account Management | Customer account creation, updates, inquiries | 500K-1M accounts |
| Card Management | Card issuance, activation, updates, lifecycle | 1M-2M cards |
| Transaction Processing | Online entry and batch posting | 100K-500K daily |
| Authorization | Real-time fraud detection and approval | 50K-250K daily |
| Bill Payment | Payment processing and balance updates | Real-time |
| Statement Generation | Monthly billing statements (text and HTML) | 500K-1M monthly |
| Reporting | Transaction reports and analytics | On-demand |
| User Administration | CRUD operations for system users | Admin-controlled |
Programming & Runtime:
Data Management:
CardDemo implements a classic three-tier mainframe architecture:
Presentation Tier:
Online Transaction Processing Tier:
Business Logic Tier:
Data Tier:
Online Transaction Flow:
Batch Processing Flow:
1. Pseudo-Conversational Programming:
2. Program Control via XCTL:
3. File Access Patterns:
4. State Management:
5. Screen Standardization:
What is it? A programming technique where programs terminate between user interactions, releasing system resources while maintaining user context.
How it works:
* First entry (EIBCALEN = 0)
IF EIBCALEN = 0
PERFORM FIRST-TIME-PROCESSING
MOVE 'Initial Screen' TO OUTPUT-AREA
ELSE
* Restart from COMMAREA
MOVE DFHCOMMAREA TO WS-COMMAREA
PERFORM PROCESS-USER-INPUT
END-IF
* Send screen and terminate
EXEC CICS SEND MAP('MAPNAME')
MAPSET('MAPSET')
FROM(OUTPUT-AREA)
ERASE
END-EXEC
* Return with state for restart
EXEC CICS RETURN
TRANSID('CAVW')
COMMAREA(WS-COMMAREA)
LENGTH(90)
END-EXEC
Key Benefits:
State Management:
File Organization:
CardDemo uses VSAM (Virtual Storage Access Method) for primary data storage:
Key Concepts:
Primary Files:
| File | Key | Records | Purpose |
|---|---|---|---|
| ACCTDAT | ACCT-ID (11 bytes) | 500K-1M | Account master |
| CARDDAT | CARD-NUM (16 bytes) | 1M-2M | Card master |
| CUSTDAT | CUST-ID (9 bytes) | 500K-1M | Customer master |
| TRANSACT | TRAN-ID (16 bytes) | Variable | Transaction history |
| USRSEC | USER-ID (8 bytes) | 100+ | User security |
| CCXREF | Composite key | 1M-2M | Card-account xref |
| TCATBALF | Composite key | Variable | Transaction balances |
| DISCGRP | DISCGRP-ID (8 bytes) | 10-50 | Disclosure groups |
Access Patterns:
* Direct Read
EXEC CICS READ
DATASET('ACCTDAT')
INTO(ACCOUNT-RECORD)
RIDFLD(WS-ACCOUNT-ID)
RESP(WS-RESP-CD)
END-EXEC
* Update
EXEC CICS READ UPDATE
DATASET('ACCTDAT')
INTO(ACCOUNT-RECORD)
RIDFLD(WS-ACCOUNT-ID)
END-EXEC
* Modify record
COMPUTE ACCOUNT-BALANCE = ACCOUNT-BALANCE - PAYMENT-AMOUNT
EXEC CICS REWRITE
DATASET('ACCTDAT')
FROM(ACCOUNT-RECORD)
END-EXEC
* Browse Pattern (for lists)
EXEC CICS STARTBR
DATASET('CARDDAT')
RIDFLD(WS-SEARCH-KEY)
KEYLENGTH(16)
GTEQ
END-EXEC
PERFORM UNTIL END-OF-FILE OR PAGE-FULL
EXEC CICS READNEXT
DATASET('CARDDAT')
INTO(CARD-RECORD)
RIDFLD(WS-CARD-KEY)
END-EXEC
* Process record
PERFORM ADD-TO-SCREEN-LIST
END-PERFORM
EXEC CICS ENDBR
DATASET('CARDDAT')
END-EXEC
Daily Processing Cycle:
Common Batch Patterns:
1. Transaction Posting (CBTRN02C):
2. Interest Calculation (CBACT04C):
3. Statement Generation (CBSTM03A):
Batch Job Dependencies:
Programs coordinate through JCL job chains:
Online Transaction Flow:
User Entry:
Screen Display:
User Input:
Processing:
Navigation:
Batch Transaction Flow:
Input Collection:
Validation:
Posting:
Reconciliation:
CICS Terms:
VSAM Terms:
Batch Terms:
Program Terms:
Data Terms:
Scenario: Add a new inquiry transaction to view customer details.
Steps:
COCUSDET.bms):COCUSDET DFHMSD TYPE=&SYSPARM,MODE=INOUT,LANG=COBOL, X
TIOAPFX=YES,STORAGE=AUTO
CUSDET DFHMDI SIZE=(24,80),LINE=1,COLUMN=1
DFHMDF POS=(01,01),LENGTH=04,ATTRB=(ASKIP,BRT), X
INITIAL='CUST'
* Add field definitions
DFHMDF POS=(10,10),LENGTH=09,ATTRB=(ASKIP,NORM), X
INITIAL='CUSTOMER ID:'
DFHMDF POS=(10,25),LENGTH=09,ATTRB=(UNPROT,NUM,IC)
* More fields...
DFHMSD TYPE=FINAL
END
COCUSDET.cbl): IDENTIFICATION DIVISION.
PROGRAM-ID. COCUSDET.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COMMAREA.
COPY COCOM01Y.
01 CUSTOMER-RECORD.
COPY CVCUS01Y.
LINKAGE SECTION.
01 DFHCOMMAREA PIC X(90).
PROCEDURE DIVISION.
IF EIBCALEN = 0
PERFORM FIRST-TIME-PROCESSING
ELSE
PERFORM PROCESS-USER-INPUT
END-IF.
FIRST-TIME-PROCESSING.
MOVE LOW-VALUES TO OUTPUT-AREA
EXEC CICS SEND MAP('CUSDET')
MAPSET('COCUSDET')
FROM(OUTPUT-AREA)
ERASE
END-EXEC
EXEC CICS RETURN
TRANSID('CUSD')
COMMAREA(WS-COMMAREA)
LENGTH(90)
END-EXEC.
PROCESS-USER-INPUT.
MOVE DFHCOMMAREA TO WS-COMMAREA
EXEC CICS RECEIVE MAP('CUSDET')
MAPSET('COCUSDET')
INTO(INPUT-AREA)
END-EXEC
PERFORM READ-CUSTOMER
PERFORM DISPLAY-CUSTOMER-DETAILS.
DEFINE TRANSACTION(CUSD)
GROUP(CARDDEMO)
PROGRAM(COCUSDET)
DESCRIPTION('Customer Detail Inquiry')
05 FILLER.
10 MENU-OPTION PIC X(02) VALUE '12'.
10 MENU-OPTION-NAME PIC X(35)
VALUE 'Customer Detail Inquiry'.
10 MENU-OPTION-PGMNAME PIC X(08) VALUE 'COCUSDET'.
10 MENU-OPTION-TRANID PIC X(04) VALUE 'CUSD'.
Scenario: Add a new validation to transaction posting.
Steps:
Locate Program: Find CBTRN02C (transaction posting)
Review Program Documentation:
Add Validation Logic:
PROCESS-TRANSACTION.
* Existing validations
PERFORM VALIDATE-CARD-NUMBER
PERFORM VALIDATE-ACCOUNT-STATUS
* New validation
PERFORM VALIDATE-TRANSACTION-AMOUNT
IF VALIDATION-ERROR
PERFORM WRITE-REJECTION-RECORD
GO TO PROCESS-NEXT-TRANSACTION
END-IF
PERFORM POST-TRANSACTION.
VALIDATE-TRANSACTION-AMOUNT.
* Check amount is within reasonable range
IF TRAN-AMOUNT < 0.01 OR TRAN-AMOUNT > 99999.99
MOVE 'Invalid transaction amount' TO ERROR-MSG
SET VALIDATION-ERROR TO TRUE
END-IF.
Update JCL:
Test:
Common Debugging Techniques:
1. CICS Trace:
CETR,ON - Turn on CICS trace
CETR,OFF - Turn off CICS trace
2. Display Variables:
EXEC CICS SEND TEXT
FROM(WS-DEBUG-MESSAGE)
LENGTH(80)
ERASE
END-EXEC
3. Write to TD Queue:
EXEC CICS WRITEQ TD
QUEUE('CSMT')
FROM(DEBUG-MESSAGE)
LENGTH(80)
END-EXEC
4. ABEND Analysis:
* Intentional abend for debugging
EXEC CICS ABEND
ABCODE('USR1')
END-EXEC
5. Trace File I/O:
READ-ACCOUNT-RECORD.
EXEC CICS READ
DATASET('ACCTDAT')
INTO(ACCOUNT-RECORD)
RIDFLD(WS-ACCOUNT-ID)
RESP(WS-RESP-CD)
RESP2(WS-REAS-CD)
END-EXEC
IF WS-RESP-CD NOT = DFHRESP(NORMAL)
STRING 'READ ERROR: ' WS-RESP-CD ' ' WS-REAS-CD
DELIMITED BY SIZE INTO DEBUG-MSG
PERFORM WRITE-DEBUG-MESSAGE
END-IF.
Debugging Workflow:
Reproduce Issue:
Analyze Code:
Add Instrumentation:
Test Fix:
Clean Up:
Unit Testing:
* Test framework pattern
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST-CBTRN02C.
PROCEDURE DIVISION.
PERFORM TEST-VALIDATE-CARD
PERFORM TEST-VALIDATE-AMOUNT
PERFORM TEST-POST-TRANSACTION
STOP RUN.
TEST-VALIDATE-CARD.
* Setup
MOVE '1234567890123456' TO TEST-CARD-NUM
* Execute
PERFORM VALIDATE-CARD-NUMBER
* Assert
IF VALIDATION-OK
DISPLAY 'TEST PASSED: Card validation'
ELSE
DISPLAY 'TEST FAILED: Card validation'
END-IF.
Integration Testing:
System Testing:
AWS Mainframe Modernization:
COBOL Resources:
CICS Resources:
GitHub Repository: