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:
parent
edefa6c450
commit
bfa168d12b
27
README.md
27
README.md
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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).
|
||||
|
|
@ -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)
|
||||
//*
|
||||
|
|
@ -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)
|
||||
//*
|
||||
Loading…
Reference in New Issue