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.