Spaces:
Running
Running
Commit History
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
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
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 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