IDENTIFICATION DIVISION. PROGRAM-ID. BILLING. AUTHOR. MIKE GALLANT. * This program produces the billing statements for the Seartons Credit * Card System ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. ALPHA. OBJECT-COMPUTER. ALPHA. INPUT-OUTPUT SECTION. FILE-CONTROL. COPY "SELECT_CLIENT.LIB". COPY "SELECT_SALES.LIB". COPY "SELECT_PAYMENT.LIB". COPY "SELECT_RETURN.LIB". COPY "SELECT_SEARTON.LIB". COPY "SELECT_BRANCH.LIB". SELECT PRINTER ASSIGN TO "STATEMENT.RPT". DATA DIVISION. FILE SECTION. COPY "FD_CLIENT.LIB". COPY "FD_SALES.LIB". COPY "FD_PAYMENT.LIB". COPY "FD_RETURN.LIB". COPY "FD_SEARTON.LIB". COPY "FD_BRANCH.LIB". * Used for writing the billing statements to file FD PRINTER RECORD CONTAINS 80 CHARACTERS LABEL RECORDS OMITTED. 01 PRINT-LINE PIC X(80). WORKING-STORAGE SECTION. COPY "CLIENTREADIN.LIB". COPY "SALESREADIN.LIB". COPY "PAYMENTREADIN.LIB". COPY "RETURNREADIN.LIB". COPY "SEARTONREADIN.LIB". COPY "BRANCHREADIN.LIB". * Main Headings for Screen 01 HEADING1 PIC X(27) VALUE "SEARTONS CREDIT CARD SYSTEM". 01 HEADING2 PIC X(18) VALUE "BILLING STATEMENTS". 01 HEADING3 PIC X(19) VALUE "1) Billing Day 14th". 01 HEADING4 PIC X(19) VALUE "2) Billing Day 28th". 01 HEADING5 PIC X(07) VALUE "0) Exit". 01 HEADING6 PIC X(23) VALUE "Please enter selection:". 01 SELECTION-PROMPT PIC X(18) VALUE "Are you sure(Y/N)?". 01 PROCESSING-PROMPT PIC X(32) VALUE "Processing Billing Statements...". 01 RETURN-PROMPT PIC X(32) VALUE "Please press return to continue!". * For accepting and validating operator selection on screen 01 BILL-DATE PIC 9. 88 BILL-DATE-VALID VALUES 0 1 2. * Used to search for matching billing dates in Client file. 01 OUT-BILL-DATE PIC 9(02) VALUE ZEROES. 01 BIN-BILL-DATE PIC S9(09) COMP. COPY "WORKDATE.LIB". COPY "BILLING-STATEMENT.LIB". * Formatted fields used for writing to the Billing Statement 01 OUTPUT-FIELDS. 05 O-ACCOUNT-ID. 10 O-ACCT-PART1 PIC X(04). 10 FILLER PIC X VALUE "-". 10 O-ACCT-PART2 PIC X(06). 05 O-LANGUAGE-CODE PIC X(07). 05 O-STATUS PIC X(09). 05 O-CURRENT-BALANCE PIC $$$,$$$,$$$.99. 05 O-PAYMENT-DUE PIC $$$,$$$,$$$.99. 05 O-CREDIT-LIMIT PIC $$$,$$$,$$$.99. 05 O-CREDIT-AVAILABLE PIC $$$,$$$,$$$.99. 05 O-DATE-OF-BIRTH. 10 O-YEAR PIC 9(04). 10 FILLER PIC X VALUE "/". 10 O-MONTH PIC 9(02). 10 FILLER PIC X VALUE "/". 10 O-DAY PIC 9(02). 05 O-PHONE-NUMBER. 10 FILLER PIC X VALUE "(". 10 O-PHONE-PART1 PIC 9(03). 10 FILLER PIC X VALUE ")". 10 O-PHONE-PART2 PIC 9(03). 10 FILLER PIC X VALUE "-". 10 O-PHONE-PART3 PIC 9(04). 05 O-STATEMENT-DAY PIC 9(02). 01 SEPERATOR-LINE PIC X(80) VALUE "_____________________________________________________________________ ________". ***************************************************************************** * Search-Account-Id - Account Id entered by operator to search by on file * Search-Last-Name - Last Name String Entered by operator to search by one fi le * E-Search-Last-Name - Used to Accept Last Name String to Search on * T-Date-Of-Birth - Used to Store Birth Date of Card Holder before displaying it * E-Found-Flag - Used to accept whether Operator has found correct account on Last Name search * T-Branch-Id - Used to Store Branch ID of Transaction before displaying it o n the screen * Primary-Name - Compress Combo of Primary Card Holders First, Middle and Las t names * Line-Count - To keep track of screen position * T-To-Float - This variable is used to convert a integer to a float data typ e for screen display * All-Nines - To fill a search field with the highest possible number to forc e an End-Of-File flag when no more matches * Line-Clear - To clear a line on the screen * T-Home-Phone - Used to store Phone Number before displaying it on the scree n * Begin-Date - The Date to begin showing transactions from * Begin-Month - The month to begin showing transactions from * Begin-Day - The Day to begin showing transactions from * Prompt - Used to accept information from user * The-Due-Day - Stores the Day that the user must pay their statement by. * The-Due-Month - Stores the Month that the user must pay their statement by * The-Due-Year - Stores the Month that the user must pay their statement by * Spec-Leap-Year - Used to calculate the Leap Year * O-Location - Used to display Location that Transaction of Billing Statement was made at * The-Interest-Rate - Contains the Current Rate per Month * Yearly-Interest-Rate - Contains the Current Rate per Year * Statements Produced - Number of Billing Statements created ***************************************************************************** 01 MISC-FIELDS. 05 SEARCH-ACCOUNT-ID PIC X(10). 05 SEARCH-LAST-NAME PIC X(12) VALUE SPACES. 05 E-SEARCH-LAST-NAME PIC X(12) VALUE SPACES. 05 T-DATE-OF-BIRTH PIC 9(08). 05 E-FOUND-FLAG PIC X. 05 T-BRANCH-ID PIC X(04). 05 PRIMARY-NAME PIC X(30). 05 LINE-COUNT PIC 9(02) VALUE ZEROES. 05 T-TO-FLOAT PIC S9(09)V99. 05 ALL-NINES PIC X(24) VALUE "999999999999999999999999 ". 05 LINE-CLEAR PIC 9(02) VALUE ZEROES. 05 T-HOME-PHONE PIC 9(10). 05 BEGIN-DATE PIC X(08). 05 BEGIN-MONTH PIC 9(02). 05 BEGIN-DAY PIC 9(02). 05 PROMPT PIC X. 05 THE-DUE-DAY PIC 9(02). 05 THE-DUE-MONTH PIC 9(02). 05 THE-DUE-YEAR PIC 9(04). 05 SPEC-LEAP-YEAR PIC 9(02) VALUE ZEROS. 05 O-LOCATION PIC X(20). 05 THE-INTEREST-RATE PIC 9(08). 05 YEARLY-INTEREST-RATE PIC 9(08). 05 STATEMENTS-PRODUCED PIC 9(04) VALUE ZEROS. 01 FLAGZ. * All-purpose flag used as a DO....WHILE 05 OK-FLAG PIC X VALUE "N". 88 OKAY VALUE "Y". 88 NOT-OKAY VALUE "N". * Used to indicate that there are no more records matching current account in Pa yment file 05 PAYMENT-FLAG PIC X VALUE "N". 88 PAYMENT-DONE VALUE "Y". 88 PAYMENT-NOT-DONE VALUE "N". * Used to indicate that there are no more records matching current account in Sa les file 05 SALES-FLAG PIC X VALUE "N". 88 SALES-DONE VALUE "Y". 88 SALES-NOT-DONE VALUE "N". * Used to indicate that there are no more records matching current account in Pa yment file 05 RETURN-FLAG PIC X VALUE "N". 88 RETURN-DONE VALUE "Y". 88 RETURN-NOT-DONE VALUE "N". * Used for calculating totals on the Billing Statement 01 TOTALS. 05 PREV-MIN-PAY-DUE PIC S9(11). 05 PREV-TOTAL-PAYMENTS PIC S9(11). 05 PREV-TOTAL-PURCHASES PIC S9(11). 05 PAST-DUE-AMT PIC S9(11). 05 MINIMUM-PAYMENT PIC S9(11). 05 CURRENT-PAYMENT PIC S9(11). 05 NEW-CURR-BALANCE PIC S9(11). 05 THE-INTEREST-OWED PIC S9(11). 05 OLD-BALANCE PIC S9(11). 05 AMT-OVERLIMIT PIC S9(11). 05 MIN-PAYMENT-ALLOWED PIC S9(11). 05 THE-ACTUAL-LIMIT PIC S9(11). 05 THE-CREDIT-LIMIT PIC 9(11). 05 ALL-ZEROS PIC 9(11) VALUE ZEROES. * These are floating point values for use on Billing Statement to show amounts w ith dollars and cents 01 DISPLAY-TOTALS. 05 STOTAL-PAYMENTS PIC S9(09)V99. 05 STOTAL-PURCHASES PIC S9(09)V99. 05 STOTAL-RETURNS PIC S9(09)V99. 05 SCURRENT-PAYMENT PIC S9(09)V99. 05 SNEW-CURR-BALANCE PIC S9(09)V99. 05 SPAST-DUE-AMT PIC S9(09)V99. 05 SINTEREST-OWED PIC S9(09)V99. 05 SMINIMUM-PAYMENT PIC S9(09)V99. 05 SPREV-BALANCE PIC S9(09)V99. 05 SACTUAL-LIMIT PIC S9(09)V99. 05 SINTEREST-RATE PIC S9(09)V99. 05 SPAST-DUE PIC S9(09)V99. 05 SOUT-OVERLIMIT PIC S9(09)V99. * Used to search files for transactions matching current Account being processed 01 SEARCH-KEYZ. 05 SALES-SEARCH-KEY PIC X(24). 05 PAYMENT-SEARCH-KEY PIC X(24). 05 RETURN-SEARCH-KEY PIC X(24). * Used to write detail lines to Billing Statement 01 BILLING-OUTPUT. 05 FILLER PIC X(05). 05 O-TRANS-DATE. 10 O-TRANS-YEAR PIC X(04). 10 FILLER PIC X VALUE "/". 10 O-TRANS-MONTH PIC X(02). 10 FILLER PIC X VALUE "/". 10 O-TRANS-DAY PIC X(02). 10 FILLER PIC X(02) VALUE SPACES. 10 O-TRANS-HOUR PIC X(02). 10 FILLER PIC X VALUE ":". 10 O-TRANS-MINUTE PIC X(02). 10 FILLER PIC X(11) VALUE SPACES. 05 O-TRANS-DESC PIC X(25). 05 FILLER PIC X(07) VALUE SPACES. 05 O-TRANS-AMT PIC $$$,$$$,$$9.99-. PROCEDURE DIVISION. MAINLINE. PERFORM INITIALIZATION. PERFORM MAIN-PROGRAM UNTIL NOT-OKAY. PERFORM TERMINATION. STOP RUN. INITIALIZATION. MOVE ZEROES TO STATEMENTS-PRODUCED. MOVE "N" TO PAYMENT-FLAG, SALES-FLAG, RETURN-FLAG. COPY "INITDATE.LIB". MOVE "N" TO OK-FLAG. DISPLAY SPACES LINE 1 ERASE TO END OF SCREEN. COPY "INITDATE.LIB". PERFORM GET-TIME-DATE. OPEN INPUT PAYMENT-FILE SALES-FILE RETURN-FILE. OPEN OUTPUT PRINTER. OPEN I-O CLIENT-FILE. DISPLAY HEADING1 LINE 3 COLUMN 28. DISPLAY HEADING2 LINE 5 COLUMN 32. DISPLAY HEADING3 LINE 7 COLUMN 28. DISPLAY HEADING4 LINE 9 COLUMN 28. DISPLAY HEADING5 LINE 11 COLUMN 28. DISPLAY HEADING6 LINE 13 COLUMN 28. PERFORM GET-BILL-DATE UNTIL BILL-DATE = 9. * Get user to enter what billing date they want to process GET-BILL-DATE. MOVE "N" TO OK-FLAG ACCEPT BILL-DATE LINE 13 COLUMN 52 PROTECTED WITH CONVERSION. EVALUATE BILL-DATE WHEN 1 MOVE 14 TO OUT-BILL-DATE WHEN 2 MOVE 28 TO OUT-BILL-DATE WHEN OTHER MOVE ZEROES TO OUT-BILL-DATE MOVE 9 TO BILL-DATE END-EVALUATE. * Get Confirmation to produce Billing Statements from Operator IF OUT-BILL-DATE NOT EQUAL ZEROES DISPLAY SELECTION-PROMPT LINE 15 COLUMN 26 ACCEPT PROMPT LINE 15 COLUMN 46 PROTECTED MOVE FUNCTION UPPER-CASE(PROMPT) TO PROMPT EVALUATE PROMPT WHEN "Y" MOVE "Y" TO OK-FLAG MOVE 9 TO BILL-DATE WHEN "E" MOVE 9 TO BILL-DATE WHEN OTHER MOVE ZEROES TO BILL-DATE END-EVALUATE ELSE MOVE 9 TO BILL-DATE END-IF. MAIN-PROGRAM. DISPLAY "Processing......Please Wait" LINE 15 COLUMN 26. PERFORM GET-INTEREST-RATE. * To convert Billing Date entered by user to Binary MOVE OUT-BILL-DATE TO STATEMENT-DAY. MOVE OUT-BILL-DATE TO BIN-BILL-DATE. MOVE BIN-BILL-DATE TO IDX-STATEMENT-DAY. * Search Client File for first record matching billing date entered READ CLIENT-FILE INTO CLIENT-READ-IN KEY IS IDX-STATEMENT-DAY * If no Accounts for billing date entered, Display message INVALID KEY DISPLAY "Report Processing Cancelled" LINE 23 COLUMN 27 ACCEPT PROMPT LINE 1 COLUMN 1 PROTECTED * If match found, see if they have any transactions NOT INVALID KEY PERFORM CHECK-FOR-TRANSACTIONS END-READ. PERFORM READ-NEXT-RECORD UNTIL NOT-OKAY. DISPLAY "Done!.....Number of Statements Produced: " LINE 17 COLUMN 18. DISPLAY STATEMENTS-PRODUCED LINE 17 COLUMN 59. READ-NEXT-RECORD. READ CLIENT-FILE NEXT INTO CLIENT-READ-IN AT END MOVE "N" TO OK-FLAG. MOVE STATEMENT-DAY TO O-STATEMENT-DAY. IF O-STATEMENT-DAY NOT EQUAL OUT-BILL-DATE THEN MOVE "N" TO OK-FLAG. IF OKAY THEN PERFORM CHECK-FOR-TRANSACTIONS. GET-INTEREST-RATE. OPEN INPUT SEARTONS-WORK. READ SEARTONS-WORK INTO SEARTON-READ-IN AT END CONTINUE. MOVE INT-RATE TO THE-INTEREST-RATE. MOVE THE-INTEREST-RATE TO YEARLY-INTEREST-RATE. COMPUTE THE-INTEREST-RATE = (THE-INTEREST-RATE / 12). CLOSE SEARTONS-WORK. * To check Account for Activity -- Why print a Billing Statement for an Account with no activity CHECK-FOR-TRANSACTIONS. MOVE SYS-DATE TO BEGIN-DATE. MOVE STATEMENT-DAY TO O-STATEMENT-DAY. MOVE O-STATEMENT-DAY TO BEGIN-DAY. MOVE BEGIN-DATE(5:2) TO BEGIN-MONTH. IF SYS-DATE(7:2) < BEGIN-DAY THEN SUBTRACT 1 FROM BEGIN-MONTH. IF BEGIN-MONTH = ZEROES THEN MOVE 12 TO BEGIN-MONTH. MOVE BEGIN-MONTH TO BEGIN-DATE(5:2). MOVE BEGIN-DAY TO BEGIN-DATE(7:2). MOVE ACCOUNT-ID TO IDX-SALES, IDX-PAYMENT, IDX-RETURN. MOVE BEGIN-DATE TO IDX-SALES(11:8), IDX-PAYMENT(11:8), IDX-RETURN(11:8). MOVE ZEROES TO IDX-SALES(19:6), IDX-PAYMENT(19:6), IDX-RETURN(19:6). * Calculate interest, Minimum Payment Due, OverDue Payment, etc. PERFORM DO-CALCULATIONS. * If no transactions for current billing cycle, skip printing of statement IF PREV-TOTAL-PURCHASES = ZEROES AND PREV-TOTAL-PAYMENTS = ZEROES THEN CONTINUE ELSE ADD 1 TO STATEMENTS-PRODUCED * Move Calculated fields to Print-Line fields PERFORM MOVE-CALCULATIONS-TO-STATEMENT PERFORM PRINT-TOP-OF-FORM MOVE "N" TO PAYMENT-FLAG, SALES-FLAG, RETURN-FLAG PERFORM SEARCH-SALES-FILE PERFORM SEARCH-PAYMENT-FILE PERFORM SEARCH-RETURN-FILE * Write all transactions for account since the last statement date PERFORM PRINT-TRANSACTIONS UNTIL PAYMENT-DONE AND SALES-DONE AND RETURN- DONE PERFORM PRINT-BOTTOM-OF-FORM PERFORM UPDATE-CLIENT-FILE END-IF. DO-CALCULATIONS. MOVE CREDIT-LIMIT TO THE-CREDIT-LIMIT. MOVE ACTUAL-CRD-LIMIT TO THE-ACTUAL-LIMIT. MOVE MIN-PAY-DUE TO PREV-MIN-PAY-DUE. MOVE TOTAL-PAYMENTS TO PREV-TOTAL-PAYMENTS. MOVE TOTAL-PURCHASES TO PREV-TOTAL-PURCHASES. MOVE PREV-BALANCE TO OLD-BALANCE. COMPUTE PAST-DUE-AMT = (PREV-MIN-PAY-DUE - PREV-TOTAL-PAYMENTS). IF PAST-DUE-AMT < 1 THEN MOVE ZEROES TO PAST-DUE-AMT. COMPUTE THE-INTEREST-OWED = ((OLD-BALANCE + PREV-TOTAL-PURCHASES - PREV-TOTA L-PAYMENTS) * (THE-INTEREST-RATE / 10000)). COMPUTE NEW-CURR-BALANCE = (THE-INTEREST-OWED + OLD-BALANCE + PREV-TOTAL-PUR CHASES - PREV-TOTAL-PAYMENTS). COMPUTE AMT-OVERLIMIT = NEW-CURR-BALANCE - (THE-CREDIT-LIMIT * 100). IF AMT-OVERLIMIT < 1 THEN MOVE ZEROES TO AMT-OVERLIMIT. MOVE 1000 TO MIN-PAYMENT-ALLOWED. COMPUTE CURRENT-PAYMENT = (NEW-CURR-BALANCE * 0.1). IF CURRENT-PAYMENT < MIN-PAYMENT-ALLOWED AND NEW-CURR-BALANCE > 1000 THEN MOVE MIN-PAYMENT-ALLOWED TO CURRENT-PAYMENT. IF NEW-CURR-BALANCE < 1000 THEN MOVE NEW-CURR-BALANCE TO CURRENT-PAYMENT. IF NEW-CURR-BALANCE < 1 THEN MOVE ZEROES TO CURRENT-PAYMENT. COMPUTE MINIMUM-PAYMENT = (CURRENT-PAYMENT + AMT-OVERLIMIT + PAST-DUE-AMT). SUBTRACT THE-INTEREST-OWED FROM THE-ACTUAL-LIMIT. IF THE-ACTUAL-LIMIT < 0 THEN MOVE ZEROES TO THE-ACTUAL-LIMIT. PERFORM SETUP-OUTPUT-FIELDS. * Converts fields to floating point for writing to Billing Statement SETUP-OUTPUT-FIELDS. IF PREV-TOTAL-PURCHASES < 0 THEN COMPUTE STOTAL-PURCHASES = ((PREV-TOTAL-PURCHASES / 100) - 0.004) ELSE COMPUTE STOTAL-PURCHASES = ((PREV-TOTAL-PURCHASES / 100) + 0.004) END-IF. IF PREV-TOTAL-PAYMENTS < 0 THEN COMPUTE STOTAL-PAYMENTS = ((PREV-TOTAL-PAYMENTS / 100) - 0.004) ELSE COMPUTE STOTAL-PAYMENTS = ((PREV-TOTAL-PAYMENTS / 100) + 0.004) END-IF. IF CURRENT-PAYMENT < 0 THEN COMPUTE SCURRENT-PAYMENT = ((CURRENT-PAYMENT / 100) - 0.004) ELSE COMPUTE SCURRENT-PAYMENT = ((CURRENT-PAYMENT / 100) + 0.004) END-IF. IF NEW-CURR-BALANCE < 0 THEN COMPUTE SNEW-CURR-BALANCE = ((NEW-CURR-BALANCE /100) - 0.004) ELSE COMPUTE SNEW-CURR-BALANCE = ((NEW-CURR-BALANCE /100) + 0.004) END-IF. COMPUTE SPAST-DUE-AMT = ((PAST-DUE-AMT / 100) + 0.004) IF THE-INTEREST-OWED < 0 THEN COMPUTE SINTEREST-OWED = ((THE-INTEREST-OWED / 100) - 0.004) ELSE COMPUTE SINTEREST-OWED = ((THE-INTEREST-OWED / 100) + 0.004) END-IF. IF MINIMUM-PAYMENT < 0 THEN COMPUTE SMINIMUM-PAYMENT = ((MINIMUM-PAYMENT / 100) - 0.004) ELSE COMPUTE SMINIMUM-PAYMENT = ((MINIMUM-PAYMENT / 100) + 0.004) END-IF. IF OLD-BALANCE < 0 THEN COMPUTE SPREV-BALANCE = ((OLD-BALANCE / 100) - 0.004) ELSE COMPUTE SPREV-BALANCE = ((OLD-BALANCE / 100) + 0.004) END-IF. COMPUTE SACTUAL-LIMIT = ((THE-ACTUAL-LIMIT / 100) + 0.004). COMPUTE SINTEREST-RATE = ((YEARLY-INTEREST-RATE / 100) + 0.004). COMPUTE SOUT-OVERLIMIT = ((AMT-OVERLIMIT / 100) + 0.004). * Move all fields to Billing Statement Template MOVE-CALCULATIONS-TO-STATEMENT. MOVE SOUT-OVERLIMIT TO OUT-OVERLIMIT. MOVE SPAST-DUE-AMT TO OUT-PAST-DUE. MOVE SCURRENT-PAYMENT TO OUT-CURRENT-DUE. MOVE SMINIMUM-PAYMENT TO OUT-MIN-PAYMENT-DUE, O-MIN-PAY-DUE. PERFORM GET-DUE-DATE. MOVE OUT-BILL-DATE TO OUT-STATEMENT-DAY, BILL-DAY. MOVE SYS-MONTH TO OUT-STATEMENT-MONTH, BILL-MONTH. MOVE SYS-YEAR TO OUT-STATEMENT-YEAR, BILL-YEAR. MOVE ACCOUNT-ID(1:4) TO ACCT-1, OUT-ACCT1. MOVE ACCOUNT-ID(5:6) TO ACCT-2, OUT-ACCT2. MOVE "800" TO OUT-AREA-CODE. MOVE "SEA" TO OUT-EXCHANGE. MOVE "RTON" TO OUT-NUMBER. MOVE STOTAL-PURCHASES TO OUT-CREDIT-CHARGES. MOVE STOTAL-PAYMENTS TO OUT-TOTAL-PAYMENTS. MOVE SINTEREST-OWED TO OUT-TOTAL-INTEREST. MOVE SNEW-CURR-BALANCE TO OUT-NEW-BALANCE. MOVE SINTEREST-RATE TO OUT-INTEREST-RATE. MOVE THE-CREDIT-LIMIT TO OUT-CREDIT-LIMIT. MOVE SACTUAL-LIMIT TO OUT-CREDIT-AVAILABLE. MOVE SPREV-BALANCE TO OUT-PREV-BALANCE. MOVE SPACES TO CARD-HOLDERS. MOVE SPACES TO CARD-ADDRESS. IF SECOND-LAST-NAME NOT EQUAL SPACES THEN STRING PRIMARY-FIRST-NAME DELIMITED BY " " " " DELIMITED BY SIZE PRIMARY-LAST-NAME DELIMITED BY SPACE " & " DELIMITED BY SIZE SECOND-FIRST-NAME DELIMITED BY SPACE " " DELIMITED BY SIZE SECOND-LAST-NAME DELIMITED BY SPACE INTO CARD-HOLDERS ELSE STRING PRIMARY-FIRST-NAME DELIMITED BY " " " " DELIMITED BY SIZE PRIMARY-LAST-NAME DELIMITED BY SPACE INTO CARD-HOLDERS END-IF. MOVE STREET TO CARD-STREET. STRING CITY DELIMITED BY ' ' " " DELIMITED BY SIZE PROVINCE DELIMITED BY SIZE " " DELIMITED BY SIZE POSTAL-CODE DELIMITED BY SIZE INTO CARD-ADDRESS. UPDATE-CLIENT-FILE. MOVE MINIMUM-PAYMENT TO MIN-PAY-DUE. MOVE ALL-ZEROS TO TOTAL-PAYMENTS. MOVE ALL-ZEROS TO TOTAL-PURCHASES. MOVE NEW-CURR-BALANCE TO PREV-BALANCE. MOVE THE-INTEREST-OWED TO INTEREST-OWED. REWRITE CLIENT-KEYS FROM CLIENT-READ-IN INVALID KEY DISPLAY "UPDATE NOT MADE -- Processing Cancelled". * To show Transactions for the current Billing Cycle on the Billing Statement PRINT-TRANSACTIONS. MOVE 19 TO LINE-COUNT. IF SALES-SEARCH-KEY < PAYMENT-SEARCH-KEY AND SALES-SEARCH-KEY < RETURN-SEARC H-KEY AND SALES-NOT-DONE THEN PERFORM MOVE-SALES-TO-OUTPUT PERFORM SEARCH-SALES-FILE ELSE IF PAYMENT-SEARCH-KEY < RETURN-SEARCH-KEY AND PAYMENT-NOT-DONE PERFORM MOVE-PAYMENT-TO-OUTPUT PERFORM SEARCH-PAYMENT-FILE ELSE IF RETURN-NOT-DONE PERFORM MOVE-RETURN-TO-OUTPUT PERFORM SEARCH-RETURN-FILE END-IF END-IF END-IF. COPY "SEARCH-TRANS-FILES.LIB". MOVE-SALES-TO-OUTPUT. PERFORM CHECK-PAGE-BREAK. MOVE SALES-SEARCH-KEY(11:4) TO O-TRANS-YEAR. MOVE SALES-SEARCH-KEY(15:2) TO O-TRANS-MONTH. MOVE SALES-SEARCH-KEY(17:2) TO O-TRANS-DAY. MOVE SALES-SEARCH-KEY(19:2) TO O-TRANS-HOUR. MOVE SALES-SEARCH-KEY(21:2) TO O-TRANS-MINUTE. MOVE S-BRANCH-ID TO T-BRANCH-ID. PERFORM SEARCH-FOR-BRANCH. STRING "Sale " DELIMITED BY SIZE, O-LOCATION DELIMITED BY SIZE INTO O-TRANS-DESC. MOVE PURCHASE-AMT TO T-TO-FLOAT. COMPUTE T-TO-FLOAT = (T-TO-FLOAT / 100). MOVE T-TO-FLOAT TO O-TRANS-AMT. WRITE PRINT-LINE FROM BILLING-OUTPUT AFTER ADVANCING 1 LINE. MOVE-PAYMENT-TO-OUTPUT. PERFORM CHECK-PAGE-BREAK. MOVE PAYMENT-SEARCH-KEY(11:4) TO O-TRANS-YEAR. MOVE PAYMENT-SEARCH-KEY(15:2) TO O-TRANS-MONTH. MOVE PAYMENT-SEARCH-KEY(17:2) TO O-TRANS-DAY. MOVE PAYMENT-SEARCH-KEY(19:2) TO O-TRANS-HOUR. MOVE PAYMENT-SEARCH-KEY(21:2) TO O-TRANS-MINUTE. MOVE P-BRANCH-ID TO T-BRANCH-ID. PERFORM SEARCH-FOR-BRANCH. STRING "Payment " DELIMITED BY SIZE, O-LOCATION DELIMITED BY SIZE INTO O-TRANS-DESC. MOVE PAYMENT-AMT TO T-TO-FLOAT. COMPUTE T-TO-FLOAT = (T-TO-FLOAT / 100). COMPUTE T-TO-FLOAT = T-TO-FLOAT - (T-TO-FLOAT * 2). MOVE T-TO-FLOAT TO O-TRANS-AMT. WRITE PRINT-LINE FROM BILLING-OUTPUT AFTER ADVANCING 1 LINE. MOVE-RETURN-TO-OUTPUT. PERFORM CHECK-PAGE-BREAK. MOVE RETURN-SEARCH-KEY(11:4) TO O-TRANS-YEAR. MOVE RETURN-SEARCH-KEY(15:2) TO O-TRANS-MONTH. MOVE RETURN-SEARCH-KEY(17:2) TO O-TRANS-DAY. MOVE RETURN-SEARCH-KEY(19:2) TO O-TRANS-HOUR. MOVE RETURN-SEARCH-KEY(21:2) TO O-TRANS-MINUTE. MOVE R-BRANCH-ID TO T-BRANCH-ID. PERFORM SEARCH-FOR-BRANCH. STRING "Return " DELIMITED BY SIZE, O-LOCATION DELIMITED BY SIZE INTO O-TRANS-DESC. MOVE RETURN-AMT TO T-TO-FLOAT. COMPUTE T-TO-FLOAT = ((T-TO-FLOAT / 100) + 0.004). COMPUTE T-TO-FLOAT = T-TO-FLOAT - (T-TO-FLOAT * 2). MOVE T-TO-FLOAT TO O-TRANS-AMT. WRITE PRINT-LINE FROM BILLING-OUTPUT AFTER ADVANCING 1 LINE. COPY "SEARCHBRANCH.LIB". CHECK-PAGE-BREAK. ADD 1 TO LINE-COUNT. IF LINE-COUNT > 30 THEN PERFORM PRINT-BOTTOM-OF-FORM PERFORM PRINT-TOP-OF-FORM MOVE 19 TO LINE-COUNT END-IF. PRINT-TOP-OF-FORM. WRITE PRINT-LINE FROM BILLING-LINE1 AFTER ADVANCING PAGE. WRITE PRINT-LINE FROM BILLING-LINE2 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE3 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE4 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE5 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE6 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE7 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE8 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE9 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE10 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE11 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE12 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE13 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE14 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE15 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE16 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE17 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM SEPERATOR-LINE AFTER ADVANCING 2 LINES. WRITE PRINT-LINE FROM BILLING-LINE18 AFTER ADVANCING 2 LINES. WRITE PRINT-LINE FROM BILLING-LINE19 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE20 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE21 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE22 AFTER ADVANCING 2 LINES. WRITE PRINT-LINE FROM BILLING-LINE23 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE24 AFTER ADVANCING 1 LINE. PRINT-BOTTOM-OF-FORM. WRITE PRINT-LINE FROM BILLING-LINE25 AFTER ADVANCING 2 LINES. WRITE PRINT-LINE FROM BILLING-LINE26 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE27 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE28 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE29 AFTER ADVANCING 2 LINES. WRITE PRINT-LINE FROM BILLING-LINE30 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE31 AFTER ADVANCING 1 LINE. WRITE PRINT-LINE FROM BILLING-LINE32 AFTER ADVANCING 1 LINE. COPY "TIMEDATE.LIB". GET-DUE-DATE. MOVE SYS-YEAR TO THE-DUE-YEAR. MOVE SYS-MONTH TO THE-DUE-MONTH. MOVE OUT-BILL-DATE TO THE-DUE-DAY. EVALUATE THE-DUE-MONTH WHEN 01 PERFORM SET-30-DAYS WHEN 02 PERFORM SET-Q-DAYS WHEN 03 PERFORM SET-31-DAYS WHEN 04 PERFORM SET-30-DAYS WHEN 05 PERFORM SET-31-DAYS WHEN 06 PERFORM SET-30-DAYS WHEN 07 PERFORM SET-31-DAYS WHEN 08 PERFORM SET-31-DAYS WHEN 09 PERFORM SET-30-DAYS WHEN 10 PERFORM SET-31-DAYS WHEN 11 PERFORM SET-30-DAYS WHEN 12 PERFORM SET-31-DAYS END-EVALUATE. MOVE THE-DUE-YEAR TO YEAR-DUE, OUT-PAYMENT-YEAR. MOVE THE-DUE-MONTH TO MONTH-DUE, OUT-PAYMENT-MONTH. MOVE THE-DUE-DAY TO DAY-DUE, OUT-PAYMENT-DAY. SET-Q-DAYS. COMPUTE SPEC-LEAP-YEAR = (FUNCTION MOD (THE-DUE-YEAR - 1600, 4)). IF SPEC-LEAP-YEAR NOT EQUAL ZERO THEN PERFORM CHECK-28-DAYS ELSE PERFORM CHECK-29-DAYS END-IF. CHECK-28-DAYS. COMPUTE THE-DUE-DAY = THE-DUE-DAY + 15. IF THE-DUE-DAY > 28 THEN MOVE 15 TO THE-DUE-DAY ADD 1 TO THE-DUE-MONTH IF THE-DUE-MONTH > 12 THEN ADD 1 TO THE-DUE-YEAR MOVE 1 TO THE-DUE-MONTH END-IF END-IF. CHECK-29-DAYS. COMPUTE THE-DUE-DAY = THE-DUE-DAY + 15. IF THE-DUE-DAY > 29 THEN MOVE 15 TO THE-DUE-DAY ADD 1 TO THE-DUE-MONTH IF THE-DUE-MONTH > 12 THEN ADD 1 TO THE-DUE-YEAR MOVE 1 TO THE-DUE-MONTH END-IF END-IF. SET-31-DAYS. COMPUTE THE-DUE-DAY = THE-DUE-DAY + 15. IF THE-DUE-DAY > 31 THEN MOVE 15 TO THE-DUE-DAY ADD 1 TO THE-DUE-MONTH IF THE-DUE-MONTH > 12 THEN ADD 1 TO THE-DUE-YEAR MOVE 1 TO THE-DUE-MONTH END-IF END-IF. SET-30-DAYS. COMPUTE THE-DUE-DAY = THE-DUE-DAY + 15. IF THE-DUE-DAY > 30 THEN MOVE 15 TO THE-DUE-DAY ADD 1 TO THE-DUE-MONTH IF THE-DUE-MONTH > 12 THEN ADD 1 TO THE-DUE-YEAR MOVE 1 TO THE-DUE-MONTH END-IF END-IF. TERMINATION. DISPLAY SPACES LINE 23 ERASE TO END OF LINE. DISPLAY "" LINE 23 COLUMN 30. ACCEPT OK-FLAG LINE 23 COLUMN 50. CLOSE CLIENT-FILE PAYMENT-FILE SALES-FILE RETURN-FILE PRINTER.