File size: 7,011 Bytes
80feb1b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
from sqlalchemy import (
create_engine,
Column,
Integer,
String,
Float,
ForeignKey,
DateTime,
Text,
Boolean,
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from datetime import datetime, timezone
import os
# Database connection - Using SQLite
DATABASE_URL = "sqlite:///./tabble_new.db" # Using the new database with offers feature
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# Database models
class Dish(Base):
__tablename__ = "dishes"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(Text, nullable=True)
category = Column(String, index=True)
price = Column(Float)
quantity = Column(Integer, default=0)
image_path = Column(String, nullable=True)
discount = Column(Float, default=0) # Discount amount (percentage)
is_offer = Column(Integer, default=0) # 0 = not an offer, 1 = is an offer
is_special = Column(Integer, default=0) # 0 = not special, 1 = today's special
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
# Relationship with OrderItem
order_items = relationship("OrderItem", back_populates="dish")
class Order(Base):
__tablename__ = "orders"
id = Column(Integer, primary_key=True, index=True)
table_number = Column(Integer)
unique_id = Column(String, index=True)
person_id = Column(Integer, ForeignKey("persons.id"), nullable=True)
status = Column(String, default="pending") # pending, completed, paid
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
# Relationships
items = relationship("OrderItem", back_populates="order")
person = relationship("Person", back_populates="orders")
class Person(Base):
__tablename__ = "persons"
id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, index=True)
password = Column(String)
phone_number = Column(String, unique=True, index=True, nullable=True) # Added phone number field
visit_count = Column(Integer, default=1)
last_visit = Column(DateTime, default=lambda: datetime.now(timezone.utc))
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
# Relationship with Order
orders = relationship("Order", back_populates="person")
class OrderItem(Base):
__tablename__ = "order_items"
id = Column(Integer, primary_key=True, index=True)
order_id = Column(Integer, ForeignKey("orders.id"))
dish_id = Column(Integer, ForeignKey("dishes.id"))
quantity = Column(Integer, default=1)
remarks = Column(Text, nullable=True)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
# Relationships
order = relationship("Order", back_populates="items")
dish = relationship("Dish", back_populates="order_items")
class Feedback(Base):
__tablename__ = "feedback"
id = Column(Integer, primary_key=True, index=True)
order_id = Column(Integer, ForeignKey("orders.id"))
person_id = Column(Integer, ForeignKey("persons.id"), nullable=True)
rating = Column(Integer) # 1-5 stars
comment = Column(Text, nullable=True)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
# Relationships
order = relationship("Order")
person = relationship("Person")
class LoyaltyProgram(Base):
__tablename__ = "loyalty_program"
id = Column(Integer, primary_key=True, index=True)
visit_count = Column(Integer, unique=True) # Number of visits required
discount_percentage = Column(Float) # Discount percentage
is_active = Column(Boolean, default=True) # Whether this loyalty tier is active
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
class SelectionOffer(Base):
__tablename__ = "selection_offers"
id = Column(Integer, primary_key=True, index=True)
min_amount = Column(Float) # Minimum order amount to qualify
discount_amount = Column(Float) # Fixed discount amount to apply
is_active = Column(Boolean, default=True) # Whether this offer is active
description = Column(String, nullable=True) # Optional description of the offer
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
class Table(Base):
__tablename__ = "tables"
id = Column(Integer, primary_key=True, index=True)
table_number = Column(Integer, unique=True) # Table number
is_occupied = Column(
Boolean, default=False
) # Whether the table is currently occupied
current_order_id = Column(
Integer, ForeignKey("orders.id"), nullable=True
) # Current active order
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
# Relationship to current order
current_order = relationship("Order", foreign_keys=[current_order_id])
class Settings(Base):
__tablename__ = "settings"
id = Column(Integer, primary_key=True, index=True)
hotel_name = Column(String, nullable=False, default="Tabble Hotel")
address = Column(String, nullable=True)
contact_number = Column(String, nullable=True)
email = Column(String, nullable=True)
tax_id = Column(String, nullable=True)
logo_path = Column(String, nullable=True)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(
DateTime,
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
)
# Create tables
def create_tables():
# Drop the selection_offers table if it exists to force recreation
try:
SelectionOffer.__table__.drop(engine)
print("Dropped selection_offers table to recreate it with the correct schema")
except:
print("Could not drop selection_offers table, it might not exist yet")
# Create all tables
Base.metadata.create_all(bind=engine)
# Get database session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
|