55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
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 |