diff --git a/README.md b/README.md index 43baf3b..f2f1604 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,26 @@ -# cobol-sample-app +# COBOL Sample Application -Sample COBOL application for JIRA AI Fixer testing \ No newline at end of file +Sample mainframe application for testing JIRA AI Fixer. + +## Structure + +``` +src/ +├── cobol/ +│ ├── AUTH.CBL - Transaction authorization +│ ├── VALIDATE.CBL - Input validation +│ ├── CLEARING.CBL - Settlement processing +│ └── HOST.CBL - Host communication +├── copybooks/ +│ └── TRANSREC.cpy - Transaction record layout +└── jcl/ + ├── AUTHPROC.jcl - Authorization job + └── CLEARJOB.jcl - Clearing batch job +``` + +## Known Issues + +For testing purposes, AUTH.CBL contains a deliberate bug: +- `WS-AVAILABLE-BALANCE` is defined as `PIC 9(9)V99` +- Should be `PIC 9(11)V99` to match HOST response +- Causes truncation on balances > $9,999,999.99 diff --git a/src/cobol/AUTH.CBL b/src/cobol/AUTH.CBL new file mode 100644 index 0000000..6e85514 --- /dev/null +++ b/src/cobol/AUTH.CBL @@ -0,0 +1,70 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. AUTH. + ***************************************************************** + * PROGRAM: AUTH - Transaction Authorization + * PURPOSE: Validate and authorize card transactions + * AUTHOR: Sample Application + ***************************************************************** + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + + 01 WS-TRANSACTION-DATA. + 05 WS-CARD-NUMBER PIC X(16). + 05 WS-TRANSACTION-AMOUNT PIC 9(11)V99. + 05 WS-AVAILABLE-BALANCE PIC 9(9)V99. + 05 WS-RESPONSE-CODE PIC 9(2). + 05 WS-MERCHANT-ID PIC X(15). + + 01 WS-HOST-RESPONSE. + 05 WS-HOST-BALANCE PIC 9(11)V99. + 05 WS-HOST-STATUS PIC X(2). + + 01 WS-FLAGS. + 05 WS-VALID-CARD PIC X VALUE 'N'. + 05 WS-SUFFICIENT-FUNDS PIC X VALUE 'N'. + + PROCEDURE DIVISION. + + 0000-MAIN-PROCESS. + PERFORM 1000-INITIALIZE + PERFORM 2000-VALIDATE-CARD + IF WS-VALID-CARD = 'Y' + PERFORM 3000-CHECK-BALANCE + IF WS-SUFFICIENT-FUNDS = 'Y' + PERFORM 4000-AUTHORIZE + ELSE + MOVE 51 TO WS-RESPONSE-CODE + END-IF + ELSE + MOVE 14 TO WS-RESPONSE-CODE + END-IF + PERFORM 9000-FINALIZE + STOP RUN. + + 1000-INITIALIZE. + INITIALIZE WS-TRANSACTION-DATA + INITIALIZE WS-HOST-RESPONSE + MOVE 'N' TO WS-VALID-CARD + MOVE 'N' TO WS-SUFFICIENT-FUNDS. + + 2000-VALIDATE-CARD. + IF WS-CARD-NUMBER NOT = SPACES + MOVE 'Y' TO WS-VALID-CARD + END-IF. + + 3000-CHECK-BALANCE. + * BUG: WS-AVAILABLE-BALANCE is PIC 9(9)V99 but HOST returns + * PIC 9(11)V99, causing truncation on amounts > 9,999,999.99 + MOVE WS-HOST-BALANCE TO WS-AVAILABLE-BALANCE + IF WS-AVAILABLE-BALANCE >= WS-TRANSACTION-AMOUNT + MOVE 'Y' TO WS-SUFFICIENT-FUNDS + ELSE + MOVE 'N' TO WS-SUFFICIENT-FUNDS + END-IF. + + 4000-AUTHORIZE. + MOVE 00 TO WS-RESPONSE-CODE. + + 9000-FINALIZE. + CONTINUE. diff --git a/src/cobol/CLEARING.CBL b/src/cobol/CLEARING.CBL new file mode 100644 index 0000000..6162e64 --- /dev/null +++ b/src/cobol/CLEARING.CBL @@ -0,0 +1,75 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. CLEARING. + ***************************************************************** + * PROGRAM: CLEARING - Settlement Processing + * PURPOSE: Process daily transaction settlements + ***************************************************************** + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT TRANS-FILE ASSIGN TO 'TRANSIN' + ORGANIZATION IS SEQUENTIAL + FILE STATUS IS WS-FILE-STATUS. + SELECT CLEAR-FILE ASSIGN TO 'CLEAROUT' + ORGANIZATION IS SEQUENTIAL + FILE STATUS IS WS-FILE-STATUS. + + DATA DIVISION. + FILE SECTION. + + FD TRANS-FILE. + 01 TRANS-RECORD. + 05 TR-CARD-NUMBER PIC X(16). + 05 TR-AMOUNT PIC 9(11)V99. + 05 TR-DATE PIC 9(8). + 05 TR-STATUS PIC X(2). + + FD CLEAR-FILE. + 01 CLEAR-RECORD. + 05 CR-CARD-NUMBER PIC X(16). + 05 CR-AMOUNT PIC 9(11)V99. + 05 CR-SETTLE-DATE PIC 9(8). + 05 CR-BATCH-ID PIC 9(6). + + WORKING-STORAGE SECTION. + + 01 WS-FILE-STATUS PIC XX. + 01 WS-EOF-FLAG PIC X VALUE 'N'. + 01 WS-RECORD-COUNT PIC 9(8) VALUE 0. + 01 WS-BATCH-NUMBER PIC 9(6) VALUE 0. + 01 WS-CURRENT-DATE PIC 9(8). + + PROCEDURE DIVISION. + + 0000-MAIN-CLEARING. + PERFORM 1000-INITIALIZE + PERFORM 2000-PROCESS-RECORDS + UNTIL WS-EOF-FLAG = 'Y' + PERFORM 9000-FINALIZE + STOP RUN. + + 1000-INITIALIZE. + OPEN INPUT TRANS-FILE + OPEN OUTPUT CLEAR-FILE + ACCEPT WS-CURRENT-DATE FROM DATE YYYYMMDD + ADD 1 TO WS-BATCH-NUMBER. + + 2000-PROCESS-RECORDS. + READ TRANS-FILE + AT END MOVE 'Y' TO WS-EOF-FLAG + NOT AT END PERFORM 3000-CREATE-CLEARING + END-READ. + + 3000-CREATE-CLEARING. + IF TR-STATUS = '00' + MOVE TR-CARD-NUMBER TO CR-CARD-NUMBER + MOVE TR-AMOUNT TO CR-AMOUNT + MOVE WS-CURRENT-DATE TO CR-SETTLE-DATE + MOVE WS-BATCH-NUMBER TO CR-BATCH-ID + WRITE CLEAR-RECORD + ADD 1 TO WS-RECORD-COUNT + END-IF. + + 9000-FINALIZE. + CLOSE TRANS-FILE + CLOSE CLEAR-FILE. diff --git a/src/cobol/HOST.CBL b/src/cobol/HOST.CBL new file mode 100644 index 0000000..e63d21a --- /dev/null +++ b/src/cobol/HOST.CBL @@ -0,0 +1,44 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. HOST. + ***************************************************************** + * PROGRAM: HOST - Host Communication Module + * PURPOSE: Interface with host system for balance inquiry + ***************************************************************** + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + + 01 WS-HOST-REQUEST. + 05 WS-REQ-FUNCTION PIC X(4). + 05 WS-REQ-CARD-NUMBER PIC X(16). + 05 WS-REQ-TIMESTAMP PIC 9(14). + + 01 WS-HOST-RESPONSE. + 05 WS-RSP-STATUS PIC X(2). + 05 WS-RSP-BALANCE PIC 9(11)V99. + 05 WS-RSP-CREDIT-LIMIT PIC 9(11)V99. + 05 WS-RSP-MESSAGE PIC X(50). + + 01 WS-RETURN-CODE PIC 9(4) VALUE 0. + + PROCEDURE DIVISION. + + 0000-MAIN-HOST. + PERFORM 1000-BUILD-REQUEST + PERFORM 2000-SEND-REQUEST + PERFORM 3000-RECEIVE-RESPONSE + STOP RUN. + + 1000-BUILD-REQUEST. + MOVE 'BALQ' TO WS-REQ-FUNCTION + ACCEPT WS-REQ-TIMESTAMP FROM TIME. + + 2000-SEND-REQUEST. + * Simulated host communication + CONTINUE. + + 3000-RECEIVE-RESPONSE. + * Simulated host response + MOVE '00' TO WS-RSP-STATUS + MOVE 150000000.00 TO WS-RSP-BALANCE + MOVE 200000000.00 TO WS-RSP-CREDIT-LIMIT. diff --git a/src/cobol/VALIDATE.CBL b/src/cobol/VALIDATE.CBL new file mode 100644 index 0000000..f32bb41 --- /dev/null +++ b/src/cobol/VALIDATE.CBL @@ -0,0 +1,45 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. VALIDATE. + ***************************************************************** + * PROGRAM: VALIDATE - Input Validation Module + * PURPOSE: Validate transaction input data + ***************************************************************** + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + + 01 WS-VALIDATION-FLAGS. + 05 WS-CARD-VALID PIC X VALUE 'N'. + 05 WS-AMOUNT-VALID PIC X VALUE 'N'. + 05 WS-MERCHANT-VALID PIC X VALUE 'N'. + + 01 WS-INPUT-DATA. + 05 WS-IN-CARD-NUMBER PIC X(16). + 05 WS-IN-AMOUNT PIC 9(11)V99. + 05 WS-IN-MERCHANT PIC X(15). + + PROCEDURE DIVISION. + + 0000-MAIN-VALIDATE. + PERFORM 1000-VALIDATE-CARD + PERFORM 2000-VALIDATE-AMOUNT + PERFORM 3000-VALIDATE-MERCHANT + STOP RUN. + + 1000-VALIDATE-CARD. + IF WS-IN-CARD-NUMBER NOT = SPACES + IF FUNCTION LENGTH( + FUNCTION TRIM(WS-IN-CARD-NUMBER)) = 16 + MOVE 'Y' TO WS-CARD-VALID + END-IF + END-IF. + + 2000-VALIDATE-AMOUNT. + IF WS-IN-AMOUNT > 0 + MOVE 'Y' TO WS-AMOUNT-VALID + END-IF. + + 3000-VALIDATE-MERCHANT. + IF WS-IN-MERCHANT NOT = SPACES + MOVE 'Y' TO WS-MERCHANT-VALID + END-IF. diff --git a/src/copybooks/TRANSREC.cpy b/src/copybooks/TRANSREC.cpy new file mode 100644 index 0000000..43d29f6 --- /dev/null +++ b/src/copybooks/TRANSREC.cpy @@ -0,0 +1,19 @@ + ***************************************************************** + * COPYBOOK: TRANSREC - Transaction Record Layout + ***************************************************************** + 01 TRANSACTION-RECORD. + 05 TXN-HEADER. + 10 TXN-TYPE PIC X(4). + 10 TXN-VERSION PIC 9(2). + 05 TXN-CARD-DATA. + 10 TXN-CARD-NUMBER PIC X(16). + 10 TXN-CARD-EXPIRY PIC 9(4). + 05 TXN-AMOUNT-DATA. + 10 TXN-AMOUNT PIC 9(11)V99. + 10 TXN-CURRENCY PIC X(3). + 05 TXN-MERCHANT-DATA. + 10 TXN-MERCHANT-ID PIC X(15). + 10 TXN-MERCHANT-NAME PIC X(40). + 05 TXN-RESPONSE. + 10 TXN-RESP-CODE PIC 9(2). + 10 TXN-RESP-MESSAGE PIC X(50). diff --git a/src/jcl/AUTHPROC.jcl b/src/jcl/AUTHPROC.jcl new file mode 100644 index 0000000..83418a3 --- /dev/null +++ b/src/jcl/AUTHPROC.jcl @@ -0,0 +1,13 @@ +//AUTHPROC JOB (ACCT),'AUTH PROCESS',CLASS=A,MSGCLASS=X +//***************************************************************** +//* JCL: AUTHPROC - Transaction Authorization Process +//***************************************************************** +//STEP01 EXEC PGM=AUTH +//STEPLIB DD DSN=PROD.LOADLIB,DISP=SHR +//SYSOUT DD SYSOUT=* +//SYSPRINT DD SYSOUT=* +//TRANSIN DD DSN=PROD.TRANS.INPUT,DISP=SHR +//TRANSOUT DD DSN=PROD.TRANS.OUTPUT,DISP=(NEW,CATLG,DELETE), +// SPACE=(CYL,(10,5),RLSE), +// DCB=(RECFM=FB,LRECL=200,BLKSIZE=0) +//* diff --git a/src/jcl/CLEARJOB.jcl b/src/jcl/CLEARJOB.jcl new file mode 100644 index 0000000..6cdbb59 --- /dev/null +++ b/src/jcl/CLEARJOB.jcl @@ -0,0 +1,13 @@ +//CLEARJOB JOB (ACCT),'CLEARING BATCH',CLASS=A,MSGCLASS=X +//***************************************************************** +//* JCL: CLEARJOB - Daily Clearing Batch Process +//***************************************************************** +//STEP01 EXEC PGM=CLEARING +//STEPLIB DD DSN=PROD.LOADLIB,DISP=SHR +//SYSOUT DD SYSOUT=* +//SYSPRINT DD SYSOUT=* +//TRANSIN DD DSN=PROD.DAILY.TRANS,DISP=SHR +//CLEAROUT DD DSN=PROD.CLEARING.OUTPUT,DISP=(NEW,CATLG,DELETE), +// SPACE=(CYL,(50,10),RLSE), +// DCB=(RECFM=FB,LRECL=100,BLKSIZE=0) +//*