>>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. DueSubsRpt.
AUTHOR. Michael Coughlan.
*>CS4321-96-COBOL-EXAM.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
       SELECT DueSubsFile ASSIGN TO "DUESUBS.dat"
                 ORGANIZATION IS LINE SEQUENTIAL.

       SELECT WorkFile ASSIGN TO "SORT.tmp".

       SELECT DueSubsReport ASSIGN TO "DUESUBS.rpt"
                 ORGANIZATION IS LINE SEQUENTIAL.


       SELECT SortedSubsFile ASSIGN TO "SORTSUBS.dat"
                 ORGANIZATION IS LINE SEQUENTIAL.

       SELECT CountryFile ASSIGN TO "COUNTRY.dat"
                 ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD DueSubsFile.
01 DueSubsRec.
   88   EndOfDueSubsFile    VALUE HIGH-VALUES.
   02   CustomerNameDS  PIC X(22).
   02   PayMethodDS             PIC 9.
   02   PayFreqDS               PIC 9.
   02   FILLER                  PIC X(24).
   02   CountryCodeDS           PIC XX.

SD WorkFile.
01 WorkRec.
   88   EndOfWorkFile VALUE HIGH-VALUES.
   02   CustomerNameWF  PIC X(22).
   02   PayMethodWF             PIC 9.
   02   PayFreqWF               PIC 9.
   02   CountryNameWF           PIC X(25).
   02   CountryCodeWF           PIC XX.


FD DueSubsReport.
01 PrintLine                    PIC X(77).

FD SortedSubsFile.
01 SortedSubsRec.
   88   EndOfSortedSubs VALUE HIGH-VALUES.
   02   CustomerNameSS  PIC X(22).
   02   PayMethodSS             PIC 9.
        88 ByVisa         VALUE 1.
        88 ByAccess       VALUE 2.
        88 ByExpress      VALUE 3.
        88 ByCheque       VALUE 4.
   02   PayFreqSS               PIC 9.
   02   CountryNameSS           PIC X(25).
   02   CountryCodeSS           PIC XX.


FD CountryFile.
01 CountryRec.
   88   EndOfCountryFile VALUE HIGH-VALUES.
   02   CountryCodeCF           PIC XX.
   02   CountryNameCF           PIC X(25).
   02   ExchangeRateCF          PIC 9(5)V9(5).


WORKING-STORAGE SECTION.

01  MethodTable VALUE "VISA     Access   AmExpressCheque   ".
    02  PayMethodMT OCCURS 4 TIMES PIC X(9).

01  FreqTable VALUE "020100180".
    02  SubsFT OCCURS 3 TIMES PIC 9(3).

01  CountryTable.
    02  Country OCCURS 242 TIMES
                ASCENDING KEY IS CountryCodeCT
                INDEXED BY CIDX.
        03 CountryCodeCT        PIC XX.
        03 CountryNameCT        PIC X(25).
        03 ExchangeRateCT       PIC 9(5)V9(5).



01  ReportHeadingLine.
    02  FILLER PIC X(18) VALUE SPACES.
    02  FILLER PIC X(35)  VALUE "NETNEWS  DUE  SUBSCRIPTIONS  REPORT".


01  ReportUnderline.
    02  FILLER                  PIC X(17) VALUE SPACES.
    02  FILLER                  PIC X(37) VALUE ALL "-".


01  TopicHeadingLine.
    02  FILLER                  PIC X(5)  VALUE SPACES.
    02  FILLER                  PIC X(12) VALUE "COUNTRY NAME".
    02  FILLER                  PIC X(11) VALUE SPACES.
    02  FILLER                  PIC X(13) VALUE "CUSTOMER NAME".
    02  FILLER                  PIC X(8)  VALUE SPACES.
    02  FILLER                  PIC X(12) VALUE "PAY METHOD  ".
    02  FILLER                  PIC X(8)  VALUE "SUBS    ".
    02  FILLER                  PIC X(7)  VALUE "LC SUBS".


