37 lines
1.7 KiB
Python
37 lines
1.7 KiB
Python
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")
|