|
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_URL = "sqlite:///./tabble_new.db" |
|
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) |
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) |
|
Base = declarative_base() |
|
|
|
|
|
|
|
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) |
|
is_offer = Column(Integer, default=0) |
|
is_special = Column(Integer, default=0) |
|
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), |
|
) |
|
|
|
|
|
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") |
|
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), |
|
) |
|
|
|
|
|
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) |
|
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)) |
|
|
|
|
|
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)) |
|
|
|
|
|
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) |
|
comment = Column(Text, nullable=True) |
|
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) |
|
|
|
|
|
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) |
|
discount_percentage = Column(Float) |
|
is_active = Column(Boolean, default=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), |
|
) |
|
|
|
|
|
class SelectionOffer(Base): |
|
__tablename__ = "selection_offers" |
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
min_amount = Column(Float) |
|
discount_amount = Column(Float) |
|
is_active = Column(Boolean, default=True) |
|
description = 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), |
|
) |
|
|
|
|
|
class Table(Base): |
|
__tablename__ = "tables" |
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
table_number = Column(Integer, unique=True) |
|
is_occupied = Column( |
|
Boolean, default=False |
|
) |
|
current_order_id = Column( |
|
Integer, ForeignKey("orders.id"), 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), |
|
) |
|
|
|
|
|
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), |
|
) |
|
|
|
|
|
|
|
def create_tables(): |
|
|
|
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") |
|
|
|
|
|
Base.metadata.create_all(bind=engine) |
|
|
|
|
|
|
|
def get_db(): |
|
db = SessionLocal() |
|
try: |
|
yield db |
|
finally: |
|
db.close() |
|
|