Amortization Project

JCL

//PROJECT3 JOB 1,NOTIFY=&SYSUID
//STEP0 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//* DELETE BACKUP TO MAKE ROOM.
DELETE KC03C2A.COBOL.LOAD(LSTLOAD)
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//* RENAME LOAD FILE FIRST TO ENSURE NOT TO LOAD A PREVIOUS COMPILATION
ALTER KC03C2A.COBOL.LOAD(ANNUITY) NEWNAME(KC03C2A.COBOL.LOAD(LSTLOAD))
//STEP2 EXEC IGYWCL
//COBOL.SYSIN DD DSN=&SYSUID..PROJECT3.CBL(ANNUITY),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..COBOL.LOAD(ANNUITY),DISP=SHR
//*IF PAYOLD EXISTS DELETE IT TO MAKE ROOM FOR NEW BACKUP
//STEP4 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
DELETE KC03C2A.PROJECT3.PAYOLD
//*RENAME TO PAYOLD
//STEP5 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
ALTER KC03C2A.PROJECT3.PAYNEW NEWNAME(KC03C2A.PROJECT3.PAYOLD)
//STEP6 EXEC PGM=IDCAMS
//STEP47 EXEC PGM=IEFBR14
//SYSPRINT DD SYSOUT=*
//*ALLOCATE PAYNEW
//DD1 DD DSN=&SYSUID..PROJECT3.PAYNEW,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),UNIT=SYSDA,
// DCB=(DSORG=PS,RECFM=FB,LRECL=116)
//* Run COBOL program ANNUITY, with a parameter
//STEP5 EXEC PGM=ANNUITY,PARM=('TEXT')
//*ALTER LOAN FILE HERE
//LOANFILE DD DSN=&SYSUID..PROJECT3.DATA(LOAN01),DISP=SHR,
// DCB=(DSORG=PS,RECFM=FB,LRECL=80)
//PAYMENT DD DSN=&SYSUID..PROJECT3.PAYNEW,DISP=SHR
//STEPLIB DD DSN=&SYSUID..COBOL.LOAD,DISP=SHR
//SYSOUT DD SYSOUT=*

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID PROJECT3.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT OPTIONAL LOAN-FILE ASSIGN TO LOANFILE
ORGANIZATION IS SEQUENTIAL.
SELECT OPTIONAL PAYMENT-FILE ASSIGN TO PAYMENT
ORGANIZATION IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD LOAN-FILE RECORDING MODE F
LABEL RECORDS STANDARD.

01 LOAN-RECORD.
05 LOAN-NAME PIC X(80).

FD PAYMENT-FILE RECORDING MODE F
LABEL RECORDS ARE STANDARD.

01 PAYMENT-RECORD.
05 PAYMENT-NUMBER PIC 9(4).
05 PAYMENT-BEGINNING-BALANCE PIC $$$,$$$,$$9.99.
05 PAYMENT-AMOUNT PIC $$$,$$$,$$9.99.
05 PAYMENT-EXTRA PIC $$$,$$$,$$9.99.
05 PAYMENT-TOTAL PIC $$$,$$$,$$9.99.
05 PAYMENT-PRINCIPAL PIC $$$,$$$,$$9.99.
05 PAYMENT-INTEREST PIC $$$,$$$,$$9.99.
05 PAYMENT-ENDING-BALANCE PIC $$$,$$$,$$9.99.
05 PAYMENT-CUMULATIVE-INTEREST PIC $$$,$$$,$$9.99.
01 STRING-RECORD.
05 STRING-VALUE PIC X(116).
01 ROI-RECORD.
05 LABEL-ROIT PIC X(6).
05 ROI PIC $$$,$$$,$$9.99.
05 FILLER-TEXT PIC X(96).

