72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
from sqlalchemy import Column, Integer, String, Boolean, Text, DateTime, ForeignKey, UniqueConstraint
|
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
from app.database import Base
|
|
|
|
|
|
class Service(Base):
|
|
__tablename__ = "services"
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
name = Column(Text, nullable=False)
|
|
slug = Column(Text, nullable=False, unique=True)
|
|
duration_min = Column(Integer, nullable=False, default=15)
|
|
description = Column(Text)
|
|
category = Column(Text, default="generale")
|
|
active = Column(Boolean, default=True)
|
|
sort_order = Column(Integer, default=0)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
provider_services = relationship("ProviderService", back_populates="service")
|
|
bookings = relationship("Booking", back_populates="service")
|
|
|
|
|
|
class Provider(Base):
|
|
__tablename__ = "providers"
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
name = Column(Text, nullable=False)
|
|
email = Column(Text)
|
|
phone = Column(Text)
|
|
google_calendar_id = Column(Text)
|
|
active = Column(Boolean, default=True)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
provider_services = relationship("ProviderService", back_populates="provider")
|
|
bookings = relationship("Booking", back_populates="provider")
|
|
|
|
|
|
class ProviderService(Base):
|
|
__tablename__ = "provider_services"
|
|
__table_args__ = (UniqueConstraint("provider_id", "service_id"),)
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
provider_id = Column(Integer, ForeignKey("providers.id", ondelete="CASCADE"))
|
|
service_id = Column(Integer, ForeignKey("services.id", ondelete="CASCADE"))
|
|
availability_rules = Column(JSONB, nullable=False, default=[])
|
|
|
|
provider = relationship("Provider", back_populates="provider_services")
|
|
service = relationship("Service", back_populates="provider_services")
|
|
|
|
|
|
class Booking(Base):
|
|
__tablename__ = "bookings"
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
service_id = Column(Integer, ForeignKey("services.id"))
|
|
provider_id = Column(Integer, ForeignKey("providers.id"))
|
|
customer_name = Column(Text, nullable=False)
|
|
customer_phone = Column(Text, nullable=False)
|
|
customer_email = Column(Text)
|
|
start_at = Column(DateTime(timezone=True), nullable=False)
|
|
end_at = Column(DateTime(timezone=True), nullable=False)
|
|
status = Column(Text, default="confirmed")
|
|
google_event_id = Column(Text)
|
|
notes = Column(Text)
|
|
reminder_sent = Column(Boolean, default=False)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
service = relationship("Service", back_populates="bookings")
|
|
provider = relationship("Provider", back_populates="bookings")
|