Order Processing System
Problem Description
Process customer orders: validate customer ID, check product availability, calculate total, apply loyalty discount, update inventory.
Expected Output
Complete order with receipt
Hints
Multiple validations, inventory update, discount logic.
Solution
IDENTIFICATION DIVISION.
PROGRAM-ID. ORDERPROC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CUSTOMERS.
05 WS-CUST OCCURS 5 TIMES.
10 WS-CUST-ID PIC 9(4).
10 WS-CUST-NAME PIC X(20).
10 WS-CUST-POINTS PIC 9(5).
01 WS-PRODUCTS.
05 WS-PROD OCCURS 5 TIMES.
10 WS-PROD-CODE PIC X(5).
10 WS-PROD-NAME PIC X(15).
10 WS-PROD-STOCK PIC 9(4).
10 WS-PROD-PRICE PIC 9(5)V99.
01 WS-ORDER-CUST PIC 9(4).
01 WS-ORDER-PROD PIC X(5).
01 WS-ORDER-QTY PIC 9(3).
01 WS-CUST-IDX PIC 9.
01 WS-PROD-IDX PIC 9.
01 WS-FOUND PIC 9.
01 WS-SUBTOTAL PIC 9(7)V99.
01 WS-DISCOUNT PIC 9(5)V99.
01 WS-FINAL PIC 9(7)V99.
01 WS-I PIC 9.
PROCEDURE DIVISION.
PERFORM INIT-DATA.
DISPLAY "=== ORDER PROCESSING ===".
DISPLAY "ENTER CUSTOMER ID: ".
ACCEPT WS-ORDER-CUST.
MOVE 0 TO WS-FOUND.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
IF WS-CUST-ID(WS-I) = WS-ORDER-CUST
MOVE WS-I TO WS-CUST-IDX
MOVE 1 TO WS-FOUND
END-IF
END-PERFORM.
IF WS-FOUND = 0
DISPLAY "INVALID CUSTOMER ID!"
STOP RUN
END-IF.
DISPLAY "WELCOME " WS-CUST-NAME(WS-CUST-IDX).
DISPLAY "LOYALTY POINTS: " WS-CUST-POINTS(WS-CUST-IDX).
DISPLAY "AVAILABLE PRODUCTS:".
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
DISPLAY WS-PROD-CODE(WS-I) " - " WS-PROD-NAME(WS-I) " - Rs." WS-PROD-PRICE(WS-I)
END-PERFORM.
DISPLAY "ENTER PRODUCT CODE: ".
ACCEPT WS-ORDER-PROD.
MOVE 0 TO WS-FOUND.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
IF WS-PROD-CODE(WS-I) = WS-ORDER-PROD
MOVE WS-I TO WS-PROD-IDX
MOVE 1 TO WS-FOUND
END-IF
END-PERFORM.
IF WS-FOUND = 0
DISPLAY "INVALID PRODUCT!"
STOP RUN
END-IF.
DISPLAY "ENTER QUANTITY: ".
ACCEPT WS-ORDER-QTY.
IF WS-ORDER-QTY > WS-PROD-STOCK(WS-PROD-IDX)
DISPLAY "INSUFFICIENT STOCK!"
STOP RUN
END-IF.
COMPUTE WS-SUBTOTAL = WS-ORDER-QTY * WS-PROD-PRICE(WS-PROD-IDX).
IF WS-CUST-POINTS(WS-CUST-IDX) >= 1000
COMPUTE WS-DISCOUNT = WS-SUBTOTAL * 0.10
DISPLAY "LOYALTY DISCOUNT (10%) APPLIED!"
ELSE
MOVE 0 TO WS-DISCOUNT
END-IF.
COMPUTE WS-FINAL = WS-SUBTOTAL - WS-DISCOUNT.
SUBTRACT WS-ORDER-QTY FROM WS-PROD-STOCK(WS-PROD-IDX).
DISPLAY "=== ORDER RECEIPT ===".
DISPLAY "CUSTOMER: " WS-CUST-NAME(WS-CUST-IDX).
DISPLAY "PRODUCT: " WS-PROD-NAME(WS-PROD-IDX).
DISPLAY "QUANTITY: " WS-ORDER-QTY.
DISPLAY "TOTAL: Rs." WS-FINAL.
STOP RUN.
INIT-DATA.
MOVE 1001 TO WS-CUST-ID(1).
MOVE "JOHN DOE" TO WS-CUST-NAME(1).
MOVE 1500 TO WS-CUST-POINTS(1).
MOVE 1002 TO WS-CUST-ID(2).
MOVE "JANE SMITH" TO WS-CUST-NAME(2).
MOVE 500 TO WS-CUST-POINTS(2).
MOVE "P001" TO WS-PROD-CODE(1).
MOVE "LAPTOP" TO WS-PROD-NAME(1).
MOVE 10 TO WS-PROD-STOCK(1).
MOVE 45000 TO WS-PROD-PRICE(1).
MOVE "P002" TO WS-PROD-CODE(2).
MOVE "PHONE" TO WS-PROD-NAME(2).
MOVE 25 TO WS-PROD-STOCK(2).
MOVE 15000 TO WS-PROD-PRICE(2).
Explanation:
Complete order workflow: customer validation, inventory check, loyalty discounts.