from pydantic import BaseModel from datetime import datetime from typing import Optional, List class SelectedOptionInput(BaseModel): id: Optional[int] = None name: Optional[str] = None price_delta: Optional[float] = None extra_cost: Optional[float] = None class OrderItemInput(BaseModel): product_id: int quantity: int selected_options: Optional[List[SelectedOptionInput]] = None removed_ingredients: Optional[List[str]] = None notes: Optional[str] = None class AddItemsRequest(BaseModel): items: List[OrderItemInput] class ProductNameOut(BaseModel): id: int name: str model_config = {"from_attributes": True} class OrderItemOut(BaseModel): id: int order_id: int product_id: int product: Optional[ProductNameOut] = None added_by: int quantity: int unit_price: float selected_options: Optional[str] = None removed_ingredients: Optional[str] = None notes: Optional[str] = None status: str added_at: datetime printed: bool paid_by: Optional[int] = None paid_at: Optional[datetime] = None payment_method: Optional[str] = None model_config = {"from_attributes": True} class PrintResultOut(BaseModel): printer_name: str success: bool error: Optional[str] = None class AddItemsResponse(BaseModel): order: "OrderOut" print_results: List[PrintResultOut] model_config = {"from_attributes": True} class OrderCreate(BaseModel): table_id: int class PayItemsRequest(BaseModel): item_ids: List[int] payment_method: Optional[str] = None # 'cash' | 'card' | 'other' — optional for now class AssignWaiterRequest(BaseModel): waiter_id: int class OrderWaiterOut(BaseModel): waiter_id: int model_config = {"from_attributes": True} class AuditLogOut(BaseModel): id: int order_id: int event_type: str waiter_id: Optional[int] = None waiter_name: Optional[str] = None # resolved server-side item_ids: Optional[str] = None amount: Optional[float] = None payment_method: Optional[str] = None note: Optional[str] = None created_at: datetime model_config = {"from_attributes": True} class OrderOut(BaseModel): id: int table_id: int opened_by: int opened_at: datetime status: str closed_at: Optional[datetime] = None closed_by: Optional[int] = None notes: Optional[str] = None items: List[OrderItemOut] = [] waiters: List[OrderWaiterOut] = [] audit_logs: List[AuditLogOut] = [] model_config = {"from_attributes": True}