01  CustLine.
    02  PrnCountryName          PIC X(25).
    02  PrnCustName             PIC BX(22).
    02  PrnPayMethod            PIC BX(9).
    02  PrnSubs                 PIC BBB$$$9.
    02  PrnLCSubs               PIC BBZZ,ZZZ,ZZ9.

01  VisaLine.
    02  FILLER                  PIC X(41) VALUE SPACES.
    02  FILLER                  PIC X(17) VALUE "VISA      TOTAL  ".
    02  PrnVisaTotal            PIC $$$,$$9.

01  AccessLine.
    02  FILLER                  PIC X(41) VALUE SPACES.
    02  FILLER                  PIC X(17) VALUE "ACCESS    TOTAL  ".
    02  PrnAccessTotal          PIC $$$,$$9.

01  AmExLine.
    02  FILLER                  PIC X(41) VALUE SPACES.
    02  FILLER                  PIC X(17) VALUE "AMEXPRESS TOTAL  ".
    02  PrnAmExTotal            PIC $$$,$$9.

01  ChequeLine.
    02  FILLER                  PIC X(41) VALUE SPACES.
    02  FILLER                  PIC X(17) VALUE "CHEQUE    TOTAL  ".
    02  PrnChequeTotal          PIC $$$,$$9.


01  VisaTotalLine.
    02  FILLER                  PIC X(35) VALUE SPACES.
    02  FILLER                  PIC X(23) VALUE "FINAL VISA      TOTAL  ".
    02  PrnVisaFinalTotal       PIC $$,$$$,$$9.


01  AccessTotalLine.
    02  FILLER                  PIC X(35) VALUE SPACES.
    02  FILLER                  PIC X(23) VALUE "FINAL ACCESS    TOTAL  ".
    02  PrnAccessFinalTotal     PIC $$,$$$,$$9.

01  AmExTotalLine.
    02  FILLER                  PIC X(35) VALUE SPACES.
    02  FILLER                  PIC X(23) VALUE "FINAL AMEXPRESS TOTAL  ".
    02  PrnAMExFinalTotal       PIC $$,$$$,$$9.

01  ChequeTotalLine.
    02  FILLER                  PIC X(35) VALUE SPACES.
    02  FILLER                  PIC X(23) VALUE "FINAL CHEQUE    TOTAL  ".
    02  PrnChequeFinalTotal     PIC $$,$$$,$$9.


01  SubTotals.
    02 VisaTotal                PIC 9(5).
    02 AccessTotal              PIC 9(5).
    02 AmExTotal                PIC 9(5).
    02 ChequeTotal              PIC 9(5).

01  FinalTotals.
    02 VisaFinalTotal           PIC 9(7) VALUE ZEROS.
    02 AccessFinalTotal         PIC 9(7) VALUE ZEROS.
    02 AmExFinalTotal           PIC 9(7) VALUE ZEROS.
    02 ChequeFinalTotal         PIC 9(7) VALUE ZEROS.

01  PrevCountryCode             PIC XX.
01  ExchangeRate                PIC 99999V99999.
01  LCSubs                      PIC 9(5).

PROCEDURE DIVISION.
ProduceSubscriptionsReport.
    PERFORM LoadCountryTable

    SORT WorkFile ON ASCENDING CountryNameWF, CustomerNameWF
         INPUT PROCEDURE IS RestructureRecords
         GIVING SortedSubsFile

    OPEN INPUT SortedSubsFile
    OPEN OUTPUT DueSubsReport

    WRITE PrintLine FROM ReportHeadingLine AFTER ADVANCING PAGE
    WRITE PrintLine FROM ReportUnderline   AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM TopicHeadingLine  AFTER ADVANCING 3 LINES
    WRITE PrintLine FROM SPACES            AFTER ADVANCING 1 LINE

    READ SortedSubsFile
        AT END SET EndOfSortedSubs TO TRUE
    END-READ
    PERFORM PrintReportBody UNTIL EndOfSortedSubs

    PERFORM PrintFinalTotals

    CLOSE SortedSubsFile, DueSubsReport.
    STOP RUN.


