From aa89ebdf9e8aba1d6f982596c87546dac0f3ab94 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Fri, 16 Jan 2026 15:46:58 +0300 Subject: [PATCH 1/3] feat(reglements): add endpoints to list and get payment details --- api.py | 30 +++++++++++++++++++++++++++++- sage_client.py | 13 ++++++------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/api.py b/api.py index 03fb2c5..b4592b2 100644 --- a/api.py +++ b/api.py @@ -4,7 +4,7 @@ from fastapi.responses import StreamingResponse, HTMLResponse, Response from fastapi.encoders import jsonable_encoder from pydantic import BaseModel, Field, EmailStr from typing import List, Optional -from datetime import datetime +from datetime import datetime, date import uvicorn import asyncio from contextlib import asynccontextmanager @@ -3240,6 +3240,34 @@ async def get_parametres_encaissement(): raise HTTPException(500, str(e)) +@app.get("/reglements", tags=["Règlements"]) +async def get_tous_reglements( + date_debut: Optional[date] = Query(None), + date_fin: Optional[date] = Query(None), + client_code: Optional[str] = Query(None), + type_reglement: Optional[str] = Query(None), + limit: int = Query(500), +): + """Liste tous les règlements avec filtres optionnels""" + params = {"limit": limit} + if date_debut: + params["date_debut"] = date_debut.isoformat() + if date_fin: + params["date_fin"] = date_fin.isoformat() + if client_code: + params["client_code"] = client_code + if type_reglement: + params["type_reglement"] = type_reglement + + return sage_client.get_tous_reglements(params) + + +@app.get("/reglements/{rg_no}", tags=["Règlements"]) +async def get_reglement_detail(rg_no: int): + """Détail complet d'un règlement""" + return sage_client.get_reglement_detail(rg_no) + + @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 6e61085..fc2c7a0 100644 --- a/sage_client.py +++ b/sage_client.py @@ -557,13 +557,6 @@ class SageGatewayClient: def get_comptes_generaux( self, prefixe: str = None, type_compte: str = None ) -> List[dict]: - """ - Récupère les comptes généraux - - Args: - prefixe: Filtre par préfixe (ex: "41", "51") - type_compte: "client", "fournisseur", "banque", "caisse", "tva" - """ params = {} if prefixe: params["prefixe"] = prefixe @@ -597,5 +590,11 @@ class SageGatewayClient: except Exception: return {"status": "down"} + def get_tous_reglements(self, params=None): + return self._get("/sage/reglements", params=params) + + def get_reglement_detail(self, rg_no): + return self._get(f"/sage/reglements/{rg_no}") + sage_client = SageGatewayClient() From 0e18129325c6e87c63beec23522242abffb0233e Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Fri, 16 Jan 2026 17:58:02 +0300 Subject: [PATCH 2/3] feat(reglements): add endpoint to get payment details by invoice number --- api.py | 11 ++++++++--- sage_client.py | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/api.py b/api.py index b4592b2..8b0b1b2 100644 --- a/api.py +++ b/api.py @@ -3246,10 +3246,9 @@ async def get_tous_reglements( date_fin: Optional[date] = Query(None), client_code: Optional[str] = Query(None), type_reglement: Optional[str] = Query(None), - limit: int = Query(500), ): """Liste tous les règlements avec filtres optionnels""" - params = {"limit": limit} + params = {} if date_debut: params["date_debut"] = date_debut.isoformat() if date_fin: @@ -3262,8 +3261,14 @@ async def get_tous_reglements( return sage_client.get_tous_reglements(params) +@app.get("/reglements/facture/{facture_no}", tags=["Règlements"]) +async def get_reglement_facture_detail(facture_no): + """Détail complet d'un règlement""" + return sage_client.get_reglement_facture_detail(facture_no) + + @app.get("/reglements/{rg_no}", tags=["Règlements"]) -async def get_reglement_detail(rg_no: int): +async def get_reglement_detail(rg_no): """Détail complet d'un règlement""" return sage_client.get_reglement_detail(rg_no) diff --git a/sage_client.py b/sage_client.py index fc2c7a0..0137512 100644 --- a/sage_client.py +++ b/sage_client.py @@ -593,6 +593,9 @@ class SageGatewayClient: def get_tous_reglements(self, params=None): return self._get("/sage/reglements", params=params) + def get_reglement_facture_detail(self, facture_no): + return self._get(f"/sage/reglements/facture/{facture_no}") + def get_reglement_detail(self, rg_no): return self._get(f"/sage/reglements/{rg_no}") From 89510537b35f57ab3620fde9c49e0f4ee769ca32 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Sat, 17 Jan 2026 11:41:44 +0300 Subject: [PATCH 3/3] fix(api): cast montant_total to float in regler_factures_multiple --- api.py | 2 +- schemas/documents/reglements.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/api.py b/api.py index 8b0b1b2..1b2e078 100644 --- a/api.py +++ b/api.py @@ -3079,7 +3079,7 @@ async def regler_factures_multiple( try: resultat = sage_client.regler_factures_client( client_code=reglement.client_id, - montant_total=reglement.montant_total, + montant_total=float(reglement.montant_total), mode_reglement=reglement.mode_reglement, date_reglement=reglement.date_reglement.isoformat() if reglement.date_reglement diff --git a/schemas/documents/reglements.py b/schemas/documents/reglements.py index 3a6248e..bf6d178 100644 --- a/schemas/documents/reglements.py +++ b/schemas/documents/reglements.py @@ -72,7 +72,6 @@ class ReglementMultipleCreate(BaseModel): client_id: str = Field(..., description="Code client") montant_total: Decimal = Field(..., gt=0) - # Même structure que ReglementFactureCreate devise_code: Optional[int] = Field(0) cours_devise: Optional[Decimal] = Field(1.0) mode_reglement: int = Field(...)