refaktorálás javításai

This commit is contained in:
Roo
2026-03-13 10:22:41 +00:00
parent 2d8d23f469
commit f53e0b53df
140 changed files with 7316 additions and 4579 deletions

View File

@@ -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

View 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")

View 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)

View File

@@ -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] = []

View 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

View File

@@ -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