diff --git a/routes/universign.py b/routes/universign.py index 73761d3..ff90d85 100644 --- a/routes/universign.py +++ b/routes/universign.py @@ -6,6 +6,7 @@ from typing import List, Optional from datetime import datetime from pydantic import BaseModel, EmailStr import logging +from data.data import templates_signature_email from email_queue import email_queue from database import get_session from database import ( @@ -86,13 +87,12 @@ async def create_signature( if not pdf_bytes: raise HTTPException(400, "Échec génération PDF") - # === 2. CRÉATION TRANSACTION UNIVERSIGN === + # === CRÉATION TRANSACTION UNIVERSIGN === import requests import uuid auth = (settings.universign_api_key, "") - # Créer la transaction resp = requests.post( f"{settings.universign_api_url}/transactions", auth=auth, @@ -109,7 +109,6 @@ async def create_signature( universign_tx_id = resp.json().get("id") - # Upload le fichier files = { "file": (f"{request.sage_document_id}.pdf", pdf_bytes, "application/pdf") } @@ -122,7 +121,6 @@ async def create_signature( file_id = resp.json().get("id") - # Attacher le document resp = requests.post( f"{settings.universign_api_url}/transactions/{universign_tx_id}/documents", auth=auth, @@ -135,7 +133,6 @@ async def create_signature( document_id = resp.json().get("id") - # Créer le champ de signature resp = requests.post( f"{settings.universign_api_url}/transactions/{universign_tx_id}/documents/{document_id}/fields", auth=auth, @@ -148,7 +145,6 @@ async def create_signature( field_id = resp.json().get("id") - # Lier le signataire resp = requests.post( f"{settings.universign_api_url}/transactions/{universign_tx_id}/signatures", auth=auth, @@ -159,7 +155,6 @@ async def create_signature( if resp.status_code not in [200, 201]: raise HTTPException(500, "Erreur liaison signataire") - # Démarrer la transaction resp = requests.post( f"{settings.universign_api_url}/transactions/{universign_tx_id}/start", auth=auth, @@ -171,7 +166,6 @@ async def create_signature( final_data = resp.json() - # Extraire l'URL de signature signer_url = "" if final_data.get("actions"): for action in final_data["actions"]: @@ -182,8 +176,7 @@ async def create_signature( if not signer_url: raise HTTPException(500, "URL de signature non retournée") - # === 3. ENREGISTREMENT LOCAL === - + # === ENREGISTREMENT LOCAL === local_id = str(uuid.uuid4()) transaction = UniversignTransaction( @@ -199,13 +192,12 @@ async def create_signature( document_name=request.document_name, created_at=datetime.now(), sent_at=datetime.now(), - is_test=True, # Environnement .alpha + is_test=True, needs_sync=True, ) session.add(transaction) - # Signataire signer = UniversignSigner( id=f"{local_id}_signer_0", transaction_id=local_id, @@ -216,18 +208,51 @@ async def create_signature( ) session.add(signer) - await session.commit() + # === ENVOI EMAIL AVEC TEMPLATE === + template = templates_signature_email["demande_signature"] + + type_labels = { + 0: "Devis", + 10: "Commande", + 30: "Bon de Livraison", + 60: "Facture", + 50: "Avoir", + } + + doc_info = email_queue.sage_client.lire_document( + request.sage_document_id, request.sage_document_type.value + ) + montant_ttc = f"{doc_info.get('total_ttc', 0):.2f}" if doc_info else "0.00" + date_doc = ( + doc_info.get("date", datetime.now().strftime("%d/%m/%Y")) + if doc_info + else datetime.now().strftime("%d/%m/%Y") + ) + + variables = { + "NOM_SIGNATAIRE": request.signer_name, + "TYPE_DOC": type_labels.get(request.sage_document_type.value, "Document"), + "NUMERO": request.sage_document_id, + "DATE": date_doc, + "MONTANT_TTC": montant_ttc, + "SIGNER_URL": signer_url, + "CONTACT_EMAIL": settings.smtp_from, + } + + sujet = template["sujet"] + corps = template["corps_html"] + + for var, valeur in variables.items(): + sujet = sujet.replace(f"{{{{{var}}}}}", str(valeur)) + corps = corps.replace(f"{{{{{var}}}}}", str(valeur)) + email_log = EmailLog( id=str(uuid.uuid4()), destinataire=request.signer_email, - sujet=f"Signature requise - {request.sage_document_type.name} {request.sage_document_id}", - corps_html=f""" -
Bonjour {request.signer_name},
-Merci de signer le document suivant :
- - """, + sujet=sujet, + corps_html=corps, document_ids=request.sage_document_id, type_document=request.sage_document_type.value, statut=StatutEmail.EN_ATTENTE, @@ -241,7 +266,6 @@ async def create_signature( email_queue.enqueue(email_log.id) # === RÉPONSE === - return TransactionResponse( id=transaction.id, transaction_id=transaction.transaction_id,