Spaces:
Running
Running
Commit History
4 days ago
-
feat(tarif): forfait duree minimale = plancher, taux machine si plus eleve
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>8661ddc -
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
7 days ago
-
fix(securite): XSS sur donnees publiques, limite d'envoi des liens simulateur
- echappement HTML des donnees saisies par le public avant rendu brut : analyse IA des documents KYC (kyc_form), profession/secteur (request_loans), nom et valeurs des garants (Data_exploration). Plus important depuis que le cookie de session est lisible en JavaScript. - simulateur public : email valide obligatoire, 3 liens/heure par adresse, 40 liens/heure au total (protege le compte Brevo et la feuille des tokens) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c4a01d3
9 days ago
-
feat(exercice): separation de toute l'application par annee civile
- core/exercice.py : source unique (lecture des dates FR/ISO, bornes, selecteur EXERCICE de la barre laterale, regle A : chaque flux dans l'annee de sa propre date, echeancier contractuel, synthese par exercice). - Objectifs de benefice par exercice (2026 = 2,2 M, 2027 = 3,5 M XOF, annees futures = dernier objectif connu), editables par annee. - Dashboard, Optimizer, rapports IA, JASMINE, Digital Twin : chiffres de l'exercice choisi + comparaison N-1 ; benefice = interets + penalites encaisses dans l'annee. - IA : consigne d'exercice dans tous les prompts. ML : variable Annee_Deblocage + erreur hors echantillon par exercice. - Correctif : "2026-03-01" n'est plus lu comme le 3 janvier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>631cd58
10 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
12 days ago
-
perf+fix(simulateur): Jasmine plus rapide, capacite de remboursement lue par la grille
LLM : modeles non textuels exclus (image, audio, deep-research...) ; un modele en echec est ecarte un moment (15 min quota, 6 h modele absent, 2 min panne) au lieu d'etre reessaye a chaque appel ; mode rapide (modeles flash d'abord) et delai de 25 s par modele pour l'analyse Jasmine. Jev : Jasmine recoit la capacite de remboursement calculee par la grille de l'entreprise et doit la recopier ; la trace envoyee a Jev contient cette lecture et la grille. Mots de decision interdits dans le rapport, phrase de non-garantie imposee. Outil tools/jev_diagnostic.py pour tester quelles formulations passent. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>5183195 -
fix: journalisation des refus Jev et ajustements du remboursement
- Simulateur : chaque refus Jev de l'analyse est écrit dans les logs avec les contrôles échoués, le score, l'erreur et le début du rapport, pour diagnostiquer les boucles de réécriture Jasmine - Remboursements et penalites : modifications en cours de la session de suivi (AnalyseRepayment, repayments) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>238c4a3 -
fix: remboursements, pénalités, rappels et cohérence des calculs
Remboursements (AnalyseRepayment, repayments): - Un paiement en retard qui ne couvre pas les pénalités est PARTIEL et ne clôture plus le prêt tant qu'un solde reste dû (garde-fou 1 %) - Pénalités dues une seule fois par échéance (celles déjà encaissées sont retirées), prélevées en premier dans la limite du versement : plus d'intérêts négatifs ; trop-perçu refusé avec message ; la dernière échéance absorbe le reliquat cumulé ; scénario de pénalités obligatoire en cas de retard - Registre des retards pardonnés : une échéance qui a déjà encaissé des pénalités n'est plus comptée comme pardonnée - Numéro de reçu et ID de transaction : plus grand numéro émis + 1, lus du même instantané juste avant l'écriture - Rappels : pénalités annoncées = pénalités encaissées (une seule règle pour le bouton, le tir groupé et le job de 12 h) ; bilan du tir groupé conservé après rechargement, clients sans email journalisés - Reçu PDF : adresse échappée (balisage dans l'adresse ne casse plus …92d7dac
23 days ago
-
Rendre le taux de marge de l'Optimizer éditable via Règles Métier
- Ajouter la règle 'Regle_Plafond_Marge_Optimizer' dans vortex_params.py (défaut: 1.0%) - Modifier jasmine_optimizer.py pour lire le plafond depuis les règles métier au lieu du hardcode - Ajouter l'UI dans regles_metier.py pour éditer et historiser les changements - Utiliser le plafond configurable dans les scénarios, diagnostics et rapport IA - Le taux est modifiable par pas de 0.1% sans redéploiement96cc64a
25 days ago
-
Ajouter les validations Jev et l'estimation de remboursement
e07d8ff
27 days ago
-
Réduit la consommation de quota Google Sheets : lectures groupées + cache étendu
- core/sheets_cache.py : ajoute get_cached_dfs_batch() (1 appel API via values_batch_get au lieu de N appels par feuille), tout en reproduisant la numérisation par défaut de get_all_records() pour un résultat identique. - request_loans.py, client_simulator.py, Usis.py, map_dashboard.py, logistique.py, communications.py, ml_dashboard.py : lectures regroupées en un seul appel (avec repli feuille par feuille si une feuille optionnelle manque), ou mises en cache quand elles ne l'étaient pas. - regles_metier.py : cache la lecture de Clients_KYC (liste déroulante), inchangé pour les lectures qui doivent rester immédiates (règles de tarification en direct). - Laissé volontairement sans cache : Check_Up_Loans.py (désactive la numérisation gspread pour éviter une corruption des décimales françaises — incompatible avec le nouveau cache groupé), les lectures juste après une écriture (forecasting, règles métier), et les tâches planifiées en arrière-plan (notifications).c20487a -
Barème de majoration par montant, détail des frais, et fix quota 429
Barème : la majoration pour retard pardonné dépend désormais du montant du prêt simulé (5% < 50k, 2,5% entre 50k et 150k, 2% > 150k XOF), remplaçant le forfait unique précédent. Pilotable dans Règles Métier. Détail des frais : le simulateur écrit maintenant la composition du taux (frais de transfert, risque brut IA, marge, majoration retard) dans de nouvelles colonnes de Prets_Requests, affichées dans le module Demandes Prêts. Quota 429 : l'initialisation du registre de pénalités ouvrait la feuille et écrivait une ligne par client/occurrence, épuisant le quota de lecture Google Sheets. Elle n'ouvre désormais la feuille qu'une fois et écrit toutes les lignes en un seul appel. Nouvelle fonction afficher_erreur_sheets() (bandeau jaune 429 / rouge générique) appliquée au chargement du simulateur et aux appels Sheets de Règles Métier ; la majoration se dégrade silencieusement en cas d'échec plutôt que de casser la page du client. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>4d00d77 -
Seuil de retard inclusif (>=) et message de blocage plus direct
Un retard de exactement 3 jours (le seuil) compte désormais comme occurrence éligible, au lieu d'exiger strictement plus de 3 jours. Le message "2 prêts en cours" invite maintenant directement à rembourser un prêt en cours, plutôt que de renvoyer vers le conseiller. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>3b3da67 -
Ajoute la majoration forfaitaire pour retards pardonnés (simulateur uniquement)
Un retard pardonné (Statut_Paiement EN_RETARD, Jours_Retard > seuil, Penalites_Retard = 0) dans Remboursements devient une occurrence facturable dans le simulateur de prêts, jamais une réécriture rétroactive des prêts déjà soldés. Nouveau registre append-only Suivi_Penalites_Retard (détection par ID_Transaction, aucun doublon même en relançant la détection) : chaque prêt soumis consomme une seule occurrence et porte une majoration forfaitaire fixe (pas multipliée par le solde), répartissant la pénalité sur plusieurs prêts plutôt que de tout charger sur un seul. Le seuil de jours et le pourcentage de majoration sont pilotables depuis le module Règles Métier (historisés, sans redéploiement), qui gagne aussi un bouton d'initialisation volontaire pour construire le solde de départ de tous les clients déjà concernés, avant mise en service. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>c922ea2
30 days ago
-
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 -
Centralise le taux de frais de transfert (TAXE_TRANSFERT) dans AnalyseFinance
Le taux de frais de transfert (+0,5%) etait ecrit en dur independamment a 3 endroits (client_simulator.py, et 2 fois dans request_loans.py), avec un risque de divergence silencieuse si un seul de ces endroits etait modifie. Source unique desormais dans Analytics.AnalyseFinance, reutilisee partout. Note : la duplication du calcul de mensualite dans le simulateur (client_simulator.py) a deja ete resolue ailleurs (fonction unique calculer_mensualite_pret) dans des changements non commites en cours sur ce fichier — non inclus ici, voir la conversation pour le detail. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>cf60bf3 -
Corrige le calcul du retard moyen dans l'historique de remboursement
Le retard moyen et le pire retard etaient calcules sur toutes les echeances, paiements en avance (jours negatifs) inclus, ce qui pouvait produire une moyenne negative absurde (ex: "Retard moyen : -1.4 j"). Seules les echeances reellement en retard (jours > 0) sont desormais prises en compte pour ces deux metriques. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>6dbf038
-
Rendre non bloquante l'alerte de risque d'endettement (>130%)
L'alerte reste affichee (theme jaune/Gotham) mais ne bloque plus la soumission de la demande : le gerant garde la decision finale. Ajoute un affichage de l'historique de remboursement (retards passes) du client, visible cote simulateur public et cote module Demandes Prets, pour aider a evaluer le risque reel du dossier. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>3d15e49
-
Retire les fichiers __pycache__ suivis par erreur et ajoute .gitignore
Le commit precedent a accidentellement inclus des .pyc de compilation locale (git add -A trop large). Ce ne sont pas des sources, juste du bytecode genere -- retires du suivi et ignores desormais. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>6025346 -
Nettoie les imports et fonctions mortes detectes par audit statique
Scan AST (imports jamais references) + scan par occurrences (fonctions jamais appelees) sur tout src/, verifie manuellement pour ecarter les faux positifs (accents cassant les limites de mot dans un grep de controle). Retire ~35 imports inutilises repartis sur 24 fichiers, et 3 fonctions mortes : get_form_elapsed_time (doublon d'un calcul deja fait dans kyc_form.py), get_select_index (jamais appelee), et refresh_data (dupliquee a l'identique dans Check_Up_Loans.py et loans_engine.py, jamais branchee a un bouton). Laisse de cote apply_ai_algorithms, detect_fraud_logic, is_closed et build_from_networkx -- a activer, pas a supprimer (suite dans un prochain commit). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>5b0dd39
-
Ajoute detection de proximite/geolocalisation verifiee et module Communications
- Corrige l'agent ontologie (rdfs:label != nom) et cable les donnees manquantes des widgets JASMINE (USIS, onboarding). - TACTICAL MAP : lignes de proximite plus-proche-voisin (detection de collusion), geocodage sur adresse complete + pays dynamique au lieu du Senegal force, correction manuelle persistante par client. - Onboarding : capture GPS navigateur + comparaison IP (non bloquant pour l'instant, le temps de confirmer que la permission navigateur fonctionne sur l'environnement de deploiement). - Nouveau : lien de verification de localisation par email (usage unique, declenchement manuel par client) et module Communications pour l'envoi groupe a une selection de clients/garants. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>6916dd5
-
Centralise l'objectif annuel et fiabilise le Forecasting
Ajoute vortex_params.py comme source de verite unique pour l'objectif annuel de profit (remplace les deux valeurs codees en dur et desynchronisees dans jasmine_optimizer.py et AI_Reports.py), le rend editable dans l'Optimizer, corrige le filtrage YTD par annee, et branche une comparaison optionnelle avec la tendance XGBoost. Ajoute une projection annuelle vs objectif dans le Digital Twin. Corrige aussi le reporting Forecasting qui restait vide : AI_Reports ne lisait jamais l'onglet Forecasting, independamment de toute synchronisation, et celle-ci n'etait declenchee que manuellement. Ajoute une synchronisation automatique si les donnees sont absentes ou perimees (+12h). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>4f24ce4
-
Update src/Analytics/ModelML.py
Verified signature5685c70 -
Update src/Analytics/ModelML.py
Verified signature8336b65
-
Update src/Analytics/AnalyseFinance.py
Verified signature00e719a -
Update src/Analytics/AnalyseFinance.py
Verified signature4aec028 -
Update src/Analytics/ModelML.py
Verified signature28145f3 -
Update src/Analytics/ModelML.py
Verified signaturef509f5e -
Update src/Analytics/ModelML.py
Verified signature40fe153 -
Update src/Analytics/ModelML.py
Verified signature0c866dd -
Update src/Analytics/ModelML.py
Verified signaturef0cca35 -
Update src/Analytics/ModelML.py
Verified signature82c087a -
Update src/Analytics/ModelML.py
Verified signaturea3f0108
-
Update src/Analytics/ModelML.py
Verified signatureb5af1da -
Create ModelML.py
Verified signature1c43a9f
-
Update src/Analytics/AnalyseRepayment.py
Verified signature58f500f
-
Update src/Analytics/AnalyseRepayment.py
Verified signature10d0cd8
-
Update src/Analytics/AnalyseRepayment.py
Verified signatureb122ea8
-
Update src/Analytics/AnalyseRepayment.py
Verified signaturee600b59
-
Update src/Analytics/AnalyseRepayment.py
Verified signaturece653d3
-
Update src/Analytics/AnalyseRepayment.py
Verified signature22e8a4e
-
Update src/Analytics/AnalyseRepayment.py
Verified signature9f03a37
-
Update src/Analytics/AnalyseRepayment.py
Verified signaturea845ea7
-
Update src/Analytics/AnalyseRepayment.py
Verified signature3f0c350
-
Update src/Analytics/AnalyseRepayment.py
Verified signatureb30306c -
Update src/Analytics/AnalyseRepayment.py
Verified signature521bfea
-
Update src/Analytics/Data_description.py
Verified signaturec2500c0 -
Update src/Analytics/AnalyseRepayment.py
Verified signatureeaa15bd -
Update src/Analytics/ML_Feature_Store_Analytics.py
Verified signature46dd77a -
Update src/Analytics/Data_exploration.py
Verified signature38f1b57