Spaces:
Running
Running
Update src/DocumentGen/InvoiceRepayment.py
Browse files
src/DocumentGen/InvoiceRepayment.py
CHANGED
|
@@ -13,41 +13,31 @@ def generer_recu(data):
|
|
| 13 |
|
| 14 |
Args:
|
| 15 |
data: dict contenant toutes les informations nécessaires
|
| 16 |
-
{
|
| 17 |
-
'numero_recu': 'REC-2026-0001',
|
| 18 |
-
'trans_id': 'TRX-2026-0042',
|
| 19 |
-
'date_paiement': date(2026, 1, 15),
|
| 20 |
-
'client': {...},
|
| 21 |
-
'loan': {...},
|
| 22 |
-
'paiement': {...},
|
| 23 |
-
'moyen': 'Mobile Money (Wave)',
|
| 24 |
-
'reference': 'WAVE-TXN-123456'
|
| 25 |
-
}
|
| 26 |
|
| 27 |
Returns:
|
| 28 |
-
BytesIO: Buffer contenant le PDF
|
| 29 |
"""
|
| 30 |
|
| 31 |
-
try
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
return None
|
| 50 |
|
|
|
|
| 51 |
try:
|
| 52 |
# Création du buffer
|
| 53 |
buffer = BytesIO()
|
|
@@ -115,8 +105,10 @@ def generer_recu(data):
|
|
| 115 |
elements.append(Spacer(1, 0.3*cm))
|
| 116 |
|
| 117 |
# Numéro de reçu et date
|
|
|
|
|
|
|
| 118 |
header_data = [
|
| 119 |
-
[f"N° {data['numero_recu']}", f"Date: {
|
| 120 |
]
|
| 121 |
header_table = Table(header_data, colWidths=[8*cm, 8*cm])
|
| 122 |
header_table.setStyle(TableStyle([
|
|
@@ -141,7 +133,7 @@ def generer_recu(data):
|
|
| 141 |
client_data = [
|
| 142 |
['Nom Complet:', client.get('Nom_Complet', 'N/A')],
|
| 143 |
['N° Client:', client.get('ID_Client', 'N/A')],
|
| 144 |
-
['Téléphone:', client.get('Telephone', 'N/A')],
|
| 145 |
['Adresse:', client.get('Adresse', 'N/A')]
|
| 146 |
]
|
| 147 |
|
|
@@ -186,9 +178,17 @@ def generer_recu(data):
|
|
| 186 |
elements.append(Paragraph("DÉTAILS DU PAIEMENT", subtitle_style))
|
| 187 |
|
| 188 |
paiement = data['paiement']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
payment_data = [
|
| 190 |
-
['Échéance:', paiement.get('numero_echeance', 'N/A')],
|
| 191 |
-
['Date Échéance Prévue:',
|
| 192 |
['Retard (jours):', str(paiement.get('jours_retard', 0))],
|
| 193 |
['Statut:', paiement.get('statut_paiement', 'N/A')]
|
| 194 |
]
|
|
@@ -230,7 +230,10 @@ def generer_recu(data):
|
|
| 230 |
elements.append(Spacer(1, 0.3*cm))
|
| 231 |
|
| 232 |
# === MONTANT TOTAL VERSÉ ===
|
| 233 |
-
montant_verse = paiement.get('montant_verse',
|
|
|
|
|
|
|
|
|
|
| 234 |
|
| 235 |
total_data = [
|
| 236 |
['MONTANT TOTAL VERSÉ', f"{montant_verse:,.0f} XOF"]
|
|
@@ -335,7 +338,6 @@ def generer_recu(data):
|
|
| 335 |
# Retour du buffer
|
| 336 |
buffer.seek(0)
|
| 337 |
print("=== PDF GÉNÉRÉ AVEC SUCCÈS ===")
|
| 338 |
-
buffer.seek(0)
|
| 339 |
return buffer
|
| 340 |
|
| 341 |
except Exception as e:
|
|
|
|
| 13 |
|
| 14 |
Args:
|
| 15 |
data: dict contenant toutes les informations nécessaires
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
Returns:
|
| 18 |
+
BytesIO: Buffer contenant le PDF (ou None en cas d'erreur)
|
| 19 |
"""
|
| 20 |
|
| 21 |
+
# === 1. LOGS ET VALIDATION (Pas besoin de try ici) ===
|
| 22 |
+
print("=== DÉBUT GÉNÉRATION REÇU ===")
|
| 23 |
+
print(f"Données reçues : {data.keys()}")
|
| 24 |
+
print(f"Numéro reçu : {data.get('numero_recu')}")
|
| 25 |
+
print(f"Transaction ID : {data.get('trans_id')}")
|
| 26 |
+
|
| 27 |
+
# Vérification des données minimales
|
| 28 |
+
if not data.get('numero_recu'):
|
| 29 |
+
print("ERREUR : numero_recu manquant")
|
| 30 |
+
return None
|
| 31 |
+
|
| 32 |
+
if not data.get('client'):
|
| 33 |
+
print("ERREUR : données client manquantes")
|
| 34 |
+
return None
|
| 35 |
+
|
| 36 |
+
if not data.get('paiement'):
|
| 37 |
+
print("ERREUR : données paiement manquantes")
|
| 38 |
+
return None
|
|
|
|
| 39 |
|
| 40 |
+
# === 2. GÉNÉRATION PDF (Protégé par try/except) ===
|
| 41 |
try:
|
| 42 |
# Création du buffer
|
| 43 |
buffer = BytesIO()
|
|
|
|
| 105 |
elements.append(Spacer(1, 0.3*cm))
|
| 106 |
|
| 107 |
# Numéro de reçu et date
|
| 108 |
+
date_str = data['date_paiement'].strftime('%d/%m/%Y') if hasattr(data['date_paiement'], 'strftime') else str(data['date_paiement'])
|
| 109 |
+
|
| 110 |
header_data = [
|
| 111 |
+
[f"N° {data['numero_recu']}", f"Date: {date_str}"]
|
| 112 |
]
|
| 113 |
header_table = Table(header_data, colWidths=[8*cm, 8*cm])
|
| 114 |
header_table.setStyle(TableStyle([
|
|
|
|
| 133 |
client_data = [
|
| 134 |
['Nom Complet:', client.get('Nom_Complet', 'N/A')],
|
| 135 |
['N° Client:', client.get('ID_Client', 'N/A')],
|
| 136 |
+
['Téléphone:', str(client.get('Telephone', 'N/A'))],
|
| 137 |
['Adresse:', client.get('Adresse', 'N/A')]
|
| 138 |
]
|
| 139 |
|
|
|
|
| 178 |
elements.append(Paragraph("DÉTAILS DU PAIEMENT", subtitle_style))
|
| 179 |
|
| 180 |
paiement = data['paiement']
|
| 181 |
+
|
| 182 |
+
# Gestion sûre de la date d'échéance
|
| 183 |
+
date_echeance = paiement.get('date_echeance_prevue', 'N/A')
|
| 184 |
+
if hasattr(date_echeance, 'strftime'):
|
| 185 |
+
date_echeance_str = date_echeance.strftime('%d/%m/%Y')
|
| 186 |
+
else:
|
| 187 |
+
date_echeance_str = str(date_echeance)
|
| 188 |
+
|
| 189 |
payment_data = [
|
| 190 |
+
['Échéance:', str(paiement.get('numero_echeance', 'N/A'))],
|
| 191 |
+
['Date Échéance Prévue:', date_echeance_str],
|
| 192 |
['Retard (jours):', str(paiement.get('jours_retard', 0))],
|
| 193 |
['Statut:', paiement.get('statut_paiement', 'N/A')]
|
| 194 |
]
|
|
|
|
| 230 |
elements.append(Spacer(1, 0.3*cm))
|
| 231 |
|
| 232 |
# === MONTANT TOTAL VERSÉ ===
|
| 233 |
+
montant_verse = paiement.get('montant_verse',
|
| 234 |
+
paiement.get('montant_principal', 0) +
|
| 235 |
+
paiement.get('montant_interets', 0) +
|
| 236 |
+
paiement.get('penalites_retard', 0))
|
| 237 |
|
| 238 |
total_data = [
|
| 239 |
['MONTANT TOTAL VERSÉ', f"{montant_verse:,.0f} XOF"]
|
|
|
|
| 338 |
# Retour du buffer
|
| 339 |
buffer.seek(0)
|
| 340 |
print("=== PDF GÉNÉRÉ AVEC SUCCÈS ===")
|
|
|
|
| 341 |
return buffer
|
| 342 |
|
| 343 |
except Exception as e:
|