import uuid from datetime import datetime from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Enum as SQLEnum from sqlalchemy.dialects.postgresql import UUID, JSONB, ARRAY from sqlalchemy.orm import relationship import enum from app.core.database import Base class AssignmentMethod(str, enum.Enum): ROUND_ROBIN = "round_robin" LEAST_BUSY = "least_busy" SKILL_BASED = "skill_based" class Queue(Base): __tablename__ = "queues" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String(100), nullable=False) description = Column(String(500), nullable=True) assignment_method = Column(SQLEnum(AssignmentMethod), default=AssignmentMethod.ROUND_ROBIN, nullable=False) max_per_agent = Column(Integer, default=10, nullable=False) sla_first_response = Column(Integer, default=300, nullable=False) sla_resolution = Column(Integer, default=86400, nullable=False) business_hours = Column(JSONB, default=dict) fallback_flow_id = Column(UUID(as_uuid=True), ForeignKey("flows.id"), nullable=True) is_active = Column(Boolean, default=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) agents = relationship("QueueAgent", back_populates="queue") conversations = relationship("Conversation", back_populates="queue") class QueueAgent(Base): __tablename__ = "queue_agents" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) queue_id = Column(UUID(as_uuid=True), ForeignKey("queues.id"), nullable=False) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) is_supervisor = Column(Boolean, default=False, nullable=False) skills = Column(ARRAY(String), default=list) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) queue = relationship("Queue", back_populates="agents") user = relationship("User")