edited pydantic schemas to permit date_livraison and date_expedition gathering

This commit is contained in:
mickael 2025-12-20 14:06:04 +01:00
parent c840cd5035
commit f0c84c9cb6
2 changed files with 513 additions and 303 deletions

65
main.py
View file

@ -63,6 +63,8 @@ class ChampLibreRequest(BaseModel):
class DevisRequest(BaseModel): class DevisRequest(BaseModel):
client_id: str client_id: str
date_devis: Optional[date] = None date_devis: Optional[date] = None
date_livraison: Optional[date] = None
date_expedition: Optional[date] = None
reference: Optional[str] = None reference: Optional[str] = None
lignes: List[Dict] lignes: List[Dict]
@ -145,6 +147,8 @@ class CommandeCreateRequest(BaseModel):
client_id: str client_id: str
date_commande: Optional[date] = None date_commande: Optional[date] = None
date_livraison: Optional[date] = None
date_expedition: Optional[date] = None
reference: Optional[str] = None reference: Optional[str] = None
lignes: List[Dict] lignes: List[Dict]
@ -161,6 +165,8 @@ class LivraisonCreateGatewayRequest(BaseModel):
client_id: str client_id: str
date_livraison: Optional[date] = None date_livraison: Optional[date] = None
date_livraison_prevue: Optional[date] = None
date_expedition: Optional[date] = None
lignes: List[Dict] lignes: List[Dict]
reference: Optional[str] = None reference: Optional[str] = None
@ -177,6 +183,8 @@ class AvoirCreateGatewayRequest(BaseModel):
client_id: str client_id: str
date_avoir: Optional[date] = None date_avoir: Optional[date] = None
date_livraison: Optional[date] = None
date_expedition: Optional[date] = None
lignes: List[Dict] lignes: List[Dict]
reference: Optional[str] = None reference: Optional[str] = None
@ -193,6 +201,8 @@ class FactureCreateGatewayRequest(BaseModel):
client_id: str client_id: str
date_facture: Optional[date] = None date_facture: Optional[date] = None
date_livraison: Optional[date] = None
date_expedition: Optional[date] = None
lignes: List[Dict] lignes: List[Dict]
reference: Optional[str] = None reference: Optional[str] = None
@ -513,6 +523,8 @@ def creer_devis(req: DevisRequest):
devis_data = { devis_data = {
"client": {"code": req.client_id, "intitule": ""}, "client": {"code": req.client_id, "intitule": ""},
"date_devis": req.date_devis or date.today(), "date_devis": req.date_devis or date.today(),
"date_livraison": req.date_livraison or date.today(),
"date_expedition": req.date_expedition or date.today(),
"reference": req.reference, "reference": req.reference,
"lignes": req.lignes, "lignes": req.lignes,
} }
@ -1041,6 +1053,8 @@ def creer_commande_endpoint(req: CommandeCreateRequest):
commande_data = { commande_data = {
"client": {"code": req.client_id, "intitule": ""}, "client": {"code": req.client_id, "intitule": ""},
"date_commande": req.date_commande or date.today(), "date_commande": req.date_commande or date.today(),
"date_livraison": req.date_livraison or date.today(),
"date_expedition": req.date_expedition or date.today(),
"reference": req.reference, "reference": req.reference,
"lignes": req.lignes, "lignes": req.lignes,
} }
@ -1082,6 +1096,8 @@ def creer_livraison_endpoint(req: LivraisonCreateGatewayRequest):
livraison_data = { livraison_data = {
"client": {"code": req.client_id, "intitule": ""}, "client": {"code": req.client_id, "intitule": ""},
"date_livraison": req.date_livraison or date.today(), "date_livraison": req.date_livraison or date.today(),
"date_livraison_prevue": req.date_livraison or date.today(),
"date_expedition": req.date_expedition or date.today(),
"reference": req.reference, "reference": req.reference,
"lignes": req.lignes, "lignes": req.lignes,
} }
@ -1123,6 +1139,8 @@ def creer_avoir_endpoint(req: AvoirCreateGatewayRequest):
avoir_data = { avoir_data = {
"client": {"code": req.client_id, "intitule": ""}, "client": {"code": req.client_id, "intitule": ""},
"date_avoir": req.date_avoir or date.today(), "date_avoir": req.date_avoir or date.today(),
"date_livraison": req.date_livraison or date.today(),
"date_expedition": req.date_expedition or date.today(),
"reference": req.reference, "reference": req.reference,
"lignes": req.lignes, "lignes": req.lignes,
} }
@ -1167,6 +1185,8 @@ def creer_facture_endpoint(req: FactureCreateGatewayRequest):
facture_data = { facture_data = {
"client": {"code": req.client_id, "intitule": ""}, "client": {"code": req.client_id, "intitule": ""},
"date_facture": req.date_facture or date.today(), "date_facture": req.date_facture or date.today(),
"date_livraison": req.date_livraison or date.today(),
"date_expedition": req.date_expedition or date.today(),
"reference": req.reference, "reference": req.reference,
"lignes": req.lignes, "lignes": req.lignes,
} }
@ -1615,16 +1635,14 @@ def lire_mouvement_stock(numero: str):
logger.error(f"❌ Erreur lecture mouvement : {e}") logger.error(f"❌ Erreur lecture mouvement : {e}")
raise HTTPException(500, str(e)) raise HTTPException(500, str(e))
@app.get("/sage/modeles/list") @app.get("/sage/modeles/list")
def lister_modeles_disponibles(): def lister_modeles_disponibles():
"""Liste tous les modèles .bgc disponibles pour chaque type de document""" """Liste tous les modèles .bgc disponibles pour chaque type de document"""
try: try:
modeles = sage.lister_modeles_crystal() modeles = sage.lister_modeles_crystal()
return { return {"success": True, "data": modeles}
"success": True,
"data": modeles
}
except Exception as e: except Exception as e:
logger.error(f"❌ Erreur listage modèles: {e}") logger.error(f"❌ Erreur listage modèles: {e}")
raise HTTPException(500, str(e)) raise HTTPException(500, str(e))
@ -1635,33 +1653,34 @@ def generer_pdf_document(
numero: str, numero: str,
type_doc: int = Query(..., description="Type document (0=devis, 60=facture, etc.)"), type_doc: int = Query(..., description="Type document (0=devis, 60=facture, etc.)"),
modele: str = Query(None, description="Nom du modèle .bgc (optionnel)"), modele: str = Query(None, description="Nom du modèle .bgc (optionnel)"),
base64_encode: bool = Query(True, description="Retourner en base64") base64_encode: bool = Query(True, description="Retourner en base64"),
): ):
""" """
📄 Génère un PDF d'un document Sage avec le modèle spécifié 📄 Génère un PDF d'un document Sage avec le modèle spécifié
""" """
try: try:
# ✅ LOG pour debug # ✅ LOG pour debug
logger.info(f"📄 PDF Request: numero={numero}, type={type_doc}, modele={modele}, base64={base64_encode}") logger.info(
f"📄 PDF Request: numero={numero}, type={type_doc}, modele={modele}, base64={base64_encode}"
)
# Générer le PDF # Générer le PDF
pdf_bytes = sage.generer_pdf_document( pdf_bytes = sage.generer_pdf_document(
numero=numero, numero=numero, type_doc=type_doc, modele=modele
type_doc=type_doc,
modele=modele
) )
if not pdf_bytes: if not pdf_bytes:
raise HTTPException(404, f"Impossible de générer le PDF pour {numero}") raise HTTPException(404, f"Impossible de générer le PDF pour {numero}")
# ✅ LOG taille PDF # ✅ LOG taille PDF
logger.info(f"✅ PDF généré: {len(pdf_bytes)} octets") logger.info(f"✅ PDF généré: {len(pdf_bytes)} octets")
if base64_encode: if base64_encode:
# Retour en JSON avec base64 # Retour en JSON avec base64
import base64 import base64
pdf_base64 = base64.b64encode(pdf_bytes).decode('utf-8')
pdf_base64 = base64.b64encode(pdf_bytes).decode("utf-8")
return { return {
"success": True, "success": True,
"data": { "data": {
@ -1670,22 +1689,22 @@ def generer_pdf_document(
"modele": modele or "défaut", "modele": modele or "défaut",
"pdf_base64": pdf_base64, "pdf_base64": pdf_base64,
"size_bytes": len(pdf_bytes), "size_bytes": len(pdf_bytes),
"size_readable": f"{len(pdf_bytes) / 1024:.1f} KB" "size_readable": f"{len(pdf_bytes) / 1024:.1f} KB",
} },
} }
else: else:
# Retour direct du fichier PDF # Retour direct du fichier PDF
from fastapi.responses import Response from fastapi.responses import Response
return Response( return Response(
content=pdf_bytes, content=pdf_bytes,
media_type="application/pdf", media_type="application/pdf",
headers={ headers={
"Content-Disposition": f'inline; filename="{numero}.pdf"', "Content-Disposition": f'inline; filename="{numero}.pdf"',
"Content-Length": str(len(pdf_bytes)) # ✅ Taille explicite "Content-Length": str(len(pdf_bytes)), # ✅ Taille explicite
} },
) )
except HTTPException: except HTTPException:
raise raise
except ValueError as e: except ValueError as e:
@ -1694,7 +1713,7 @@ def generer_pdf_document(
except Exception as e: except Exception as e:
logger.error(f"❌ Erreur technique: {e}", exc_info=True) logger.error(f"❌ Erreur technique: {e}", exc_info=True)
raise HTTPException(500, str(e)) raise HTTPException(500, str(e))
# ===================================================== # =====================================================
# LANCEMENT # LANCEMENT

File diff suppressed because it is too large Load diff