Register all active platform services and base features in core DB so admin can manage them, add delivery/hospitality/sports-center backend phases, update apps catalog and production deploy tooling. Co-authored-by: Cursor <cursoragent@cursor.com>
166 lines
4.0 KiB
Python
166 lines
4.0 KiB
Python
"""QR Menu & QR Ordering DTOs — Phase 12.2."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from app.models.types import (
|
|
CartStatus,
|
|
LifecycleStatus,
|
|
OrderingSessionStatus,
|
|
QrSessionStatus,
|
|
QrTargetType,
|
|
)
|
|
from app.schemas.common import ORMBase
|
|
|
|
|
|
class QrCodeCreate(BaseModel):
|
|
venue_id: UUID
|
|
code: str = Field(max_length=50)
|
|
name: str = Field(max_length=255)
|
|
description: str | None = None
|
|
status: LifecycleStatus = LifecycleStatus.ACTIVE
|
|
target_type: QrTargetType = QrTargetType.MENU
|
|
menu_id: UUID | None = None
|
|
dining_area_id: UUID | None = None
|
|
table_id: UUID | None = None
|
|
ordering_enabled: bool = False
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class QrCodeRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
venue_id: UUID
|
|
code: str
|
|
token: str
|
|
name: str
|
|
description: str | None
|
|
status: LifecycleStatus
|
|
target_type: QrTargetType
|
|
menu_id: UUID | None
|
|
dining_area_id: UUID | None
|
|
table_id: UUID | None
|
|
ordering_enabled: bool
|
|
metadata_json: dict | None
|
|
is_deleted: bool
|
|
created_by: str | None
|
|
updated_by: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class QrMenuSessionCreate(BaseModel):
|
|
venue_id: UUID
|
|
qr_code_id: UUID
|
|
menu_id: UUID | None = None
|
|
table_id: UUID | None = None
|
|
locale: str | None = Field(default=None, max_length=16)
|
|
guest_label: str | None = Field(default=None, max_length=255)
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class QrMenuSessionRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
venue_id: UUID
|
|
qr_code_id: UUID
|
|
menu_id: UUID | None
|
|
table_id: UUID | None
|
|
session_token: str
|
|
status: QrSessionStatus
|
|
locale: str | None
|
|
guest_label: str | None
|
|
metadata_json: dict | None
|
|
is_deleted: bool
|
|
created_by: str | None
|
|
updated_by: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class QrOrderingSessionCreate(BaseModel):
|
|
venue_id: UUID
|
|
qr_code_id: UUID
|
|
qr_menu_session_id: UUID | None = None
|
|
menu_id: UUID | None = None
|
|
table_id: UUID | None = None
|
|
guest_label: str | None = Field(default=None, max_length=255)
|
|
notes: str | None = None
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class QrOrderingSessionRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
venue_id: UUID
|
|
qr_code_id: UUID
|
|
qr_menu_session_id: UUID | None
|
|
menu_id: UUID | None
|
|
table_id: UUID | None
|
|
session_token: str
|
|
status: OrderingSessionStatus
|
|
guest_label: str | None
|
|
notes: str | None
|
|
metadata_json: dict | None
|
|
is_deleted: bool
|
|
created_by: str | None
|
|
updated_by: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class CartCreate(BaseModel):
|
|
venue_id: UUID
|
|
ordering_session_id: UUID
|
|
currency_code: str = Field(default="IRR", max_length=3)
|
|
notes: str | None = None
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class CartRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
venue_id: UUID
|
|
ordering_session_id: UUID
|
|
status: CartStatus
|
|
currency_code: str
|
|
notes: str | None
|
|
metadata_json: dict | None
|
|
is_deleted: bool
|
|
created_by: str | None
|
|
updated_by: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class CartLineCreate(BaseModel):
|
|
venue_id: UUID
|
|
cart_id: UUID
|
|
menu_item_id: UUID
|
|
quantity: int = 1
|
|
modifier_option_ids: list[UUID] | None = None
|
|
line_notes: str | None = None
|
|
sort_order: int = 0
|
|
|
|
|
|
class CartLineRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
venue_id: UUID
|
|
cart_id: UUID
|
|
menu_item_id: UUID
|
|
quantity: int
|
|
unit_price: int
|
|
currency_code: str
|
|
modifier_option_ids: list | None
|
|
line_notes: str | None
|
|
sort_order: int
|
|
is_deleted: bool
|
|
created_by: str | None
|
|
updated_by: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|