from enum import Enum from sqlalchemy import Column, DateTime, Enum as SQLEnum, Float, ForeignKey, Integer, String, Text from sqlalchemy.orm import relationship from app.models.base import BaseModel, TimestampMixin class OrderStatus(str, Enum): """Enum for order statuses.""" PENDING = "pending" CONFIRMED = "confirmed" PREPARING = "preparing" READY_FOR_PICKUP = "ready_for_pickup" OUT_FOR_DELIVERY = "out_for_delivery" DELIVERED = "delivered" CANCELLED = "cancelled" class PaymentMethod(str, Enum): """Enum for payment methods.""" CREDIT_CARD = "credit_card" DEBIT_CARD = "debit_card" CASH = "cash" DIGITAL_WALLET = "digital_wallet" class PaymentStatus(str, Enum): """Enum for payment statuses.""" PENDING = "pending" PAID = "paid" FAILED = "failed" REFUNDED = "refunded" class Order(BaseModel, TimestampMixin): """Order model.""" customer_id = Column(Integer, ForeignKey("user.id"), nullable=False) restaurant_id = Column(Integer, ForeignKey("restaurant.id"), nullable=False) delivery_id = Column(Integer, ForeignKey("delivery.id"), nullable=True) status = Column(SQLEnum(OrderStatus), default=OrderStatus.PENDING, nullable=False) total_amount = Column(Float, nullable=False) delivery_address = Column(String, nullable=False) delivery_notes = Column(Text, nullable=True) payment_method = Column(SQLEnum(PaymentMethod), nullable=False) payment_status = Column(SQLEnum(PaymentStatus), default=PaymentStatus.PENDING, nullable=False) estimated_delivery_time = Column(DateTime, nullable=True) actual_delivery_time = Column(DateTime, nullable=True) # Relationships customer = relationship("User", foreign_keys=[customer_id], backref="orders") restaurant = relationship("Restaurant", backref="orders") delivery = relationship("Delivery", back_populates="order") order_items = relationship("OrderItem", back_populates="order", cascade="all, delete-orphan") def __repr__(self) -> str: return f"" class OrderItem(BaseModel, TimestampMixin): """Order item model.""" order_id = Column(Integer, ForeignKey("order.id"), nullable=False) menu_item_id = Column(Integer, ForeignKey("menuitem.id"), nullable=False) quantity = Column(Integer, nullable=False) unit_price = Column(Float, nullable=False) special_instructions = Column(Text, nullable=True) # Relationships order = relationship("Order", back_populates="order_items") menu_item = relationship("MenuItem", back_populates="order_items") def __repr__(self) -> str: return f""