v1.3.0 — pannello admin completo, auth localStorage, Baileys WA, customers, calendario, paginazione, dashboard 7gg

This commit is contained in:
2026-04-12 17:46:08 +00:00
commit c33ec8450e
31 changed files with 3072 additions and 0 deletions

71
app/models.py Normal file
View File

@@ -0,0 +1,71 @@
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")