feat: add PDF document generation and model listing functionality

This commit is contained in:
Fanilo-Nantenaina 2025-12-17 17:25:27 +03:00
parent 388618603b
commit daf96f71eb
2 changed files with 109 additions and 1 deletions

53
api.py
View file

@ -3896,6 +3896,59 @@ async def statistiques_utilisateurs(session: AsyncSession = Depends(get_session)
logger.error(f"❌ Erreur stats utilisateurs: {e}")
raise HTTPException(500, str(e))
@app.get("/modeles", tags=["PDF"])
async def get_modeles_disponibles():
"""Liste tous les modèles PDF disponibles"""
try:
modeles = sage_client.lister_modeles_disponibles()
return modeles
except Exception as e:
logger.error(f"Erreur listage modèles: {e}")
raise HTTPException(500, str(e))
@app.get("/documents/{numero}/pdf", tags=["Documents"])
async def get_document_pdf(
numero: str,
type_doc: int = Query(..., description="0=devis, 60=facture, etc."),
modele: str = Query(None, description="Nom du modèle (ex: 'Facture client logo.bgc')"),
download: bool = Query(False, description="Télécharger au lieu d'afficher")
):
"""
📄 Génère et retourne le PDF d'un document
Exemples:
- GET /documents/DE00001/pdf?type_doc=0
- GET /documents/FA00123/pdf?type_doc=60&modele=Facture client logo.bgc
- GET /documents/FA00123/pdf?type_doc=60&download=true
"""
try:
# Récupérer le PDF (en bytes)
pdf_bytes = sage_client.generer_pdf_document(
numero=numero,
type_doc=type_doc,
modele=modele,
base64_encode=False # On veut les bytes bruts
)
# Retourner le PDF
from fastapi.responses import Response
disposition = "attachment" if download else "inline"
filename = f"{numero}.pdf"
return Response(
content=pdf_bytes,
media_type="application/pdf",
headers={
"Content-Disposition": f'{disposition}; filename="{filename}"'
}
)
except Exception as e:
logger.error(f"Erreur génération PDF: {e}")
raise HTTPException(500, str(e))
# =====================================================
# LANCEMENT

View file

@ -428,5 +428,60 @@ class SageGatewayClient:
return None
# Instance globale
def lister_modeles_disponibles(self) -> Dict:
"""Liste les modèles Crystal Reports disponibles"""
try:
r = requests.get(
f"{self.url}/sage/modeles/list",
headers=self.headers,
timeout=30
)
r.raise_for_status()
return r.json().get("data", {})
except requests.exceptions.RequestException as e:
logger.error(f"❌ Erreur listage modèles: {e}")
raise
def generer_pdf_document(
self,
numero: str,
type_doc: int,
modele: str = None,
base64_encode: bool = True
) -> Union[bytes, str, Dict]:
"""
Génère un PDF d'un document Sage
Returns:
Dict: Avec pdf_base64 si base64_encode=True
bytes: Contenu PDF brut si base64_encode=False
"""
try:
params = {
"type_doc": type_doc,
"base64_encode": base64_encode
}
if modele:
params["modele"] = modele
r = requests.get(
f"{self.url}/sage/documents/{numero}/pdf",
params=params,
headers=self.headers,
timeout=60 # PDF peut prendre du temps
)
r.raise_for_status()
if base64_encode:
return r.json().get("data", {})
else:
return r.content
except requests.exceptions.RequestException as e:
logger.error(f"❌ Erreur génération PDF: {e}")
raise
sage_client = SageGatewayClient()