feat: add PDF document generation and model listing functionality
This commit is contained in:
parent
388618603b
commit
daf96f71eb
2 changed files with 109 additions and 1 deletions
53
api.py
53
api.py
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue