refaktorálás javításai
This commit is contained in:
@@ -38,12 +38,12 @@ async def get_system_health(
|
||||
stats = {}
|
||||
|
||||
# Felhasználói eloszlás (Nyers SQL a sebességért)
|
||||
user_res = await db.execute(text("SELECT subscription_plan, count(*) FROM data.users GROUP BY subscription_plan"))
|
||||
user_res = await db.execute(text("SELECT subscription_plan, count(*) FROM identity.users GROUP BY subscription_plan"))
|
||||
stats["user_distribution"] = {row[0]: row[1] for row in user_res}
|
||||
|
||||
# Eszköz és Szervezet számlálók
|
||||
stats["total_assets"] = (await db.execute(text("SELECT count(*) FROM data.assets"))).scalar()
|
||||
stats["total_organizations"] = (await db.execute(text("SELECT count(*) FROM data.organizations"))).scalar()
|
||||
stats["total_assets"] = (await db.execute(text("SELECT count(*) FROM vehicle.assets"))).scalar()
|
||||
stats["total_organizations"] = (await db.execute(text("SELECT count(*) FROM fleet.organizations"))).scalar()
|
||||
|
||||
# Biztonsági riasztások (Kritikus logok az elmúlt 24 órában)
|
||||
day_ago = datetime.now() - timedelta(days=1)
|
||||
@@ -99,7 +99,7 @@ async def set_parameter(
|
||||
):
|
||||
""" Paraméter beállítása vagy frissítése hierarchikus scope-al. """
|
||||
query = text("""
|
||||
INSERT INTO data.system_parameters (key, value, scope_level, scope_id, category, last_modified_by)
|
||||
INSERT INTO system.system_parameters (key, value, scope_level, scope_id, category, last_modified_by)
|
||||
VALUES (:key, :val, :sl, :sid, :cat, :user)
|
||||
ON CONFLICT (key, scope_level, scope_id)
|
||||
DO UPDATE SET
|
||||
|
||||
46
backend/app/schemas/analytics.py
Normal file
46
backend/app/schemas/analytics.py
Normal file
@@ -0,0 +1,46 @@
|
||||
"""
|
||||
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")
|
||||
43
backend/app/schemas/finance.py
Normal file
43
backend/app/schemas/finance.py
Normal file
@@ -0,0 +1,43 @@
|
||||
# /opt/docker/dev/service_finder/backend/app/schemas/finance.py
|
||||
"""
|
||||
Finance-related Pydantic schemas for API requests and responses.
|
||||
"""
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from datetime import datetime
|
||||
from typing import Optional, Any, Dict, List
|
||||
import enum
|
||||
|
||||
|
||||
class IssuerType(str, enum.Enum):
|
||||
"""Kibocsátó típusok (jogi forma)."""
|
||||
KFT = "KFT"
|
||||
EV = "EV"
|
||||
BT = "BT"
|
||||
ZRT = "ZRT"
|
||||
OTHER = "OTHER"
|
||||
|
||||
|
||||
class IssuerResponse(BaseModel):
|
||||
"""Response schema for Issuer entities."""
|
||||
id: int
|
||||
name: str
|
||||
tax_id: Optional[str] = None
|
||||
type: IssuerType
|
||||
revenue_limit: float
|
||||
current_revenue: float
|
||||
is_active: bool
|
||||
api_config: Dict[str, Any]
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class IssuerUpdate(BaseModel):
|
||||
"""Update schema for Issuer entities (PATCH)."""
|
||||
is_active: Optional[bool] = None
|
||||
revenue_limit: Optional[float] = None
|
||||
api_config: Optional[Dict[str, Any]] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
@@ -1,4 +1,4 @@
|
||||
# /opt/docker/dev/service_finder/backend/app/schemas/social.py
|
||||
import uuid # HOZZÁADVA
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from typing import Optional, List
|
||||
from datetime import datetime
|
||||
@@ -27,6 +27,28 @@ class ServiceProviderResponse(ServiceProviderBase):
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
# --- Értékelések (Reviews) - HOZZÁADVA ---
|
||||
|
||||
class ServiceReviewBase(BaseModel):
|
||||
price_rating: int
|
||||
quality_rating: int
|
||||
time_rating: int
|
||||
communication_rating: int
|
||||
comment: Optional[str] = None
|
||||
|
||||
class ServiceReviewCreate(ServiceReviewBase):
|
||||
pass
|
||||
|
||||
class ServiceReviewResponse(ServiceReviewBase):
|
||||
id: int
|
||||
user_id: int
|
||||
service_id: int
|
||||
transaction_id: uuid.UUID
|
||||
is_verified: bool
|
||||
created_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
# --- Gamifikáció és Szavazás (Voting & Gamification) ---
|
||||
|
||||
class VoteCreate(BaseModel):
|
||||
@@ -43,15 +65,15 @@ class BadgeSchema(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
description: str
|
||||
icon_url: Optional[str] = None # JAVÍTVA: icon_url a modell szerint
|
||||
icon_url: Optional[str] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True) # Pydantic V2 kompatibilis
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
class UserStatSchema(BaseModel):
|
||||
user_id: int
|
||||
total_xp: int # JAVÍTVA: total_xp a modell szerint
|
||||
total_xp: int
|
||||
current_level: int
|
||||
penalty_points: int # JAVÍTVA: új mező
|
||||
penalty_points: int
|
||||
rank_title: Optional[str] = None
|
||||
badges: List[BadgeSchema] = []
|
||||
|
||||
|
||||
56
backend/app/schemas/vehicle.py
Normal file
56
backend/app/schemas/vehicle.py
Normal file
@@ -0,0 +1,56 @@
|
||||
"""
|
||||
Jármű értékelési sémák a Social 1 modulhoz.
|
||||
"""
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class VehicleRatingCreate(BaseModel):
|
||||
"""Értékelés beküldéséhez használt séma."""
|
||||
driving_experience: int = Field(..., ge=1, le=10, description="Vezetési élmény 1-10 skálán")
|
||||
reliability: int = Field(..., ge=1, le=10, description="Megbízhatóság 1-10 skálán")
|
||||
comfort: int = Field(..., ge=1, le=10, description="Kényelem 1-10 skálán")
|
||||
consumption_satisfaction: int = Field(..., ge=1, le=10, description="Fogyasztás elégedettség 1-10 skálán")
|
||||
comment: Optional[str] = Field(None, max_length=1000, description="Opcionális megjegyzés")
|
||||
|
||||
@validator('driving_experience', 'reliability', 'comfort', 'consumption_satisfaction')
|
||||
def validate_rating_range(cls, v):
|
||||
if not 1 <= v <= 10:
|
||||
raise ValueError('Értékelésnek 1 és 10 között kell lennie')
|
||||
return v
|
||||
|
||||
|
||||
class VehicleRatingResponse(BaseModel):
|
||||
"""Értékelés válasza, tartalmazza a számított átlagpontszámot."""
|
||||
id: UUID
|
||||
vehicle_id: int
|
||||
user_id: int
|
||||
driving_experience: int
|
||||
reliability: int
|
||||
comfort: int
|
||||
consumption_satisfaction: int
|
||||
comment: Optional[str]
|
||||
average_score: float = Field(..., description="Számított átlagpontszám (4 dimenzió átlaga)")
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
@validator('average_score', pre=True, always=True)
|
||||
def calculate_average(cls, v, values):
|
||||
"""Számolja ki az átlagpontszámot, ha nincs megadva."""
|
||||
if v is not None:
|
||||
return v
|
||||
# Ha nincs megadva, számoljuk ki a 4 dimenzióból
|
||||
scores = [
|
||||
values.get('driving_experience'),
|
||||
values.get('reliability'),
|
||||
values.get('comfort'),
|
||||
values.get('consumption_satisfaction')
|
||||
]
|
||||
if any(score is None for score in scores):
|
||||
raise ValueError('Nem lehet kiszámolni az átlagot hiányzó értékelések miatt')
|
||||
return sum(scores) / 4.0
|
||||
@@ -1,30 +0,0 @@
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from typing import Optional, List, Any
|
||||
from uuid import UUID
|
||||
from datetime import datetime
|
||||
|
||||
class EngineSpecBase(BaseModel):
|
||||
engine_code: str
|
||||
fuel_type: str
|
||||
power_kw: int
|
||||
default_service_interval_km: int = 15000
|
||||
|
||||
class VehicleBase(BaseModel):
|
||||
brand_id: int
|
||||
model_name: str
|
||||
identification_number: str
|
||||
license_plate: Optional[str] = None
|
||||
tracking_mode: str = "km"
|
||||
|
||||
class VehicleCreate(VehicleBase):
|
||||
current_company_id: int
|
||||
engine_spec_id: int
|
||||
|
||||
class VehicleRead(VehicleBase):
|
||||
id: UUID
|
||||
current_rating_pct: int
|
||||
total_real_usage: float
|
||||
created_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
Reference in New Issue
Block a user