Skip to content

fix(catalogue): les signalements nomment les produits - #17

Merged
lostmind84 merged 2 commits into
mainfrom
fix/signalements-nomment-les-produits
Jul 30, 2026
Merged

lostmind84 merged 2 commits into
mainfrom
fix/signalements-nomment-les-produits

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

§10.3 bis exigeait le nom depuis le debut — « id Odoo et nom du produit, de quoi ouvrir la fiche sans chercher » — et les trois listes de la page Catalogue n'affichaient que l'identifiant. Corriger « 4412 » demande de chercher d'abord de quel produit il s'agit ; corriger « AIL VIOLET SAF » commence tout de suite.

Le chemin, du CSV a l'ecran

Couche Fichier Changement
Domaine internal/domain/journal.go Finding.ProductName
Qualification internal/catalog/findings.go les 13 constructeurs qui recoivent une ligne portent r.Name
Parseur internal/catalog/csvodoo/csvodoo.go duplicateID aussi
Base internal/store/migrations/0002_findings_product_name.sql product_name TEXT NOT NULL DEFAULT ''
Store internal/store/imports.go insert + select
HTTP internal/web/admin.go product_name dans findingDTO
Ecran web/src/admin/pages/Catalog.svelte le nom avant l'identifiant, dans l'extrait rows

Les trois listes — anomalies, unites divergentes, non pesables — sont dessinees par le meme extrait Svelte. Le nom apparait dans les trois d'un seul coup, et le banc les verifie ensemble : une seule qui nommerait le produit designerait un extrait duplique ailleurs.

Pourquoi un instantane et pas une jointure

Le nom est ecrit par l'import qui l'a lu, comme weighings.product_name depuis le premier jour. Une jointure sur products a l'affichage aurait evite la migration et menti deux fois :

  • les signalements d'un import de mars auraient porte le nom d'aujourd'hui ;
  • un lot refuse — dont aucun produit n'entre jamais en base — n'aurait eu aucun nom, alors que c'est precisement le lot qu'on veut diagnostiquer.

Vide dans les deux cas ou le fichier n'en donne pas : un signalement qui ne porte sur aucun produit, et une ligne trop abimee pour porter un nom, ce qu'UNREADABLE_ROW dit deja. L'ecran n'ecrit alors rien plutot qu'un « nom inconnu » qui serait un fait qu'il n'a pas lu. L'identifiant reste dessine partout : c'est lui qui ouvre la fiche dans Odoo.

Effet de bord assume sur les tests de store

Deux tests figeaient user_version a 1 et devenaient faux a la premiere migration livree. Ils lisent MigrationCount(), et reopenWithMigrations embarque desormais toutes les migrations livrees : sans cela une base creee par le vrai Open passait pour en avance sur le binaire, et le test de sauvegarde prealable exercait la branche ERR-DB-02 au lieu de la sienne. Leurs scripts synthetiques sont numerotes au-dela du jeu livre — migrate() parcourt files[v:] par indice, pas par nom, et rejouerait un fichier deja applique.

Le commentaire de DB.migrationSource justifiait ce champ par « avec une seule migration livree, aucun user_version ne satisfait 0 < v < len(files) ». Cette phrase cesse d'etre vraie ici ; elle est remplacee par la raison qui survit.

Correction documentaire jointe

Trois entrees de SUIVI.md declaraient la passe -race injouable sur ce poste et la renvoyaient a la CI Linux. C'etait faux : WinLibs est installe, et son gcc n'est que dans le PATH utilisateur. Un shell qui n'herite pas de l'environnement de session repond cgo: C compiler "gcc" not found, ce qui ressemble a une absence. Les trois invariants de concurrence du Hub sont donc verifiables avant de pousser, ce que l'en-tete du Makefile demande de ne pas perdre. Le chemin est ecrit en clair.

Verification

gofmt -l .                          vide
go vet ./...                        vert
CGO_ENABLED=1 go test ./... -race   31 paquets ok, 0 echec
CGO_ENABLED=0 go test ./...         2 572 passes, 5 ecartes, 0 echec
tools/boundary + tools/deps         vertes
svelte-check                        338 fichiers, 0 erreur, 0 avertissement
vitest                              766 passes (34 fichiers), +2
budget                              79 425 o gzip, 70,5 % du plafond

Les deux nouveaux tests front ont ete prouves vivants : casses volontairement, namesIn('mismatches') renvoyait bien ['OEUFS PLEIN AIR'].

Le budget ne bouge pas de facon significative — les 4 octets d'ecart viennent du hachage des noms d'actifs. La page Catalogue est dans le paquet d'administration, que la grille ne charge jamais.

Hors perimetre, dit explicitement

Le panneau « Produits retirés depuis l'import précédent » ne publie qu'un nombre. Les nommer demanderait une route de plus, et le panneau dit lui-meme ou les lire. C'est un compteur, pas une liste de produits.

