Delivery
CONTEXT Delivery IN ENGLISH
RELATION clientName[Client*Name] [UNI,TOT]
POPULATION clientName CONTAINS
[ ("Client_1" , "Martijn")
; ("Client_2" , "Stef")
]
RELATION clientAddress[Client*Address] [UNI,TOT]
POPULATION clientAddress CONTAINS
[ ("Client_1" , "Kerkstraat")
; ("Client_2" , "Dorpsstraat")
]
RELATION clientCity[Client*City] [UNI,TOT]
POPULATION clientCity CONTAINS
[ ("Client_1" , "Utrecht")
; ("Client_2" , "Enschede")
]
-- Vendor
RELATION vendorName[Vendor*Name] [UNI,TOT]
POPULATION vendorName CONTAINS
[ ("Vendor_1", "Rubber inc.")
; ("Vendor_2", "Mario's pizzas")
]
RELATION sells[Vendor*Product]
POPULATION sells CONTAINS
[ ("Vendor_1", "Product_1")
; ("Vendor_1", "Product_2")
; ("Vendor_1", "Product_3")
; ("Vendor_2", "Product_4")
; ("Vendor_2", "Product_5")
; ("Vendor_2", "Product_3")
]
-- Product
RELATION productName[Product*Name] [UNI,TOT]
POPULATION productName CONTAINS
[ ("Product_1", "Inner tube")
; ("Product_2", "Bouncing ball")
; ("Product_3", "Rubber chicken")
; ("Product_4", "Pizza Margherita")
; ("Product_5", "Broodje Mario")
]
RELATION productPrice[Product*Price] [UNI,TOT]
POPULATION productPrice CONTAINS
[ ("Product_1", "10,00 euro")
; ("Product_2", "0,75 euro")
; ("Product_3", "6,95 euro")
; ("Product_4", "8,50 euro")
; ("Product_5", "4,50 euro")
]
-- Order
RELATION orderTotal[Order*Price] [UNI]
RELATION orderedBy[Order*Client] [UNI,TOT]
-- POPULATION orderedBy CONTAINS [ ("Order_1", "Client_2") ]
RELATION orderedAt[Order* Vendor] [UNI,TOT]
-- POPULATION orderedAt CONTAINS [ ("Order_1", "Vendor_1") ]
RELATION orderOf[Order* Product] [TOT]
-- POPULATION orderOf CONTAINS [ ("Order_1", "Product_1") ]
-- Rules
RELATION orderAccepted[Order*Vendor] [UNI] -- an order may not be accepted by multiple vendors
-- POPULATION orderAccepted CONTAINS [ ("Order_1", "Vendor_1") ]
RELATION orderReceived[Order*Client] [UNI] -- an order may not be received by multiple clients
-- POPULATION orderReceived CONTAINS [ ("Order_1", "Client_1") ]
RULE orderInAssortment : orderOf |- orderedAt; sells
PURPOSE RULE allAccepted
{+To remind vendors of orders that are not yet accepted, we introduce a process rule.
+}
RULE allAccepted: orderedAt |- (I/\orderAccepted; orderAccepted~); orderedAt -- == TOT extended to allow hyperlinking to vendor in violation
MEANING "All orders have been accepted"
MESSAGE "Not all orders have been accepted"
VIOLATION (TGT I, TXT " has not accepted the order ",SRC I,TXT " by ", SRC orderedBy; clientName)
--RULE allPriced: orderAccepted |- (orderTotal;orderTotal~/\I ) ;orderAccepted
--MEANING "The order's total price must be calculated for each accepted order."
--MESSAGE "Not all accepted orders have been priced."
--VIOLATION (SRC I, TXT " has been accepted by ", TGT I, TXT " but hasn't been priced.")
ROLE Vendor MAINTAINS allAccepted
--ROLE OPA MAINTAINS allPriced
ROLE Client MAINTAINS dummy
RULE dummy: orderedAt |- orderedAt
-- Interfaces
INTERFACE Overview : "_SESSION"[SESSION]
BOX[ "All clients" : V[SESSION*Client]
, "All vendors" : V[SESSION*Vendor]
, "All products" : V[SESSION*Product]
, "All orders" : V[SESSION*Order]
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
]
INTERFACE Client FOR Client : I[Client]
BOX [ "Name" : clientName
, "Street" : clientAddress
, "City" : clientCity
, "All orders" : orderedBy~
BOX [ vendor :orderedAt
, product : orderOf
]
, "Orders to be accepted by provider" : orderedBy~ /\ -(V; orderAccepted~)
, "Orders pending delivery" : orderedBy~ /\ (V; orderAccepted~) /\ -orderReceived~
, "Received orders" : orderReceived~
]
INTERFACE ClientInfo FOR Vendor : I[Client]
BOX [ "Name" : clientName
, "Street" : clientAddress
, "City" : clientCity
, "All orders" : orderedBy~
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
, "Orders to be accepted by provider" : orderedBy~ /\ -(V; orderAccepted~)
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
, "Orders pending delivery" : orderedBy~ /\ (V; orderAccepted~) /\ -orderReceived~
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
, "Received orders" : orderReceived~
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
]
INTERFACE Vendor FOR Vendor: I[Vendor]
BOX [ "Name" : vendorName
, "Products" : sells
BOX [ "Name" : productName
, "Price" : productPrice
]
, "Orders to be accepted" : orderedAt~ /\ -orderAccepted~
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
, "Orders to be delivered" : orderAccepted~ /\ -(orderAccepted~;orderReceived;V)
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
, "Past orders" : orderAccepted~ /\ orderAccepted~;orderReceived;V
BOX [ product : orderOf;productName
, client : orderedBy;clientName
, vendor :orderedAt;vendorName
]
]
INTERFACE Product (productName, productPrice) FOR Vendor : I[Product]
BOX [ "Name" : productName
, "Price" : productPrice
, "Vendors" : sells~
]
INTERFACE AcceptOrderByVendor (orderAccepted) FOR Vendor : I[Order] /\ -(orderAccepted;orderAccepted~)
BOX [ "Client" : orderedBy
, "Vendor" : orderedAt
, "Product" : orderOf
, "sign here to accept" : orderAccepted
]
INTERFACE ViewOrderByVendor FOR Vendor : I[Order]
BOX [ "Client" : orderedBy
, "Vendor" : orderedAt
, "Products" : orderOf
, "sign here to accept" : orderAccepted
]
INTERFACE OrdersForClient (orderedBy, orderedAt, orderOf, orderReceived) FOR Client : I[Order]
BOX [ "Client" : orderedBy
, "Vendor" : orderedAt
, "Product" : orderOf
, "accepted by" : orderAccepted
, "sign here when received" : orderReceived
]
ENDCONTEXTAssignment
What have you learned?
Last updated