# # FOURJS_START_COPYRIGHT(U,2011) # Property of Four Js* # (c) Copyright Four Js 2011, 2019. All Rights Reserved. # * Trademark of Four Js Development Tools Europe Ltd # in the United States and elsewhere # # Four Js and its suppliers do not warrant or guarantee that these samples # are accurate and suitable for your purposes. Their inclusion is purely for # information purposes only. # FOURJS_END_COPYRIGHT # IMPORT XML IMPORT COM IMPORT SECURITY GLOBALS "Types.4gl" PRIVATE DEFINE GoodsInStock DYNAMIC ARRAY OF Good PRIVATE DEFINE Sessions DYNAMIC ARRAY OF ShoppingCart # # Initialize the list of goods # # FUNCTION InitGoods() CALL GoodsInStock.appendElement() LET GoodsInStock[1].serial = 101 LET GoodsInStock[1].desc = "Air conditioners" LET GoodsInStock[1].UnitPrice = 1000.0 CALL GoodsInStock.appendElement() LET GoodsInStock[2].serial = 102 LET GoodsInStock[2].desc = "Flower decorations" LET GoodsInStock[2].UnitPrice = 4.99 CALL GoodsInStock.appendElement() LET GoodsInStock[3].serial = 103 LET GoodsInStock[3].desc = "Gloves" LET GoodsInStock[3].UnitPrice = 14.99 CALL GoodsInStock.appendElement() LET GoodsInStock[4].SERIAL = 104 LET GoodsInStock[4].desc = "Guitar" LET GoodsInStock[4].UnitPrice = 355.59 CALL GoodsInStock.appendElement() LET GoodsInStock[5].SERIAL = 105 LET GoodsInStock[5].desc = "Hammer" LET GoodsInStock[5].UnitPrice = 12.99 CALL GoodsInStock.appendElement() LET GoodsInStock[6].SERIAL = 106 LET GoodsInStock[6].desc = "Milk" LET GoodsInStock[6].UnitPrice = 2.99 CALL GoodsInStock.appendElement() LET GoodsInStock[7].SERIAL = 107 LET GoodsInStock[7].desc = "Mirror" LET GoodsInStock[7].UnitPrice = 29.99 CALL GoodsInStock.appendElement() LET GoodsInStock[8].SERIAL = 108 LET GoodsInStock[8].desc = "Mug" LET GoodsInStock[8].UnitPrice = 7.99 CALL GoodsInStock.appendElement() LET GoodsInStock[9].SERIAL = 109 LET GoodsInStock[9].desc = "Ball" LET GoodsInStock[9].UnitPrice = 3.99 CALL GoodsInStock.appendElement() LET GoodsInStock[10].SERIAL = 110 LET GoodsInStock[10].desc = "Pencils" LET GoodsInStock[10].UnitPrice = 11.99 CALL GoodsInStock.appendElement() LET GoodsInStock[11].SERIAL = 111 LET GoodsInStock[11].desc = "Watch" LET GoodsInStock[11].UnitPrice = 109.49 CALL GoodsInStock.appendElement() LET GoodsInStock[12].SERIAL = 112 LET GoodsInStock[12].desc = "Postcard" LET GoodsInStock[12].UnitPrice = 0.79 CALL GoodsInStock.appendElement() LET GoodsInStock[13].SERIAL = 113 LET GoodsInStock[13].desc = "School bag" LET GoodsInStock[13].UnitPrice = 24.99 END FUNCTION # # Returns the list of goods # FUNCTION GetGoodsList() RETURN GoodsInStock END FUNCTION # # Creates a new shopping cart # and returns an identifier # FUNCTION MgrGetSessionId(login) DEFINE login STRING DEFINE ind INTEGER FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.login == login THEN RETURN Sessions[ind].cust.id END IF END FOR RETURN MgrCreateNewSession(login) END FUNCTION # # Creates a new session # and returns the identifier # PRIVATE FUNCTION MgrCreateNewSession(login) DEFINE login STRING DEFINE ind STRING CALL Sessions.appendElement() LET ind = Sessions.getLength() LET Sessions[ind].cust.login = login LET Sessions[ind].cust.id = security.RandomGenerator.CreateUUIDString() LET Sessions[ind].cust.DATE = CURRENT RETURN Sessions[ind].cust.id END FUNCTION # # Scans all sessions and remove them if expiration date is reached # Session lifetime is 10 minutes # FUNCTION MgrRemoveExpiredSessions() DEFINE ind INTEGER DEFINE id STRING FOR ind = 1 TO Sessions.getLength() IF CURRENT > Sessions[ind].cust.DATE + INTERVAL (10) MINUTE TO MINUTE THEN LET id = Sessions[ind].cust.id CALL Sessions.deleteElement(ind) DISPLAY " Sessions "||id||" has expired" END IF END FOR END FUNCTION # # Adds given good to given session # return TRUE if added, FALSE otherwise # FUNCTION MgrAddGoodToCart(id,serial) DEFINE id STRING DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.id = id THEN CALL AddGoods(Sessions[ind].goods,serial) RETURN TRUE END IF END FOR RETURN FALSE END FUNCTION PRIVATE FUNCTION AddGoods(goods,serial) DEFINE goods DYNAMIC ARRAY OF GoodValue DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO goods.getLength() IF goods[ind].SERIAL = SERIAL THEN LET goods[ind].Qte = goods[ind].Qte + 1 RETURN END IF END FOR # New Good CALL goods.appendElement() LET ind = goods.getLength() LET goods[ind].SERIAL = SERIAL LET goods[ind].DESC = RetrieveGoodDescription(serial) LET goods[ind].Qte = 1 END FUNCTION # # Removes given good from given session # return TRUE if removed, FALSE otherwise # FUNCTION MgrRemoveGoodFromCart(id,serial) DEFINE id STRING DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.id = id THEN CALL RemoveGoods(Sessions[ind].goods,serial) RETURN TRUE END IF END FOR RETURN FALSE END FUNCTION PRIVATE FUNCTION RemoveGoods(goods,serial) DEFINE goods DYNAMIC ARRAY OF GoodValue DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO goods.getLength() IF goods[ind].SERIAL = SERIAL THEN LET goods[ind].Qte = goods[ind].Qte - 1 IF goods[ind].Qte == 0 THEN CALL goods.deleteElement(ind) END IF EXIT FOR END IF END FOR END FUNCTION # # Returns the list of goods in shopping cart # FUNCTION MgrGetGoodsInCart(id) DEFINE id STRING DEFINE ind INTEGER FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.id = id THEN RETURN TRUE,Sessions[ind].goods END IF END FOR RETURN FALSE,NULL END FUNCTION # # Removes the session of given id # Note: session is closed # FUNCTION MgrDiscardShoppingCart(id) DEFINE id STRING DEFINE ind INTEGER FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.id = id THEN CALL Sessions[ind].goods.clear() RETURN END IF END FOR END FUNCTION # # Order the cart and returns the # total price # Note: session is closed # FUNCTION MgrOrderCart(id) DEFINE id STRING DEFINE ind INTEGER DEFINE TOTAL FLOAT FOR ind = 1 TO Sessions.getLength() IF Sessions[ind].cust.id = id THEN LET TOTAL = ComputePrice(Sessions[ind].goods) CALL Sessions.deleteElement(ind) RETURN TRUE, total END IF END FOR RETURN FALSE,0 END FUNCTION # # Returns the UnitPrice of a good # PRIVATE FUNCTION RetrieveGoodUnitPrice(serial) DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO GoodsInStock.getLength() IF GoodsInStock[ind].SERIAL = SERIAL THEN RETURN GoodsInStock[ind].UnitPrice END IF END FOR RETURN 0 END FUNCTION # # Returns the Description of a good # PRIVATE FUNCTION RetrieveGoodDescription(serial) DEFINE SERIAL INTEGER DEFINE ind INTEGER FOR ind = 1 TO GoodsInStock.getLength() IF GoodsInStock[ind].SERIAL = SERIAL THEN RETURN GoodsInStock[ind].DESC END IF END FOR RETURN 0 END FUNCTION # # Computes the total price of all goods # PRIVATE FUNCTION ComputePrice(goods) DEFINE goods DYNAMIC ARRAY OF GoodValue DEFINE ind INTEGER DEFINE TOTAL FLOAT DEFINE unit FLOAT LET TOTAL = 0 FOR ind = 1 TO goods.getLength() LET unit = RetrieveGoodUnitPrice(goods[ind].SERIAL) LET TOTAL = TOTAL + unit * goods[ind].Qte END FOR RETURN TOTAL END FUNCTION