diff --git a/.env b/.env index 93c73e4..a6b7cf8 100644 --- a/.env +++ b/.env @@ -1,4 +1,14 @@ +#Connexion base de données DB_HOST=54.36.188.119 DB_USER=commun DB_PASSWORD=4cs8Ro6GVnJFkhUI -DB_NAME=Commun \ No newline at end of file +DB_NAME=Commun + +# connexion OVH pour les SMS +OVH_APP_KEY=f725d07b2f98a195 +OVH_APP_SECRET=5ca392a0a728e2395edd426bb1e11ad6 +OVH_CONSUMER_KEY=305f2e8611e58b83930de84ee65c99f9 +OVH_SMS_ACCOUNT=sms-jm164396-1 +OVH_SMS_SENDER=DOMO91FR +SMS_RECIPIENT=+33635164680 +OVH_ENDPOINT=ovh-eu \ No newline at end of file diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml index 471c40e..a57a756 100644 --- a/.idea/dictionaries/project.xml +++ b/.idea/dictionaries/project.xml @@ -3,6 +3,10 @@ acces curdate + delims + endlocal + popd + pushd setlocal diff --git a/Scripts/maj_prod_ratio.bat b/Scripts/maj_prod_ratio.bat index 09e664a..a1e4cc0 100644 --- a/Scripts/maj_prod_ratio.bat +++ b/Scripts/maj_prod_ratio.bat @@ -22,3 +22,18 @@ copy /Y "%PROD_DIR%\Ratio_prod.xlsm" "%INSTALL_CLIENT%\Ratio_prod.xlsm" echo. echo ✔️ Mise à jour complète effectuée (archive, prod, client) pause +echo Nettoyage des anciennes archives (on garde les 5 plus récentes)... + +pushd "%PROD_DIR%" +setlocal EnableDelayedExpansion +set count=0 + +for /f "delims=" %%f in ('dir /b /o-d "Ratio_prod_????_??_??.xlsm"') do ( + set /a count+=1 + if !count! gtr 5 ( + echo Suppression de l'ancienne archive : %%f + del "%%f" + ) +) +endlocal +popd \ No newline at end of file diff --git a/sms_alert.py b/sms_alert.py new file mode 100644 index 0000000..97bce78 --- /dev/null +++ b/sms_alert.py @@ -0,0 +1,115 @@ +import os +import mysql.connector +import ovh +from dotenv import load_dotenv + +load_dotenv() + +# 📍 Liste des numéros de téléphone par site +PHONE_NUMBERS_BY_SITE = { + "Roissy": ["+336XXXXXXXX"], + "Meudon": ["+336XXXXXXXX"], + "Saclay": ["+336XXXXXXXX"] +} + +STATE_FILE = "last_ids.txt" + +# ✅ Lecture des derniers IDs connus +def load_last_ids(): + if not os.path.exists(STATE_FILE): + return {} + with open(STATE_FILE, "r") as f: + return dict(line.strip().split(":") for line in f) + +# ✅ Sauvegarde des derniers IDs +def save_last_ids(ids): + with open(STATE_FILE, "w") as f: + for site, id_val in ids.items(): + f.write(f"{site}:{id_val}\n") + +# ✅ Fonction SMS via OVH +def send_sms(message: str, site: str) -> None: + phone_numbers = PHONE_NUMBERS_BY_SITE.get(site) + if not phone_numbers or phone_numbers == ['']: + print(f"[!] Aucun numéro défini pour le site {site}. SMS non envoyé.") + return + + try: + client = ovh.Client( + endpoint=os.getenv("OVH_ENDPOINT"), + application_key=os.getenv("OVH_APP_KEY"), + application_secret=os.getenv("OVH_APP_SECRET"), + consumer_key=os.getenv("OVH_CONSUMER_KEY"), + ) + + sender = os.getenv("OVH_SMS_SENDER") + account = os.getenv("OVH_SMS_ACCOUNT") + + result = client.post(f"/sms/{account}/jobs", + sender=sender, + message=message, + receivers=phone_numbers, + priority='high', + noStopClause=True, + charset='UTF-8', + class_='phoneDisplay', + coding='7bit', + senderForResponse=False, + validityPeriod=2880) + + print(f"[✓] SMS envoyé à {phone_numbers} pour {site}") + except Exception as e: + print(f"[!] Erreur envoi SMS OVH : {e}") + +# ✅ Connexion à la base Commun pour lire les identifiants des sites +def get_db_connections(): + conn = mysql.connector.connect( + host=os.getenv("DB_HOST"), + user=os.getenv("DB_USER"), + password=os.getenv("DB_PASSWORD"), + database=os.getenv("DB_NAME") + ) + cursor = conn.cursor(dictionary=True) + cursor.execute("SELECT BDD, UID, PWD FROM Connexions") + connexions = cursor.fetchall() + cursor.close() + conn.close() + return connexions + +# ✅ Vérifie chaque site pour nouvelle ligne +def check_new_logs(): + last_ids = load_last_ids() + connexions = get_db_connections() + + for conn_info in connexions: + site = conn_info['BDD'] + try: + conn = mysql.connector.connect( + host=os.getenv("DB_HOST"), + user=conn_info['UID'], + password=conn_info['PWD'], + database=site + ) + cursor = conn.cursor() + cursor.execute("SELECT MAX(Id) FROM Log_Inventaires") + result = cursor.fetchone() + latest_id = result[0] or 0 + old_id = int(last_ids.get(site, 0)) + + print(f"{site} → dernier ID enregistré : {old_id}, ID actuel : {latest_id}") + + if latest_id > old_id: + message = f"🔔 Nouveau log dans {site} (Id: {latest_id})" + send_sms(message, site) + last_ids[site] = str(latest_id) + + cursor.close() + conn.close() + except Exception as e: + print(f"[{site}] Erreur : {e}") + + save_last_ids(last_ids) + +# ✅ Point d'entrée principal +if __name__ == "__main__": + check_new_logs() diff --git a/test_sms_ovh.py b/test_sms_ovh.py new file mode 100644 index 0000000..280e40b --- /dev/null +++ b/test_sms_ovh.py @@ -0,0 +1,33 @@ +def send_sms(message: str, site: str) -> None: + phone_numbers = PHONE_NUMBERS_BY_SITE.get(site) + if not phone_numbers or phone_numbers == ['']: + print(f"[!] Aucun numéro défini pour le site {site}. SMS non envoyé.") + return + + try: + client = ovh.Client( + endpoint=os.getenv("OVH_ENDPOINT"), + application_key=os.getenv("OVH_APP_KEY"), + application_secret=os.getenv("OVH_APP_SECRET"), + consumer_key=os.getenv("OVH_CONSUMER_KEY"), + ) + + sender = os.getenv("OVH_SMS_SENDER") + account = os.getenv("OVH_SMS_ACCOUNT") + + result = client.post(f"/sms/{account}/jobs", + sender=sender, + message=message, + receivers=phone_numbers, + priority='high', + noStopClause=True, + charset='UTF-8', + class_='phoneDisplay', + coding='7bit', + senderForResponse=False, + validityPeriod=2880) + + print(f"[✓] SMS envoyé à {phone_numbers} pour {site}") + # Optionnel : journaliser_sms(message, site, phone_numbers) + except Exception as e: + print(f"[!] Erreur envoi SMS OVH : {e}")