RABC fejlesztése és beélesítése hibák kijavításával
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# /opt/docker/dev/service_finder/backend/app/schemas/asset_event.py
|
||||
from pydantic import BaseModel, ConfigDict, Field, validator
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
from typing import Optional, Dict, Any, List
|
||||
from uuid import UUID
|
||||
from datetime import datetime
|
||||
@@ -17,6 +17,12 @@ class AssetEventTypeEnum(str, Enum):
|
||||
RECALL = "RECALL" # Visszahívás
|
||||
OTHER = "OTHER" # Egyéb
|
||||
|
||||
class AssetEventStatusEnum(str, Enum):
|
||||
"""Esemény státuszok a feldolgozási munkafolyamathoz."""
|
||||
DRAFT = "DRAFT"
|
||||
MISSING_TECH_DATA = "MISSING_TECH_DATA"
|
||||
COMPLETED = "COMPLETED"
|
||||
|
||||
class AssetEventCreate(BaseModel):
|
||||
"""Digitális Szervizkönyv esemény létrehozásához szükséges adatok."""
|
||||
event_type: AssetEventTypeEnum = Field(..., description="Esemény típusa")
|
||||
@@ -24,9 +30,10 @@ class AssetEventCreate(BaseModel):
|
||||
description: str = Field(..., min_length=1, max_length=1000, description="Esemény leírása")
|
||||
event_date: Optional[datetime] = Field(None, description="Esemény dátuma (alapértelmezett: most)")
|
||||
cost_id: Optional[UUID] = Field(None, description="Kapcsolódó költség rekord ID (opcionális)")
|
||||
|
||||
# RBAC ellenőrzés: csak a tulajdonos vagy operátor szervezet adhat hozzá eseményt
|
||||
# Ezt a service rétegben validáljuk, nem a sémában
|
||||
cost_amount: Optional[float] = Field(None, gt=0, description="Költség összege. Ha > 0, automatikusan létrejön egy AssetCost rekord.")
|
||||
currency: Optional[str] = Field(None, min_length=3, max_length=3, description="Valutakód (pl. HUF, EUR)")
|
||||
status: Optional[AssetEventStatusEnum] = Field(None, description="Esemény státusz (auto-set by backend)")
|
||||
linked_expense_id: Optional[UUID] = Field(None, description="Kapcsolódó AssetCost ID (kétirányú hivatkozáshoz)")
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@@ -41,6 +48,12 @@ class AssetEventResponse(BaseModel):
|
||||
odometer_reading: Optional[int] = None
|
||||
description: Optional[str] = None
|
||||
cost_id: Optional[UUID] = None
|
||||
cost_amount: Optional[float] = Field(None, description="Auto-created cost amount")
|
||||
currency: Optional[str] = Field(None, description="Currency code (e.g. HUF)")
|
||||
|
||||
# Új mezők
|
||||
status: str = "DRAFT"
|
||||
linked_expense_id: Optional[UUID] = None
|
||||
|
||||
event_date: datetime
|
||||
created_at: datetime
|
||||
@@ -52,6 +65,31 @@ class AssetEventResponse(BaseModel):
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
@classmethod
|
||||
def model_validate(cls, obj, **kwargs):
|
||||
"""Override to resolve cost_amount and currency from the related AssetCost.
|
||||
|
||||
GROSS-FIRST: cost_amount resolves from amount_gross (Bruttó) as primary source.
|
||||
"""
|
||||
data = {}
|
||||
if hasattr(obj, '__dict__'):
|
||||
# Copy ORM attributes
|
||||
for field in cls.model_fields:
|
||||
if hasattr(obj, field):
|
||||
data[field] = getattr(obj, field)
|
||||
|
||||
# Resolve cost_amount and currency from the cost relationship
|
||||
cost = getattr(obj, 'cost', None)
|
||||
if cost is not None:
|
||||
if data.get('cost_amount') is None:
|
||||
# GROSS-FIRST: prefer amount_gross as the source of truth
|
||||
data['cost_amount'] = float(cost.amount_gross) if cost.amount_gross is not None else (
|
||||
float(cost.amount_net) if cost.amount_net is not None else None
|
||||
)
|
||||
if data.get('currency') is None:
|
||||
data['currency'] = cost.currency
|
||||
return cls(**data)
|
||||
|
||||
class AssetEventUpdate(BaseModel):
|
||||
"""Digitális Szervizkönyv esemény frissítéséhez szükséges adatok."""
|
||||
event_type: Optional[AssetEventTypeEnum] = Field(None, description="Esemény típusa")
|
||||
@@ -59,8 +97,11 @@ class AssetEventUpdate(BaseModel):
|
||||
description: Optional[str] = Field(None, min_length=1, max_length=1000, description="Esemény leírása")
|
||||
event_date: Optional[datetime] = Field(None, description="Esemény dátuma")
|
||||
cost_id: Optional[UUID] = Field(None, description="Kapcsolódó költség rekord ID")
|
||||
status: Optional[AssetEventStatusEnum] = Field(None, description="Esemény státusz")
|
||||
linked_expense_id: Optional[UUID] = Field(None, description="Kapcsolódó AssetCost ID")
|
||||
|
||||
@validator('description')
|
||||
@field_validator('description')
|
||||
@classmethod
|
||||
def validate_description(cls, v):
|
||||
if v is not None and len(v.strip()) == 0:
|
||||
raise ValueError('Description cannot be empty or whitespace only')
|
||||
|
||||
Reference in New Issue
Block a user