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

File diff suppressed because it is too large Load diff