Files
bakery-ia/services/pos/app/models/pos_sync.py

126 lines
5.5 KiB
Python
Raw Normal View History

2025-08-16 15:00:36 +02:00
# services/pos/app/models/pos_sync.py
"""
POS Sync Log Model
Tracks synchronization operations with POS systems
"""
from sqlalchemy import Column, String, DateTime, Boolean, Integer, Text, JSON, Index, Numeric
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.sql import func
import uuid
from shared.database.base import Base
class POSSyncLog(Base):
"""
Log of synchronization operations with POS systems
"""
__tablename__ = "pos_sync_logs"
# Primary identifiers
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
tenant_id = Column(UUID(as_uuid=True), nullable=False, index=True)
pos_config_id = Column(UUID(as_uuid=True), nullable=False, index=True)
# Sync Operation Details
sync_type = Column(String(50), nullable=False, index=True) # full, incremental, manual, webhook_triggered
sync_direction = Column(String(20), nullable=False) # inbound, outbound, bidirectional
data_type = Column(String(50), nullable=False, index=True) # transactions, products, customers, orders
# POS Provider Information
pos_system = Column(String(50), nullable=False, index=True) # square, toast, lightspeed
# Sync Status
status = Column(String(50), nullable=False, default="started", index=True) # started, in_progress, completed, failed, cancelled
# Timing Information
started_at = Column(DateTime(timezone=True), nullable=False, index=True)
completed_at = Column(DateTime(timezone=True), nullable=True)
duration_seconds = Column(Numeric(10, 3), nullable=True)
# Date Range for Sync
sync_from_date = Column(DateTime(timezone=True), nullable=True)
sync_to_date = Column(DateTime(timezone=True), nullable=True)
# Statistics
records_requested = Column(Integer, default=0, nullable=False)
records_processed = Column(Integer, default=0, nullable=False)
records_created = Column(Integer, default=0, nullable=False)
records_updated = Column(Integer, default=0, nullable=False)
records_skipped = Column(Integer, default=0, nullable=False)
records_failed = Column(Integer, default=0, nullable=False)
# API Usage Statistics
api_calls_made = Column(Integer, default=0, nullable=False)
api_rate_limit_hits = Column(Integer, default=0, nullable=False)
total_api_time_ms = Column(Integer, default=0, nullable=False)
# Error Information
error_message = Column(Text, nullable=True)
error_code = Column(String(100), nullable=True)
error_details = Column(JSON, nullable=True)
# Retry Information
retry_attempt = Column(Integer, default=0, nullable=False)
max_retries = Column(Integer, default=3, nullable=False)
parent_sync_id = Column(UUID(as_uuid=True), nullable=True) # Reference to original sync for retries
# Configuration Snapshot
sync_configuration = Column(JSON, nullable=True) # Settings used for this sync
# Progress Tracking
current_page = Column(Integer, nullable=True)
total_pages = Column(Integer, nullable=True)
current_batch = Column(Integer, nullable=True)
total_batches = Column(Integer, nullable=True)
progress_percentage = Column(Numeric(5, 2), nullable=True)
# Data Quality
validation_errors = Column(JSON, nullable=True) # Array of validation issues
data_quality_score = Column(Numeric(5, 2), nullable=True) # 0-100 score
# Performance Metrics
memory_usage_mb = Column(Numeric(10, 2), nullable=True)
cpu_usage_percentage = Column(Numeric(5, 2), nullable=True)
network_bytes_received = Column(Integer, nullable=True)
network_bytes_sent = Column(Integer, nullable=True)
# Business Impact
revenue_synced = Column(Numeric(12, 2), nullable=True) # Total monetary value synced
transactions_synced = Column(Integer, default=0, nullable=False)
# Trigger Information
triggered_by = Column(String(50), nullable=True) # system, user, webhook, schedule
triggered_by_user_id = Column(UUID(as_uuid=True), nullable=True)
trigger_details = Column(JSON, nullable=True)
# External References
external_batch_id = Column(String(255), nullable=True) # POS system's batch/job ID
webhook_log_id = Column(UUID(as_uuid=True), nullable=True) # If triggered by webhook
# Timestamps
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
# Metadata
notes = Column(Text, nullable=True)
tags = Column(JSON, nullable=True) # Array of tags for categorization
# Indexes for performance
__table_args__ = (
Index('idx_sync_log_tenant_started', 'tenant_id', 'started_at'),
Index('idx_sync_log_pos_system_type', 'pos_system', 'sync_type'),
Index('idx_sync_log_status', 'status'),
Index('idx_sync_log_data_type', 'data_type'),
Index('idx_sync_log_trigger', 'triggered_by'),
Index('idx_sync_log_completed', 'completed_at'),
Index('idx_sync_log_duration', 'duration_seconds'),
Index('idx_sync_log_retry', 'retry_attempt'),
Index('idx_sync_log_parent', 'parent_sync_id'),
Index('idx_sync_log_webhook', 'webhook_log_id'),
Index('idx_sync_log_external_batch', 'external_batch_id'),
)
def __repr__(self):
return f"<POSSyncLog(id={self.id}, pos_system='{self.pos_system}', type='{self.sync_type}', status='{self.status}')>"