LoadCountryTable.
    MOVE HIGH-VALUES TO CountryTable
    OPEN INPUT CountryFile
    READ CountryFile
        AT END SET EndOfCountryFile TO TRUE
    END-READ
    PERFORM VARYING CIDX FROM 1 BY 1 UNTIL EndOfCountryFile
        MOVE CountryRec TO Country(CIDX)
        READ CountryFile
           AT END SET EndOfCountryFile TO TRUE
        END-READ
    END-PERFORM
    CLOSE CountryFile.


RestructureRecords.
    OPEN INPUT DueSubsFile
    READ DueSubsFile
        AT END SET EndOfDueSubsFile TO TRUE
    END-READ
    PERFORM UNTIL EndOfDueSubsFile
        MOVE CustomerNameDS TO CustomerNameWF
        MOVE PayMethodDS TO PayMethodWF
        MOVE PayFreqDS TO PayFreqWF
        MOVE CountryCodeDS To CountryCodeWF
        SEARCH ALL Country
           AT END DISPLAY "Name for " CountryCodeDS " not found."
           WHEN CountryCodeCT(CIDX) = CountryCodeDS
               MOVE CountryNameCT(CIDX) TO CountryNameWF
        END-SEARCH
        RELEASE WorkRec
        READ DueSubsFile
           AT END SET EndOfDueSubsFile TO TRUE
        END-READ
    END-PERFORM
    CLOSE DueSubsFile.


PrintReportBody.
    MOVE CountryNameSS TO PrnCountryName
    MOVE CountryCodeSS TO PrevCountryCode
    SEARCH ALL Country
        AT END DISPLAY "Name for " CountryCodeSS " not found."
        WHEN CountryCodeCT(CIDX) = CountryCodeSS
        MOVE ExchangeRateCT(CIDX) TO ExchangeRate
    END-SEARCH
    MOVE ZEROS TO SubTotals

    PERFORM PrintCountryLines UNTIL
                CountryCodeSS NOT EQUAL TO PrevCountryCode
                OR EndOfSortedSubs

    MOVE VisaTotal TO PrnVisaTotal
    MOVE AccessTotal TO PrnAccessTotal
    MOVE AmExTotal TO PrnAmExTotal
    MOVE ChequeTotal TO PrnChequeTotal

    WRITE PrintLine FROM VisaLine   AFTER ADVANCING 4 LINES
    WRITE PrintLine FROM AccessLine AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM AmExLine   AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM ChequeLine AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM SPACES AFTER ADVANCING 3 LINES.



PrintCountryLines.
    MOVE CustomerNameSS TO PrnCustName
    MOVE PayMethodMT(PayMethodSS) TO PrnPayMethod
    MOVE SubsFT(PayFreqSS) TO PrnSubs
    COMPUTE PrnLCSubs ROUNDED = SubsFT(PayFreqSS) * ExchangeRate

    EVALUATE TRUE
        WHEN ByVisa ADD SubsFT(PayFreqSS) TO VisaTotal, VisaFinalTotal
        WHEN ByAccess ADD SubsFT(PayFreqSS) TO AccessTotal, AccessFinalTotal
        WHEN ByExpress ADD SubsFT(PayFreqSS) TO AmExTotal, AmExFinalTotal
        WHEN ByCheque ADD SubsFT(PayFreqSS) TO ChequeTotal, ChequeFinalTotal
    END-EVALUATE

    WRITE PrintLine FROM CustLine
        AFTER ADVANCING 1 LINE
    MOVE SPACES TO PrnCountryName

    READ SortedSubsFile
        AT END SET EndOfSortedSubs TO TRUE
    END-READ.

PrintFinalTotals.
    MOVE VisaFinalTotal TO PrnVisaFinalTotal
    MOVE AccessFinalTotal TO PrnAccessFinalTotal
    MOVE AmExFinalTotal TO PrnAmExFinalTotal
    MOVE ChequeFinalTotal TO PrnChequeFinalTotal

    WRITE PrintLine FROM VisaTotalLine   AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM AccessTotalLine AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM AmExTotalLine   AFTER ADVANCING 1 LINE
    WRITE PrintLine FROM ChequeTotalLine AFTER ADVANCING 1 LINE.