From b9d6055c480a3f39a1b0b4ff8b8ad05a0a1fde2b Mon Sep 17 00:00:00 2001 From: bonamin Date: Sun, 31 May 2026 23:42:46 +0300 Subject: [PATCH] =?UTF-8?q?feat(connect):=20Phase=201=20=E2=80=94=20add=20?= =?UTF-8?q?digital=20product=20fields=20to=20local=5Fbackend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds seven digital-menu-specific columns to the products table so managers can control the public Xenia Connect menu independently of POS data: - digital_visible (INTEGER, default 1) — hide product from menu - digital_available (INTEGER, default 1) — show as out-of-stock - digital_name (VARCHAR, nullable) — override display name - digital_description (VARCHAR, nullable) - digital_price (REAL, nullable) — override price - digital_discount (REAL, default 0.0) — percentage discount - digital_image_url (VARCHAR, nullable) — menu-specific image Changes: - main.py: 7 additive ALTER TABLE migrations (safe on existing DBs) - models/product.py: matching SQLAlchemy columns on Product - schemas/product.py: ProductBase carries defaults (visible/available default True); ProductUpdate has all fields Optional; ProductOut inherits everything via ProductBase No router changes needed — PUT /api/products/{id} picks up the new fields from ProductUpdate automatically. Co-Authored-By: Claude Sonnet 4.6 --- local_backend/main.py | 8 ++++++++ local_backend/models/product.py | 9 +++++++++ local_backend/schemas/product.py | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/local_backend/main.py b/local_backend/main.py index 4fb9332..03d076d 100644 --- a/local_backend/main.py +++ b/local_backend/main.py @@ -218,6 +218,14 @@ def _run_migrations(): "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('security.auto_lock_seconds', '300', CURRENT_TIMESTAMP)", "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('security.auto_logout', 'false', CURRENT_TIMESTAMP)", "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('security.auto_logout_seconds', '1800', CURRENT_TIMESTAMP)", + # Xenia Connect — digital menu fields on products + "ALTER TABLE products ADD COLUMN digital_visible INTEGER NOT NULL DEFAULT 1", + "ALTER TABLE products ADD COLUMN digital_available INTEGER NOT NULL DEFAULT 1", + "ALTER TABLE products ADD COLUMN digital_name VARCHAR", + "ALTER TABLE products ADD COLUMN digital_description VARCHAR", + "ALTER TABLE products ADD COLUMN digital_price REAL", + "ALTER TABLE products ADD COLUMN digital_discount REAL NOT NULL DEFAULT 0.0", + "ALTER TABLE products ADD COLUMN digital_image_url VARCHAR", ] for sql in migrations: try: diff --git a/local_backend/models/product.py b/local_backend/models/product.py index 29c5463..54edf3e 100644 --- a/local_backend/models/product.py +++ b/local_backend/models/product.py @@ -36,6 +36,15 @@ class Product(Base): image_url = Column(String, nullable=True) sort_order = Column(Integer, default=0, nullable=False) + # Xenia Connect — digital menu overrides + digital_visible = Column(Integer, default=1, nullable=False) + digital_available = Column(Integer, default=1, nullable=False) + digital_name = Column(String, nullable=True) + digital_description = Column(String, nullable=True) + digital_price = Column(Float, nullable=True) + digital_discount = Column(Float, default=0.0, nullable=False) + digital_image_url = Column(String, nullable=True) + category = relationship("Category", back_populates="products") printer_zone = relationship("Printer", back_populates="products") quick_options = relationship("ProductQuickOption", back_populates="product", cascade="all, delete-orphan") diff --git a/local_backend/schemas/product.py b/local_backend/schemas/product.py index a40ec99..24b1a6b 100644 --- a/local_backend/schemas/product.py +++ b/local_backend/schemas/product.py @@ -263,6 +263,14 @@ class ProductBase(BaseModel): lifecycle_status: str = "active" printer_zone_id: Optional[int] = None sort_order: int = 0 + # Xenia Connect — digital menu overrides + digital_visible: bool = True + digital_available: bool = True + digital_name: Optional[str] = None + digital_description: Optional[str] = None + digital_price: Optional[float] = None + digital_discount: float = 0.0 + digital_image_url: Optional[str] = None class ProductCreate(ProductBase): @@ -284,6 +292,14 @@ class ProductUpdate(BaseModel): options: Optional[List[ProductOptionCreate]] = None ingredients: Optional[List[ProductIngredientCreate]] = None preference_sets: Optional[List[PreferenceSetCreate]] = None + # Xenia Connect — digital menu overrides + digital_visible: Optional[bool] = None + digital_available: Optional[bool] = None + digital_name: Optional[str] = None + digital_description: Optional[str] = None + digital_price: Optional[float] = None + digital_discount: Optional[float] = None + digital_image_url: Optional[str] = None class ProductReorderItem(BaseModel):