Spaces:
Running
Running
Commit History
2 days ago
-
feat(simulateur): score de remboursement sans Jev, selon la qualite du modele Running
Le score s'affiche si le modele a passe ses controles (historique mature, classes equilibrees, test chronologique, Brier, AUC). Jev reste pour l'analyse Jasmine et Ontology. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>2278cb0 -
feat(jasmine): chat et contenu de la carte Logistique (Mapbox) transmis au chat
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>57c9004 -
feat(jasmine): le chat lit tous les graphiques de la page (Plotly et natifs), par module
Les graphiques affiches sont captes (core/graphiques_contexte.py) et transmis au chat de leur page via graphiques_affiches ; le chat lit ceux du run precedent. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>2ce0542 -
fix(jasmine): le chat voit les donnees des graphiques C et H (residus vs predits, stats, historique)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>373f99b
3 days ago
-
fix(signature): localisation facultative — le code email reste saisissable sans position
Le lieu non communique est inscrit a la place (refusee / non recue) avec l'IP. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>06df37a -
feat(jasmine): chat JASMINE sur la page prevision, avant la section A — Signal operationnel
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>b3acfb7 -
fix(ui): legende evolution reelle suit le theme (Ambre en noir)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c928c1f -
docs(onboarding): mail insiste sur localisation obligatoire
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bb9984f -
fix(kyc): geolocalisation facultative si refusee par le navigateur
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8beadd4 -
feat(signature): apercu des contrats dans la page, plus de PDF dans les emails
Lien de signature et confirmation sans piece jointe ; apercu par page (client et preteur), telechargement immediat apres signature, PDF definitifs envoyes a la contresignature. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>966c823 -
fix(logistique): lecture des feuilles tolerante aux onglets absents, quota remonte au bandeau 429
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>5ba382e
4 days ago
-
feat(logistique): carte de renseignement — liens adresses/IP/tel/email/piece entre clients et garants
- core/liens_logistique.py : croisement pur (adresses normalisees + GPS, IP publiques, telephones, emails, pieces, employeurs, garants). IP d'audit limitees aux sessions publiques. - modules/carte_html.py : carte plein ecran noire, clic = dossier du lieu + liens, recherche, alertes. - map_dashboard : retrait du bloc ANSD (donnees externes) et des KPI codes en dur. - sheets_quota : invalidation par onglet (l'audit ne vide plus les autres feuilles). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>1030d8c
5 days ago
-
feat(tarif): forfait duree minimale = plancher, taux machine si plus eleve
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>8661ddc -
fix(demandes): montants lus a 0 quand le Sheet fournit une espace insecable
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>6ff8ef6 -
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 -
feat(signature): localisation obligatoire pour signer et contresigner
- Etape 3 de la page de signature : lieu detecte (ville, quartier) affiche avant le formulaire ; sans position, pas de formulaire. - Apres un refus : case obligatoire qui relance la demande au navigateur (audit_log.redemander_gps, nouvelle cle du composant) ; aide pour reactiver une localisation bloquee. - signer/contresigner(exiger_position=True) refusent une position vide, refusee ou non recue (verification cote service, pas seulement dans l'interface). - Contresignature du preteur : meme localisation (Localisation_Preteur, GPS_Preteur) imprimee dans son bloc ; module partage localisation_ui. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>cfbb492 -
feat(signature): localisation (ville, quartier) dans le bloc de signature
- GPS du navigateur reutilise (audit_log) : geocodage inverse Nominatim en "Ville, Quartier" ; refus ou absence = mention explicite. - Ligne "Localisation (GPS)" dans le contrat, IP conservee a cote ; absente des signatures anterieures (PDF identiques octet pour octet). - Signatures_Contrats : Localisation_Signature et GPS_Signature (coordonnees brutes + precision, jamais imprimees) ; journal de signature enrichi. - Page de signature : information sur l'enregistrement de la position. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>3f6c2b9
6 days ago
-
feat(signature): faire signer tous les prets en cours, avec ou sans remboursement
- lister_prets_a_signer : inclut les prets avec remboursements (colonne Remboursements), exclut seulement ceux deja signes par toutes les parties. - Un pret avec remboursements reste ACTIF pendant l'attente de signature (journal PRET_RESTE_ACTIF) ; sans remboursement il passe EN_ATTENTE_SIGNATURE. - Onglet "Prets a faire signer" : case "Tout selectionner". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bc03a3d -
feat(signature): suivi d'ouverture des emails de lien de signature
- Les emails de lien (et rappels) portent le tag Brevo vortex-signature et sont enregistres dans Suivi_Emails (Type=SIGNATURE, ID_Signature, ID_Pret). - Onglet Signatures > Ouvertures : liens envoyes / ouverts / signes, delai entre premiere ouverture et signature, filtres. - Plus de copie cachee admin sur le lien (son ouverture fausserait le suivi). - envoyer_email accepte tags et meta (message_id Brevo). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c44d4c8
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 -
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 -
feat(signature): mention manuscrite "Bon pour..." saisie par le debiteur
- reconnaissance de dette : montant en toutes lettres (snapshots v2), mention recopiee par le signataire, verifiee avant l'OTP, stockee (Mention_Manuscrite) et imprimee - echeancier du contrat repris tel quel des donnees du pret (recalcul en controle seulement) - mention bornee a 300 caracteres (texte public) Travail d'une autre session, relu et teste avant commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>6122be7 -
feat(signature): onglet Actions, plusieurs demandes affichees en meme temps
Selection multiple : une carte par demande, avec ses propres boutons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>0a12997
9 days ago
-
feat(signature): email au signataire quand sa demande est annulee
- annulation par l'admin : email "lien annule, ne l'utilisez plus" (journal ANNULATION_NOTIFIEE) - nouveau lien a la meme adresse : le mail du nouveau lien annonce que l'ancien est annule - nouveau lien a une adresse corrigee : l'ancienne adresse recoit l'email d'annulation - ecran admin : confirme l'envoi ou signale l'echec de l'email d'annulation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>103bca0
10 days ago
-
feat(ontology): module serieux (vue 360, fraude, coherence, terminal IA fiable)
Exactitude - core/kg_data.py : une ligne par pret (Prets_Master + derniere version Prets_Update), classes canoniques (Prêt = Pret), ID_Officiel n'est plus classe "Officiel", identifiants normalises (telephone, email, piece) - montant_net = Montant_Total de la version courante (plus le MAX de tout "montant") - qualite RDF sur toutes les classes : completude reelle + cardinalites - controles de coherence : references orphelines, doublons, chaine des soldes (solde de depart = Montant_Total), statuts incoherents - fraude : identifiants partages entre personnes distinctes (client = garant compte pour une personne), auto-garantie, garantie croisee, garant multi-emprunteurs Securite - plus aucun HTML brut issu des donnees (chat en st.chat_message, infobulles neutralisees) - identifiants sensibles masques dans le RDF, l'export et tout ce qui part vers LLM/Jev - SPARQL de l'agent en lecture seule (SERVICE/INSERT/DROP... refuses) Robustesse - lecture groupee en cache (values_batch_get)…c6c39e9 -
feat(ui): cases carrees sur tous les st.radio, module Suppressions
- CSS radio : structure react-aria (stRadioOption / data-selected), remplace l'ancien [data-baseweb="radio"] inoperant en Streamlit 1.64 - maintien de session (fragment run_every 5 min) - module Suppressions (admin) et son journal, entree dans l'overlay orb Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>f7df762 -
fix(signature): journal chaine, lecture groupee et arret propre sur quota Sheets
- lot_envoi() : lit Clients_KYC/Garants_KYC une fois par envoi groupe et reutilise la feuille du journal (quota 429) - envoi groupe : arret propre sur APIError avec liste des prets restants - journal de signature chaine (verifier_journal), cache par classeur reinitialise entre tests Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>bbab97f -
fix(telemetrie): heure de Dakar (et non d'Abidjan) dans les libelles
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>4208fca -
chore(telemetrie): renommer le module Audit en Télémétrie
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>3caa1ab -
feat(exercice): base du benefice globale (encaisse / accorde)
Le bouton "Base du benefice" passe dans la barre laterale et pilote tous les modules : - Dashboard : KPI, analyse mensuelle, repartition. - Optimizer : realise selon la base ; interets restant a echoir ajoutes seulement en base encaissee. - Digital Twin : projection du benefice jusqu'au 31/12 de l'exercice (realise + part interets/penalites simulee) au lieu de la tresorerie totale sur 52 semaines ; base accordee = realise. - Rapports IA et JASMINE : base retenue dans les donnees et la consigne. Echeancier contractuel : vraies dates (Dates_Versements) si renseignees. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>2d6c8b9 -
feat(dashboard): bascule benefice encaisse / accorde
Bouton "Base du benefice" sur le Dashboard : Encaisse (interets + penalites, au mois du paiement, base de l'objectif) ou Accorde (cout du credit, au mois du deblocage). KPI, analyse mensuelle, repartition et contexte JASMINE suivent la base choisie. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>89d4159 -
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
11 days ago
-
feat(signature): contresignature du preteur (contrat et caution) avant activation
- Le preteur contresigne le dossier une fois client et garant signes (code par email, admin connecte) - Bloc preteur ajoute au contrat et a l'acte de caution ; reconnaissance de dette inchangee - Pret ACTIF seulement apres contresignature ; documents definitifs envoyes a chaque signataire - Onglet admin 'A contresigner' ; verification publique du sceau preteur - Mention 'loi ivoirienne' retiree du bandeau public Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>db7f3f2 -
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
13 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: decimaux du Sheet lus correctement (17,61 n'est plus lu 1761) et logs LLM/Jev
Le classeur est en locale francaise : gspread supprimait la virgule des decimaux a la lecture ("17,61" -> 1761, "1,5" -> 15, "252,4" -> 2524). core/gspread_fr.py lit desormais une virgule decimale comme un decimal, pour toute l'application (get_all_records, cache partage) et le job de rappels. Neutralise la rustine "diviser par 10 tant que > maximum" de Demandes Prets qui reduisait un taux legitime de 24,11 % en 2,41 %. Diagnostic : [LLM] modele, duree et erreur de chaque tentative ; [JEV <etape>] trace envoyee et reponse brute complete. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c73b85c -
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(simulateur): meme seuil de blocage a l'affichage et a la soumission (LIMITE_PRETS_EN_COURS = 3)
Le garde-fou de soumission bloquait a 2 prets/demandes en cours alors que l'affichage bloque a 3 : un client avec 2 prets etait refuse a tort. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>e50b6fd -
feat(simulateur): progression de l'analyse IA en une ligne et durée dans Demandes Prêts
Sous le bouton d'analyse, une seule ligne remplacée à chaque étape (taux ML, Jasmine, contrôles Jev, modèle de remboursement) avec le temps écoulé, puis "Analyse terminée en X s". Durée totale et détail par étape enregistrés dans Prets_Requests (Duree_Analyse_IA_s, Detail_Analyse_IA) et affichés dans la fiche de la demande. Chronométrage de chaque étape aussi écrit dans les logs ([CHRONO simulation]). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f40f505 -
perf(simulator): stabilize ML cache hash, remove cosmetic KYC upload delays
- client_simulator.py: drop UI-only 'label' column before passing df_clients/df_garants to get_trained_model_cached and train_repayment_model_cached. That column was hashed by st.cache_resource on every click of LANCER L'ANALYSE DU DOSSIER, causing XGBoost/repayment model retraining even when nothing relevant had changed. - kyc_form.py: remove artificial time.sleep() calls in the per-document upload progress loop (~1.35s/doc with zero functional effect). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>7d8fe7c -
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 -
fix(repayments): lock encaissement button right after append_row
If any step after ws_remb.append_row (auto-closure, df_clients lookup, PDF receipt) raised, the except block called liberer() and let the operator click again -> a second TRX for the same payment. Now marquer_fait() runs immediately after the row is written; the except branch only releases the lock when the row has NOT yet been written (deja_fait check). Operator must refresh for a new payment on this loan if a downstream step fails, which is the intended trade-off. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>35191a5 -
fix(simulator): add missing charge_mensuelle_equivalente definition
Previous commit shipped calls to charge_mensuelle_equivalente without its definition (NameError on LANCER L'ANALYSE DU DOSSIER). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>3ee9a2a -
fix(simulator): use ML rate instead of silent 5% fallback
get_trained_model_cached returns (model, dossier_type) but the simulator kept the whole tuple, so predict() raised and every client got the 5% fallback rate. Unpack the model and log each fallback (import, training, unavailable model, prediction) via log_swallowed / vortex logger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>ab935d4 -
Augmente limite prêts simultanés de 2 à 3
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>84013b8
16 days ago
-
fix: lien d'onboarding valable 48 heures, precise dans le mail
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>52546c7
17 days ago
-
fix: parcours client plus fiable (onboarding, KYC, demande de pret)
- Noms avec accents acceptes dans le formulaire KYC (client et contact d'urgence) - Lien d'onboarding verifie a l'ouverture mais consomme seulement apres l'enregistrement du dossier (validite 7 jours) ; lien simulateur reouvrable pendant 2 h - Documents KYC repartis en plusieurs e-mails selon la taille, resultat journalise dans l'onglet Audit_Documents, client prevenu en cas d'echec - Mail de confirmation de demande de pret : echec sans fausse erreur - ID du dossier releve a l'envoi, apercu en cache, erreurs lisibles - Mail d'onboarding : liste des documents et informations a preparer, conseil d'ouvrir le lien dans Chrome ou Safari - APP_BASE_URL : valeur par defaut partagee par tous les liens - Attente forcee par document reduite de 4 s a 1 s Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>bba08b3 -
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
18 days ago
-
fix: APP_BASE_URL sans fallback bloquait l'envoi des liens onboarding
Erreur d'envoi. silencieuse pour client et garant : get_credential n'avait pas de valeur par defaut si le secret APP_BASE_URL etait absent. Ajout du meme fallback que sim_gate.py (URL du Space) et message d'erreur precis (credential manquant, echec Sheets, echec Brevo) au lieu du message generique. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>bd36912