96 lines
3.1 KiB
Python
96 lines
3.1 KiB
Python
"""
|
|
Pydantic schemas for POS configuration API requests and responses
|
|
"""
|
|
|
|
from typing import Optional, List, Dict, Any
|
|
from datetime import datetime
|
|
from pydantic import BaseModel, Field
|
|
from enum import Enum
|
|
|
|
|
|
class POSProvider(str, Enum):
|
|
"""POS provider types"""
|
|
SQUARE = "square"
|
|
TOAST = "toast"
|
|
LIGHTSPEED = "lightspeed"
|
|
|
|
|
|
class POSConfigurationBase(BaseModel):
|
|
"""Base schema for POS configurations"""
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
use_enum_values = True
|
|
json_encoders = {
|
|
datetime: lambda v: v.isoformat() if v else None
|
|
}
|
|
|
|
|
|
class POSConfigurationResponse(POSConfigurationBase):
|
|
"""Schema for POS configuration API responses"""
|
|
id: str
|
|
tenant_id: str
|
|
pos_system: POSProvider
|
|
provider_name: str
|
|
is_active: bool
|
|
is_connected: bool
|
|
webhook_url: Optional[str] = None
|
|
webhook_secret: Optional[str] = None
|
|
environment: str = "sandbox"
|
|
location_id: Optional[str] = None
|
|
merchant_id: Optional[str] = None
|
|
sync_enabled: bool = True
|
|
sync_interval_minutes: str = "5"
|
|
auto_sync_products: bool = True
|
|
auto_sync_transactions: bool = True
|
|
last_sync_at: Optional[datetime] = None
|
|
last_successful_sync_at: Optional[datetime] = None
|
|
last_sync_status: Optional[str] = None
|
|
last_sync_message: Optional[str] = None
|
|
provider_settings: Optional[Dict[str, Any]] = None
|
|
last_health_check_at: Optional[datetime] = None
|
|
health_status: str = "unknown"
|
|
health_message: Optional[str] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
notes: Optional[str] = None
|
|
|
|
@classmethod
|
|
def from_orm(cls, obj):
|
|
"""Convert ORM object to schema with proper UUID handling"""
|
|
return cls(
|
|
id=str(obj.id),
|
|
tenant_id=str(obj.tenant_id),
|
|
pos_system=obj.pos_system,
|
|
provider_name=obj.provider_name,
|
|
is_active=obj.is_active,
|
|
is_connected=obj.is_connected,
|
|
webhook_url=obj.webhook_url,
|
|
webhook_secret=obj.webhook_secret,
|
|
environment=obj.environment,
|
|
location_id=obj.location_id,
|
|
merchant_id=obj.merchant_id,
|
|
sync_enabled=obj.sync_enabled,
|
|
sync_interval_minutes=obj.sync_interval_minutes,
|
|
auto_sync_products=obj.auto_sync_products,
|
|
auto_sync_transactions=obj.auto_sync_transactions,
|
|
last_sync_at=obj.last_sync_at,
|
|
last_successful_sync_at=obj.last_successful_sync_at,
|
|
last_sync_status=obj.last_sync_status,
|
|
last_sync_message=obj.last_sync_message,
|
|
provider_settings=obj.provider_settings,
|
|
last_health_check_at=obj.last_health_check_at,
|
|
health_status=obj.health_status,
|
|
health_message=obj.health_message,
|
|
created_at=obj.created_at,
|
|
updated_at=obj.updated_at,
|
|
notes=obj.notes
|
|
)
|
|
|
|
|
|
class POSConfigurationListResponse(BaseModel):
|
|
"""Schema for POS configuration list API response"""
|
|
configurations: List[POSConfigurationResponse]
|
|
total: int
|
|
supported_systems: List[str] = ["square", "toast", "lightspeed"]
|