Master Mainframe Technologies - COBOL, JCL, DB2, VSAM, CICS & More
ABEND Codes SQLCODEs File Status Interview Prep Contact
← Back to Real-World Scenarios
Real-World Scenarios | Advanced | COBOL

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.