94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
|
|
"""
|
||
|
|
POS Service Analytics API Endpoints
|
||
|
|
ANALYTICS layer - Channel and sync performance analytics
|
||
|
|
"""
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends, HTTPException, Path, Query
|
||
|
|
from typing import Optional, Dict, Any
|
||
|
|
from uuid import UUID
|
||
|
|
from datetime import datetime
|
||
|
|
import structlog
|
||
|
|
|
||
|
|
from app.core.database import get_db
|
||
|
|
from shared.auth.decorators import get_current_user_dep
|
||
|
|
from shared.auth.access_control import require_user_role
|
||
|
|
from shared.routing import RouteBuilder
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
logger = structlog.get_logger()
|
||
|
|
route_builder = RouteBuilder('pos')
|
||
|
|
|
||
|
|
|
||
|
|
@router.get(
|
||
|
|
route_builder.build_analytics_route("sync-performance"),
|
||
|
|
response_model=dict
|
||
|
|
)
|
||
|
|
@require_user_role(['viewer', 'member', 'admin', 'owner'])
|
||
|
|
async def get_sync_performance_analytics(
|
||
|
|
tenant_id: UUID = Path(...),
|
||
|
|
days: int = Query(30, ge=1, le=365),
|
||
|
|
config_id: Optional[UUID] = Query(None),
|
||
|
|
current_user: dict = Depends(get_current_user_dep),
|
||
|
|
db=Depends(get_db)
|
||
|
|
):
|
||
|
|
"""Analyze sync performance metrics"""
|
||
|
|
try:
|
||
|
|
return {
|
||
|
|
"period_days": days,
|
||
|
|
"total_syncs": 0,
|
||
|
|
"successful_syncs": 0,
|
||
|
|
"failed_syncs": 0,
|
||
|
|
"success_rate": 0.0,
|
||
|
|
"average_duration_minutes": 0.0,
|
||
|
|
"total_transactions_synced": 0,
|
||
|
|
"total_revenue_synced": 0.0,
|
||
|
|
"sync_frequency": {
|
||
|
|
"daily_average": 0.0,
|
||
|
|
"peak_day": None,
|
||
|
|
"peak_count": 0
|
||
|
|
},
|
||
|
|
"error_analysis": {
|
||
|
|
"common_errors": [],
|
||
|
|
"error_trends": []
|
||
|
|
}
|
||
|
|
}
|
||
|
|
except Exception as e:
|
||
|
|
logger.error("Failed to get sync analytics", error=str(e), tenant_id=tenant_id)
|
||
|
|
raise HTTPException(status_code=500, detail=f"Failed to get analytics: {str(e)}")
|
||
|
|
|
||
|
|
|
||
|
|
@router.get(
|
||
|
|
route_builder.build_analytics_route("channel-performance"),
|
||
|
|
response_model=dict
|
||
|
|
)
|
||
|
|
@require_user_role(['viewer', 'member', 'admin', 'owner'])
|
||
|
|
async def get_channel_performance_analytics(
|
||
|
|
tenant_id: UUID = Path(...),
|
||
|
|
days: int = Query(30, ge=1, le=365),
|
||
|
|
pos_system: Optional[str] = Query(None),
|
||
|
|
current_user: dict = Depends(get_current_user_dep),
|
||
|
|
db=Depends(get_db)
|
||
|
|
):
|
||
|
|
"""Analyze POS channel performance by system"""
|
||
|
|
try:
|
||
|
|
return {
|
||
|
|
"period_days": days,
|
||
|
|
"pos_system": pos_system,
|
||
|
|
"channel_metrics": {
|
||
|
|
"total_transactions": 0,
|
||
|
|
"total_revenue": 0.0,
|
||
|
|
"average_transaction_value": 0.0,
|
||
|
|
"transaction_growth_rate": 0.0
|
||
|
|
},
|
||
|
|
"system_breakdown": [],
|
||
|
|
"performance_trends": {
|
||
|
|
"daily_trends": [],
|
||
|
|
"hourly_trends": [],
|
||
|
|
"day_of_week_trends": []
|
||
|
|
},
|
||
|
|
"top_performing_channels": []
|
||
|
|
}
|
||
|
|
except Exception as e:
|
||
|
|
logger.error("Failed to get channel analytics", error=str(e), tenant_id=tenant_id)
|
||
|
|
raise HTTPException(status_code=500, detail=f"Failed to get channel analytics: {str(e)}")
|