From ba793543861fce0a01289b3b70f46078f5be6e11 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Sat, 6 Dec 2025 15:03:23 +0300 Subject: [PATCH] Create new fournisseur --- api.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ sage_client.py | 12 ++++++++ 2 files changed, 88 insertions(+) diff --git a/api.py b/api.py index fbab037..16a7acf 100644 --- a/api.py +++ b/api.py @@ -214,6 +214,36 @@ class UserResponse(BaseModel): from_attributes = True +class FournisseurCreateAPIRequest(BaseModel): + intitule: str = Field(..., min_length=1, max_length=69, description="Raison sociale du fournisseur") + compte_collectif: str = Field("401000", description="Compte comptable fournisseur (ex: 401000)") + num: Optional[str] = Field(None, max_length=17, description="Code fournisseur souhaité (optionnel)") + adresse: Optional[str] = Field(None, max_length=35) + code_postal: Optional[str] = Field(None, max_length=9) + ville: Optional[str] = Field(None, max_length=35) + pays: Optional[str] = Field(None, max_length=35) + email: Optional[EmailStr] = None + telephone: Optional[str] = Field(None, max_length=21) + siret: Optional[str] = Field(None, max_length=14) + tva_intra: Optional[str] = Field(None, max_length=25) + + class Config: + json_schema_extra = { + "example": { + "intitule": "ACME SUPPLIES SARL", + "compte_collectif": "401000", + "num": "FOUR001", + "adresse": "15 Rue du Commerce", + "code_postal": "75001", + "ville": "Paris", + "pays": "France", + "email": "contact@acmesupplies.fr", + "telephone": "0145678901", + "siret": "12345678901234", + "tva_intra": "FR12345678901" + } + } + # ===================================================== # SERVICES EXTERNES (Universign) # ===================================================== @@ -1819,6 +1849,52 @@ async def rechercher_fournisseurs(query: Optional[str] = Query(None)): logger.error(f"❌ Erreur recherche fournisseurs: {e}") raise HTTPException(500, str(e)) +@app.post("/fournisseurs", status_code=201, tags=["Fournisseurs"]) +async def ajouter_fournisseur( + fournisseur: FournisseurCreateAPIRequest, + session: AsyncSession = Depends(get_session) +): + """ + ➕ Création d'un nouveau fournisseur dans Sage 100c + + **Champs obligatoires:** + - `intitule`: Raison sociale (max 69 caractères) + + **Champs optionnels:** + - `compte_collectif`: Compte comptable (défaut: 401000) + - `num`: Code fournisseur personnalisé (auto-généré si vide) + - `adresse`, `code_postal`, `ville`, `pays` + - `email`, `telephone` + - `siret`, `tva_intra` + + **Retour:** + - Fournisseur créé avec son numéro définitif + + **Erreurs possibles:** + - 400: Fournisseur existe déjà (doublon) + - 500: Erreur technique Sage + """ + try: + # Appel à la gateway Windows via sage_client + nouveau_fournisseur = sage_client.creer_fournisseur(fournisseur.dict()) + + logger.info(f"✅ Fournisseur créé via API: {nouveau_fournisseur.get('numero')}") + + return { + "success": True, + "message": "Fournisseur créé avec succès", + "data": nouveau_fournisseur + } + + except ValueError as e: + # Erreur métier (doublon, validation) + logger.warning(f"⚠️ Erreur métier création fournisseur: {e}") + raise HTTPException(400, str(e)) + + except Exception as e: + # Erreur technique (COM, connexion) + logger.error(f"❌ Erreur technique création fournisseur: {e}") + raise HTTPException(500, str(e)) @app.get("/fournisseurs/{code}", tags=["Fournisseurs"]) async def lire_fournisseur(code: str): diff --git a/sage_client.py b/sage_client.py index 732fe2d..3074119 100644 --- a/sage_client.py +++ b/sage_client.py @@ -275,6 +275,18 @@ class SageGatewayClient: """Lecture d'un fournisseur par code""" return self._post("/sage/fournisseurs/get", {"code": code}).get("data") + def creer_fournisseur(self, fournisseur_data: Dict) -> Dict: + """ + Envoie la requête de création de fournisseur à la gateway Windows. + + Args: + fournisseur_data: Dict contenant intitule, compte_collectif, etc. + + Returns: + Fournisseur créé avec son numéro définitif + """ + return self._post("/sage/fournisseurs/create", fournisseur_data).get("data", {}) + # ===================================================== # AVOIRS # =====================================================