klydekushy commited on
Commit
edbcbe3
·
verified ·
1 Parent(s): fa028d1

Update src/modules/loans_engine.py

Browse files
Files changed (1) hide show
  1. src/modules/loans_engine.py +158 -9
src/modules/loans_engine.py CHANGED
@@ -376,15 +376,164 @@ def show_loans_engine(client, sheet_name):
376
  # Logique de conversion durée selon type (à adapter finement comme dans ton code original)
377
  duree_semaines = duree_val if type_code in ["IN_FINE", "HEBDOMADAIRE"] else duree_val * 4.33
378
 
379
- # CALCULS PRELIMINAIRES (Simulation)
380
- # Note: Pour simplifier l'exemple, je mets une logique basique, tu gardes ta logique complexe d'UI ici si tu veux
381
- # L'important est de passer les BONS paramètres à l'Analytics
382
- nb_versements = int(duree_val) if type_code != "IN_FINE" else 1
383
- montant_versement = 0 # À calculer selon ta logique UI existante
384
- if type_code == "IN_FINE": montant_versement = montant * (1 + taux_hebdo/100 * duree_val)
385
-
386
- montant_total = montant_versement * nb_versements # Approx pour l'exemple
387
- cout_credit = montant_total - montant
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388
 
389
  # 5. APPEL CERVEAU ANALYTIQUE (AUTO-TRIGGER)
390
  # On passe les données brutes, le module fait le reste
 
376
  # Logique de conversion durée selon type (à adapter finement comme dans ton code original)
377
  duree_semaines = duree_val if type_code in ["IN_FINE", "HEBDOMADAIRE"] else duree_val * 4.33
378
 
