from pydantic import BaseModel, Field from typing import Optional class FamilleCreate(BaseModel): """Schéma pour création de famille d'articles""" code: str = Field(..., max_length=18, description="Code famille (max 18 car)") intitule: str = Field(..., max_length=69, description="Intitulé (max 69 car)") type: int = Field(0, ge=0, le=1, description="0=Détail, 1=Total") compte_achat: Optional[str] = Field( None, max_length=13, description="Compte général achat (ex: 607000)" ) compte_vente: Optional[str] = Field( None, max_length=13, description="Compte général vente (ex: 707000)" ) class Config: json_schema_extra = { "example": { "code": "PRODLAIT", "intitule": "Produits laitiers", "type": 0, "compte_achat": "607000", "compte_vente": "707000", } } class Familles(BaseModel): """Modèle complet d'une famille avec données comptables et fournisseur""" code: str = Field(..., description="Code famille") intitule: str = Field(..., description="Intitulé") type: int = Field(..., description="Type (0=Détail, 1=Total)") type_libelle: str = Field(..., description="Libellé du type") est_total: bool = Field(..., description="True si type Total") est_detail: bool = Field(..., description="True si type Détail") unite_vente: Optional[str] = Field(None, description="Unité de vente par défaut") unite_poids: Optional[str] = Field(None, description="Unité de poids") coef: Optional[float] = Field(None, description="Coefficient multiplicateur") suivi_stock: Optional[bool] = Field(None, description="Suivi du stock activé") garantie: Optional[int] = Field(None, description="Durée de garantie (mois)") delai: Optional[int] = Field(None, description="Délai de livraison (jours)") nb_colis: Optional[int] = Field(None, description="Nombre de colis") code_fiscal: Optional[str] = Field(None, description="Code fiscal par défaut") escompte: Optional[bool] = Field(None, description="Escompte autorisé") est_centrale: Optional[bool] = Field(None, description="Famille d'achat centralisé") nature: Optional[int] = Field(None, description="Nature de la famille") pays: Optional[str] = Field(None, description="Pays d'origine") categorie_1: Optional[int] = Field( None, description="Catégorie comptable 1 (CL_No1)" ) categorie_2: Optional[int] = Field( None, description="Catégorie comptable 2 (CL_No2)" ) categorie_3: Optional[int] = Field( None, description="Catégorie comptable 3 (CL_No3)" ) categorie_4: Optional[int] = Field( None, description="Catégorie comptable 4 (CL_No4)" ) stat_01: Optional[str] = Field(None, description="Statistique libre 1") stat_02: Optional[str] = Field(None, description="Statistique libre 2") stat_03: Optional[str] = Field(None, description="Statistique libre 3") stat_04: Optional[str] = Field(None, description="Statistique libre 4") stat_05: Optional[str] = Field(None, description="Statistique libre 5") hors_statistique: Optional[bool] = Field( None, description="Exclue des statistiques" ) vente_debit: Optional[bool] = Field(None, description="Vente au débit") non_imprimable: Optional[bool] = Field( None, description="Non imprimable sur documents" ) contremarque: Optional[bool] = Field(None, description="Article en contremarque") fact_poids: Optional[bool] = Field(None, description="Facturation au poids") fact_forfait: Optional[bool] = Field(None, description="Facturation forfaitaire") publie: Optional[bool] = Field(None, description="Publié (e-commerce)") racine_reference: Optional[str] = Field( None, description="Racine pour génération auto de références" ) racine_code_barre: Optional[str] = Field( None, description="Racine pour génération auto de codes-barres" ) raccourci: Optional[str] = Field(None, description="Raccourci clavier") sous_traitance: Optional[bool] = Field( None, description="Famille en sous-traitance" ) fictif: Optional[bool] = Field(None, description="Famille fictive (nomenclature)") criticite: Optional[int] = Field(None, description="Niveau de criticité (0-5)") compte_vente: Optional[str] = Field(None, description="Compte général de vente") compte_auxiliaire_vente: Optional[str] = Field( None, description="Compte auxiliaire de vente" ) tva_vente_1: Optional[str] = Field(None, description="Code TVA vente principal") tva_vente_2: Optional[str] = Field(None, description="Code TVA vente secondaire") tva_vente_3: Optional[str] = Field(None, description="Code TVA vente tertiaire") type_facture_vente: Optional[int] = Field(None, description="Type de facture vente") compte_achat: Optional[str] = Field(None, description="Compte général d'achat") compte_auxiliaire_achat: Optional[str] = Field( None, description="Compte auxiliaire d'achat" ) tva_achat_1: Optional[str] = Field(None, description="Code TVA achat principal") tva_achat_2: Optional[str] = Field(None, description="Code TVA achat secondaire") tva_achat_3: Optional[str] = Field(None, description="Code TVA achat tertiaire") type_facture_achat: Optional[int] = Field(None, description="Type de facture achat") compte_stock: Optional[str] = Field(None, description="Compte de stock") compte_auxiliaire_stock: Optional[str] = Field( None, description="Compte auxiliaire de stock" ) fournisseur_principal: Optional[str] = Field( None, description="N° compte fournisseur principal" ) fournisseur_unite: Optional[str] = Field( None, description="Unité d'achat fournisseur" ) fournisseur_conversion: Optional[float] = Field( None, description="Coefficient de conversion" ) fournisseur_delai_appro: Optional[int] = Field( None, description="Délai d'approvisionnement (jours)" ) fournisseur_garantie: Optional[int] = Field( None, description="Garantie fournisseur (mois)" ) fournisseur_colisage: Optional[int] = Field( None, description="Colisage fournisseur" ) fournisseur_qte_mini: Optional[float] = Field( None, description="Quantité minimum de commande" ) fournisseur_qte_mont: Optional[float] = Field(None, description="Quantité montant") fournisseur_devise: Optional[int] = Field( None, description="Devise fournisseur (0=Euro)" ) fournisseur_remise: Optional[float] = Field( None, description="Remise fournisseur (%)" ) fournisseur_type_remise: Optional[int] = Field( None, description="Type de remise (0=%, 1=Montant)" ) nb_articles: Optional[int] = Field( None, description="Nombre d'articles dans la famille" ) FA_CodeFamille: Optional[str] = Field(None, description="[Legacy] Code famille") FA_Intitule: Optional[str] = Field(None, description="[Legacy] Intitulé") FA_Type: Optional[int] = Field(None, description="[Legacy] Type") CG_NumVte: Optional[str] = Field(None, description="[Legacy] Compte vente") CG_NumAch: Optional[str] = Field(None, description="[Legacy] Compte achat") class Config: json_schema_extra = { "example": { "code": "ELECT", "intitule": "Électronique et Informatique", "type": 0, "type_libelle": "Détail", "est_total": False, "est_detail": True, "unite_vente": "U", "unite_poids": "KG", "coef": 2.5, "suivi_stock": True, "garantie": 24, "delai": 5, "nb_colis": 1, "code_fiscal": "C19", "escompte": True, "est_centrale": False, "nature": 0, "pays": "FR", "categorie_1": 1, "categorie_2": 0, "categorie_3": 0, "categorie_4": 0, "stat_01": "HIGH_TECH", "stat_02": "", "stat_03": "", "stat_04": "", "stat_05": "", "hors_statistique": False, "vente_debit": False, "non_imprimable": False, "contremarque": False, "fact_poids": False, "fact_forfait": False, "publie": True, "racine_reference": "ELEC", "racine_code_barre": "339", "raccourci": "F5", "sous_traitance": False, "fictif": False, "criticite": 2, "compte_vente": "707100", "compte_auxiliaire_vente": "", "tva_vente_1": "C19", "tva_vente_2": "", "tva_vente_3": "", "type_facture_vente": 0, "compte_achat": "607100", "compte_auxiliaire_achat": "", "tva_achat_1": "C19", "tva_achat_2": "", "tva_achat_3": "", "type_facture_achat": 0, "compte_stock": "350000", "compte_auxiliaire_stock": "", "fournisseur_principal": "FTECH001", "fournisseur_unite": "U", "fournisseur_conversion": 1.0, "fournisseur_delai_appro": 7, "fournisseur_garantie": 12, "fournisseur_colisage": 10, "fournisseur_qte_mini": 5.0, "fournisseur_qte_mont": 100.0, "fournisseur_devise": 0, "fournisseur_remise": 5.0, "fournisseur_type_remise": 0, "nb_articles": 156, } } class FamilleList(BaseModel): """Réponse pour la liste des familles""" familles: list[Familles] total: int filtre: Optional[str] = None inclure_totaux: bool = True class Config: json_schema_extra = { "example": { "familles": [], "total": 42, "filtre": "ELECT", "inclure_totaux": False, } }