From 149d8fb2def3d5a00a4a5e29b40b1d706fb742c3 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Thu, 15 Jan 2026 14:38:42 +0300 Subject: [PATCH] feat(factures): add invoice validation endpoints and client methods --- api.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ sage_client.py | 18 +++++++++++ 2 files changed, 99 insertions(+) diff --git a/api.py b/api.py index 7c3146e..73cab27 100644 --- a/api.py +++ b/api.py @@ -2965,6 +2965,87 @@ async def preview_societe(): return f"

Erreur

{str(e)}

" +@app.post("/factures/{numero_facture}/valider", status_code=200, tags=["Factures"]) +async def valider_facture( + numero_facture: str, + session: AsyncSession = Depends(get_session), +): + """ + Valide une facture (pose le cadenas) + """ + try: + resultat = sage_client.valider_facture(numero_facture) + + logger.info( + f"Facture {numero_facture} validée: {resultat.get('action_effectuee')}" + ) + + return { + "success": True, + "message": resultat.get("message", "Facture validée"), + "data": resultat, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Erreur validation facture {numero_facture}: {e}") + raise HTTPException(500, str(e)) + + +@app.post("/factures/{numero_facture}/devalider", status_code=200, tags=["Factures"]) +async def devalider_facture( + numero_facture: str, + session: AsyncSession = Depends(get_session), +): + """ + Dévalide une facture (retire le cadenas) + + Impossible si la facture a des règlements. + """ + try: + resultat = sage_client.devalider_facture(numero_facture) + + logger.info( + f"Facture {numero_facture} dévalidée: {resultat.get('action_effectuee')}" + ) + + return { + "success": True, + "message": resultat.get("message", "Facture dévalidée"), + "data": resultat, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Erreur dévalidation facture {numero_facture}: {e}") + raise HTTPException(500, str(e)) + + +@app.get("/factures/{numero_facture}/statut-validation", tags=["Factures"]) +async def get_statut_validation_facture( + numero_facture: str, + session: AsyncSession = Depends(get_session), +): + """ + Retourne le statut de validation d'une facture + """ + try: + resultat = sage_client.get_statut_validation(numero_facture) + + return { + "success": True, + "data": resultat, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Erreur lecture statut {numero_facture}: {e}") + raise HTTPException(500, str(e)) + + @app.get("/health", tags=["System"]) async def health_check( sage: SageGatewayClient = Depends(get_sage_client_for_user), diff --git a/sage_client.py b/sage_client.py index f938ab5..7effc22 100644 --- a/sage_client.py +++ b/sage_client.py @@ -431,6 +431,24 @@ class SageGatewayClient: """Lit les informations de la société depuis P_DOSSIER""" return self._get("/sage/societe/info").get("data") + def valider_facture(self, numero_facture: str) -> dict: + """Valide une facture""" + return self._post(f"/sage/factures/{numero_facture}/valider", {}).get( + "data", {} + ) + + def devalider_facture(self, numero_facture: str) -> dict: + """Dévalide une facture""" + return self._post(f"/sage/factures/{numero_facture}/devalider", {}).get( + "data", {} + ) + + def get_statut_validation(self, numero_facture: str) -> dict: + """Récupère le statut de validation""" + return self._get(f"/sage/factures/{numero_facture}/statut-validation").get( + "data", {} + ) + def refresh_cache(self) -> Dict: return self._post("/sage/cache/refresh")