WORKING-STORAGE SECTION.
01 FIELDS-TO-DISPLAY.
05 DISPLAY-NAME PIC X(20).
05 DISPLAY-AMOUNT PIC X(11).
05 AMOUNT REDEFINES DISPLAY-AMOUNT PIC 9(9)V99.
05 DISPLAY-INTEREST-RATE PIC X(5).
05 INTEREST-RATE REDEFINES DISPLAY-INTEREST-RATE PIC 99V99.
05 DISPLAY-PAYMENT-RATE PIC X(4).
05 PAYMENT-PLAN REDEFINES DISPLAY-PAYMENT-RATE PIC 9(3).
05 DISPLAY-EARLY-PAYMENT PIC X(9).
05 EARLY-PAYMENT REDEFINES DISPLAY-EARLY-PAYMENT PIC 9(9).
01 EDITED-AMOUNT PIC 9(9)V99.
01 EDITED-INTEREST PIC 9V99.
01 EDITED-PAYMENT PIC 9(3).
01 EDITED-EARLY PIC 9(9).
01 FILE-STATUS-CODE PIC XX.
01 PAYMENT-NUM PIC 9(3) VALUE 0.

01 MONTHLY-PAYMENT-RATE PIC 9(9)V99.
01 MONTHLY-INTEREST-RATE PIC 9V9999999.

01 ADJUSTED-MONTHLY-PAYMENT-RATE PIC 9(9)V99.
01 INTEREST-PAYMENT PIC 9(9)V99.
01 CUMULATIVE-INTEREST-PAYMENT PIC 9(9)V99.
01 OLD-CUMULATIVE PIC 9(9)V99.
01 PRINCIPAL-PAYMENT PIC 9(9)V99.
01 REMAINING-BALANCE PIC 9(9)V99.


Linkage section.
1 parameters-from-jcl.
* System-inserted field for total string length of parameters
2 parameters-total-length pic 9(4) usage comp.
* format parameter - TEXT or HTML
2 parameter-values pic x(20).

PROCEDURE DIVISION.
MAIN-LOGIC SECTION.
*> Main Logic Section jumping to performs
PROGRAM-BEGIN.
PERFORM OPEN-FILE-PROCESSING.
PERFORM READ-FILE-PROCESSING.
PERFORM CLOSE-FILE-PROCESS.
PERFORM CHECK-VALIDITY-PROCESSING.
PERFORM MATH-PROCESSING.

PROGRAM-END.
STOP RUN.
OPEN-FILE-PROCESSING.
OPEN INPUT LOAN-FILE.

CLOSE-FILE-PROCESS.
CLOSE LOAN-FILE.

READ-FILE-PROCESSING.
*> READ IN THE SET NEAME
READ LOAN-FILE NEXT RECORD.
MOVE LOAN-NAME TO DISPLAY-NAME.
*> READ IN THE LOAN AMOUNT
READ LOAN-FILE NEXT RECORD.
IF LOAN-NAME IS ALPHABETIC
PERFORM ERROR-LOAN-AMOUNT
END-IF.
MOVE LOAN-NAME TO DISPLAY-AMOUNT.
COMPUTE EDITED-AMOUNT = FUNCTION NUMVAL(DISPLAY-AMOUNT).
*> READ IN INTEREST-RATE
READ LOAN-FILE NEXT RECORD.
IF LOAN-NAME IS ALPHABETIC
PERFORM ERROR-INTEREST-RATE
END-IF.
MOVE LOAN-NAME TO DISPLAY-INTEREST-RATE.
COMPUTE EDITED-INTEREST = FUNCTION
NUMVAL(DISPLAY-INTEREST-RATE).
*> READ IN PAYMENT RATE IN YEARS
READ LOAN-FILE NEXT RECORD.
IF LOAN-NAME IS ALPHABETIC
PERFORM ERROR-LOAN-PAYMENT-RATE
END-IF.
MOVE LOAN-NAME TO DISPLAY-PAYMENT-RATE.
COMPUTE EDITED-PAYMENT =
FUNCTION NUMVAL(DISPLAY-PAYMENT-RATE).
*> READ IN THE EARLY PAYMENT
READ LOAN-FILE NEXT RECORD.
IF LOAN-NAME IS ALPHABETIC
PERFORM ERROR-LOAN-EARLY-PAYMENT
END-IF.
MOVE LOAN-NAME TO DISPLAY-EARLY-PAYMENT.
COMPUTE EDITED-EARLY =
FUNCTION NUMVAL(DISPLAY-EARLY-PAYMENT).

