From 2b15e7b3e2bde0b17d3c9f4bc41833dcd4654e3e Mon Sep 17 00:00:00 2001 From: fanilo Date: Wed, 14 Jan 2026 07:56:11 +0100 Subject: [PATCH] (feat): Added method and route to gather actual society informations --- main.py | 21 +++++++- sage_connector.py | 120 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 3462eef..68418b6 100644 --- a/main.py +++ b/main.py @@ -91,7 +91,11 @@ def startup(): raise sage = SageConnector( - settings.chemin_base, settings.sql_server_name, settings.sql_server_database, settings.utilisateur, settings.mot_de_passe + settings.chemin_base, + settings.sql_server_name, + settings.sql_server_database, + settings.utilisateur, + settings.mot_de_passe, ) if not sage.connecter(): @@ -1412,6 +1416,21 @@ def collaborateur_update(req: CollaborateurUpdateRequest): raise HTTPException(500, str(e)) +@app.get("/sage/societe/info", dependencies=[Depends(verify_token)]) +def get_societe_info(): + """Retourne les informations de la société actuelle depuis P_DOSSIER""" + try: + societe_info = sage.lire_informations_societe() + if not societe_info: + raise HTTPException(404, "Informations société introuvables dans P_DOSSIER") + return {"success": True, "data": societe_info} + except HTTPException: + raise + except Exception as e: + logger.error(f"Erreur lecture info société: {e}") + raise HTTPException(500, str(e)) + + if __name__ == "__main__": uvicorn.run( "main:app", diff --git a/sage_connector.py b/sage_connector.py index 760b32e..481bb30 100644 --- a/sage_connector.py +++ b/sage_connector.py @@ -7792,3 +7792,123 @@ class SageConnector: except Exception as e: logger.error(f"❌ Erreur modification collaborateur: {e}", exc_info=True) raise RuntimeError(f"Échec modification collaborateur: {str(e)}") + + def lire_informations_societe(self): + try: + with self._get_sql_connection() as conn: + cursor = conn.cursor() + + # Requête pour récupérer toutes les colonnes importantes + query = """ + SELECT + D_RaisonSoc, D_NumDoss, D_Siret, D_Ape, D_Identifiant, + D_Adresse, D_Complement, D_CodePostal, D_Ville, + D_CodeRegion, D_Pays, + D_Telephone, D_Telecopie, D_EMail, D_EMailSoc, D_Site, + D_Capital, D_FormeJuridique, + D_DebutExo01, D_FinExo01, + D_DebutExo02, D_FinExo02, + D_DebutExo03, D_FinExo03, + D_DebutExo04, D_FinExo04, + D_DebutExo05, D_FinExo05, + N_DeviseCompte, N_DeviseEquival, + D_LgCg, D_LgAn, + D_RegimeFEC, + BM_Intitule, + cbMarq + FROM P_DOSSIER + """ + + cursor.execute(query) + row = cursor.fetchone() + + if not row: + logger.warning("Aucune donnée dans P_DOSSIER") + return None + + # Mapping des données + societe = { + # Identification + "raison_sociale": row.D_RaisonSoc.strip() + if row.D_RaisonSoc + else "", + "numero_dossier": row.D_NumDoss.strip() if row.D_NumDoss else "", + "siret": row.D_Siret.strip() if row.D_Siret else "", + "code_ape": row.D_Ape.strip() if row.D_Ape else "", + "numero_tva": row.D_Identifiant.strip() + if row.D_Identifiant + else "", + # Adresse + "adresse": row.D_Adresse.strip() if row.D_Adresse else "", + "complement_adresse": row.D_Complement.strip() + if row.D_Complement + else "", + "code_postal": row.D_CodePostal.strip() if row.D_CodePostal else "", + "ville": row.D_Ville.strip() if row.D_Ville else "", + "code_region": row.D_CodeRegion.strip() if row.D_CodeRegion else "", + "pays": row.D_Pays.strip() if row.D_Pays else "", + # Contacts + "telephone": row.D_Telephone.strip() if row.D_Telephone else "", + "telecopie": row.D_Telecopie.strip() if row.D_Telecopie else "", + "email": row.D_EMail.strip() if row.D_EMail else "", + "email_societe": row.D_EMailSoc.strip() if row.D_EMailSoc else "", + "site_web": row.D_Site.strip() if row.D_Site else "", + # Informations juridiques + "capital": float(row.D_Capital) if row.D_Capital else 0.0, + "forme_juridique": row.D_FormeJuridique.strip() + if row.D_FormeJuridique + else "", + # Exercices comptables (filtrer les exercices vides) + "exercices": [], + } + + # Ajouter uniquement les exercices valides (année > 1753) + exercices_potentiels = [ + (1, row.D_DebutExo01, row.D_FinExo01), + (2, row.D_DebutExo02, row.D_FinExo02), + (3, row.D_DebutExo03, row.D_FinExo03), + (4, row.D_DebutExo04, row.D_FinExo04), + (5, row.D_DebutExo05, row.D_FinExo05), + ] + + for numero, debut, fin in exercices_potentiels: + if debut and debut.year > 1753: + societe["exercices"].append( + { + "numero": numero, + "debut": debut.isoformat(), + "fin": fin.isoformat() + if fin and fin.year > 1753 + else None, + } + ) + + # Compléter les champs manquants + societe.update( + { + # Configuration + "devise_compte": row.N_DeviseCompte + if row.N_DeviseCompte + else 0, + "devise_equivalent": row.N_DeviseEquival + if row.N_DeviseEquival + else 0, + "longueur_compte_general": row.D_LgCg if row.D_LgCg else 0, + "longueur_compte_analytique": row.D_LgAn if row.D_LgAn else 0, + "regime_fec": row.D_RegimeFEC if row.D_RegimeFEC else 0, + # Autres + "base_modele": row.BM_Intitule.strip() + if row.BM_Intitule + else "", + "marqueur": row.cbMarq if row.cbMarq else 0, + } + ) + + logger.info( + f"✓ SQL: Informations société '{societe['raison_sociale']}' lues" + ) + return societe + + except Exception as e: + logger.error(f"✗ Erreur SQL lecture P_DOSSIER: {e}", exc_info=True) + raise RuntimeError(f"Erreur lecture informations société: {str(e)}")