from pydantic import BaseModel, Field, validator from typing import Optional, ClassVar class Contact(BaseModel): """Contact associé à un tiers""" numero: Optional[str] = Field(None, description="Code du tiers parent (CT_Num)") contact_numero: Optional[int] = Field( None, description="Numéro unique du contact (CT_No)" ) n_contact: Optional[int] = Field( None, description="Numéro de référence contact (N_Contact)" ) civilite: Optional[str] = Field( None, description="Civilité : M., Mme, Mlle (CT_Civilite)" ) nom: Optional[str] = Field(None, description="Nom de famille (CT_Nom)") prenom: Optional[str] = Field(None, description="Prénom (CT_Prenom)") fonction: Optional[str] = Field(None, description="Fonction/Titre (CT_Fonction)") service_code: Optional[int] = Field(None, description="Code du service (N_Service)") telephone: Optional[str] = Field(None, description="Téléphone fixe (CT_Telephone)") portable: Optional[str] = Field( None, description="Téléphone mobile (CT_TelPortable)" ) telecopie: Optional[str] = Field(None, description="Fax (CT_Telecopie)") email: Optional[str] = Field(None, description="Adresse email (CT_EMail)") facebook: Optional[str] = Field(None, description="Profil Facebook (CT_Facebook)") linkedin: Optional[str] = Field(None, description="Profil LinkedIn (CT_LinkedIn)") skype: Optional[str] = Field(None, description="Identifiant Skype (CT_Skype)") est_defaut: Optional[bool] = Field(False, description="Contact par défaut") civilite_map: ClassVar[dict] = { 0: "M.", 1: "Mme", 2: "Mlle", 3: "Société", } @validator("civilite", pre=True, always=True) def convert_civilite(cls, v): if v is None: return v if isinstance(v, int): return cls.civilite_map.get(v, str(v)) return v class ContactCreate(BaseModel): """Données pour créer ou modifier un contact""" numero: str = Field(..., description="Code du client parent (obligatoire)") civilite: Optional[str] = Field(None, description="M., Mme, Mlle, Société") nom: str = Field(..., description="Nom de famille (obligatoire)") prenom: Optional[str] = Field(None, description="Prénom") fonction: Optional[str] = Field(None, description="Fonction/Titre") est_defaut: Optional[bool] = Field( False, description="Définir comme contact par défaut du client" ) service_code: Optional[int] = Field(None, description="Code du service") telephone: Optional[str] = Field(None, description="Téléphone fixe") portable: Optional[str] = Field(None, description="Téléphone mobile") telecopie: Optional[str] = Field(None, description="Fax") email: Optional[str] = Field(None, description="Email") facebook: Optional[str] = Field(None, description="URL Facebook") linkedin: Optional[str] = Field(None, description="URL LinkedIn") skype: Optional[str] = Field(None, description="Identifiant Skype") @validator("civilite") def validate_civilite(cls, v): if v and v not in ["M.", "Mme", "Mlle", "Société"]: raise ValueError("Civilité doit être: M., Mme, Mlle ou Société") return v class Config: json_schema_extra = { "example": { "numero": "CLI000001", "civilite": "M.", "nom": "Dupont", "prenom": "Jean", "fonction": "Directeur Commercial", "telephone": "0123456789", "portable": "0612345678", "email": "j.dupont@exemple.fr", "linkedin": "https://linkedin.com/in/jeandupont", "est_defaut": True, } } class ContactUpdate(BaseModel): """Données pour modifier un contact (tous champs optionnels)""" civilite: Optional[str] = None nom: Optional[str] = None prenom: Optional[str] = None fonction: Optional[str] = None service_code: Optional[int] = None telephone: Optional[str] = None portable: Optional[str] = None telecopie: Optional[str] = None email: Optional[str] = None facebook: Optional[str] = None linkedin: Optional[str] = None skype: Optional[str] = None est_defaut: Optional[bool] = None