311 lines
7.7 KiB
Plaintext
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
|
|
|
|
|
|
|