# services/tenant/app/models/tenants.py """ Tenant models for bakery management """ from sqlalchemy import Column, String, Boolean, DateTime, Float, ForeignKey, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from datetime import datetime import uuid from shared.database.base import Base class Tenant(Base): """Tenant/Bakery model""" __tablename__ = "tenants" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String(200), nullable=False) subdomain = Column(String(100), unique=True) business_type = Column(String(100), default="bakery") # Location info address = Column(Text, nullable=False) city = Column(String(100), default="Madrid") postal_code = Column(String(10), nullable=False) latitude = Column(Float) longitude = Column(Float) # Contact info phone = Column(String(20)) email = Column(String(255)) # Status is_active = Column(Boolean, default=True) subscription_tier = Column(String(50), default="basic") # ML status model_trained = Column(Boolean, default=False) last_training_date = Column(DateTime) # Ownership (The user who created the tenant, still a direct link) owner_id = Column(UUID(as_uuid=True), nullable=False, index=True) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships # Define the many-to-many relationship through TenantMember members = relationship("TenantMember", back_populates="tenant", cascade="all, delete-orphan") users = relationship("User", secondary="tenant_members", back_populates="tenants") def __repr__(self): return f"" class TenantMember(Base): """Tenant membership model for team access - Association Table""" __tablename__ = "tenant_members" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) tenant_id = Column(UUID(as_uuid=True), ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) # Added ForeignKey to users.id # Role and permissions specific to this tenant role = Column(String(50), default="member") # owner, admin, member, viewer permissions = Column(Text) # JSON string of permissions # Status is_active = Column(Boolean, default=True) invited_by = Column(UUID(as_uuid=True)) invited_at = Column(DateTime, default=datetime.utcnow) joined_at = Column(DateTime) created_at = Column(DateTime, default=datetime.utcnow) # Relationships to access the associated Tenant and User objects tenant = relationship("Tenant", back_populates="members") user = relationship("User", back_populates="tenant_memberships") # Changed back_populates to avoid conflict def __repr__(self): return f""