From 9ae447e2c710e24cf31aaf3384c725a2e0c5172c Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Tue, 13 Jan 2026 17:03:18 +0300 Subject: [PATCH 1/2] feat(society): add company info schema and endpoint --- api.py | 20 ++++++++++++++- sage_client.py | 6 ++++- schemas/__init__.py | 3 +++ schemas/society/societe.py | 50 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 schemas/society/societe.py diff --git a/api.py b/api.py index a7e2c9c..e5de23d 100644 --- a/api.py +++ b/api.py @@ -33,6 +33,7 @@ from email_queue import email_queue from sage_client import sage_client, SageGatewayClient from schemas import ( + SocieteInfo, TiersDetails, BaremeRemiseResponse, Users, @@ -176,7 +177,7 @@ app.include_router(universign_router) @app.get("/clients", response_model=List[ClientDetails], tags=["Clients"]) async def obtenir_clients( query: Optional[str] = Query(None), - #sage: SageGatewayClient = Depends(get_sage_client_for_user), + # sage: SageGatewayClient = Depends(get_sage_client_for_user), ): try: clients = sage_client.lister_clients(filtre=query or "") @@ -2854,6 +2855,23 @@ async def modifier_collaborateur(numero: int, collaborateur: CollaborateurUpdate raise HTTPException(500, str(e)) +@app.get("/societe/info", response_model=SocieteInfo, tags=["Société"]) +async def obtenir_informations_societe(): + try: + societe = sage_client.lire_informations_societe() + + if not societe: + raise HTTPException(404, "Informations société introuvables") + + return {"success": True, "data": societe} + + except HTTPException: + raise + except Exception as e: + logger.error(f"Erreur lecture info société: {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 8caef65..f938ab5 100644 --- a/sage_client.py +++ b/sage_client.py @@ -408,7 +408,7 @@ class SageGatewayClient: return self._post( "/sage/collaborateurs/list", { - "filtre": filtre or "", # Convertir None en "" + "filtre": filtre or "", "actifs_seulement": actifs_seulement, }, ).get("data", []) @@ -427,6 +427,10 @@ class SageGatewayClient: "/sage/collaborateurs/update", {"numero": numero, **data} ).get("data") + def lire_informations_societe(self) -> Optional[Dict]: + """Lit les informations de la société depuis P_DOSSIER""" + return self._get("/sage/societe/info").get("data") + def refresh_cache(self) -> Dict: return self._post("/sage/cache/refresh") diff --git a/schemas/__init__.py b/schemas/__init__.py index aa73aaa..7b49dd7 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -59,6 +59,8 @@ from schemas.sage.sage_gateway import ( CurrentGatewayInfo, ) +from schemas.society.societe import SocieteInfo + __all__ = [ "TiersDetails", "TypeTiers", @@ -114,4 +116,5 @@ __all__ = [ "SyncStatsResponse", "CreateSignatureRequest", "TransactionResponse", + "SocieteInfo" ] diff --git a/schemas/society/societe.py b/schemas/society/societe.py new file mode 100644 index 0000000..4bb9031 --- /dev/null +++ b/schemas/society/societe.py @@ -0,0 +1,50 @@ +from pydantic import BaseModel, Field +from typing import Optional, List + + +class ExerciceComptable(BaseModel): + numero: int + debut: Optional[str] = None + fin: Optional[str] = None + + +class SocieteInfo(BaseModel): + # Identification + raison_sociale: str = Field(..., description="Raison sociale") + numero_dossier: str = Field(..., description="Code du dossier") + siret: Optional[str] = Field(None, description="Numéro SIRET") + code_ape: Optional[str] = Field(None, description="Code APE/NAF") + numero_tva: Optional[str] = Field(None, description="Numéro TVA intracommunautaire") + + # Adresse + adresse: Optional[str] = None + complement_adresse: Optional[str] = None + code_postal: Optional[str] = None + ville: Optional[str] = None + code_region: Optional[str] = None + pays: Optional[str] = None + + # Contacts + telephone: Optional[str] = None + telecopie: Optional[str] = None + email: Optional[str] = None + email_societe: Optional[str] = None + site_web: Optional[str] = None + + # Informations juridiques + capital: float = 0.0 + forme_juridique: Optional[str] = None + + # Exercices comptables + exercices: List[ExerciceComptable] = [] + + # Configuration + devise_compte: int = 0 + devise_equivalent: int = 0 + longueur_compte_general: int = 0 + longueur_compte_analytique: int = 0 + regime_fec: int = 0 + + # Autres + base_modele: Optional[str] = None + marqueur: int = 0 From d2f02e1555b3a10488801f65c685b35dfca784f0 Mon Sep 17 00:00:00 2001 From: Fanilo-Nantenaina Date: Tue, 13 Jan 2026 17:09:12 +0300 Subject: [PATCH 2/2] refactor(api/schemas): simplify company info response and schema --- api.py | 2 +- schemas/society/societe.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api.py b/api.py index e5de23d..a523812 100644 --- a/api.py +++ b/api.py @@ -2863,7 +2863,7 @@ async def obtenir_informations_societe(): if not societe: raise HTTPException(404, "Informations société introuvables") - return {"success": True, "data": societe} + return societe except HTTPException: raise diff --git a/schemas/society/societe.py b/schemas/society/societe.py index 4bb9031..01fa308 100644 --- a/schemas/society/societe.py +++ b/schemas/society/societe.py @@ -1,20 +1,20 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel from typing import Optional, List class ExerciceComptable(BaseModel): numero: int - debut: Optional[str] = None + debut: str fin: Optional[str] = None class SocieteInfo(BaseModel): # Identification - raison_sociale: str = Field(..., description="Raison sociale") - numero_dossier: str = Field(..., description="Code du dossier") - siret: Optional[str] = Field(None, description="Numéro SIRET") - code_ape: Optional[str] = Field(None, description="Code APE/NAF") - numero_tva: Optional[str] = Field(None, description="Numéro TVA intracommunautaire") + raison_sociale: str + numero_dossier: str + siret: Optional[str] = None + code_ape: Optional[str] = None + numero_tva: Optional[str] = None # Adresse adresse: Optional[str] = None