Create new fournisseur

This commit is contained in:
Fanilo-Nantenaina 2025-12-06 15:03:23 +03:00
parent 709de0cb2c
commit ba79354386
2 changed files with 88 additions and 0 deletions

76
api.py
View file

@ -214,6 +214,36 @@ class UserResponse(BaseModel):
from_attributes = True 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) # SERVICES EXTERNES (Universign)
# ===================================================== # =====================================================
@ -1819,6 +1849,52 @@ async def rechercher_fournisseurs(query: Optional[str] = Query(None)):
logger.error(f"❌ Erreur recherche fournisseurs: {e}") logger.error(f"❌ Erreur recherche fournisseurs: {e}")
raise HTTPException(500, str(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"]) @app.get("/fournisseurs/{code}", tags=["Fournisseurs"])
async def lire_fournisseur(code: str): async def lire_fournisseur(code: str):

View file

@ -275,6 +275,18 @@ class SageGatewayClient:
"""Lecture d'un fournisseur par code""" """Lecture d'un fournisseur par code"""
return self._post("/sage/fournisseurs/get", {"code": code}).get("data") 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 # AVOIRS
# ===================================================== # =====================================================