frontend költség beállítások

This commit is contained in:
Roo
2026-06-23 21:11:21 +00:00
parent 5b437b220d
commit 71ef33bb85
90 changed files with 11850 additions and 1053 deletions

View File

@@ -2,7 +2,7 @@
from pydantic import BaseModel, ConfigDict, Field, validator, root_validator, model_validator, field_validator
from typing import Optional, Dict, Any, List
from uuid import UUID
from datetime import datetime
from datetime import datetime, date
class AssetCatalogResponse(BaseModel):
""" A technikai katalógus (Master Data) teljes adattartalma. """
@@ -86,6 +86,19 @@ class AssetResponse(BaseModel):
is_under_warranty: bool = Field(default=False, description="Érvényes jótállás")
warranty_expiry_date: Optional[datetime] = Field(None, description="Jótállás érvényességi dátuma")
# === REGISTRATION DOCUMENTS ===
registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedély száma")
registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedély érvényességi ideje")
vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv száma")
# === INTERNATIONALIZATION (ÚJ) ===
registration_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Regisztráció országa (ISO 3166-1 alpha-2, pl. 'HU', 'SK', 'DE')")
first_domestic_registration_date: Optional[date] = Field(None, description="Első belföldi forgalomba helyezés dátuma")
import_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Importország (ISO 3166-1 alpha-2), ha importált jármű")
title_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szám (title document)")
engine_number: Optional[str] = Field(None, max_length=100, description="Motorszám")
number_of_previous_owners: Optional[int] = Field(None, ge=0, description="Előző tulajdonosok száma")
# === SALES MODULE ===
is_for_sale: bool = Field(default=False)
price: Optional[float] = None
@@ -228,12 +241,53 @@ class AssetCreate(BaseModel):
is_under_warranty: bool = Field(default=False, description="Érvényes jótállás")
warranty_expiry_date: Optional[datetime] = Field(None, description="Jótállás érvényességi dátuma")
# === REGISTRATION DOCUMENTS ===
registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedély száma")
registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedély érvényességi ideje")
vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv száma")
# === INTERNATIONALIZATION (ÚJ) ===
registration_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Regisztráció országa (ISO 3166-1 alpha-2, pl. 'HU', 'SK', 'DE')")
first_domestic_registration_date: Optional[date] = Field(None, description="Első belföldi forgalomba helyezés dátuma")
import_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Importország (ISO 3166-1 alpha-2), ha importált jármű")
title_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szám (title document)")
engine_number: Optional[str] = Field(None, max_length=100, description="Motorszám")
number_of_previous_owners: Optional[int] = Field(None, ge=0, description="Előző tulajdonosok száma")
# === PRIMARY VEHICLE FLAG ===
is_primary: bool = Field(default=False, description="Elsődleges jármű (tárolva: individual_equipment JSONB)")
# === DATA STATUS (for transfer/duplicate scenarios) ===
data_status: Optional[str] = Field(None, description="Adat státusz (pl. 'draft' tulajdonosváltáskor)")
# ── Internationalization validators ──
@field_validator('registration_country', 'import_country')
@classmethod
def validate_iso_country(cls, v: Optional[str]) -> Optional[str]:
"""registration_country és import_country: pontosan 2 karakteres nagybetűs string (ISO 3166-1 alpha-2)."""
if v is None or not isinstance(v, str):
return v
cleaned = v.strip().upper()
if len(cleaned) != 2:
raise ValueError(f'Az országkódnak pontosan 2 karakter hosszúnak kell lennie (ISO 3166-1 alpha-2), kapott: "{v}"')
return cleaned
@field_validator('number_of_previous_owners')
@classmethod
def validate_previous_owners(cls, v: Optional[int]) -> Optional[int]:
"""number_of_previous_owners >= 0."""
if v is not None and v < 0:
raise ValueError('Az előző tulajdonosok száma nem lehet negatív')
return v
@field_validator('first_domestic_registration_date')
@classmethod
def validate_not_future_date(cls, v: Optional[date]) -> Optional[date]:
"""first_domestic_registration_date nem lehet jövőbeli dátum."""
if v is not None and v > date.today():
raise ValueError('Az első belföldi forgalomba helyezés dátuma nem lehet jövőbeli')
return v
# === STATUS VALIDATION ===
@validator('status', pre=True, always=True)
def determine_status(cls, v, values):
@@ -370,6 +424,47 @@ class AssetUpdate(BaseModel):
is_under_warranty: Optional[bool] = Field(None, description="Érvényes jótállás")
warranty_expiry_date: Optional[datetime] = Field(None, description="Jótállás érvényességi dátuma")
# === REGISTRATION DOCUMENTS ===
registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedély száma")
registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedély érvényességi ideje")
vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv száma")
# === INTERNATIONALIZATION (ÚJ) ===
registration_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Regisztráció országa (ISO 3166-1 alpha-2, pl. 'HU', 'SK', 'DE')")
first_domestic_registration_date: Optional[date] = Field(None, description="Első belföldi forgalomba helyezés dátuma")
import_country: Optional[str] = Field(None, min_length=2, max_length=2, description="Importország (ISO 3166-1 alpha-2), ha importált jármű")
title_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szám (title document)")
engine_number: Optional[str] = Field(None, max_length=100, description="Motorszám")
number_of_previous_owners: Optional[int] = Field(None, ge=0, description="Előző tulajdonosok száma")
# ── Internationalization validators ──
@field_validator('registration_country', 'import_country')
@classmethod
def validate_iso_country(cls, v: Optional[str]) -> Optional[str]:
"""registration_country és import_country: pontosan 2 karakteres nagybetűs string (ISO 3166-1 alpha-2)."""
if v is None or not isinstance(v, str):
return v
cleaned = v.strip().upper()
if len(cleaned) != 2:
raise ValueError(f'Az országkódnak pontosan 2 karakter hosszúnak kell lennie (ISO 3166-1 alpha-2), kapott: "{v}"')
return cleaned
@field_validator('number_of_previous_owners')
@classmethod
def validate_previous_owners(cls, v: Optional[int]) -> Optional[int]:
"""number_of_previous_owners >= 0."""
if v is not None and v < 0:
raise ValueError('Az előző tulajdonosok száma nem lehet negatív')
return v
@field_validator('first_domestic_registration_date')
@classmethod
def validate_not_future_date(cls, v: Optional[date]) -> Optional[date]:
"""first_domestic_registration_date nem lehet jövőbeli dátum."""
if v is not None and v > date.today():
raise ValueError('Az első belföldi forgalomba helyezés dátuma nem lehet jövőbeli')
return v
# === STATUS ===
current_mileage: Optional[int] = Field(None, ge=0, description="Aktuális km óra állás")
is_primary: Optional[bool] = Field(None, description="Elsődleges jármű")