Spaces:
Running
Running
Create notifications.py
Browse files- src/modules/notifications.py +73 -0
src/modules/notifications.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import smtplib
|
| 2 |
+
from email.mime.text import MIMEText
|
| 3 |
+
from email.mime.multipart import MIMEMultipart
|
| 4 |
+
from datetime import datetime, timedelta
|
| 5 |
+
import pandas as pd
|
| 6 |
+
import streamlit as st
|
| 7 |
+
|
| 8 |
+
# Configuration SMTP (A mettre dans st.secrets idéalement)
|
| 9 |
+
# SMTP_SERVER = "smtp.gmail.com"
|
| 10 |
+
# SMTP_PORT = 587
|
| 11 |
+
# SENDER_EMAIL = "votre_email@gmail.com"
|
| 12 |
+
# SENDER_PASSWORD = "votre_mot_de_passe_application"
|
| 13 |
+
|
| 14 |
+
def envoyer_email(destinataire, sujet, corps):
|
| 15 |
+
try:
|
| 16 |
+
# Récupération des secrets (si configurés)
|
| 17 |
+
smtp_server = st.secrets["smtp"]["server"]
|
| 18 |
+
smtp_port = st.secrets["smtp"]["port"]
|
| 19 |
+
sender_email = st.secrets["smtp"]["email"]
|
| 20 |
+
sender_password = st.secrets["smtp"]["password"]
|
| 21 |
+
|
| 22 |
+
msg = MIMEMultipart()
|
| 23 |
+
msg['From'] = sender_email
|
| 24 |
+
msg['To'] = destinataire
|
| 25 |
+
msg['Subject'] = sujet
|
| 26 |
+
msg.attach(MIMEText(corps, 'plain'))
|
| 27 |
+
|
| 28 |
+
server = smtplib.SMTP(smtp_server, smtp_port)
|
| 29 |
+
server.starttls()
|
| 30 |
+
server.login(sender_email, sender_password)
|
| 31 |
+
text = msg.as_string()
|
| 32 |
+
server.sendmail(sender_email, destinataire, text)
|
| 33 |
+
server.quit()
|
| 34 |
+
return True
|
| 35 |
+
except Exception as e:
|
| 36 |
+
st.error(f"Erreur d'envoi mail : {e}")
|
| 37 |
+
return False
|
| 38 |
+
|
| 39 |
+
def verifier_et_notifier_echeances(client, sheet_name):
|
| 40 |
+
st.subheader("📧 Gestion des Alertes & Notifications")
|
| 41 |
+
|
| 42 |
+
if st.button("🔄 Vérifier les échéances à venir (J+3)"):
|
| 43 |
+
try:
|
| 44 |
+
sh = client.open(sheet_name)
|
| 45 |
+
# On suppose que tu as une feuille 'Echeancier_Global' ou qu'on le calcule
|
| 46 |
+
# Pour l'exemple, on imagine qu'on scanne les prêts actifs
|
| 47 |
+
ws_prets = sh.worksheet("Prets_Master")
|
| 48 |
+
df_prets = pd.DataFrame(ws_prets.get_all_records())
|
| 49 |
+
|
| 50 |
+
# Simulation de détection (Logique à adapter selon ta structure de données exacte)
|
| 51 |
+
# Ici on simule une alerte pour l'exemple
|
| 52 |
+
alertes_envoyees = 0
|
| 53 |
+
|
| 54 |
+
# Exemple de logique : Si une date de versement est proche
|
| 55 |
+
today = datetime.now().date()
|
| 56 |
+
deadline = today + timedelta(days=3) # Alerte à 3 jours
|
| 57 |
+
|
| 58 |
+
# ... (Ici tu bouclerais sur ton tableau d'amortissement réel) ...
|
| 59 |
+
|
| 60 |
+
# Exemple d'envoi
|
| 61 |
+
# email_client = "client@exemple.com" # À récupérer dans df_clients via ID
|
| 62 |
+
# corps_message = f"Bonjour, votre échéance de prêt arrive le {deadline}."
|
| 63 |
+
# succes = envoyer_email(email_client, "Rappel Echéance - Vortex", corps_message)
|
| 64 |
+
|
| 65 |
+
# Si pas de config SMTP, on affiche juste à l'écran pour le moment
|
| 66 |
+
st.info("Simulation : 3 clients détectés avec échéance proche.")
|
| 67 |
+
st.write("1. Moussa Diop (15/05/2024) - 50 000 XOF")
|
| 68 |
+
st.write("2. Fatou Ndiaye (16/05/2024) - 25 000 XOF")
|
| 69 |
+
|
| 70 |
+
st.warning("⚠️ Pour activer l'envoi réel, configurez les secrets SMTP dans Streamlit.")
|
| 71 |
+
|
| 72 |
+
except Exception as e:
|
| 73 |
+
st.error(f"Erreur : {e}")
|