bug(onboarding): la case « Classer une transaction à la main » ne se coche jamais — le classement manuel écrit 'true' en texte #390
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#390
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat
Max, le 2026-10-06, en testant l'onboarding phase 1 sur la v0.17.0 : classer une transaction à la main sur la page Transactions ne coche pas la case 5 de la liste de démarrage, « Classer une transaction à la main ».
Cause (vérifiée)
useTransactions.updateCategoryappelleupdateTransactionCategory(txId, categoryId, true)(src/hooks/useTransactions.ts:279). Le service lie ce booléen tel quel :is_manually_categorized = $2avec[categoryId, isManual, txId](src/services/transactionService.ts:296-306).src/wrapper.rs:155-165). Un booléen tombe dansquery.bind(value)avec unserde_json::Value, que sqlx 0.8.6 encode en JSON, donc en texte : la colonne reçoit'true', pas1.is_manually_categorized INTEGER NOT NULL DEFAULT 0. L'affinité INTEGER ne convertit que les textes qui ont la forme d'un nombre, donc'true'reste du texte.COUNT(*) FROM transactions WHERE is_manually_categorized = 1(src/services/onboardingService.ts:43). Un texte n'est jamais égal à l'entier 1, donc le compteur reste à 0.Reproduit sur SQLite 3.45, avec la même définition de colonne : la ligne écrite
'true'atypeof=text, celle écrite1atypeof=integer, etWHERE m = 1ne compte que la seconde.Aucun test ne touche
updateTransactionCategoryniupdateCategory.onboardingService.test.tsvérifie le texte de la requête contre un mock, etonboardingChecklist.test.tspart de compteurs déjà calculés.Portée
2b9fc49, 2026-02-08). Toute transaction classée depuis la page Transactions porte'true'en texte, dans tous les profils existants.autoCategorizeTransactions(= 0), écarte ces lignes, ce qui est le comportement voulu ;"true"relue est vraie.parseInt("true") || 0vaut 0,dataExportService.ts:363) ;"true"tel quel (dataExportService.ts:632-641).categoryService.ts:282,balance.service.ts:229-230et494-501), etapplyKeywordWithReassignmentécrit1en dur (categorizationService.ts:266-272).Correctif proposé
updateTransactionCategory:isManual ? 1 : 0.UPDATE transactions SET is_manually_categorized = 1 WHERE is_manually_categorized = 'true'. Les profils existants retrouvent ainsi leur case 5 à la mise à jour, sans rien refaire."true".Tests attendus
updateTransactionCategoryest l'entier1. RemettreisManualbrut doit faire rougir le test.'true'en 1 et laisse 0 et 1 intacts."is_manually_categorized": "true"écrit 1.Critères
CHANGELOG.mdetCHANGELOG.fr.md.La PR #394 est mergée en avance rapide le 2026-10-06 (
main=5910387). L'issue reste ouverte, comme l'annonceRefs: elle attend les vérifications de la liste post-merge de la PR, à faire sur un build qui contient le correctif (version suivante ou build local) :~/.config/com.simpl.resultat/migration-backups/;.dbet ses fichiers annexes doivent disparaître de~/.config/com.simpl.resultat/.L'issue passe en
status:blockedjusqu'à ces vérifications ; elle sera fermée à la main, avec les preuves. Suivis non bloquants de la revue : #395.Vérifications post-merge faites par Max sur la v0.17.1 publiée (tag sur
e4db715, qui contient la PR #394) ; complétion confirmée le 2026-10-10. Les cinq points de la liste (commentaire 20191) sont faits :~/.config/com.simpl.resultat/migration-backups/, import fonctionnel dans ce profil ;.dbet ses fichiers annexes de~/.config/com.simpl.resultat/;Le détail des observations n'est pas consigné ici. Fermeture à la main, comme l'annonçait
Refs. Les suivis non bloquants de la revue restent en #395.