from pydantic import BaseModel, Field, EmailStr, validator, field_validator from typing import List, Optional, Dict, ClassVar, Any from datetime import date, datetime from enum import Enum, IntEnum class LigneFacture(BaseModel): """Ligne de facture""" article_code: str quantite: float remise_pourcentage: Optional[float] = 0.0 @field_validator("article_code", mode="before") def strip_insecables(cls, v): return v.replace("\xa0", "").strip() class FactureCreateRequest(BaseModel): """Création d'une facture""" client_id: str date_facture: Optional[date] = None date_livraison: Optional[date] = None lignes: List[LigneFacture] reference: Optional[str] = None class Config: json_schema_extra = { "example": { "client_id": "CLI000001", "date_facture": "2024-01-15", "reference": "FA-EXT-001", "lignes": [ { "article_code": "ART001", "quantite": 10.0, "prix_unitaire_ht": 50.0, "remise_pourcentage": 5.0, } ], } } class FactureUpdateRequest(BaseModel): """Modification d'une facture existante""" date_facture: Optional[date] = None date_livraison: Optional[date] = None lignes: Optional[List[LigneFacture]] = None statut: Optional[int] = Field(None, ge=0, le=6) reference: Optional[str] = None class Config: json_schema_extra = { "example": { "date_facture": "2024-01-15", "date_livraison": "2024-01-15", "lignes": [ { "article_code": "ART001", "quantite": 15.0, "prix_unitaire_ht": 45.0, } ], "statut": 2, } }