diff --git a/api.py b/api.py index 16a7acf..a49060c 100644 --- a/api.py +++ b/api.py @@ -244,6 +244,28 @@ class FournisseurCreateAPIRequest(BaseModel): } } +class FournisseurUpdateRequest(BaseModel): + """Modèle pour modification d'un fournisseur existant""" + intitule: Optional[str] = Field(None, min_length=1, max_length=69) + 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 MODIFIÉ", + "email": "nouveau@acme.fr", + "telephone": "0198765432" + } + } + + # ===================================================== # SERVICES EXTERNES (Universign) # ===================================================== @@ -1896,6 +1918,51 @@ async def ajouter_fournisseur( logger.error(f"❌ Erreur technique création fournisseur: {e}") raise HTTPException(500, str(e)) +@app.put("/fournisseurs/{code}", tags=["Fournisseurs"]) +async def modifier_fournisseur( + code: str, + fournisseur_update: FournisseurUpdateRequest, + session: AsyncSession = Depends(get_session) +): + """ + ✏️ Modification d'un fournisseur existant + + Args: + code: Code du fournisseur à modifier + fournisseur_update: Champs à mettre à jour (seuls les champs fournis seront modifiés) + + Returns: + Fournisseur modifié avec ses nouvelles valeurs + + Example: + PUT /fournisseurs/DUPONT + { + "email": "nouveau@email.fr", + "telephone": "0198765432" + } + """ + try: + # Appel à la gateway Windows + resultat = sage_client.modifier_fournisseur(code, fournisseur_update.dict(exclude_none=True)) + + logger.info(f"✅ Fournisseur {code} modifié avec succès") + + return { + "success": True, + "message": f"Fournisseur {code} modifié avec succès", + "fournisseur": resultat + } + + except ValueError as e: + # Erreur métier (fournisseur introuvable, etc.) + logger.warning(f"Erreur métier modification fournisseur {code}: {e}") + raise HTTPException(404, str(e)) + except Exception as e: + # Erreur technique + logger.error(f"Erreur technique modification fournisseur {code}: {e}") + raise HTTPException(500, str(e)) + + @app.get("/fournisseurs/{code}", tags=["Fournisseurs"]) async def lire_fournisseur(code: str): """📄 Lecture d'un fournisseur par code""" diff --git a/sage_client.py b/sage_client.py index 3074119..4d5a0c5 100644 --- a/sage_client.py +++ b/sage_client.py @@ -287,6 +287,23 @@ class SageGatewayClient: """ return self._post("/sage/fournisseurs/create", fournisseur_data).get("data", {}) + def modifier_fournisseur(self, code: str, fournisseur_data: Dict) -> Dict: + """ + ✏️ Modification d'un fournisseur existant + + Args: + code: Code du fournisseur à modifier + fournisseur_data: Dictionnaire contenant les champs à modifier + (seuls les champs présents seront mis à jour) + + Returns: + Fournisseur modifié + """ + return self._post("/sage/fournisseurs/update", { + "code": code, + "fournisseur_data": fournisseur_data + }).get("data", {}) + # ===================================================== # AVOIRS # =====================================================