114 lines
4.9 KiB
Python
114 lines
4.9 KiB
Python
"""
|
|
Analytics Pydantic schemas for TCO (Total Cost of Ownership) API responses.
|
|
"""
|
|
|
|
from typing import List, Optional, Dict, Any
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class TCOResponse(BaseModel):
|
|
"""Response schema for a single TCO category breakdown."""
|
|
category_id: int = Field(..., description="Cost category ID")
|
|
category_code: str = Field(..., description="Category code (e.g., 'FUEL', 'MAINTENANCE')")
|
|
category_name: str = Field(..., description="Human-readable category name")
|
|
amount: float = Field(..., description="Total amount in original currency")
|
|
currency: str = Field(..., description="Original currency code (e.g., 'EUR', 'HUF')")
|
|
amount_huf: float = Field(..., description="Amount converted to HUF")
|
|
percentage: float = Field(..., description="Percentage of total cost (0-100)")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class TCOSummaryStats(BaseModel):
|
|
"""Statistics part of the TCO summary."""
|
|
total_cost: float = Field(..., description="Total cost in HUF")
|
|
cost_per_km: Optional[float] = Field(None, description="Cost per kilometer (HUF/km)")
|
|
total_transactions: int = Field(..., description="Number of cost transactions")
|
|
date_range: Optional[Dict[str, str]] = Field(None, description="Start and end dates if filtered")
|
|
|
|
|
|
class TCOSummaryResponse(BaseModel):
|
|
"""Complete TCO summary for a vehicle."""
|
|
vehicle_id: int = Field(..., description="Vehicle ID")
|
|
user_tco: List[TCOResponse] = Field(..., description="TCO breakdown for the current user/organization")
|
|
lifetime_tco: List[TCOResponse] = Field(..., description="Lifetime TCO across all owners (anonymized)")
|
|
benchmark_tco: List[TCOResponse] = Field(..., description="Benchmark TCO for similar vehicles")
|
|
stats: TCOSummaryStats = Field(..., description="Aggregated statistics")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class TCOErrorResponse(BaseModel):
|
|
"""Error response for TCO endpoints."""
|
|
detail: str = Field(..., description="Error description")
|
|
vehicle_id: Optional[int] = Field(None, description="Related vehicle ID if applicable")
|
|
|
|
|
|
class DashboardMonthlyCost(BaseModel):
|
|
"""Monthly cost data for dashboard charts."""
|
|
month: str = Field(..., description="Month abbreviation (e.g., 'Jan', 'Feb')")
|
|
maintenance: float = Field(..., description="Maintenance costs")
|
|
fuel: float = Field(..., description="Fuel costs")
|
|
insurance: float = Field(..., description="Insurance costs")
|
|
total: float = Field(..., description="Total monthly cost")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DashboardFuelEfficiency(BaseModel):
|
|
"""Fuel efficiency trend data."""
|
|
month: str = Field(..., description="Month abbreviation")
|
|
efficiency: float = Field(..., description="Fuel efficiency in km per liter")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DashboardCostPerKm(BaseModel):
|
|
"""Cost per km trend data."""
|
|
month: str = Field(..., description="Month abbreviation")
|
|
cost: float = Field(..., description="Cost per kilometer")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DashboardFunFacts(BaseModel):
|
|
"""Fun facts for dashboard."""
|
|
total_km_driven: float = Field(..., description="Total kilometers driven")
|
|
total_trees_saved: int = Field(..., description="Total trees saved (eco metric)")
|
|
total_co2_saved: float = Field(..., description="Total CO2 saved in tons")
|
|
total_money_saved: float = Field(..., description="Total money saved in EUR")
|
|
moon_trips: int = Field(..., description="Number of moon trips equivalent")
|
|
earth_circuits: int = Field(..., description="Number of Earth circuits equivalent")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DashboardBusinessMetrics(BaseModel):
|
|
"""Business metrics for fleet management."""
|
|
fleet_size: int = Field(..., description="Number of vehicles in fleet")
|
|
average_vehicle_age: float = Field(..., description="Average vehicle age in years")
|
|
total_monthly_cost: float = Field(..., description="Total monthly cost for fleet")
|
|
average_cost_per_km: float = Field(..., description="Average cost per kilometer")
|
|
utilization_rate: float = Field(..., description="Fleet utilization rate in percentage")
|
|
downtime_hours: int = Field(..., description="Total downtime hours per month")
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DashboardResponse(BaseModel):
|
|
"""Complete dashboard data response."""
|
|
monthly_costs: List[DashboardMonthlyCost] = Field(..., description="Monthly cost breakdown")
|
|
fuel_efficiency_trends: List[DashboardFuelEfficiency] = Field(..., description="Fuel efficiency trends")
|
|
cost_per_km_trends: List[DashboardCostPerKm] = Field(..., description="Cost per km trends")
|
|
fun_facts: DashboardFunFacts = Field(..., description="Fun facts and eco metrics")
|
|
business_metrics: DashboardBusinessMetrics = Field(..., description="Business metrics")
|
|
|
|
class Config:
|
|
from_attributes = True |