CHECK-VALIDITY-PROCESSING.
*> Check if data is positive and numeric
IF DISPLAY-AMOUNT < 0
PERFORM ERROR-LOAN-AMOUNT
STOP RUN
END-IF.

IF DISPLAY-AMOUNT IS ALPHABETIC
PERFORM ERROR-LOAN-AMOUNT
STOP RUN
END-IF.

IF DISPLAY-INTEREST-RATE < 0
PERFORM ERROR-INTEREST-RATE
STOP RUN
END-IF.

IF DISPLAY-INTEREST-RATE IS ALPHABETIC
PERFORM ERROR-INTEREST-RATE
STOP RUN
END-IF.
IF DISPLAY-PAYMENT-RATE < 0
PERFORM ERROR-LOAN-PAYMENT-RATE
STOP RUN
END-IF.
IF DISPLAY-PAYMENT-RATE IS ALPHABETIC
PERFORM ERROR-LOAN-PAYMENT-RATE
STOP RUN
END-IF.
IF DISPLAY-EARLY-PAYMENT < 0
PERFORM ERROR-LOAN-EARLY-PAYMENT
STOP RUN
END-IF.
IF DISPLAY-EARLY-PAYMENT IS ALPHABETIC
PERFORM ERROR-LOAN-EARLY-PAYMENT
STOP RUN
END-IF.
*> Non-Flushed out Error displays
ERROR-LOAN-AMOUNT.
DISPLAY "ERROR : LOAN AMOUNT MUST BE A POSITIVE NUMBER".
ERROR-INTEREST-RATE.
DISPLAY "ERROR : INTEREST RATE MUST BE A POSTIVE NUMBER".
ERROR-LOAN-PAYMENT-RATE.
DISPLAY "ERROR : PAYMENT RATE MUST BE A POSITIVE NUMBER".
ERROR-LOAN-EARLY-PAYMENT.
DISPLAY "ERROR : EARLY PAYMENT MUST BE A POSITIVE NUMBER".

MATH-PROCESSING.
*>Calculate rate
COMPUTE MONTHLY-PAYMENT-RATE = EDITED-AMOUNT * FUNCTION
ANNUITY(EDITED-INTEREST / 100 / 12, EDITED-PAYMENT * 12).
MOVE EDITED-AMOUNT TO REMAINING-BALANCE.
COMPUTE ADJUSTED-MONTHLY-PAYMENT-RATE = MONTHLY-PAYMENT-RATE
+ EDITED-EARLY.
OPEN OUTPUT PAYMENT-FILE.
PERFORM WRITE-HEADER.
PERFORM AMORTIZATION.
IF EARLY-PAYMENT > 0
PERFORM ROI-CALCULATION
END-IF.
CLOSE PAYMENT-FILE.

AMORTIZATION.
PERFORM UNTIL REMAINING-BALANCE <= 0
ADD 1 TO PAYMENT-NUM
*>Calculate interest payments
COMPUTE INTEREST-PAYMENT = EDITED-AMOUNT *
EDITED-INTEREST / 12 / 100
*>Calculate principal payments
COMPUTE PRINCIPAL-PAYMENT =
ADJUSTED-MONTHLY-PAYMENT-RATE - INTEREST-PAYMENT
*>Update remaining balance
IF(PRINCIPAL-PAYMENT > REMAINING-BALANCE)
COMPUTE PRINCIPAL-PAYMENT =
PRINCIPAL-PAYMENT - REMAINING-BALANCE
MOVE 0 TO REMAINING-BALANCE
END-IF
IF(PRINCIPAL-PAYMENT <= REMAINING-BALANCE)
Compute REMAINING-BALANCE =
EDITED-AMOUNT - PRINCIPAL-PAYMENT
END-IF
*> Track Cumulative interest payed
COMPUTE CUMULATIVE-INTEREST-PAYMENT =
CUMULATIVE-INTEREST-PAYMENT + INTEREST-PAYMENT
*>Write payment details to file
PERFORM WRITE-TO-RECORD
MOVE REMAINING-BALANCE TO EDITED-AMOUNT
END-PERFORM.
MOVE CUMULATIVE-INTEREST-PAYMENT TO OLD-CUMULATIVE.

