Files
erp-nutzfahrzeuge/backend/app/schemas/sale.py
T

108 lines
2.6 KiB
Python
Raw Normal View History

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