From c7f4df2b2f3e98f390935091edeb3f4658568144 Mon Sep 17 00:00:00 2001 From: Matteo Giustini Date: Mon, 25 May 2026 15:51:43 +0200 Subject: [PATCH] Schema completo flusso valutazioni (!) --- backend/app/schemas/valuation.py | 156 +++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 backend/app/schemas/valuation.py diff --git a/backend/app/schemas/valuation.py b/backend/app/schemas/valuation.py new file mode 100644 index 0000000..1e74815 --- /dev/null +++ b/backend/app/schemas/valuation.py @@ -0,0 +1,156 @@ +from datetime import datetime, date +from decimal import Decimal +from typing import Any +from pydantic import BaseModel, Field + + +class ValuationCreate(BaseModel): + plate: str = Field(..., min_length=5, max_length=10) + motornet_code: str | None = None + mileage: int | None = Field(None, ge=0) + retake_regime: str | None = None + expected_return_date: date | None = None + interest_fuel: str | None = None + priority: str = "valutazione" + notes: str | None = None + + +class CommentCreate(BaseModel): + content: str = Field(..., min_length=1) + visible_to_all: bool = True + + +class CommentResponse(BaseModel): + id: int + valuation_id: int + user_id: int + user_full_name: str | None = None + content: str + visible_to_all: bool + created_at: datetime + + model_config = {"from_attributes": True} + + +class PhotoResponse(BaseModel): + id: int + valuation_id: int + filename: str + storage_path: str + uploaded_by: int + uploaded_at: datetime + url: str | None = None + + model_config = {"from_attributes": True} + + +class HistoryResponse(BaseModel): + id: int + field_name: str + old_value: str | None + new_value: str | None + changed_by: int + changed_by_name: str | None = None + changed_at: datetime + + model_config = {"from_attributes": True} + + +class VehicleInfo(BaseModel): + plate: str + vin: str | None + vehicle_type: str | None + registration_date: date | None + version_label: str | None + brand_name: str | None + model_description: str | None + gamma_description: str | None + list_price: Decimal | None + + +class MotornetValuationResponse(BaseModel): + id: int + valuation_id: int + plate: str + motornet_code: str | None + fetched_at: datetime + registration_year: int | None + registration_month: int | None + mileage: int | None + motornet_id: int | None + ediz_dati: str | None + brand_name: str | None + model_description: str | None + allestimento: str | None + alimentazione: str | None + immagine_url: str | None + xml_url: str | None + percorrenza_media_km: int | None + quotazione_blu: Decimal | None + quotazione_blu_km: Decimal | None + quotazione_giallo: Decimal | None + quotazione_giallo_km: Decimal | None + quotazione_blu_totale: Decimal | None + quotazione_giallo_totale: Decimal | None + variazione_km: Decimal | None + prezzo_listino: Decimal | None + prezzo_accessori: Decimal | None + totale_riparazioni_carrozzeria: Decimal | None + totale_riparazioni_meccanica: Decimal | None + raw_response: Any | None = None + + model_config = {"from_attributes": True} + + +class ValuationResponse(BaseModel): + id: int + plate: str + user_id: int + group_id: int | None + motornet_code: str | None + mileage: int | None + retake_regime: str | None + expected_return_date: date | None + interest_fuel: str | None + priority: str + notes: str | None + status: str + final_value: Decimal | None + evaluator_notes: str | None + is_frozen: bool + priority_rank: int + created_at: datetime + updated_at: datetime + vehicle: VehicleInfo | None = None + photos: list[PhotoResponse] = [] + comments: list[CommentResponse] = [] + history: list[HistoryResponse] = [] + motornet_valuations: list[MotornetValuationResponse] = [] + + model_config = {"from_attributes": True} + + +class ValuationListItem(BaseModel): + id: int + plate: str + status: str + priority: str + priority_rank: int + mileage: int | None + is_frozen: bool + created_at: datetime + updated_at: datetime + brand_name: str | None = None + model_description: str | None = None + version_label: str | None = None + final_value: Decimal | None = None + + model_config = {"from_attributes": True} + + +class PaginatedValuations(BaseModel): + items: list[ValuationListItem] + total: int + page: int + page_size: int + pages: int