Sage100-vps/schemas/tiers/contact.py

117 lines
4.3 KiB
Python

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