108 lines
2.6 KiB
Python
108 lines
2.6 KiB
Python
"""Pydantic schemas for sale-related request and response bodies."""
|
|
|
|
import uuid
|
|
from datetime import date, datetime
|
|
from decimal import Decimal
|
|
from typing import Literal, Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
SALE_STATUSES = Literal["draft", "completed", "cancelled"]
|
|
|
|
|
|
class SaleCreate(BaseModel):
|
|
"""POST /api/v1/sales request body."""
|
|
|
|
vehicle_id: uuid.UUID
|
|
buyer_contact_id: uuid.UUID
|
|
seller_contact_id: Optional[uuid.UUID] = None
|
|
sale_price: Decimal = Field(..., ge=0)
|
|
sale_date: Optional[date] = None
|
|
status: SALE_STATUSES = "draft"
|
|
is_gwg: bool = False
|
|
|
|
|
|
class SaleUpdate(BaseModel):
|
|
"""PUT /api/v1/sales/:id request body (all fields optional)."""
|
|
|
|
sale_price: Optional[Decimal] = Field(None, ge=0)
|
|
sale_date: Optional[date] = None
|
|
status: Optional[SALE_STATUSES] = None
|
|
is_gwg: Optional[bool] = None
|
|
seller_contact_id: Optional[uuid.UUID] = None
|
|
|
|
|
|
class VehicleNested(BaseModel):
|
|
"""Nested vehicle info in sale response."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
make: str
|
|
model: str
|
|
fin: str
|
|
vehicle_type: str
|
|
availability: str
|
|
price: Decimal
|
|
|
|
|
|
class ContactNested(BaseModel):
|
|
"""Nested contact info in sale response."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
company_name: str
|
|
address_city: Optional[str] = None
|
|
address_country: str
|
|
vat_id: Optional[str] = None
|
|
email: Optional[str] = None
|
|
phone: Optional[str] = None
|
|
|
|
|
|
class SaleResponse(BaseModel):
|
|
"""Sale response schema with nested vehicle and contacts."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
vehicle_id: uuid.UUID
|
|
buyer_contact_id: uuid.UUID
|
|
seller_contact_id: Optional[uuid.UUID] = None
|
|
sale_price: Decimal
|
|
sale_date: date
|
|
status: str
|
|
is_gwg: bool
|
|
contract_pdf_path: Optional[str] = None
|
|
created_at: Optional[datetime] = None
|
|
updated_at: Optional[datetime] = None
|
|
vehicle: Optional[VehicleNested] = None
|
|
buyer: Optional[ContactNested] = None
|
|
seller: Optional[ContactNested] = None
|
|
|
|
|
|
class SaleListResponse(BaseModel):
|
|
"""Paginated sale list response."""
|
|
|
|
items: list[SaleResponse]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
class ContractResponse(BaseModel):
|
|
"""Response for contract PDF generation/download."""
|
|
|
|
sale_id: uuid.UUID
|
|
contract_pdf_path: str
|
|
message: str = "Contract generated"
|
|
|
|
|
|
class UstIdVerifyResponse(BaseModel):
|
|
"""Response for USt-IdNr. verification."""
|
|
|
|
verified: bool
|
|
message: str
|
|
vat_id: Optional[str] = None
|