$ SET SOURCEFORMAT"FREE"
IDENTIFICATION DIVISION.
PROGRAM-ID.  SFbyMail.
AUTHOR.  Michael Coughlan.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT BookStockFile ASSIGN TO "BookStock.DAT"
        ORGANIZATION IS INDEXED
        ACCESS MODE IS DYNAMIC
        RECORD KEY IS Book-Id-BSF
        ALTERNATE RECORD KEY IS Book-Title-BSF
        ALTERNATE RECORD KEY IS Author-Id-BSF
                  WITH DUPLICATES
        FILE STATUS IS BookStatus.

    SELECT ProcessedOrdersFile ASSIGN TO "ProcessedOrders.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

    SELECT OrdersFile ASSIGN TO "Orders.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD  BookStockFile.
01  BookStockRec.
    02  Book-Id-BSF             PIC X(5).
    02  Book-Title-BSF          PIC X(30).
    02  Author-Id-BSF           PIC 9(4).
    02  Qty-In-Stock-BSF        PIC 999.
    02  Copy-Price-BSF          PIC 99V99.

FD  ProcessedOrdersFile.
01  ProcessedOrdersRec.
    02  Order-Number-POF        PIC X(7).
    02  Customer-Id-POF         PIC X(5).
    02  Book-Title-POF          PIC X(30).
    02  Qty-Required-POF        PIC 99.
    02  Title-Cost-POF          PIC 999V99.
    02  Title-Postage-POF       PIC 99V99.

FD  OrdersFile.
01  OrdersRec.
    88 EndOfOrders              VALUE HIGH-VALUES.
    02  Order-Number            PIC X(7).
    02  Customer-Id             PIC X(5).
    02  Book-Details OCCURS 10 TIMES.
        03  Book-Id             PIC X(5).
        03  Qty-Required        PIC 99.

WORKING-STORAGE SECTION.
01  BookStatus                  PIC XX.
01  BookNum                     PIC 99.
01  Copy-Postage                PIC 99V99.
01  Cust-Address                PIC X(40).
01  UnstringPtr                 PIC 99.
    88 EndOfAddress             VALUE 41.
01  Country-Code                PIC XX.



PROCEDURE DIVISION.
Begin.
    OPEN INPUT OrdersFile.
    OPEN I-O BookStockFile.
    OPEN OUTPUT ProcessedOrdersFile.

    READ OrdersFile
        AT END SET EndOfOrders TO TRUE
    END-READ.
    PERFORM Process-Orders UNTIL EndOfOrders
    CLOSE   OrdersFile
            BookStockFile
            ProcessedOrdersFile.
    STOP RUN.


Process-Orders.
    PERFORM GetCopyPostage
    PERFORM VARYING BookNum FROM 1 BY 1
        UNTIL BookNum> 10 OR  Book-Id(BookNum) = SPACES
        MOVE Book-Id(BookNum) TO  Book-Id-BSF
        READ BookStockFile
            KEY is Book-Id-BSF
            INVALID KEY
               DISPLAY "Error in ProcessOrders1"
        END-READ
        IF Qty-Required(BookNum) > Qty-In-Stock-BSF
           MOVE ZEROS TO Qty-Required-POF
         ELSE
           SUBTRACT Qty-Required(BookNum)FROM Qty-In-Stock-BSF
           MOVE Qty-Required(BookNum) TO Qty-Required-POF
           REWRITE BookStockRec
              INVALID KEY DISPLAY "Error ProcessOrders2"
           END-REWRITE
        END-IF
        PERFORM CreateProcessedOrder
    END-PERFORM
    READ OrdersFile
        AT END SET EndOfOrders TO TRUE
    END-READ.

CreateProcessedOrder.
    MOVE Order-Number TO Order-Number-POF
    MOVE Customer-Id TO Customer-ID-POF
    MOVE Book-Title-BSF TO Book-Title-POF
    COMPUTE Title-Cost-POF = Qty-Required-POF * Copy-Price-BSF
    COMPUTE Title-Postage-POF = Qty-Required-POF * Copy-Postage
    WRITE ProcessedOrdersRec.

GetCopyPostage.
    CALL "GetCustomerAddress" USING BY CONTENT Customer-Id
                                    BY REFERENCE Cust-Address
    MOVE 1 TO UnstringPtr
    PERFORM UNTIL EndOfAddress
        UNSTRING Cust-Address
                 Delimited BY "," OR ALL SPACES
                 INTO Country-Code
                 WITH POINTER UnstringPtr
        END-UNSTRING
    END-PERFORM

    CALL "GetPostage" USING BY CONTENT Country-Code
                            BY REFERENCE Copy-Postage.