// COBOL for MORTGAGE project
*-----------------------
IDENTIFICATION DIVISION.
*-----------------------
PROGRAM-ID. MORTGAGE.
AUTHOR. Rosario Silva.
*--------------------
ENVIRONMENT DIVISION.
*--------------------
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRINT-LINE ASSIGN TO PRTLINE.
SELECT ACCT-REC ASSIGN TO ACCTREC.
*-------------
DATA DIVISION.
*-------------
FILE SECTION.
FD PRINT-LINE RECORDING MODE V.
01 PRINT-REC.
05 TOTAL-RECORD PIC X(400).
FD ACCT-REC RECORDING MODE F.
01 ACCT-FIELDS.
05 TOTAL-RECORD-F PIC X(80).
*
WORKING-STORAGE SECTION.
01 FORMAT PIC X(4).
01 USERNAME PIC X(50).
01 FLAGS.
05 LASTREC PIC X VALUE SPACE.
01 LOAN-NAME PIC X(40).
01 LOAN-AMOUNT PIC 9(9)V99.
01 INTEREST-RATE PIC 999V9999.
01 YEARS PIC 999.
01 APS PIC X(11).
01 AP PIC 9(9)V99.
01 ORIGINAL-MONTHLY-PAYMENT PIC 9(9)V99 VALUE ZERO.
01 ORIGINAL-TOTAL-INTEREST PIC 9(11)V99 VALUE ZERO.
01 INTEREST-SAVED PIC 9(11)V99 VALUE ZERO.
01 CURRENT-PRINCIPAL PIC 9(9)V99.
01 MONTHS PIC 999 VALUE ZERO.
01 ROI PIC 9(9)V99 VALUE ZERO.
01 CUMMULATIVE-INTEREST PIC 9(9)V99 VALUE ZERO.
01 INTEREST-PORTION PIC 9(9)V99 VALUE ZERO.
01 PRINCIPAL-PORTION PIC 9(9)V99 VALUE ZERO.
01 TOTAL-PAYMENT PIC 9(9)V99 VALUE ZERO.
01 TOTAL-EXTRA-PAY PIC 9(11)V99 VALUE ZERO.
01 MONTHLY-PAYMENT PIC 9(9)V99.
01 PAYMENT-COUNT PIC 9(4) VALUE 1.
01 YYYYMMDD PIC 9(8).
01 DATE-AS-INTEGER PIC 9(8).
01 PAYMENT-DATE.
05 MM PIC 99.
05 FILLER PIC X VALUE '/'.
05 DD PIC 99.
05 FILLER PIC X VALUE '/'.
05 YYYY PIC 9(4).
01 HEADER.
05 FILLER PIC X(30) VALUE
- "Values for loan processing:".
01 HEADER-LINE.
05 FILLER PIC X(44) VALUE ALL "-".
01 HEADER-LOAN-NAME.
05 FILLER PIC X(28) VALUE
- "Processing loan for: ".
05 HD-LOAN-NAME PIC X(40).
01 HEADER-LOAN-AMOUNT.
05 FILLER PIC X(28) VALUE
- "Loan amount: ".
05 HD-LOAN-AMOUNT PIC $$$,$$$,$$9.99.
01 HEADER-INTEREST-RATE.
05 FILLER PIC X(28) VALUE
- "Annual interest rate: ".
05 HD-INTEREST-RATE PIC ZZ9.99.
05 FILLER PIC X VALUE "%".
01 HEADER-YEARS.
05 FILLER PIC X(28) VALUE
- "Loan period in years: ".
05 HD-YEARS PIC ZZ9.
01 HEADER-MONTHS.
05 FILLER PIC X(28) VALUE
- "Payments per year: 12".
01 HEADER-MONTHS-2.
05 FILLER PIC X(35) VALUE
- "Scheduled number of payments: ".
05 HD-MONTHS PIC ZZZZZ9.
01 HEADER-PAYMENT-DATE.
05 FILLER PIC X(28) VALUE
- "Start date of loan: ".
05 HD-PAYMENT-DATE PIC X(20).
01 HEADER-AP.
05 FILLER PIC X(28) VALUE
- "Accelerated Payment: ".
05 HD-AP PIC $$$,$$$,$$9.99.
01 HEADER-MONTHLY-PAYMENT.
05 FILLER PIC X(28) VALUE
- "Monthly Payment: ".
05 HD-MONTHLY-PAYMENT PIC $$$,$$$,$$9.99.
05 FILLER PIC X(44) VALUE SPACES.
01 TABLE-HEADER.
05 FILLER PIC X(20) VALUE "Payment number | ".
05 FILLER PIC X(20) VALUE "Payment date | ".
05 FILLER PIC X(22) VALUE "Beginning balance | ".
05 FILLER PIC X(22) VALUE "Scheduled payment | ".
05 FILLER PIC X(18) VALUE "Extra payment | ".
05 FILLER PIC X(24) VALUE "Total payment | ".
05 FILLER PIC X(16) VALUE "Principal |".
05 FILLER PIC X(14) VALUE "Interest | ".
05 FILLER PIC X(21) VALUE "Ending balance | ".
05 FILLER PIC X(24) VALUE "Cumulative interest".
01 TABLE-ROW.
05 ROW-PAY-NUM PIC Z(4)9.
05 FILLER PIC X(9) VALUE SPACES.
05 FILLER PIC X(3) VALUE " | ".
05 ROW-PAY-DATE PIC X(10).
05 FILLER PIC X(14) VALUE " | ".
05 ROW-BEGIN-BAL PIC $$$,$$$,$$9.99.
05 FILLER PIC X(9) VALUE " | ".
05 ROW-SCHED-PMT PIC $$$,$$$9.99.
05 FILLER PIC X(12) VALUE " | ".
05 ROW-EXTRA-PMT PIC $$$,$$$9.99.
05 FILLER PIC X(12) VALUE "|".
05 ROW-TOTAL-PMT PIC $$$,$$$9.99.
05 FILLER PIC X(3) VALUE " | ".
05 ROW-PRINCIPAL PIC $$$,$$$9.99.
05 FILLER PIC X(3) VALUE " | ".
05 ROW-INTEREST PIC $$$,$$$9.99.
05 FILLER PIC X(4) VALUE " | ".
05 ROW-END-BAL PIC $$$,$$$,$$9.99.
05 FILLER PIC X(6) VALUE " | ".
05 ROW-CUM-INT PIC $$$,$$$,$$9.99.
01 FOOTER.
05 FILLER PIC X(15) VALUE "Loan summary".
01 FOOTER-LINE.
05 FILLER PIC X(44) VALUE ALL "-".
01 FOOTER-TOTALS.
05 FILLER PIC X(30) VALUE "Actual number of payments: ".
05 FT-ACTUAL-PAYMENTS PIC ZZZZZ9.
01 FOOTER-EARLY-PAYMENT.
05 FILLER PIC X(30) VALUE "Total early payments: ".
05 FT-EARLY-PAYMENTS PIC $$$,$$$,$$9.99.
01 FOOTER-INTEREST.
05 FILLER PIC X(21) VALUE "Total interest: ".
05 FT-TOTAL-INTEREST PIC $$$,$$$,$$9.99.
01 FOOTER-ROI.
05 FILLER PIC X(40)
VALUE "Total Return On Investment (ROI): ".
05 FT-ROI PIC $$$,$$$,$$9.99.
01 FOOTER-CUM-INTEREST.
05 FILLER PIC X(40) VALUE "Total cumulative interest paid: ".
05 FT-CUM-INTEREST PIC X(20).
01 html-code PIC X(400).
01 html-table-header PIC X(160) VALUE "
| Payment number
- " | Payment date | Beginning balance |
- "Scheduled payment | Extra payment | ".
01 html-table-header-2 PIC x(160) VALUE "Total payment
- " | Principal | Interest | Ending balance
- " | Cumulative interest |
|---|
".
01 HTML-TABLE-ROW.
05 FILLER PIC X(9) VALUE "
| ".
05 ROW-PAY-NUM-H PIC Z(4)9.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-PAY-DATE-H PIC X(10).
05 FILLER PIC X(10) VALUE " | ".
05 ROW-BEGIN-BAL-H PIC $$$,$$$,$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-SCHED-PMT-H PIC $$$,$$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-EXTRA-PMT-H PIC $$$,$$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-TOTAL-PMT-H PIC $$$,$$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-PRINCIPAL-H PIC $$$,$$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-INTEREST-H PIC $$$,$$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-END-BAL-H PIC $$$,$$$,$$9.99.
05 FILLER PIC X(10) VALUE " | ".
05 ROW-CUM-INT-H PIC $$$,$$$,$$9.99.
05 FILLER PIC X(10) VALUE " |
".
Linkage section.
1 parameters.
* System-inserted field for total string length of parameters
2 parameters-total-length pic 9(4) usage comp.
* Flyer format parameter - TEXT or HTML
2 parameter-values pic x(20).
2 parameter-username pic x(50).
* Parameters are passed to the program from the JCL and moved
* into "flyerformat"
PROCEDURE DIVISION using parameters.
If parameters-total-length > 0 then
* Trim the parameter
Move function trim (parameter-values) to format
MOVE function trim (parameter-username) to username
End-if
MOVE FUNCTION CURRENT-DATE(1:8) TO YYYYMMDD.
MOVE YYYYMMDD(1:4) TO YYYY.
MOVE YYYYMMDD(5:2) TO MM.
MOVE YYYYMMDD(7:2) TO DD.
PERFORM OPEN-FILES.
PERFORM READ-NEXT-RECORD.
PERFORM WRITE-HEADER.
if FORMAT = 'HTML' then
WRITE PRINT-REC FROM HTML-TABLE-HEADER
WRITE PRINT-REC FROM HTML-TABLE-HEADER-2
else
MOVE TABLE-HEADER TO PRINT-REC
WRITE PRINT-REC
end-if.
PERFORM PROCESSAMONTH
UNTIL LASTREC = "Y".
PERFORM PROCESSAMONTH.
PERFORM WRITE-FOOTER.
PERFORM CLOSE-STOP.
OPEN-FILES.
OPEN INPUT ACCT-REC.
OPEN OUTPUT PRINT-LINE.
*
READ-NEXT-RECORD.
PERFORM READ-RECORD
PERFORM WRITE-RECORD.
PROCESSAMONTH.
MOVE PAYMENT-COUNT TO ROW-PAY-NUM.
MOVE PAYMENT-DATE TO ROW-PAY-DATE.
MOVE CURRENT-PRINCIPAL TO ROW-BEGIN-BAL.
MOVE MONTHLY-PAYMENT TO ROW-SCHED-PMT.
MOVE AP TO ROW-EXTRA-PMT.
COMPUTE TOTAL-PAYMENT = MONTHLY-PAYMENT + AP.
COMPUTE TOTAL-EXTRA-PAY = TOTAL-EXTRA-PAY + AP.
MOVE TOTAL-PAYMENT TO ROW-TOTAL-PMT.
DISPLAY "Current Principal: " CURRENT-PRINCIPAL.
DISPLAY "interest rate: " INTEREST-RATE.
COMPUTE INTEREST-PORTION = CURRENT-PRINCIPAL *
- (INTEREST-RATE / 12.00).
MOVE INTEREST-PORTION TO ROW-INTEREST.
COMPUTE PRINCIPAL-PORTION =
- TOTAL-PAYMENT - INTEREST-PORTION.
MOVE PRINCIPAL-PORTION TO ROW-PRINCIPAL.
COMPUTE CUMMULATIVE-INTEREST = CUMMULATIVE-INTEREST
- + INTEREST-PORTION.
COMPUTE CURRENT-PRINCIPAL =
- CURRENT-PRINCIPAL - PRINCIPAL-PORTION.
IF CURRENT-PRINCIPAL < PRINCIPAL-PORTION
MOVE "Y" TO LASTREC
END-IF.
MOVE CURRENT-PRINCIPAL TO ROW-END-BAL.
MOVE CUMMULATIVE-INTEREST TO ROW-CUM-INT.
MOVE TABLE-ROW TO PRINT-REC.
if format = 'HTML' then
MOVE ROW-PAY-NUM TO ROW-PAY-NUM-H
MOVE ROW-PAY-DATE TO ROW-PAY-DATE-H
MOVE ROW-BEGIN-BAL TO ROW-BEGIN-BAL-H
MOVE ROW-SCHED-PMT TO ROW-SCHED-PMT-H
MOVE ROW-EXTRA-PMT TO ROW-EXTRA-PMT-H
MOVE ROW-TOTAL-PMT TO ROW-TOTAL-PMT-H
MOVE ROW-INTEREST TO ROW-INTEREST-H
MOVE ROW-PRINCIPAL TO ROW-PRINCIPAL-H
MOVE ROW-END-BAL TO ROW-END-BAL-H
MOVE ROW-CUM-INT TO ROW-CUM-INT-H
WRITE PRINT-REC FROM HTML-TABLE-ROW
else
WRITE PRINT-REC FROM TABLE-ROW
end-if.
ADD 1 TO PAYMENT-COUNT.
PERFORM UPDATE-PAYMENT-DATE.
UPDATE-PAYMENT-DATE.
COMPUTE DATE-AS-INTEGER = FUNCTION INTEGER-OF-DATE(YYYYMMDD).
ADD 30 TO DATE-AS-INTEGER.
COMPUTE YYYYMMDD = FUNCTION DATE-OF-INTEGER(DATE-AS-INTEGER).
MOVE YYYYMMDD(1:4) TO YYYY.
MOVE YYYYMMDD(5:2) TO MM.
MOVE YYYYMMDD(7:2) TO DD.
*
CLOSE-STOP.
CLOSE ACCT-REC.
CLOSE PRINT-LINE.
GOBACK.
*
READ-RECORD.
READ ACCT-REC
AT END MOVE 'Y' TO LASTREC
END-READ.
*
WRITE-RECORD.
MOVE TOTAL-RECORD-F TO TOTAL-RECORD.
UNSTRING TOTAL-RECORD
DELIMITED BY ALL ','
INTO LOAN-NAME, LOAN-AMOUNT, INTEREST-RATE, YEARS, APS
END-UNSTRING.
DIVIDE 100 INTO LOAN-AMOUNT.
DIVIDE 10000 INTO INTEREST-RATE.
COMPUTE AP = FUNCTION NUMVAL(APS).
DIVIDE 100 INTO AP.
MOVE LOAN-AMOUNT TO CURRENT-PRINCIPAL.
COMPUTE MONTHS = YEARS * 12.
DISPLAY 'Months: ' MONTHS.
COMPUTE MONTHLY-PAYMENT = LOAN-AMOUNT *
- FUNCTION ANNUITY ((INTEREST-RATE / 12), MONTHS).
MOVE MONTHLY-PAYMENT TO ORIGINAL-MONTHLY-PAYMENT.
COMPUTE ORIGINAL-TOTAL-INTEREST =
- (ORIGINAL-MONTHLY-PAYMENT * MONTHS) - LOAN-AMOUNT.
WRITE-HEADER.
MOVE LOAN-NAME TO HD-LOAN-NAME.
MOVE LOAN-AMOUNT TO HD-LOAN-AMOUNT.
MULTIPLY 100 BY INTEREST-RATE.
MOVE INTEREST-RATE TO HD-INTEREST-RATE.
DIVIDE 100 INTO INTEREST-RATE.
MOVE YEARS TO HD-YEARS.
MOVE MONTHS TO HD-MONTHS.
MOVE PAYMENT-DATE TO HD-PAYMENT-DATE.
MOVE AP TO HD-AP.
MOVE MONTHLY-PAYMENT TO HD-MONTHLY-PAYMENT.
if FORMAT = 'HTML' then
MOVE "
" TO html-code
WRITE PRINT-REC FROM html-code
end-if.
*
WRITE PRINT-REC FROM HEADER.
WRITE PRINT-REC FROM HEADER-LINE.
WRITE PRINT-REC FROM HEADER-LOAN-NAME.
WRITE PRINT-REC FROM HEADER-LOAN-AMOUNT.
WRITE PRINT-REC FROM HEADER-INTEREST-RATE.
WRITE PRINT-REC FROM HEADER-YEARS.
WRITE PRINT-REC FROM HEADER-MONTHS.
WRITE PRINT-REC FROM HEADER-MONTHS-2.
WRITE PRINT-REC FROM HEADER-PAYMENT-DATE.
WRITE PRINT-REC FROM HEADER-AP.
if format = 'HTML' then
MOVE "" TO html-code
WRITE PRINT-REC FROM html-code
MOVE "
"
- TO html-code
WRITE PRINT-REC FROM html-code
end-if.
WRITE-FOOTER.
SUBTRACT 1 FROM PAYMENT-COUNT.
if format = 'HTML' then
MOVE "
" TO html-code
WRITE PRINT-REC FROM html-code
end-if.
MOVE PAYMENT-COUNT TO FT-ACTUAL-PAYMENTS
MOVE TOTAL-EXTRA-PAY TO FT-EARLY-PAYMENTS.
MOVE CUMMULATIVE-INTEREST TO FT-TOTAL-INTEREST.
COMPUTE INTEREST-SAVED =
- ORIGINAL-TOTAL-INTEREST - CUMMULATIVE-INTEREST.
WRITE PRINT-REC FROM FOOTER.
WRITE PRINT-REC FROM FOOTER-LINE.
WRITE PRINT-REC FROM FOOTER-TOTALS.
WRITE PRINT-REC FROM FOOTER-EARLY-PAYMENT.
IF TOTAL-EXTRA-PAY > 0
COMPUTE ROI = INTEREST-SAVED / TOTAL-EXTRA-PAY
MOVE ROI TO FT-ROI
WRITE PRINT-REC FROM FOOTER-ROI
END-IF.
MOVE username TO html-code
WRITE PRINT-REC FROM html-code
MOVE FUNCTION CURRENT-DATE TO html-code
WRITE PRINT-REC FROM html-code
if format = 'HTML' then
MOVE "" TO html-code
WRITE PRINT-REC FROM html-code
end-if.
*
//JCL to run the program for MORT1
//MORTJ1 JOB 1,NOTIFY=&SYSUID
//***************************************************/
//COBRUN EXEC IGYWCL
//COBOL.SYSIN DD DSN=&SYSUID..CBL(MORTGAGE),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..LOAD(MORTGAGE),DISP=SHR
//***************************************************/
// IF RC <= 4 THEN
//***************************************************/
//RUN EXEC PGM(MORTGAGE)PARM=('HTML','&SYSUID')
//STEPLIB DD DSN=&SYSUID..LOAD,DISP=SHR
//ACCTREC DD DSN=&SYSUID..INPUT(MORTD1),DISP=SHR
//PRTLINE DD DSN=&SYSUID..D&LYYMMDD..T&LHHMMSS(1:4).,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1)),
// DCB=(RECFM=V,LRECL=404,BLKSIZE=0)
//SYSOUT DD SYSOUT=*,OUTLIM=15000
//CEEDUMP DD DUMMY
//SYSUDUMP DD DUMMY
//***************************************************/
// ELSE
// ENDIF
//JCL to run the program for MORT2
//MORTJ2 JOB 1,NOTIFY=&SYSUID
//***************************************************/
//COBRUN EXEC IGYWCL
//COBOL.SYSIN DD DSN=&SYSUID..CBL(MORTGAGE),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..LOAD(MORTGAGE),DISP=SHR
//***************************************************/
// IF RC <= 4 THEN
//***************************************************/
//RUN EXEC PGM(MORTGAGE)PARM=('HTML','&SYSUID')
//STEPLIB DD DSN=&SYSUID..LOAD,DISP=SHR
//ACCTREC DD DSN=&SYSUID..INPUT(MORTD1),DISP=SHR
//PRTLINE DD DSN=&SYSUID..D&LYYMMDD..T&LHHMMSS(1:4).,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1)),
// DCB=(RECFM=V,LRECL=404,BLKSIZE=0)
//SYSOUT DD SYSOUT=*,OUTLIM=15000
//CEEDUMP DD DUMMY
//SYSUDUMP DD DUMMY
//***************************************************/
// ELSE
// ENDIF