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")