Prix de vente : élaguer le code magasin, qui sert de clé

Le code magasin de `cube_pv` sert de clé de recherche côté Grille
(`prixVenteByStore["292"]`). Or la synchronisation Apiflow l'écrit BRUT
(`site: r.Site`), là où elle fait passer celui de `cube_stock` par `safeStr`
— et aucune des deux ne l'élague. Une colonne MSSQL de largeur fixe remonte
complétée d'espaces : la recherche échouerait alors sans rien signaler, et
de la pire façon qui soit, le prix restant visible en « tous magasins » et
vide magasin par magasin.

`TRIM` des deux côtés, plus l'élagage du repli lu depuis le cube de stock.
L'opération ne coûte rien quand il n'y a pas de remplissage, et le doute
n'avait pas de raison de subsister.

La route de diagnostic affiche désormais les valeurs de `site` telles
qu'elles sont stockées, avec leur longueur : de quoi vérifier d'un coup
d'œil que les clés sont bien « 292 » et « 579 », sur trois caractères.

Commentaires SQL déplacés hors du littéral gabarit, comme partout ailleurs
dans le fichier : un accent grave dans un commentaire refermait la chaîne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYGgoQCG1VCe42HzbzhAXR
This commit is contained in:
Claude committed 2026-08-14 06:12:25 +00:00
1 parent c9e1934aae
commit 8158eda11b
3 files changed
+31 -3

No files matched your search

+9 -2
View File
@@ -450,10 +450,12 @@ function buildNomMap(rows: PgNomRow[]): Map<string, PgNomRow> {
* 1 requête SQL — remplace la partie stock du référentiel.
*/
export async function pgGetStockByFournisseur(codefou: string): Promise<Map<string, PgStockRow[]>> {
// `site` est élagué pour la même raison que dans pgGetPrixVenteByFournisseur :
// il sert de clé de recherche (derniereLivraisonByStore, prix de repli).
const result = await pgNoParallel(sql`
SELECT
a.codein,
cs.site,
TRIM(cs.site::text) AS site,
cs.stockdispo::float,
cs.qte::float,
cs.valstock::float,
@@ -487,10 +489,15 @@ export async function pgGetStockByFournisseur(codefou: string): Promise<Map<stri
* tarifé n'est pas un article à 0 €.
*/
export async function pgGetPrixVenteByFournisseur(codefou: string): Promise<Map<string, Record<string, number>>> {
// Le site sert de CLÉ de recherche côté Grille (prixVenteByStore["292"]), d'où
// l'élagage : la synchronisation Apiflow écrit `cube_pv.site` brut, sans passer
// par le `safeStr` qu'elle applique à `cube_stock`. Une colonne MSSQL de largeur
// fixe remonterait complétée d'espaces, et la recherche échouerait en silence —
// le prix resterait visible en « tous magasins » et vide magasin par magasin.
const result = await pgNoParallel(sql`
SELECT
a.codein,
cpv.site,
TRIM(cpv.site::text) AS site,
cpv.pv::float AS pv
FROM cube_pv cpv
JOIN articles a ON a.no_id = cpv.artnoid