379
+ # ====================================================================
380
+ # DÉBUT DU BLOC LOGIQUE À COPIER-COLLER
381
+ # ====================================================================
382
+
383
+ # Initialisation des variables pour éviter les erreurs
384
+ montant_versement = 0
385
+ montant_total = 0
386
+ cout_credit = 0
387
+ nb_versements = 0
388
+ duree_semaines = 0
389
+ dates_versements = []
390
+
391
+ # -----------------------------------------------------------
392
+ # 1. LOGIQUE IN FINE (1 seul versement à la fin)
393
+ # -----------------------------------------------------------
394
+ if type_code == "IN_FINE":
395
+ duree_semaines = col3.number_input("Durée (en semaines)", min_value=1, max_value=104, value=8)
396
+
397
+ # Calculs
398
+ montant_total = montant * (1 + (taux_hebdo / 100) * duree_semaines)
399
+ cout_credit = montant_total - montant
400
+ montant_versement = montant_total
401
+ nb_versements = 1
402
+
403
+ # Affichage résultat simulation immédiate
404
+ st.markdown("### 📊 Simulation")
405
+ res1, res2 = st.columns(2)
406
+ res1.metric("Versement unique", f"{int(montant_versement):,} XOF".replace(",", " "))
407
+ res2.metric("Coût du crédit", f"{int(cout_credit):,} XOF".replace(",", " "))
408
+
409
+ # -----------------------------------------------------------
410
+ # 2. LOGIQUE MENSUEL - INTÉRÊTS (Remboursement capital à la fin)
411
+ # -----------------------------------------------------------
412
+ elif type_code == "MENSUEL_INTERETS":
413
+ duree_mois = col3.number_input("Durée (en mois)", min_value=1, max_value=60, value=12)
414
+
415
+ # Conversion et Calculs
416
+ duree_semaines = duree_mois * 4.33 # Standard bancaire
417
+ taux_mensuel = (taux_hebdo / 100) * 4.33
418
+ interet_mensuel = montant * taux_mensuel
419
+
420
+ montant_versement = interet_mensuel # Ce que le client paie chaque mois
421
+ montant_final_mois = montant + interet_mensuel # Dernier mois
422
+ montant_total = (interet_mensuel * duree_mois) + montant
423
+ cout_credit = montant_total - montant
424
+ nb_versements = int(duree_mois)
425
+
426
+ # Affichage résultat simulation
427
+ st.markdown("### 📊 Simulation")
428
+ res1, res2, res3 = st.columns(3)
429
+ res1.metric("Intérêts mensuels", f"{int(interet_mensuel):,} XOF".replace(",", " "))
430
+ res2.metric("Dernier versement", f"{int(montant_final_mois):,} XOF".replace(",", " "))
431
+ res3.metric("Coût total", f"{int(cout_credit):,} XOF".replace(",", " "))
432
+
433
+ # -----------------------------------------------------------
434
+ # 3. LOGIQUE MENSUEL - CONSTANT (Amortissement classique)
435
+ # -----------------------------------------------------------
436
+ elif type_code == "MENSUEL_CONSTANT":
437
+ duree_mois = col3.number_input("Durée (en mois)", min_value=1, max_value=60, value=12)
438
+
439
+ # Conversion et Calculs
440
+ duree_semaines = duree_mois * 4.33
441
+ taux_mensuel = (taux_hebdo / 100) * 4.33
442
+
443
+ if taux_mensuel > 0:
444
+ # Formule mathématique des mensualités constantes
445
+ mensualite = (montant * taux_mensuel) / (1 - (1 + taux_mensuel)**(-duree_mois))
446
+ else:
447
+ mensualite = montant / duree_mois
448
+
449
+ montant_versement = mensualite
450
+ montant_total = mensualite * duree_mois
451
+ cout_credit = montant_total - montant
452
+ nb_versements = int(duree_mois)
453
+
454
+ # Affichage résultat simulation
455
+ st.markdown("### 📊 Simulation")
456
+ res1, res2 = st.columns(2)
457
+ res1.metric("Mensualité constante", f"{int(mensualite):,} XOF".replace(",", " "))
458
+ res2.metric("Coût total", f"{int(cout_credit):,} XOF".replace(",", " "))
459
+
460
+ # -----------------------------------------------------------
461
+ # 4. LOGIQUE HEBDOMADAIRE
462
+ # -----------------------------------------------------------
463
+ elif type_code == "HEBDOMADAIRE":
464
+ duree_semaines = col3.number_input("Durée (en semaines)", min_value=1, max_value=104, value=12)
465
+
466
+ # Calculs
467
+ taux_hebdo_decimal = taux_hebdo / 100
468
+ if taux_hebdo_decimal > 0:
469
+ hebdomadalite = (montant * taux_hebdo_decimal) / (1 - (1 + taux_hebdo_decimal)**(-duree_semaines))
470
+ else:
471
+ hebdomadalite = montant / duree_semaines
472
+
473
+ montant_versement = hebdomadalite
474
+ montant_total = hebdomadalite * duree_semaines
475
+ cout_credit = montant_total - montant
476
+ nb_versements = int(duree_semaines)
477
+
478
+ # Affichage résultat simulation
479
+ st.markdown("### 📊 Simulation")
480
+ res1, res2 = st.columns(2)
481
+ res1.metric("Versement Hebdo", f"{int(hebdomadalite):,} XOF".replace(",", " "))
482
+ res2.metric("Coût total", f"{int(cout_credit):,} XOF".replace(",", " "))
483
+
484
+ # -----------------------------------------------------------
485
+ # 5. LOGIQUE PERSONNALISÉE (Dates manuelles)
486
+ # -----------------------------------------------------------
487
+ else: # PERSONNALISE
488
+ # On n'a pas besoin de l'input durée ici car elle dépend des dates
489
+ st.info("Configurez les dates de versement ci-dessous")
490
+
491
+ # Gestion des dates dans la session state pour persistance
492
+ if 'dates_perso' not in st.session_state:
493
+ st.session_state.dates_perso = [date.today() + timedelta(weeks=2)]
494
+
495
+ # Interface d'ajout de dates
496
+ st.markdown("**Dates de versement :**")
497
+ col_add, col_reset = st.columns([1, 4])
498
+ if col_add.button("➕ Ajouter"):
499
+ last_date = st.session_state.dates_perso[-1]
500
+ st.session_state.dates_perso.append(last_date + timedelta(weeks=1))
501
+ st.rerun()
502
+
503
+ # Affichage des date pickers
504
+ dates_versements = []
505
+ for idx, dt in enumerate(st.session_state.dates_perso):
506
+ col_d, col_x = st.columns([4, 1])
507
+ new_date = col_d.date_input(f"Echéance {idx+1}", value=dt, key=f"d_{idx}", min_value=date.today())
508
+ dates_versements.append(new_date)
509
+ if col_x.button("❌", key=f"del_{idx}") and len(st.session_state.dates_perso) > 1:
510
+ st.session_state.dates_perso.pop(idx)
511
+ st.rerun()
512
+
513
+ st.session_state.dates_perso = dates_versements # Mise à jour state
514
+
515
+ # Calculs basés sur les dates
516
+ if dates_versements:
517
+ dates_versements.sort()
518
+ date_fin_calc = dates_versements[-1]
519
+ delta_days = (date_fin_calc - date.today()).days
520
+ duree_semaines = max(1, delta_days // 7)
521
+
522
+ montant_total = montant * (1 + (taux_hebdo / 100) * duree_semaines)
523
+ cout_credit = montant_total - montant
524
+ nb_versements = len(dates_versements)
525
+ montant_versement = montant_total / nb_versements
526
+
527
+ # Affichage résultat simulation
528
+ st.markdown("### 📊 Simulation")
529
+ res1, res2, res3 = st.columns(3)
530
+ res1.metric("Moyenne/Versement", f"{int(montant_versement):,} XOF".replace(",", " "))
531
+ res2.metric("Durée est.", f"{duree_semaines} sem")
532
+ res3.metric("Coût total", f"{int(cout_credit):,} XOF".replace(",", " "))
533
+
534
+ # ====================================================================
535
+ # FIN DU BLOC LOGIQUE
536
+ # ====================================================================
537
 
538
  # 5. APPEL CERVEAU ANALYTIQUE (AUTO-TRIGGER)
539
  # On passe les données brutes, le module fait le reste