46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey, Boolean
|
|
from sqlalchemy.orm import declarative_base, relationship, sessionmaker
|
|
from datetime import datetime
|
|
|
|
Base = declarative_base()
|
|
|
|
class ProposalJob(Base):
|
|
__tablename__ = 'proposal_jobs'
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
job_uuid = Column(String, unique=True, nullable=False) # Für die API-Links
|
|
customer_email = Column(String, nullable=False)
|
|
customer_name = Column(String, nullable=True)
|
|
customer_company = Column(String, nullable=True)
|
|
|
|
# Status-Tracking
|
|
status = Column(String, default='pending') # pending, approved, rejected, sent, failed
|
|
|
|
# Audit-Trail
|
|
created_at = Column(DateTime, default=datetime.now)
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
|
approved_at = Column(DateTime, nullable=True)
|
|
|
|
# Verknüpfung zu den vorgeschlagenen Slots
|
|
slots = relationship("ProposedSlot", back_populates="job")
|
|
|
|
class ProposedSlot(Base):
|
|
__tablename__ = 'proposed_slots'
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
job_id = Column(Integer, ForeignKey('proposal_jobs.id'))
|
|
|
|
start_time = Column(DateTime, nullable=False)
|
|
end_time = Column(DateTime, nullable=False)
|
|
|
|
# Wir brauchen kein 'is_blocked' Flag mehr, da wir dynamisch zählen,
|
|
# wie oft 'start_time' in den letzten 24h verwendet wurde.
|
|
|
|
job = relationship("ProposalJob", back_populates="slots")
|
|
|
|
# DB Setup Helper
|
|
def init_db(db_path='sqlite:///trading_twins/trading_twins.db'):
|
|
engine = create_engine(db_path)
|
|
Base.metadata.create_all(engine)
|
|
return sessionmaker(bind=engine)
|