feat: Initial COBOL sample application

- AUTH.CBL: Transaction authorization (with deliberate bug)
- VALIDATE.CBL: Input validation module
- CLEARING.CBL: Settlement batch processing
- HOST.CBL: Host communication interface
- Copybooks and JCLs included

Bug for testing: AUTH.CBL uses PIC 9(9)V99 for balance
instead of PIC 9(11)V99, causing truncation.
This commit is contained in:
Ricel Leite 2026-02-18 15:29:32 -03:00
parent edefa6c450
commit bfa168d12b
8 changed files with 304 additions and 2 deletions

View File

@ -1,3 +1,26 @@
# cobol-sample-app
# COBOL Sample Application
Sample COBOL application for JIRA AI Fixer testing
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

70
src/cobol/AUTH.CBL Normal file
View File

@ -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.

75
src/cobol/CLEARING.CBL Normal file
View File

@ -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.

44
src/cobol/HOST.CBL Normal file
View File

@ -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.

45
src/cobol/VALIDATE.CBL Normal file
View File

@ -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.

View File

@ -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).

13
src/jcl/AUTHPROC.jcl Normal file
View File

@ -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)
//*

13
src/jcl/CLEARJOB.jcl Normal file
View File

@ -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)
//*