Trying to make universign functionnal

This commit is contained in:
Fanilo-Nantenaina 2025-12-22 11:11:12 +03:00
parent d921c7100a
commit 215763b679

129
api.py
View file

@ -1433,9 +1433,7 @@ async def universign_envoyer_avec_email(
logger.info(f"🔐 Démarrage processus Universign pour {email}")
logger.info(f"📌 Document: {doc_id} ({doc_data.get('type_label')})")
# ========================================
# VÉRIFICATION : PDF valide ?
# ========================================
# Vérification PDF
if not pdf_bytes or len(pdf_bytes) == 0:
raise Exception("Le PDF généré est vide")
@ -1444,7 +1442,7 @@ async def universign_envoyer_avec_email(
# ========================================
# ÉTAPE 1 : Créer la transaction
# ========================================
logger.info(f"📝 ÉTAPE 1/7 : Création transaction")
logger.info(f"📝 ÉTAPE 1/6 : Création transaction")
response = requests.post(
f"{api_url}/transactions",
@ -1466,7 +1464,7 @@ async def universign_envoyer_avec_email(
# ========================================
# ÉTAPE 2 : Upload du fichier PDF
# ========================================
logger.info(f"📄 ÉTAPE 2/7 : Upload PDF")
logger.info(f"📄 ÉTAPE 2/6 : Upload PDF")
files = {
"file": (
@ -1488,22 +1486,17 @@ async def universign_envoyer_avec_email(
raise Exception(f"Erreur upload fichier: {response.status_code}")
file_id = response.json().get("id")
if not file_id:
logger.error(f"❌ Pas de file_id retourné")
raise Exception("Upload réussi mais file_id manquant")
logger.info(f"✅ Fichier uploadé: {file_id}")
# ========================================
# ÉTAPE 3 : Ajouter le document (form-data)
# ÉTAPE 3 : Ajouter le document
# ========================================
logger.info(f"📋 ÉTAPE 3/7 : Ajout document à transaction")
logger.info(f"📋 ÉTAPE 3/6 : Ajout document à transaction")
response = requests.post(
f"{api_url}/transactions/{transaction_id}/documents",
auth=auth,
data={"document": file_id}, # ✅ UTILISER data= (form-data)
data={"document": file_id},
timeout=30,
)
@ -1515,44 +1508,16 @@ async def universign_envoyer_avec_email(
logger.info(f"✅ Document ajouté: {document_id}")
# ========================================
# ÉTAPE 4 : Créer le signataire
# ÉTAPE 4 : Créer le champ de signature
# ========================================
logger.info(f"👤 ÉTAPE 4/7 : Création signataire")
nom_parts = nom.split()
first_name = nom_parts[0] if len(nom_parts) > 0 else nom
last_name = " ".join(nom_parts[1:]) if len(nom_parts) > 1 else ""
response = requests.post(
f"{api_url}/transactions/{transaction_id}/signers",
auth=auth,
data={ # ✅ UTILISER data= (form-data)
"email": email,
"firstName": first_name,
"lastName": last_name,
},
timeout=30,
)
if response.status_code not in [200, 201]:
logger.error(f"❌ Erreur création signataire: {response.text}")
raise Exception(f"Erreur création signataire: {response.status_code}")
signer_id = response.json().get("id")
logger.info(f"✅ Signataire créé: {signer_id}")
# ========================================
# ÉTAPE 5 : Créer le champ de signature
# ========================================
logger.info(f"✍️ ÉTAPE 5/7 : Création champ signature")
logger.info(f"✍️ ÉTAPE 4/6 : Création champ signature")
response = requests.post(
f"{api_url}/transactions/{transaction_id}/documents/{document_id}/fields",
auth=auth,
data={ # ✅ UTILISER data= (form-data)
data={
"type": "signature",
"page": "1",
"signer": signer_id,
# Laisser Universign positionner automatiquement
},
timeout=30,
)
@ -1565,12 +1530,35 @@ async def universign_envoyer_avec_email(
logger.info(f"✅ Champ créé: {field_id}")
# ========================================
# ÉTAPE 6 : Démarrer la transaction
# ÉTAPE 5 : Lier le signataire au champ (ancien endpoint)
# ========================================
logger.info(f"🚀 ÉTAPE 6/7 : Démarrage transaction")
logger.info(f"👤 ÉTAPE 5/6 : Liaison signataire au champ")
response = requests.post(
f"{api_url}/transactions/{transaction_id}/start", auth=auth, timeout=30
f"{api_url}/transactions/{transaction_id}/signatures", # ✅ /signatures pas /signers
auth=auth,
data={
"signer": email,
"field": field_id,
},
timeout=30,
)
if response.status_code not in [200, 201]:
logger.error(f"❌ Erreur liaison signataire: {response.text}")
raise Exception(f"Erreur liaison signataire: {response.status_code}")
logger.info(f"✅ Signataire lié: {email}")
# ========================================
# ÉTAPE 6 : Démarrer la transaction
# ========================================
logger.info(f"🚀 ÉTAPE 6/6 : Démarrage transaction")
response = requests.post(
f"{api_url}/transactions/{transaction_id}/start",
auth=auth,
timeout=30
)
if response.status_code not in [200, 201]:
@ -1581,39 +1569,36 @@ async def universign_envoyer_avec_email(
logger.info(f"✅ Transaction démarrée")
# ========================================
# ÉTAPE 7 : Récupérer l'URL de signature
# Récupérer l'URL de signature
# ========================================
logger.info(f"🔗 ÉTAPE 7/7 : Récupération URL")
logger.info(f"🔗 Récupération URL de signature")
signer_url = ""
# Chercher dans la réponse du /start
if final_data.get("signers"):
# Chercher dans actions
if final_data.get("actions"):
for action in final_data["actions"]:
if action.get("url"):
signer_url = action["url"]
break
# Sinon chercher dans signers
if not signer_url and final_data.get("signers"):
for signer in final_data["signers"]:
if signer.get("email") == email:
signer_url = signer.get("url", "")
break
# Si pas trouvée, interroger le signataire directement
if not signer_url:
response = requests.get(
f"{api_url}/transactions/{transaction_id}/signers/{signer_id}",
auth=auth,
timeout=10,
)
if response.status_code == 200:
signer_url = response.json().get("url", "")
if not signer_url:
logger.error(f"❌ URL de signature introuvable")
logger.error(f"❌ URL introuvable dans: {final_data}")
raise ValueError("URL de signature non retournée par Universign")
logger.info(f"✅ URL récupérée avec succès")
logger.info(f"✅ URL récupérée")
# ========================================
# Créer l'email de notification
# ========================================
logger.info(f"📧 Préparation email de notification")
logger.info(f"📧 Préparation email")
template = templates_signature_email["demande_signature"]
@ -1642,7 +1627,6 @@ async def universign_envoyer_avec_email(
sujet = sujet.replace(f"{{{{{var}}}}}", str(valeur))
corps = corps.replace(f"{{{{{var}}}}}", str(valeur))
# Créer log email
email_log = EmailLog(
id=str(uuid.uuid4()),
destinataire=email,
@ -1658,11 +1642,10 @@ async def universign_envoyer_avec_email(
session.add(email_log)
await session.flush()
# Enqueue l'email
email_queue.enqueue(email_log.id)
logger.info(f"✅ Email mis en file pour {email}")
logger.info(f"🎉 Processus Universign terminé avec succès")
logger.info(f"🎉 Processus terminé avec succès")
return {
"transaction_id": transaction_id,
@ -1672,16 +1655,6 @@ async def universign_envoyer_avec_email(
"email_sent": True,
}
except requests.exceptions.HTTPError as e:
logger.error(f"❌ Erreur HTTP Universign: {e}")
if e.response:
logger.error(f"Status: {e.response.status_code}")
logger.error(f"Body: {e.response.text}")
return {
"error": f"Erreur Universign: {e.response.status_code if e.response else 'Unknown'} - {e.response.text if e.response else str(e)}",
"statut": "ERREUR",
"email_sent": False,
}
except Exception as e:
logger.error(f"❌ Erreur Universign: {e}", exc_info=True)
return {