from dataclasses import dataclass from datetime import datetime from typing import Optional from domain.entities.dish import Dish @dataclass class Order: id: int customer_id: int restaurant_id: int restaurant_name: str dishes: list[Dish] delivery_address: str created_at: Optional[datetime] = datetime.now() delivery_at: Optional[datetime] = None def amount(self): return sum(dish.price for dish in self.dishes) def is_late(self): if self.delivery_at is None: return False deadline = order.created_at + timedelta(minutes= self.DELIVERY_DELAY_MINUTES) #type: ignore return datetime.now() > deadline def status(self): if self.delivery_at: return "Delivered" elif self.is_late(): return "Late" else: return "In delivery progress..." def urgency_level(self, delivery_delay, warning_threshold): if self.delivery_at: return "Delivered" minutes = (datetime.now() - order.created_at).total_seconds() / 60 #type: ignore if minutes > delivery_delay: return "severe_delay" elif minutes > warning_threshold: return "light_delay" return "normal" @dataclass class OrderWithStatus: order_id: int restaurant_name: str total_amount: float is_late: bool free_delivery: bool is_premium_customer: bool status: str urgency_level: str # normal, light_delay, severe_delay, delivered