from sqlalchemy import Column, BigInteger, String, Integer, Text, DateTime, Enum as SQLEnum, func from enum import Enum from datetime import datetime from app.db.session import Base class SubmissionSource(str, Enum): ADMIN = "ADMIN" PUBLIC = "PUBLIC" class DepartureStatus(str, Enum): BOOKED_OUT = "BOOKED_OUT" GROUND = "GROUND" DEPARTED = "DEPARTED" LOCAL = "LOCAL" CANCELLED = "CANCELLED" PENDING = "PENDING" class Departure(Base): __tablename__ = "departures" id = Column(BigInteger, primary_key=True, autoincrement=True) registration = Column(String(16), nullable=False, index=True) type = Column(String(32), nullable=True) callsign = Column(String(16), nullable=True) pob = Column(Integer, nullable=False) out_to = Column(String(64), nullable=False, index=True) status = Column(SQLEnum(DepartureStatus), default=DepartureStatus.BOOKED_OUT, nullable=False, index=True) notes = Column(Text, nullable=True) created_dt = Column(DateTime, server_default=func.now(), nullable=False, index=True) etd = Column(DateTime, nullable=True, index=True) # Estimated Time of Departure contact_dt = Column(DateTime, nullable=True) # Time when contact is established with pilot departed_dt = Column(DateTime, nullable=True) # Actual departure time (QSY) takeoff_dt = Column(DateTime, nullable=True) # Time when aircraft becomes airborne created_by = Column(String(16), nullable=True, index=True) submitted_via = Column(SQLEnum(SubmissionSource), nullable=False, default=SubmissionSource.ADMIN, index=True) pilot_email = Column(String(128), nullable=True) # For public submissions arrival_id = Column(BigInteger, nullable=True) # Linked arrival for PPR-activated departures updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False)