from sqlalchemy import Column, String, Integer, Float, DateTime, Text, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime from app.core.database.db_session import Base class POSTerminal(Base): __tablename__ = "pos_terminals" __bind_key__ = "commerce" terminal_id = Column(String(50), primary_key=True) store_name = Column(String(150), nullable=False) status = Column(String(20), default="ONLINE") # ONLINE, IDLE, OFFLINE ip_address = Column(String(45), nullable=True) last_heartbeat = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) synced_today = Column(Integer, default=0) pending_queue = Column(Integer, default=0) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) logs = relationship("POSTransactionLog", back_populates="terminal", cascade="all, delete-orphan") class POSTransactionLog(Base): __tablename__ = "pos_transaction_logs" __bind_key__ = "commerce" sync_id = Column(String(50), primary_key=True) terminal_id = Column(String(50), ForeignKey("pos_terminals.terminal_id"), nullable=False) invoice_no = Column(String(100), nullable=False, index=True) pos_transaction_id = Column(String(100), nullable=False, index=True) items_count = Column(Integer, default=1) total_amount = Column(Float, default=0.0) status = Column(String(20), default="SYNCED") # SYNCED, FAILED, PENDING_RETRY error_detail = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.utcnow, index=True) terminal = relationship("POSTerminal", back_populates="logs")