Spaces:
Running
Running
Commit History
5 days ago
-
style(ui): emojis remplaces par des balises tactiques sobres
- [OK] [ECHEC] [ATTENTION] [ALERTE] [REFUS] [STOP] [ANALYSE] [IA] [DOSSIER]... a la place des emojis dans tous les libelles, messages et journaux - puces d'etat (couleurs) remplacees par des carres/ronds geometriques - aucun changement de logique : les tests et la detection des messages suivent la nouvelle forme Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>495d60d
8 days ago
-
feat(communications): suivi d'ouverture des emails (Brevo)
- Envoi HTML tague par campagne, une ligne par destinataire dans Suivi_Emails. - Synchronisation des evenements Brevo (delivre, ouvertures, proxy Apple, clics, rebonds, spam) a la demande et toutes les heures (scheduler). - Onglet Statistiques d'ouverture : tableau par campagne + detail par personne. - Recapitulatif unique a l'admin au lieu d'une copie cachee par email. - Lecture du messageId Brevo sans jamais faire echouer un envoi reussi. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c45c242
11 days ago
-
feat: journal d'audit, pénalités, cohérence remboursements et signature
- Journal d'audit (core/audit_log.py, module audit_viewer) : traces des envois d'email, connexions et jobs - Pénalités : consommation de l'occurrence à l'octroi uniquement, idempotente - Correctifs remboursements, rappels et décimaux du Sheet (virgule française) - Pages et module de signature électronique restants (voir commit précédent) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>56277f7 -
feat(signature): signature electronique des contrats (lien email + 4 derniers car. ID_Officiel + OTP + case a cocher)
- Pret cree EN_ATTENTE_SIGNATURE (bloque), ACTIF quand client (et garant) ont signe - Pages publiques ?sign=<token> et ?verifysig=<ID> ; bloc de signature electronique en fin de PDF - PDF deterministes (invariant=1) + snapshot JSON : documents reconstituables sans stockage de fichier - Sceau HMAC (secret SIGNATURE_SECRET), token et OTP jamais stockes en clair, journal append-only - Relances 24 h, re-emission automatique apres expiration (3 max), alerte admin - Module admin Signatures : suivi, rattrapage des prets sans remboursement, actions, journal - Branche sur octroi direct, demandes approuvees et Check-Up ; EN_ATTENTE_SIGNATURE compte dans la limite de prets - 79 tests (faux classeur Sheets, AppTest Streamlit) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>de5e25f
17 days ago
-
feat: rappels automatiques quotidiens a 12h pour les echeances en retard et critiques
Processus independant de Streamlit (rappels_daemon.py, lance par le Dockerfile) : les rappels partent chaque jour sans connexion, tant que l'echeance apparait EN_RETARD ou CRITIQUE dans le radar. Rattrapage au demarrage si le conteneur redemarre apres 12h, un seul passage par jour. Journal d'audit (onglet Audit_Rappels) des envois automatiques et manuels, affiche dans Repayments. Les envois manuels ne bloquent pas l'automatique. Suppression de l'ancien rappel J-2, remplace par ce job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>d4df7aa
22 days ago
-
fix: consolide get_credential, log silences critiques, securise MIME/SPARQL/Mapbox
- Rapport IA : filtre mois/trimestres multi-select par cases a cocher (union exacte des mois coches, non contigu) - get_credential() centralisee dans core/email_client.py : supprime 10 copies dupliquees (client_simulator, Check_Up_Loans, loans_engine, repayments x2, notifications, geoip_client, sim_gate, map_dashboard, geoloc_verify) - except Exception: pass nus remplaces par log_swallowed() ou Weitere silences critiques (demarrage scheduler, cache Usis, schema_cache AIP, prediction ML post-reentrainement) - Logs InvoiceRepayment.py : retrait numero_recu/trans_id des print() (fuite potentielle dans les logs du Space) - validation_engine.py : validation du format cls/prop avant interpolation SPARQL - map_dashboard.py : token Mapbox echappe via json.dumps au lieu de concatenation brute en JS - document_validator.py : verification magic bytes avant Docling (fichier renomme ne passe plus silencieusement) - Ajout tests/ (62 tests : penalites_retard, AnalyseFinance, doc…2fe4365
28 days ago
-
fix(notifications): stop resending the admin digest on every process restart
demarrer_scheduler() sets next_run_time=datetime.now() so the digest job fires immediately whenever the scheduler (re)starts — which happens on every process restart (redeploy, Space waking up from idle), not just every digest_intervalle_heures. _job_digest_admin now checks the persisted Dernier_Digest_Notifications timestamp (Parametres_Vortex) and skips if less than 24h have passed, unless force=True (the manual "ENVOYER LE DIGEST MAINTENANT" button still always sends).0fb9aa4
-
Securite et fiabilite : corrections sur l'ensemble du simulateur/octroi/notifications
Relecture complete (17 fichiers modifies + 4 nouveaux) des corrections suivantes, apportees en parallele sur le poste : Securite : - Simulateur public : recherche client remplacee (ne liste plus toute la base), mot de passe partage remplace par un lien d'onboarding a usage unique, outils JASMINE (portefeuille reel) retires cote page publique (allowed_tools=[]). - Mots de passe hashes PBKDF2-HMAC-SHA256 (core/auth.py), compatible avec les comptes pas encore migres, comparaison en temps constant y compris pour un identifiant inconnu (anti-enumeration). - Verrouillage apres 5 tentatives de connexion echouees (5 min). - IP client lue depuis le dernier maillon de X-Forwarded-For (celui ajoute par le proxy de confiance) plutot que le premier (falsifiable par le client) ; bug qui empechait l'enregistrement du GPS corrige. - Motif libre du client (et l'analyse JASMINE qui en decoule) traite comme une donnee a citer, jamais une instruction, avec echappement HTML avant afficha…397b23d
-
Migre l'envoi d'email vers l'API HTTPS Brevo (SMTP bloque sur HF Spaces)
Hugging Face Spaces bloque les connexions SMTP sortantes (587/465/25) pour la plupart des Spaces -- confirme par plusieurs fils du forum HF et par l'erreur "Connexion SMTP : timed out" observee en conditions reelles sur le module Communications. Le SMTP (Gmail ou Brevo relay) ne peut donc jamais aboutir depuis ce deploiement, quel que soit le fournisseur. Nouveau module central src/core/email_client.py : utilise l'API Brevo (BREVO_API_KEY, deja present dans les secrets, HTTPS/443 jamais bloque) en priorite, et ne retombe sur smtplib que si aucune cle API n'est configuree (utile en local ou sur un hebergement autorisant le SMTP). email_sender.py, notifications.py, geoloc_verify.py et communications.py delegent maintenant tous a ce module -- toute la logique SMTP dupliquee (login, port, enveloppe) est supprimee de ces 4 fichiers. Corrige au passage un vrai Bcc (enveloppe/API) a la place d'un simple en-tete "Bcc:" visible dans email_sender.py. Co-Authored-By: Claude Sonnet 5 <noreply@a…f56ffd3
-
Ajoute un identifiant de connexion SMTP distinct de l'adresse expediteur
Necessaire pour Brevo (et tout relais SMTP similaire) : le login SMTP (ex. aced4d001@smtp-brevo.com) est different de l'adresse d'expediteur verifiee affichee dans le "From". Nouveau secret optionnel SMTP_LOGIN, utilise pour server.login() a la place de SENDER_EMAIL ; retombe sur SENDER_EMAIL si absent (comportement Gmail inchange). Retire aussi quelques emojis au passage sur le code touche. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>dda528d -
Retire les emojis de l'onglet Relances (Logistique)
Streamlit affiche deja une icone via st.warning/success/info/error -- l'emoji manuel en plus faisait doublon. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>d2ca892
-
Corrige un crash SMTP dans notifications.py (StreamlitSecretNotFoundError)
Les identifiants SMTP etaient lus via st.secrets["smtp"]["..."], un format TOML imbrique jamais utilise ailleurs dans le code, et l'except KeyError ne rattrapait pas StreamlitSecretNotFoundError (levee quand aucun secrets.toml n'existe du tout - le cas sur ce deploiement Hugging Face, ou les secrets sont des variables d'environnement). Resultat : le bouton "ENVOYER LE DIGEST MAINTENANT" faisait planter toute la page. Aligne notifications.py sur le meme pattern get_credential(cle) (env puis st.secrets, jamais d'exception) deja utilise par email_sender.py et le reste du code, avec les memes noms de cles (SMTP_SERVER, SMTP_PORT, SENDER_EMAIL, SENDER_PASSWORD, ADMIN_EMAIL) - les identifiants deja configures pour les emails KYC fonctionnent donc directement ici aussi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>6a44331
-
Reactive et fiabilise les notifications et la carte, ajoute la page Logistique
notifications.py etait du code mort : demarrer_scheduler() n'etait appele nulle part. Le branche desormais au demarrage de l'app (streamlit_app.py), corrige envoyer_email_rappel pour utiliser une vraie copie cachee admin (un seul email, plus de message separe ni de fallback admin@vortex.com), et ajoute un digest quotidien (_job_digest_admin) couvrant les dossiers KYC en attente de revue et les demandes de pret en attente depuis plus de 3 jours. map_dashboard.py etait egalement inatteignable (aucune entree de menu). Deplace les cles LocationIQ et Mapbox codees en dur vers les secrets, colore les marqueurs par statut de pret reel (rouge = retard/litige), remplace le panneau LIVE FEED fictif par des compteurs reels, et ajoute une tournee prioritaire (plus proche voisin) pour les clients a risque. Nouvelle page unifiee "Logistique" (src/modules/logistique.py) avec 3 onglets : carte terrain, dossiers a traiter (KYC + demandes en attente), et relances (statut + declenchement manuel du dige…6f4a72e
-
Update src/modules/notifications.py
Verified signature688a66d -
Update src/modules/notifications.py
Verified signature5b0c2d8
-
Update src/modules/notifications.py
Verified signature75a0ab1 -
Update src/modules/notifications.py
Verified signature506651d
-
Update src/modules/notifications.py
Verified signatureeae5bee -
Create notifications.py
Verified signature59a8c9f