style: Reformat method calls and remove unnecessary blank lines for improved code consistency.
This commit is contained in:
parent
61e787bf36
commit
e95e550044
2 changed files with 519 additions and 539 deletions
164
sage_client.py
164
sage_client.py
|
|
@ -278,32 +278,32 @@ class SageGatewayClient:
|
||||||
def creer_fournisseur(self, fournisseur_data: Dict) -> Dict:
|
def creer_fournisseur(self, fournisseur_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
Envoie la requête de création de fournisseur à la gateway Windows.
|
Envoie la requête de création de fournisseur à la gateway Windows.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
fournisseur_data: Dict contenant intitule, compte_collectif, etc.
|
fournisseur_data: Dict contenant intitule, compte_collectif, etc.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Fournisseur créé avec son numéro définitif
|
Fournisseur créé avec son numéro définitif
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/fournisseurs/create", fournisseur_data).get("data", {})
|
return self._post("/sage/fournisseurs/create", fournisseur_data).get("data", {})
|
||||||
|
|
||||||
def modifier_fournisseur(self, code: str, fournisseur_data: Dict) -> Dict:
|
def modifier_fournisseur(self, code: str, fournisseur_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'un fournisseur existant
|
✏️ Modification d'un fournisseur existant
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
code: Code du fournisseur à modifier
|
code: Code du fournisseur à modifier
|
||||||
fournisseur_data: Dictionnaire contenant les champs à modifier
|
fournisseur_data: Dictionnaire contenant les champs à modifier
|
||||||
(seuls les champs présents seront mis à jour)
|
(seuls les champs présents seront mis à jour)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Fournisseur modifié
|
Fournisseur modifié
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/fournisseurs/update", {
|
return self._post(
|
||||||
"code": code,
|
"/sage/fournisseurs/update",
|
||||||
"fournisseur_data": fournisseur_data
|
{"code": code, "fournisseur_data": fournisseur_data},
|
||||||
}).get("data", {})
|
).get("data", {})
|
||||||
|
|
||||||
# =====================================================
|
# =====================================================
|
||||||
# AVOIRS
|
# AVOIRS
|
||||||
# =====================================================
|
# =====================================================
|
||||||
|
|
@ -357,7 +357,7 @@ class SageGatewayClient:
|
||||||
return r.json()
|
return r.json()
|
||||||
except:
|
except:
|
||||||
return {"status": "down"}
|
return {"status": "down"}
|
||||||
|
|
||||||
def creer_client(self, client_data: Dict) -> Dict:
|
def creer_client(self, client_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
Envoie la requête de création de client à la gateway Windows.
|
Envoie la requête de création de client à la gateway Windows.
|
||||||
|
|
@ -365,48 +365,45 @@ class SageGatewayClient:
|
||||||
"""
|
"""
|
||||||
# On appelle la route définie dans main.py
|
# On appelle la route définie dans main.py
|
||||||
return self._post("/sage/clients/create", client_data).get("data", {})
|
return self._post("/sage/clients/create", client_data).get("data", {})
|
||||||
|
|
||||||
def modifier_client(self, code: str, client_data: Dict) -> Dict:
|
def modifier_client(self, code: str, client_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'un client existant
|
✏️ Modification d'un client existant
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
code: Code du client à modifier
|
code: Code du client à modifier
|
||||||
client_data: Dictionnaire contenant les champs à modifier
|
client_data: Dictionnaire contenant les champs à modifier
|
||||||
(seuls les champs présents seront mis à jour)
|
(seuls les champs présents seront mis à jour)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Client modifié
|
Client modifié
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/clients/update", {
|
return self._post(
|
||||||
"code": code,
|
"/sage/clients/update", {"code": code, "client_data": client_data}
|
||||||
"client_data": client_data
|
).get("data", {})
|
||||||
}).get("data", {})
|
|
||||||
|
|
||||||
|
|
||||||
def modifier_devis(self, numero: str, devis_data: Dict) -> Dict:
|
def modifier_devis(self, numero: str, devis_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'un devis existant
|
✏️ Modification d'un devis existant
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
numero: Numéro du devis à modifier
|
numero: Numéro du devis à modifier
|
||||||
devis_data: Dictionnaire contenant les champs à modifier:
|
devis_data: Dictionnaire contenant les champs à modifier:
|
||||||
- date_devis (str, optional): Nouvelle date
|
- date_devis (str, optional): Nouvelle date
|
||||||
- lignes (List, optional): Nouvelles lignes
|
- lignes (List, optional): Nouvelles lignes
|
||||||
- statut (int, optional): Nouveau statut
|
- statut (int, optional): Nouveau statut
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Devis modifié avec totaux recalculés
|
Devis modifié avec totaux recalculés
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/devis/update", {
|
return self._post(
|
||||||
"numero": numero,
|
"/sage/devis/update", {"numero": numero, "devis_data": devis_data}
|
||||||
"devis_data": devis_data
|
).get("data", {})
|
||||||
}).get("data", {})
|
|
||||||
|
|
||||||
def creer_commande(self, commande_data: Dict) -> Dict:
|
def creer_commande(self, commande_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
➕ Création d'une nouvelle commande (Bon de commande)
|
➕ Création d'une nouvelle commande (Bon de commande)
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
commande_data: Dictionnaire contenant:
|
commande_data: Dictionnaire contenant:
|
||||||
- client_id (str): Code du client
|
- client_id (str): Code du client
|
||||||
|
|
@ -417,17 +414,16 @@ class SageGatewayClient:
|
||||||
- quantite (float)
|
- quantite (float)
|
||||||
- prix_unitaire_ht (float, optional)
|
- prix_unitaire_ht (float, optional)
|
||||||
- remise_pourcentage (float, optional)
|
- remise_pourcentage (float, optional)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Commande créée avec son numéro et ses totaux
|
Commande créée avec son numéro et ses totaux
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/commandes/create", commande_data).get("data", {})
|
return self._post("/sage/commandes/create", commande_data).get("data", {})
|
||||||
|
|
||||||
|
|
||||||
def modifier_commande(self, numero: str, commande_data: Dict) -> Dict:
|
def modifier_commande(self, numero: str, commande_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'une commande existante
|
✏️ Modification d'une commande existante
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
numero: Numéro de la commande à modifier
|
numero: Numéro de la commande à modifier
|
||||||
commande_data: Dictionnaire contenant les champs à modifier:
|
commande_data: Dictionnaire contenant les champs à modifier:
|
||||||
|
|
@ -435,36 +431,33 @@ class SageGatewayClient:
|
||||||
- lignes (List, optional): Nouvelles lignes
|
- lignes (List, optional): Nouvelles lignes
|
||||||
- statut (int, optional): Nouveau statut
|
- statut (int, optional): Nouveau statut
|
||||||
- reference (str, optional): Nouvelle référence
|
- reference (str, optional): Nouvelle référence
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Commande modifiée avec totaux recalculés
|
Commande modifiée avec totaux recalculés
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/commandes/update", {
|
return self._post(
|
||||||
"numero": numero,
|
"/sage/commandes/update", {"numero": numero, "commande_data": commande_data}
|
||||||
"commande_data": commande_data
|
).get("data", {})
|
||||||
}).get("data", {})
|
|
||||||
|
|
||||||
|
|
||||||
def creer_livraison(self, livraison_data: Dict) -> Dict:
|
def creer_livraison(self, livraison_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
➕ Création d'une nouvelle livraison (Bon de livraison)
|
➕ Création d'une nouvelle livraison (Bon de livraison)
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/livraisons/create", livraison_data).get("data", {})
|
return self._post("/sage/livraisons/create", livraison_data).get("data", {})
|
||||||
|
|
||||||
|
|
||||||
def modifier_livraison(self, numero: str, livraison_data: Dict) -> Dict:
|
def modifier_livraison(self, numero: str, livraison_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'une livraison existante
|
✏️ Modification d'une livraison existante
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/livraisons/update", {
|
return self._post(
|
||||||
"numero": numero,
|
"/sage/livraisons/update",
|
||||||
"livraison_data": livraison_data
|
{"numero": numero, "livraison_data": livraison_data},
|
||||||
}).get("data", {})
|
).get("data", {})
|
||||||
|
|
||||||
def creer_avoir(self, avoir_data: Dict) -> Dict:
|
def creer_avoir(self, avoir_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
➕ Création d'un avoir (Bon d'avoir)
|
➕ Création d'un avoir (Bon d'avoir)
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
avoir_data: Dictionnaire contenant:
|
avoir_data: Dictionnaire contenant:
|
||||||
- client_id (str): Code du client
|
- client_id (str): Code du client
|
||||||
|
|
@ -475,17 +468,16 @@ class SageGatewayClient:
|
||||||
- quantite (float)
|
- quantite (float)
|
||||||
- prix_unitaire_ht (float, optional)
|
- prix_unitaire_ht (float, optional)
|
||||||
- remise_pourcentage (float, optional)
|
- remise_pourcentage (float, optional)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Avoir créé avec son numéro et ses totaux
|
Avoir créé avec son numéro et ses totaux
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/avoirs/create", avoir_data).get("data", {})
|
return self._post("/sage/avoirs/create", avoir_data).get("data", {})
|
||||||
|
|
||||||
|
|
||||||
def modifier_avoir(self, numero: str, avoir_data: Dict) -> Dict:
|
def modifier_avoir(self, numero: str, avoir_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'un avoir existant
|
✏️ Modification d'un avoir existant
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
numero: Numéro de l'avoir à modifier
|
numero: Numéro de l'avoir à modifier
|
||||||
avoir_data: Dictionnaire contenant les champs à modifier:
|
avoir_data: Dictionnaire contenant les champs à modifier:
|
||||||
|
|
@ -493,20 +485,18 @@ class SageGatewayClient:
|
||||||
- lignes (List, optional): Nouvelles lignes
|
- lignes (List, optional): Nouvelles lignes
|
||||||
- statut (int, optional): Nouveau statut
|
- statut (int, optional): Nouveau statut
|
||||||
- reference (str, optional): Nouvelle référence
|
- reference (str, optional): Nouvelle référence
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Avoir modifié avec totaux recalculés
|
Avoir modifié avec totaux recalculés
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/avoirs/update", {
|
return self._post(
|
||||||
"numero": numero,
|
"/sage/avoirs/update", {"numero": numero, "avoir_data": avoir_data}
|
||||||
"avoir_data": avoir_data
|
).get("data", {})
|
||||||
}).get("data", {})
|
|
||||||
|
|
||||||
|
|
||||||
def creer_facture(self, facture_data: Dict) -> Dict:
|
def creer_facture(self, facture_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
➕ Création d'une facture
|
➕ Création d'une facture
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
facture_data: Dictionnaire contenant:
|
facture_data: Dictionnaire contenant:
|
||||||
- client_id (str): Code du client
|
- client_id (str): Code du client
|
||||||
|
|
@ -517,17 +507,16 @@ class SageGatewayClient:
|
||||||
- quantite (float)
|
- quantite (float)
|
||||||
- prix_unitaire_ht (float, optional)
|
- prix_unitaire_ht (float, optional)
|
||||||
- remise_pourcentage (float, optional)
|
- remise_pourcentage (float, optional)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Facture créée avec son numéro et ses totaux
|
Facture créée avec son numéro et ses totaux
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/factures/create", facture_data).get("data", {})
|
return self._post("/sage/factures/create", facture_data).get("data", {})
|
||||||
|
|
||||||
|
|
||||||
def modifier_facture(self, numero: str, facture_data: Dict) -> Dict:
|
def modifier_facture(self, numero: str, facture_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
✏️ Modification d'une facture existante
|
✏️ Modification d'une facture existante
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
numero: Numéro de la facture à modifier
|
numero: Numéro de la facture à modifier
|
||||||
facture_data: Dictionnaire contenant les champs à modifier:
|
facture_data: Dictionnaire contenant les champs à modifier:
|
||||||
|
|
@ -535,21 +524,20 @@ class SageGatewayClient:
|
||||||
- lignes (List, optional): Nouvelles lignes
|
- lignes (List, optional): Nouvelles lignes
|
||||||
- statut (int, optional): Nouveau statut
|
- statut (int, optional): Nouveau statut
|
||||||
- reference (str, optional): Nouvelle référence
|
- reference (str, optional): Nouvelle référence
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Facture modifiée avec totaux recalculés
|
Facture modifiée avec totaux recalculés
|
||||||
"""
|
"""
|
||||||
return self._post("/sage/factures/update", {
|
return self._post(
|
||||||
"numero": numero,
|
"/sage/factures/update", {"numero": numero, "facture_data": facture_data}
|
||||||
"facture_data": facture_data
|
).get("data", {})
|
||||||
}).get("data", {})
|
|
||||||
|
|
||||||
def generer_pdf_document(self, doc_id: str, type_doc: int) -> bytes:
|
def generer_pdf_document(self, doc_id: str, type_doc: int) -> bytes:
|
||||||
"""
|
"""
|
||||||
🆕 Génère le PDF d'un document via la gateway Windows (route généralisée)
|
🆕 Génère le PDF d'un document via la gateway Windows (route généralisée)
|
||||||
|
|
||||||
**Cette méthode remplace les appels spécifiques par type de document**
|
**Cette méthode remplace les appels spécifiques par type de document**
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
doc_id: Numéro du document (ex: "DE00001", "FA00001")
|
doc_id: Numéro du document (ex: "DE00001", "FA00001")
|
||||||
type_doc: Type de document Sage:
|
type_doc: Type de document Sage:
|
||||||
|
|
@ -558,14 +546,14 @@ class SageGatewayClient:
|
||||||
- 30: Bon de livraison
|
- 30: Bon de livraison
|
||||||
- 60: Facture
|
- 60: Facture
|
||||||
- 50: Bon d'avoir
|
- 50: Bon d'avoir
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
bytes: Contenu du PDF (binaire)
|
bytes: Contenu du PDF (binaire)
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
ValueError: Si le PDF retourné est vide
|
ValueError: Si le PDF retourné est vide
|
||||||
RuntimeError: Si erreur de communication avec la gateway
|
RuntimeError: Si erreur de communication avec la gateway
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
>>> pdf_bytes = sage_client.generer_pdf_document("DE00001", 0)
|
>>> pdf_bytes = sage_client.generer_pdf_document("DE00001", 0)
|
||||||
>>> with open("devis.pdf", "wb") as f:
|
>>> with open("devis.pdf", "wb") as f:
|
||||||
|
|
@ -573,59 +561,55 @@ class SageGatewayClient:
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
logger.info(f"📄 Demande génération PDF: doc_id={doc_id}, type={type_doc}")
|
logger.info(f"📄 Demande génération PDF: doc_id={doc_id}, type={type_doc}")
|
||||||
|
|
||||||
# Appel HTTP vers la gateway Windows
|
# Appel HTTP vers la gateway Windows
|
||||||
r = requests.post(
|
r = requests.post(
|
||||||
f"{self.url}/sage/documents/generate-pdf",
|
f"{self.url}/sage/documents/generate-pdf",
|
||||||
json={
|
json={"doc_id": doc_id, "type_doc": type_doc},
|
||||||
"doc_id": doc_id,
|
|
||||||
"type_doc": type_doc
|
|
||||||
},
|
|
||||||
headers=self.headers,
|
headers=self.headers,
|
||||||
timeout=60 # Timeout élevé pour génération PDF
|
timeout=60, # Timeout élevé pour génération PDF
|
||||||
)
|
)
|
||||||
|
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
|
|
||||||
response_data = r.json()
|
response_data = r.json()
|
||||||
|
|
||||||
# Vérifier que la réponse contient bien le PDF
|
# Vérifier que la réponse contient bien le PDF
|
||||||
if not response_data.get("success"):
|
if not response_data.get("success"):
|
||||||
error_msg = response_data.get("error", "Erreur inconnue")
|
error_msg = response_data.get("error", "Erreur inconnue")
|
||||||
raise RuntimeError(f"Gateway a retourné une erreur: {error_msg}")
|
raise RuntimeError(f"Gateway a retourné une erreur: {error_msg}")
|
||||||
|
|
||||||
pdf_base64 = response_data.get("data", {}).get("pdf_base64", "")
|
pdf_base64 = response_data.get("data", {}).get("pdf_base64", "")
|
||||||
|
|
||||||
if not pdf_base64:
|
if not pdf_base64:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"PDF vide retourné par la gateway pour {doc_id} (type {type_doc})"
|
f"PDF vide retourné par la gateway pour {doc_id} (type {type_doc})"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Décoder le base64
|
# Décoder le base64
|
||||||
pdf_bytes = base64.b64decode(pdf_base64)
|
pdf_bytes = base64.b64decode(pdf_base64)
|
||||||
|
|
||||||
logger.info(f"✅ PDF décodé: {len(pdf_bytes)} octets")
|
logger.info(f"✅ PDF décodé: {len(pdf_bytes)} octets")
|
||||||
|
|
||||||
return pdf_bytes
|
return pdf_bytes
|
||||||
|
|
||||||
except requests.exceptions.Timeout:
|
except requests.exceptions.Timeout:
|
||||||
logger.error(f"⏱️ Timeout génération PDF pour {doc_id}")
|
logger.error(f"⏱️ Timeout génération PDF pour {doc_id}")
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
f"Timeout lors de la génération du PDF (>60s). "
|
f"Timeout lors de la génération du PDF (>60s). "
|
||||||
f"Le document {doc_id} est peut-être trop volumineux."
|
f"Le document {doc_id} est peut-être trop volumineux."
|
||||||
)
|
)
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
logger.error(f"❌ Erreur HTTP génération PDF: {e}")
|
logger.error(f"❌ Erreur HTTP génération PDF: {e}")
|
||||||
raise RuntimeError(f"Erreur de communication avec la gateway: {str(e)}")
|
raise RuntimeError(f"Erreur de communication avec la gateway: {str(e)}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"❌ Erreur génération PDF: {e}", exc_info=True)
|
logger.error(f"❌ Erreur génération PDF: {e}", exc_info=True)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Instance globale
|
# Instance globale
|
||||||
sage_client = SageGatewayClient()
|
sage_client = SageGatewayClient()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue