Files
booking-service/app/models.py

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