§10.3 bis exigeait le nom depuis le debut. Le tableau du OU y dit « id Odoo ET
nom du produit -- de quoi ouvrir la fiche sans chercher », et les trois listes
de la page Catalogue n'affichaient que l'identifiant. Corriger « 4412 » demande
de chercher d'abord de quel produit il s'agit ; corriger « AIL VIOLET SAF »
commence tout de suite. C'est la difference entre un filtre et un plan de
travail, et c'est la seule mesure de la qualite de la configuration Odoo que
quelqu'un regardera.

domain.Finding porte desormais ProductName, rempli par les treize constructeurs
d'internal/catalog qui recoivent une ligne, et par duplicateID du parseur. Les
trois listes -- anomalies, unites divergentes, non pesables -- sont dessinees
par le MEME extrait Svelte : le nom apparait dans les trois d'un seul coup, et
c'est pourquoi le banc les verifie ensemble. Une seule d'entre elles qui
nommerait le produit designerait un extrait duplique ailleurs.

Le nom est un INSTANTANE D'AFFICHAGE, ecrit par l'import qui l'a lu, comme
weighings.product_name depuis le premier jour. Aller le chercher dans products
au moment de l'affichage aurait evite la migration et menti deux fois : les
signalements d'un import de mars auraient porte le nom d'aujourd'hui, et un lot
REFUSE -- dont aucun produit n'entre jamais en base -- n'aurait eu aucun nom du
tout, alors que c'est precisement le lot qu'on veut diagnostiquer.

Il est vide dans les deux cas ou le fichier n'en donne pas : un signalement qui
ne porte sur aucun produit, et une ligne trop abimee pour porter un nom, ce
qu'UNREADABLE_ROW dit deja dans son propre message. L'ecran n'ecrit alors rien
plutot qu'un « nom inconnu » qui serait un fait qu'il n'a pas lu. L'identifiant
reste dessine dans tous les cas : c'est lui qui ouvre la fiche dans Odoo.

Deux tests de store figeaient user_version a 1 et devenaient faux a la premiere
migration livree. Ils lisent MigrationCount(), et reopenWithMigrations embarque
maintenant TOUTES les migrations livrees, pas seulement la premiere : sans cela
une base creee par le vrai Open passait pour en avance sur le binaire, et le
test de sauvegarde prealable exercait la branche ERR-DB-02 au lieu de la sienne.
Leurs scripts synthetiques sont numerotes AU-DELA du jeu livre, sinon migrate()
rejouait un fichier deja applique -- la boucle parcourt files[v:] par indice et
non par nom.

Le commentaire de DB.migrationSource justifiait ce champ par « avec une seule
migration livree, aucun user_version ne satisfait 0 < v < len(files) ». Cette
phrase cesse d'etre vraie avec ce commit ; elle est remplacee par la raison qui
survit, la mise a jour qu'un poste traverse.

Ce changement ne coute rien a l'ecran client : la page Catalogue est dans le
paquet d'administration, que la grille ne charge jamais. Les 4 octets d'ecart du
budget -- 79 429 a 79 425 -- viennent du hachage des noms d'actifs, pas d'une
ligne de code.

Verifie : gofmt propre, go vet vert, 2 572 tests Go passes et 5 ecartes sur
31 paquets, la passe -race verte elle aussi, boundary et deps vertes,
svelte-check sans erreur sur 338 fichiers, 766 tests front sur 34 fichiers
-- deux de plus --, budget a 70,5 % du plafond avec la separation des deux
entrees verifiee.
Trois entrees de SUIVI.md de suite ont affirme que la passe -race ne pouvait pas
etre jouee ici -- « elle exige cgo, le depot est en zero cgo et il n'y a pas de
gcc ici » -- et l'ont renvoyee a la CI Linux. C'etait faux. WinLibs est installe
par winget et son gcc, MinGW-W64 UCRT 16.1.0, n'est que dans le PATH UTILISATEUR,
absent du PATH machine. Un shell qui n'herite pas de l'environnement de session
ne le voit pas, et go test -race repond alors « cgo: C compiler "gcc" not
found », ce qui ressemble a une absence.

Le cout de cette erreur n'est pas documentaire : les trois invariants de
concurrence du Hub sont verifiables AVANT de pousser, et l'en-tete du Makefile
demande nommement de ne jamais perdre cette verification. Elle avait ete
abandonnee sur un diagnostic de PATH.

Le chemin est ecrit en clair, pour ne pas le rechercher une quatrieme fois. La
recherche recursive qui l'avait manque descendait a cinq niveaux sous
%LOCALAPPDATA% ; les paquets winget sont au sixieme.

Les compteurs sont remesures sur ce commit et non recopies : 2 572 tests Go
passes, 5 ecartes, 0 echec sur 31 paquets, passe -race comprise ; 766 tests
front sur 34 fichiers ; bundle client a 79 425 octets gzip, 70,5 % du budget de
112 640.

L'entree du jour dit aussi ce qu'elle NE fait PAS : le panneau des produits
retires depuis l'import precedent ne publie qu'un nombre, et le nommer
demanderait une route de plus. C'est un compteur, pas une liste de produits.
@lostmind84
lostmind84 merged commit 556d797 into main Jul 30, 2026
6 checks passed
@lostmind84
lostmind84 deleted the fix/signalements-nomment-les-produits branch July 30, 2026 08:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant