feat(society): add logo support and preview endpoint
This commit is contained in:
parent
d5273a0786
commit
671d5bac15
2 changed files with 95 additions and 8 deletions
93
api.py
93
api.py
|
|
@ -1,6 +1,6 @@
|
|||
from fastapi import FastAPI, HTTPException, Path, Query, Depends, status, Body
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import StreamingResponse
|
||||
from fastapi.responses import StreamingResponse, HTMLResponse, Response
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from pydantic import BaseModel, Field, EmailStr
|
||||
from typing import List, Optional
|
||||
|
|
@ -2874,6 +2874,97 @@ async def obtenir_informations_societe():
|
|||
raise HTTPException(500, str(e))
|
||||
|
||||
|
||||
@app.get("/societe/logo", tags=["Société"])
|
||||
async def obtenir_logo_societe():
|
||||
"""Retourne le logo en tant qu'image directe"""
|
||||
try:
|
||||
societe = sage_client.lire_informations_societe()
|
||||
|
||||
if not societe or not societe.get("logo_base64"):
|
||||
raise HTTPException(404, "Logo introuvable")
|
||||
|
||||
import base64
|
||||
|
||||
image_data = base64.b64decode(societe["logo_base64"])
|
||||
|
||||
return Response(content=image_data, media_type=societe["logo_content_type"])
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur récupération logo: {e}")
|
||||
raise HTTPException(500, str(e))
|
||||
|
||||
|
||||
@app.get("/societe/preview", response_class=HTMLResponse, tags=["Société"])
|
||||
async def preview_societe():
|
||||
"""Page HTML pour visualiser les infos société avec logo"""
|
||||
try:
|
||||
societe = sage_client.lire_informations_societe()
|
||||
|
||||
if not societe:
|
||||
return "<h1>Société introuvable</h1>"
|
||||
|
||||
logo_html = ""
|
||||
if societe.get("logo_base64"):
|
||||
logo_html = f'<img src="data:{societe["logo_content_type"]};base64,{societe["logo_base64"]}" style="max-width: 300px; border: 1px solid #ccc; padding: 10px;">'
|
||||
else:
|
||||
logo_html = "<p>Aucun logo disponible</p>"
|
||||
|
||||
html = f"""
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Informations Société</title>
|
||||
<style>
|
||||
body {{ font-family: Arial, sans-serif; margin: 40px; }}
|
||||
.container {{ max-width: 800px; }}
|
||||
.logo {{ margin: 20px 0; }}
|
||||
.info {{ margin: 10px 0; }}
|
||||
.label {{ font-weight: bold; }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Informations Société</h1>
|
||||
|
||||
<div class="logo">
|
||||
<h2>Logo</h2>
|
||||
{logo_html}
|
||||
</div>
|
||||
|
||||
<div class="info">
|
||||
<span class="label">Raison sociale:</span> {societe["raison_sociale"]}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">SIRET:</span> {societe["siret"] or "N/A"}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">Adresse:</span> {societe["adresse"] or "N/A"}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">Code postal:</span> {societe["code_postal"] or "N/A"}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">Ville:</span> {societe["ville"] or "N/A"}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">Email:</span> {societe["email"] or "N/A"}
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="label">Téléphone:</span> {societe["telephone"] or "N/A"}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
return html
|
||||
|
||||
except Exception as e:
|
||||
return f"<h1>Erreur</h1><p>{str(e)}</p>"
|
||||
|
||||
|
||||
@app.get("/health", tags=["System"])
|
||||
async def health_check(
|
||||
sage: SageGatewayClient = Depends(get_sage_client_for_user),
|
||||
|
|
|
|||
|
|
@ -9,14 +9,12 @@ class ExerciceComptable(BaseModel):
|
|||
|
||||
|
||||
class SocieteInfo(BaseModel):
|
||||
# Identification
|
||||
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
|
||||
complement_adresse: Optional[str] = None
|
||||
code_postal: Optional[str] = None
|
||||
|
|
@ -24,27 +22,25 @@ class SocieteInfo(BaseModel):
|
|||
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
|
||||
|
||||
logo_base64: Optional[str] = None
|
||||
logo_content_type: Optional[str] = None
|
||||
|
|
|
|||
Loading…
Reference in a new issue