From 459ce26766d4a985983c2a3772c98fb13fed5539 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Fri, 26 Dec 2025 20:33:53 +0300 Subject: [PATCH] feat(api): enhance FamilleResponse model with additional fields --- api.py | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 6 deletions(-) diff --git a/api.py b/api.py index c4ea553..e6d28be 100644 --- a/api.py +++ b/api.py @@ -1763,17 +1763,81 @@ class FamilleCreateRequest(BaseModel): class FamilleResponse(BaseModel): - """Modèle de réponse pour une famille d'articles""" + """Modèle de réponse pour une famille d'articles - aligné sur lister_toutes_familles""" + # === Identification === 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: Optional[bool] = Field(None, description="True si type Total") + est_total: bool = Field(..., description="True si type Total") + est_detail: Optional[bool] = Field(None, description="True si type Détail") + + # === Vente et unités === + unite_vente: Optional[str] = Field(None, description="Unité de vente") + unite_poids: Optional[str] = Field(None, description="Unité de poids") + coef: Optional[float] = Field(None, description="Coefficient") + + # === Stock et logistique === + 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") + + # === Comptabilité === compte_achat: Optional[str] = Field(None, description="Compte général achat") compte_vente: Optional[str] = Field(None, description="Compte général vente") - unite_vente: Optional[str] = Field(None, description="Unité de vente par défaut") - coef: Optional[float] = Field(None, description="Coefficient") + code_fiscal: Optional[str] = Field(None, description="Code fiscal") + escompte: Optional[bool] = Field(None, description="Escompte autorisé") + + # === Organisation === + est_centrale: Optional[bool] = Field(None, description="Famille centrale") + nature: Optional[int] = Field(None, description="Nature de la famille") + pays: Optional[str] = Field(None, description="Pays d'origine") + + # === Classifications === + categorie_1: Optional[int] = Field(None, description="Catégorie 1") + categorie_2: Optional[int] = Field(None, description="Catégorie 2") + categorie_3: Optional[int] = Field(None, description="Catégorie 3") + categorie_4: Optional[int] = Field(None, description="Catégorie 4") + + # === Statistiques === + stat_01: Optional[str] = Field(None, description="Statistique 1") + stat_02: Optional[str] = Field(None, description="Statistique 2") + stat_03: Optional[str] = Field(None, description="Statistique 3") + stat_04: Optional[str] = Field(None, description="Statistique 4") + stat_05: Optional[str] = Field(None, description="Statistique 5") + hors_statistique: Optional[bool] = Field(None, description="Exclue des statistiques") + est_statistique: Optional[bool] = Field(None, description="Incluse dans les statistiques (legacy)") + + # === Paramètres commerciaux === + vente_debit: Optional[bool] = Field(None, description="Vente au débit") + non_imprimable: Optional[bool] = Field(None, description="Non imprimable") + contremarque: Optional[bool] = Field(None, description="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é") + + # === Références === + racine_reference: Optional[str] = Field(None, description="Racine référence article") + racine_code_barre: Optional[str] = Field(None, description="Racine code-barres") + raccourci: Optional[str] = Field(None, description="Raccourci clavier") + + # === Gestion === + sous_traitance: Optional[bool] = Field(None, description="Sous-traitance") + fictif: Optional[bool] = Field(None, description="Famille fictive") + criticite: Optional[int] = Field(None, description="Niveau de criticité") + + # === Métadonnées (spécifiques à lire_famille) === + avertissement: Optional[str] = Field(None, description="Avertissement si famille Total") + index_com: Optional[int] = Field(None, description="Index COM (lire_famille uniquement)") + date_creation: Optional[str] = Field(None, description="Date de création") + date_modification: Optional[str] = Field(None, description="Date de modification") + nb_articles: Optional[int] = Field(None, description="Nombre d'articles dans la famille") + + # === Champs bruts SQL (optionnels) === + # Permet de conserver tous les champs SQL si besoin + champs_sql: Optional[Dict[str, Any]] = Field(None, description="Champs SQL bruts (si demandés)") class Config: json_schema_extra = { @@ -1783,14 +1847,57 @@ class FamilleResponse(BaseModel): "type": 0, "type_libelle": "Détail", "est_total": False, + "est_detail": True, + "unite_vente": "U", + "unite_poids": "KG", + "coef": 2.0, + "suivi_stock": True, + "garantie": 12, + "delai": 7, + "nb_colis": 1, "compte_achat": "607000", "compte_vente": "707000", - "unite_vente": "U", - "coef": 2.0, + "code_fiscal": "TVA20", + "escompte": True, + "est_centrale": False, + "nature": 0, + "pays": "FR", + "categorie_1": 1, + "categorie_2": 0, + "categorie_3": 0, + "categorie_4": 0, + "nb_articles": 45 } } +class FamilleListResponse(BaseModel): + """Modèle de réponse pour une liste de familles""" + + familles: list[FamilleResponse] = Field(..., description="Liste des familles") + total: int = Field(..., description="Nombre total de familles") + filtre_applique: Optional[str] = Field(None, description="Filtre appliqué") + inclut_totaux: bool = Field(..., description="Inclut les familles de type Total") + + class Config: + json_schema_extra = { + "example": { + "familles": [ + { + "code": "ZDIVERS", + "intitule": "Frais et accessoires", + "type": 0, + "type_libelle": "Détail", + "est_total": False, + "nb_articles": 45 + } + ], + "total": 1, + "filtre_applique": "frais", + "inclut_totaux": False + } + } + class MouvementStockLigneRequest(BaseModel): article_ref: str = Field(..., description="Référence de l'article") quantite: float = Field(..., gt=0, description="Quantité (>0)")