Files
MBS/WEBSERVICES/shoppingcart/server/SessionManagement.4gl
T

311 lines
7.7 KiB
Plaintext

#
# 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