Snapshot of in-progress work across local_backend, manager_dashboard, and waiter_pwa (pricing, chat, fiscal, prep zones, recovery codes, CRM, inventory, permissions), plus the nginx/docker-compose deploy fixes for the Unraid + NPM reverse-proxy setup. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
57 lines
2.7 KiB
Python
57 lines
2.7 KiB
Python
from sqlalchemy import Column, Integer, String, Boolean, Table, ForeignKey
|
|
from sqlalchemy.orm import relationship
|
|
from database import Base
|
|
|
|
|
|
# Many-to-many: prep_zones <-> printers (all printers assigned to a zone)
|
|
prep_zone_printers = Table(
|
|
"prep_zone_printers",
|
|
Base.metadata,
|
|
Column("prep_zone_id", Integer, ForeignKey("prep_zones.id"), primary_key=True),
|
|
Column("printer_id", Integer, ForeignKey("printers.id"), primary_key=True),
|
|
)
|
|
|
|
# Many-to-many: products <-> prep_zones
|
|
product_prep_zones = Table(
|
|
"product_prep_zones",
|
|
Base.metadata,
|
|
Column("product_id", Integer, ForeignKey("products.id"), primary_key=True),
|
|
Column("prep_zone_id", Integer, ForeignKey("prep_zones.id"), primary_key=True),
|
|
)
|
|
|
|
|
|
class PrepZone(Base):
|
|
__tablename__ = "prep_zones"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String, nullable=False)
|
|
description = Column(String, nullable=True)
|
|
notification_name = Column(String, nullable=True)
|
|
|
|
# Printer routing
|
|
# auto_print: 'none' | 'master' | 'all'
|
|
auto_print = Column(String, nullable=False, default='none')
|
|
# master_printer_id: single FK to the "primary" printer (nullable — may not be set yet)
|
|
master_printer_id = Column(Integer, ForeignKey("printers.id"), nullable=True)
|
|
master_copies = Column(Integer, nullable=False, default=1)
|
|
# secondary printers are those in the M2M table that are NOT the master
|
|
secondary_copies = Column(Integer, nullable=False, default=1)
|
|
# Legacy field kept for backward compat (use master_copies/secondary_copies instead)
|
|
print_copies = Column(Integer, nullable=False, default=1)
|
|
|
|
# Ticket formatting
|
|
# sort_items_by: 'order_time' | 'item_count' | 'alpha'
|
|
sort_items_by = Column(String, nullable=False, default='order_time')
|
|
group_by_category = Column(Integer, nullable=False, default=0) # bool as int
|
|
category_order = Column(String, nullable=False, default='[]') # JSON array of category IDs
|
|
print_checkboxes = Column(Integer, nullable=False, default=0) # bool as int
|
|
|
|
# KDS bypass / auto-progression
|
|
bypass_pending = Column(Integer, nullable=False, default=0) # skip pending+prep → straight to ready
|
|
bypass_kds = Column(Integer, nullable=False, default=0) # skip KDS entirely → straight to served (implies bypass_pending)
|
|
auto_ready_to_served = Column(Integer, nullable=False, default=0) # when item hits 'done' on KDS → auto-upgrade to served
|
|
|
|
# Relationships
|
|
printers = relationship("Printer", secondary=prep_zone_printers, back_populates="prep_zones")
|
|
products = relationship("Product", secondary=product_prep_zones, back_populates="prep_zones")
|