Initial Switch to V2. Completely Overhauled Backend, Frontend and General Structure.

This commit is contained in:
2026-04-17 14:37:36 +03:00
parent eb773c5531
commit 0a8a42d69b
447 changed files with 70696 additions and 492 deletions

46
backend/tickets/orm.py Normal file
View File

@@ -0,0 +1,46 @@
import uuid
from datetime import datetime, timezone
from sqlalchemy import Column, String, Text, DateTime, Boolean, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from database.postgres import Base
def _now():
return datetime.now(timezone.utc)
class SupportTicket(Base):
__tablename__ = "support_tickets"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
customer_id = Column(String(128), nullable=False) # Firestore ID (moves to UUID when customers migrate)
customer_name = Column(String(255), nullable=True) # denormalized snapshot
device_id = Column(String(128), nullable=True) # Firestore ID
device_serial = Column(String(64), nullable=True) # denormalized snapshot
subject = Column(String(500), nullable=False)
status = Column(String(30), nullable=False, default="open")
# open | waiting_on_customer | waiting_on_staff | resolved | closed
priority = Column(String(10), nullable=True) # low | medium | high | urgent
opened_via = Column(String(20), nullable=True) # app | email | phone | staff
linked_entry_id = Column(UUID(as_uuid=True), ForeignKey("crm_entries.id", ondelete="SET NULL"), nullable=True)
created_at = Column(DateTime(timezone=True), nullable=False, default=_now)
updated_at = Column(DateTime(timezone=True), nullable=False, default=_now, onupdate=_now)
messages = relationship("TicketMessage", back_populates="ticket",
cascade="all, delete-orphan", order_by="TicketMessage.created_at", lazy="noload")
class TicketMessage(Base):
__tablename__ = "ticket_messages"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
ticket_id = Column(UUID(as_uuid=True), ForeignKey("support_tickets.id", ondelete="CASCADE"), nullable=False)
sender_type = Column(String(10), nullable=False) # 'staff' | 'customer'
sender_id = Column(String(128), nullable=False)
sender_name = Column(String(255), nullable=True)
body = Column(Text, nullable=False)
is_internal = Column(Boolean, nullable=False, default=False)
created_at = Column(DateTime(timezone=True), nullable=False, default=_now)
ticket = relationship("SupportTicket", back_populates="messages")