ROI-CALCULATION.
*> repeate calcuations without extra payments for ROI
COMPUTE EDITED-AMOUNT = FUNCTION NUMVAL(DISPLAY-AMOUNT).
MOVE EDITED-AMOUNT TO REMAINING-BALANCE.
PERFORM UNTIL REMAINING-BALANCE <= 0
COMPUTE INTEREST-PAYMENT = EDITED-AMOUNT *
EDITED-INTEREST / 12 / 100
COMPUTE PRINCIPAL-PAYMENT =
MONTHLY-PAYMENT-RATE - INTEREST-PAYMENT
IF(PRINCIPAL-PAYMENT > REMAINING-BALANCE)
COMPUTE PRINCIPAL-PAYMENT =
PRINCIPAL-PAYMENT - REMAINING-BALANCE
MOVE 0 TO REMAINING-BALANCE
END-IF
IF(PRINCIPAL-PAYMENT <= REMAINING-BALANCE)
Compute REMAINING-BALANCE =
EDITED-AMOUNT - PRINCIPAL-PAYMENT
END-IF
COMPUTE CUMULATIVE-INTEREST-PAYMENT =
CUMULATIVE-INTEREST-PAYMENT + INTEREST-PAYMENT
MOVE REMAINING-BALANCE TO EDITED-AMOUNT
END-PERFORM
*> Calculate ROI then write to record.
COMPUTE CUMULATIVE-INTEREST-PAYMENT =
CUMULATIVE-INTEREST-PAYMENT - OLD-CUMULATIVE.
COMPUTE ROI = CUMULATIVE-INTEREST-PAYMENT.
INITIALIZE FILLER-TEXT.
INITIALIZE LABEL-ROIT.
MOVE "ROI : " TO LABEL-ROIT.
Move " saved from Accellerated payments." to FILLER-TEXT.
DISPLAY ROI-RECORD.
WRITE ROI-RECORD.

WRITE-TO-RECORD.
*>Write records to file
MOVE PAYMENT-NUM TO PAYMENT-NUMBER.
MOVE EDITED-AMOUNT TO PAYMENT-BEGINNING-BALANCE.
MOVE MONTHLY-PAYMENT-RATE TO PAYMENT-AMOUNT.
MOVE EDITED-EARLY TO PAYMENT-EXTRA.
MOVE ADJUSTED-MONTHLY-PAYMENT-RATE TO PAYMENT-TOTAL.
MOVE PRINCIPAL-PAYMENT TO PAYMENT-PRINCIPAL.
MOVE INTEREST-PAYMENT TO PAYMENT-INTEREST.
MOVE REMAINING-BALANCE TO PAYMENT-ENDING-BALANCE.
MOVE CUMULATIVE-INTEREST-PAYMENT TO
PAYMENT-CUMULATIVE-INTEREST.
DISPLAY PAYMENT-NUMBER PAYMENT-BEGINNING-BALANCE
PAYMENT-AMOUNT PAYMENT-EXTRA PAYMENT-TOTAL
PAYMENT-PRINCIPAL PAYMENT-INTEREST
PAYMENT-ENDING-BALANCE PAYMENT-CUMULATIVE-INTEREST.
WRITE PAYMENT-RECORD.

WRITE-HEADER.
*> Write header to file
INITIALIZE STRING-VALUE.
MOVE "Month Beg-Balance Monthly-Payment Early-Payment Adjuste
- d payment Principal Interest End-Balance Total-Interest
- t" TO STRING-VALUE.
DISPLAY STRING-RECORD.
WRITE STRING-RECORD.