class Customer:
"""
Tracks the customers data (orders, table number, name, total payments,
ordered food, turn in the queue, served or not, and if he left or not),
you can get all the required data using 'customer_x.info['attribute']'
you can also add to his order using 'new_order()', serve him using 'serve()'
and sign him off using 'leave()'.
*Note: the customer might sign in and order later
"""
active_customers={}
customer_counter=1
def __init__(self, name:str, table:int, *argu, order_code:None|int=None, turn_in_queue:None|int=None):
self.name=name
self.table=table
self.ordered_food=list(argu)
self.order_code=order_code
self._total_cost=0 # protected so it can't be changed
self.turn_in_queue=turn_in_queue
self._served=False # protected so it's only true when the customer is served
self.present=True # checks if the customer left or still have the table
self.customer_id=f"{name}, id:{Customer.customer_counter}"
# to-do: make table taken
Customer.active_customers[self.id]=self
Customer.customer_counter+=1
@property
def is_served(self):
return self._served
@property
def total_cost(self): #calculates the total payments by suming each meal cost
# to-do: calculate the cost of each meal
return self._total_cost
@property
def info(self):
return {
"name": self.name,
"table": self.table,
"ordered_food": self.ordered_food,
"order_code": self.order_code,
"turn_in_queue": self.turn_in_queue,
"served": self._served,
"present": self.present
}
def serve(self):
if self.is_served: print(f"Customer {self.name} doesn't need serves!"); return
self._served=True
self.order_code=None
self.turn_in_queue=None
print(f"Customer {self.name} was served!")
def leave(self): # signs off customers and make the table empty
# to-do: make the table empty
self.present=False
del Customer.active_customers[self.id]
print(f"Customer {self.name} left!")
def new_order(self, order_code:int, turn_in_queue:int, *argu):
self.order_code=order_code
self.ordered_food.extend(argu)
self.turn_in_queue=turn_in_queue
self._served=False
print(f"Customer {self.name} ordered the next: \n{'\n'.join(str(item) for item in argu)}") # to-do: make order table with price of each meal
"""
notes: search for 'to-do:' part
in the code and customise it based
on your part
"""
Y2xhc3MgQ3VzdG9tZXI6CiAgICAiIiIKICAgIFRyYWNrcyB0aGUgY3VzdG9tZXJzIGRhdGEgKG9yZGVycywgdGFibGUgbnVtYmVyLCBuYW1lLCB0b3RhbCBwYXltZW50cywgCiAgICBvcmRlcmVkIGZvb2QsIHR1cm4gaW4gdGhlIHF1ZXVlLCBzZXJ2ZWQgb3Igbm90LCBhbmQgaWYgaGUgbGVmdCBvciBub3QpLCAKICAgIHlvdSBjYW4gZ2V0IGFsbCB0aGUgcmVxdWlyZWQgZGF0YSB1c2luZyAnY3VzdG9tZXJfeC5pbmZvWydhdHRyaWJ1dGUnXScKICAgIHlvdSBjYW4gYWxzbyBhZGQgdG8gaGlzIG9yZGVyIHVzaW5nICduZXdfb3JkZXIoKScsIHNlcnZlIGhpbSB1c2luZyAnc2VydmUoKScKICAgIGFuZCBzaWduIGhpbSBvZmYgdXNpbmcgJ2xlYXZlKCknLgogICAgKk5vdGU6IHRoZSBjdXN0b21lciBtaWdodCBzaWduIGluIGFuZCBvcmRlciBsYXRlcgogICAgIiIiCiAgICAKICAgIGFjdGl2ZV9jdXN0b21lcnM9e30KICAgIGN1c3RvbWVyX2NvdW50ZXI9MQogICAgCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZTpzdHIsIHRhYmxlOmludCwgKmFyZ3UsIG9yZGVyX2NvZGU6Tm9uZXxpbnQ9Tm9uZSwgdHVybl9pbl9xdWV1ZTpOb25lfGludD1Ob25lKToKICAgICAgICBzZWxmLm5hbWU9bmFtZQogICAgICAgIHNlbGYudGFibGU9dGFibGUKICAgICAgICBzZWxmLm9yZGVyZWRfZm9vZD1saXN0KGFyZ3UpCiAgICAgICAgc2VsZi5vcmRlcl9jb2RlPW9yZGVyX2NvZGUKICAgICAgICBzZWxmLl90b3RhbF9jb3N0PTAgICAgICAgICMgcHJvdGVjdGVkIHNvIGl0IGNhbid0IGJlIGNoYW5nZWQKICAgICAgICBzZWxmLnR1cm5faW5fcXVldWU9dHVybl9pbl9xdWV1ZQogICAgICAgIHNlbGYuX3NlcnZlZD1GYWxzZSAgICAgICAgIyBwcm90ZWN0ZWQgc28gaXQncyBvbmx5IHRydWUgd2hlbiB0aGUgY3VzdG9tZXIgaXMgc2VydmVkCiAgICAgICAgc2VsZi5wcmVzZW50PVRydWUgICAgICAgICAjIGNoZWNrcyBpZiB0aGUgY3VzdG9tZXIgbGVmdCBvciBzdGlsbCBoYXZlIHRoZSB0YWJsZSAgCiAgICAgICAgc2VsZi5jdXN0b21lcl9pZD1mIntuYW1lfSwgaWQ6e0N1c3RvbWVyLmN1c3RvbWVyX2NvdW50ZXJ9IgogICAgICAgICMgdG8tZG86IG1ha2UgdGFibGUgdGFrZW4KICAgICAgICBDdXN0b21lci5hY3RpdmVfY3VzdG9tZXJzW3NlbGYuaWRdPXNlbGYKICAgICAgICBDdXN0b21lci5jdXN0b21lcl9jb3VudGVyKz0xCiAgICAgICAgCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19zZXJ2ZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NlcnZlZAogICAgICAgIAogICAgQHByb3BlcnR5CiAgICBkZWYgdG90YWxfY29zdChzZWxmKTogICAgI2NhbGN1bGF0ZXMgdGhlIHRvdGFsIHBheW1lbnRzIGJ5IHN1bWluZyBlYWNoIG1lYWwgY29zdAogICAgICAgICMgdG8tZG86IGNhbGN1bGF0ZSB0aGUgY29zdCBvZiBlYWNoIG1lYWwKICAgICAgICByZXR1cm4gc2VsZi5fdG90YWxfY29zdAogICAgCiAgICBAcHJvcGVydHkgICAgCiAgICBkZWYgaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAibmFtZSI6IHNlbGYubmFtZSwKICAgICAgICAgICAgInRhYmxlIjogc2VsZi50YWJsZSwKICAgICAgICAgICAgIm9yZGVyZWRfZm9vZCI6IHNlbGYub3JkZXJlZF9mb29kLAogICAgICAgICAgICAib3JkZXJfY29kZSI6IHNlbGYub3JkZXJfY29kZSwKICAgICAgICAgICAgInR1cm5faW5fcXVldWUiOiBzZWxmLnR1cm5faW5fcXVldWUsCiAgICAgICAgICAgICJzZXJ2ZWQiOiBzZWxmLl9zZXJ2ZWQsCiAgICAgICAgICAgICJwcmVzZW50Ijogc2VsZi5wcmVzZW50CiAgICAgICAgfSAgICAgICAgCiAgICAKICAgIGRlZiBzZXJ2ZShzZWxmKToKICAgICAgICBpZiBzZWxmLmlzX3NlcnZlZDogcHJpbnQoZiJDdXN0b21lciB7c2VsZi5uYW1lfSBkb2Vzbid0IG5lZWQgc2VydmVzISIpOyByZXR1cm4gCiAgICAgICAgc2VsZi5fc2VydmVkPVRydWUKICAgICAgICBzZWxmLm9yZGVyX2NvZGU9Tm9uZQogICAgICAgIHNlbGYudHVybl9pbl9xdWV1ZT1Ob25lCiAgICAgICAgcHJpbnQoZiJDdXN0b21lciB7c2VsZi5uYW1lfSB3YXMgc2VydmVkISIpCiAgICAgICAgCiAgICBkZWYgbGVhdmUoc2VsZik6ICAgICAjIHNpZ25zIG9mZiBjdXN0b21lcnMgYW5kIG1ha2UgdGhlIHRhYmxlIGVtcHR5CiAgICAgICAgIyB0by1kbzogbWFrZSB0aGUgdGFibGUgZW1wdHkgCiAgICAgICAgc2VsZi5wcmVzZW50PUZhbHNlCiAgICAgICAgZGVsIEN1c3RvbWVyLmFjdGl2ZV9jdXN0b21lcnNbc2VsZi5pZF0KICAgICAgICBwcmludChmIkN1c3RvbWVyIHtzZWxmLm5hbWV9IGxlZnQhIikKICAgICAgICAKICAgIGRlZiBuZXdfb3JkZXIoc2VsZiwgb3JkZXJfY29kZTppbnQsIHR1cm5faW5fcXVldWU6aW50LCAqYXJndSk6CiAgICAgICAgc2VsZi5vcmRlcl9jb2RlPW9yZGVyX2NvZGUKICAgICAgICBzZWxmLm9yZGVyZWRfZm9vZC5leHRlbmQoYXJndSkKICAgICAgICBzZWxmLnR1cm5faW5fcXVldWU9dHVybl9pbl9xdWV1ZQogICAgICAgIHNlbGYuX3NlcnZlZD1GYWxzZQogICAgICAgIHByaW50KGYiQ3VzdG9tZXIge3NlbGYubmFtZX0gb3JkZXJlZCB0aGUgbmV4dDogXG57J1xuJy5qb2luKHN0cihpdGVtKSBmb3IgaXRlbSBpbiBhcmd1KX0iKSAjIHRvLWRvOiBtYWtlIG9yZGVyIHRhYmxlIHdpdGggcHJpY2Ugb2YgZWFjaCBtZWFsCiAgICAgICAgCgoiIiIKbm90ZXM6IHNlYXJjaCBmb3IgJ3RvLWRvOicgcGFydCAKaW4gdGhlIGNvZGUgYW5kIGN1c3RvbWlzZSBpdCBiYXNlZApvbiB5b3VyIHBhcnQKIiIi