pacho_the_python

Untitled

Aug 22nd, 2022
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.85 KB | None | 0 0
  1. from project.client import Client
  2. from project.meals.meal import Meal
  3.  
  4.  
  5. class FoodOrdersApp:
  6.     def __init__(self):
  7.         self.menu = []
  8.         self.clients_list = []
  9.         self.receipt_id = 0
  10.  
  11.     def register_client(self, client_phone_number: str):
  12.         for client in self.clients_list:
  13.             if client.phone_number == client_phone_number:
  14.                 raise Exception("The client has already been registered!")
  15.         new_client = Client(client_phone_number)
  16.         self.clients_list.append(new_client)
  17.         return f"Client {client_phone_number} registered successfully."
  18.  
  19.     def add_meals_to_menu(self, *meals: Meal):
  20.         self.menu = [meal for meal in meals if meal.__class__.__name__ in ["Starter", "MainDish", "Dessert"]]
  21.  
  22.     def show_menu(self):
  23.         if len(self.menu) < 5:
  24.             raise Exception("The menu is not ready!")
  25.         result = ""
  26.         for meal in self.menu:
  27.             result += meal.details() + "\n"
  28.         return result.strip()
  29.  
  30.     def add_meals_to_shopping_cart(self, client_phone_number: str, **meal_names_and_quantities):
  31.         if len(self.menu) < 5:
  32.             raise Exception("The menu is not ready!")
  33.  
  34.         client = None
  35.         current_client = self.find_client_by_phone_num(client_phone_number)
  36.         if current_client is None:
  37.             new_client = Client(client_phone_number)
  38.             self.clients_list.append(new_client)
  39.             client = new_client
  40.         else:
  41.             client = current_client
  42.  
  43.         for meal_name, meal_quantity in meal_names_and_quantities.items():
  44.             meal = self.find_meal_by_name(meal_name)
  45.             if meal is None:
  46.                 raise Exception(f"{meal_name} is not on the menu!")
  47.             if meal.quantity < meal_quantity:
  48.                 raise Exception(f"Not enough quantity of {meal.__class__.__name__}: {meal_name}!")
  49.             client.shopping_cart.append(meal)
  50.             client.bill += meal.price * meal_quantity
  51.  
  52.         result = []
  53.         for meal in client.shopping_cart:
  54.             current_name = meal.name
  55.             result.append(current_name)
  56.         return f"Client {client_phone_number} successfully ordered {', '.join(result)} for {client.bill:.2f}lv."
  57.  
  58.     def cancel_order(self, client_phone_number: str):
  59.         client = self.find_client_by_phone_num(client_phone_number)
  60.         if len(client.shopping_cart) == 0:
  61.             raise Exception("There are no ordered meals!")
  62.  
  63.         for meal in client.shopping_cart:
  64.             current_quantity = meal.quantity
  65.             for i in range(len(self.menu)):
  66.                 if meal.name == self.menu[i].name:
  67.                     self.menu[i] += current_quantity
  68.         client.bill = 0
  69.         client.shopping_cart = []
  70.         return f"Client {client_phone_number} successfully canceled his order."
  71.  
  72.     def finish_order(self, client_phone_number: str):
  73.         client = self.find_client_by_phone_num(client_phone_number)
  74.         if len(client.shopping_cart) == 0:
  75.             raise Exception("There are no ordered meals!")
  76.         total_paid_money = client.bill
  77.         client.bill = 0
  78.         client.shopping_cart = []
  79.         self.receipt_id += 1
  80.         return f"Receipt #{self.receipt_id} with total amount of {total_paid_money:.2f} was successfully paid for " \
  81.                f"{client_phone_number}."
  82.  
  83.     def __str__(self):
  84.         result = f"Food Orders App has {len(self.menu)} meals on the menu and {len(self.clients_list)} clients."
  85.         return result
  86.  
  87.     def find_client_by_phone_num(self, phone_number):
  88.         for client in self.clients_list:
  89.             if client.phone_number == phone_number:
  90.                 return client
  91.         return None
  92.  
  93.     def find_meal_by_name(self, meal_name):
  94.         for meal in self.menu:
  95.             if meal.name == meal_name:
  96.                 return meal
  97.         return None
  98.  
Advertisement
Add Comment
Please, Sign In to add comment