mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-22 22:48:08 +02:00
Grille : le prix de vente vient de cube_pv, pas d'article_infosup
La colonne PV s'affichait vide sur toutes les lignes. Le schéma du SaaS Postgres (dépôt Apiflow, postgres/init.sql) explique pourquoi : la seule source lue jusqu'ici, `article_infosup.prix_vente_mini`, est une borne de PARAMÉTRAGE — un prix plancher, à côté de `prix_vente_maxi` et `pv_conseille` — et non le prix pratiqué. Le prix de vente vit dans `cube_pv (artnoid, site, pv)`, pendant exact du `cube_pa` déjà utilisé pour l'achat, rafraîchi chaque nuit depuis le cube MSSQL `Cube_PV`. `cube_stock` porte le même PV et sert de filet : il ne couvre que les articles ayant une ligne de stock, mais il est déjà interrogé par la Grille, une colonne de plus dans le SELECT suffit. Le prix est propre à chaque MAGASIN. La colonne suit donc le magasin consulté ; en « tous magasins » elle montre le prix commun, et s'ils divergent le plus élevé assorti d'un « ≠ » et de l'infobulle qui donne les deux. Une moyenne afficherait un prix qu'aucune caisse ne pratique, et retenir silencieusement l'un des deux ferait passer le prix d'un magasin pour celui des deux. L'en-tête devient « PV / Magasin » : « PV central » décrivait la fiche article, ce n'est plus la source. Vérifié sur build de production, prix identiques, divergents et absents : en « tous magasins » 14,90 € ≠ avec l'infobulle « Frouard (Nancy) : 13,90 € · Houdemont : 14,90 € » ; sur Frouard 13,90 €, sur Houdemont 14,90 €, sans marqueur ; « - » quand aucune source n'a de prix. La route de diagnostic compte désormais les trois sources côte à côte, de quoi confirmer sur la base réelle laquelle est renseignée. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYGgoQCG1VCe42HzbzhAXR
This commit is contained in:
5 files changed
+160
-10
No files matched your search
@@ -72,6 +72,8 @@ export interface PgStockRow {
|
||||
qte: number;
|
||||
valstock: number;
|
||||
prmp: number;
|
||||
/** Prix de vente du site — cube_stock.pv, filet de secours si cube_pv est vide. */
|
||||
pv?: number;
|
||||
dernierevente?: string;
|
||||
dernierereception?: string;
|
||||
}
|
||||
@@ -456,6 +458,7 @@ export async function pgGetStockByFournisseur(codefou: string): Promise<Map<stri
|
||||
cs.qte::float,
|
||||
cs.valstock::float,
|
||||
cs.prmp::float,
|
||||
cs.pv::float,
|
||||
cs.dernierevente::text,
|
||||
cs.dernierereception::text
|
||||
FROM cube_stock cs
|
||||
@@ -472,6 +475,41 @@ export async function pgGetStockByFournisseur(codefou: string): Promise<Map<stri
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prix de vente par article et par site (`cube_pv`).
|
||||
*
|
||||
* Pendant exact de `cube_pa` pour l'achat, rafraîchi chaque nuit depuis le cube
|
||||
* MSSQL `Cube_PV`. C'est LA source du prix de vente : `article_infosup`, seule
|
||||
* table lue jusqu'ici pour cette information, ne porte qu'un prix plancher de
|
||||
* paramétrage (`prix_vente_mini`) qui reste vide en pratique.
|
||||
*
|
||||
* Retour : codein → { site → PV }. Les prix nuls sont écartés — un article non
|
||||
* tarifé n'est pas un article à 0 €.
|
||||
*/
|
||||
export async function pgGetPrixVenteByFournisseur(codefou: string): Promise<Map<string, Record<string, number>>> {
|
||||
const result = await pgNoParallel(sql`
|
||||
SELECT
|
||||
a.codein,
|
||||
cpv.site,
|
||||
cpv.pv::float AS pv
|
||||
FROM cube_pv cpv
|
||||
JOIN articles a ON a.no_id = cpv.artnoid
|
||||
JOIN (SELECT DISTINCT art_no_id FROM artfou1 WHERE code = ${codefou}) af
|
||||
ON af.art_no_id = a.no_id
|
||||
WHERE cpv.pv IS NOT NULL AND cpv.pv > 0
|
||||
`);
|
||||
|
||||
const map = new Map<string, Record<string, number>>();
|
||||
for (const row of result.rows as { codein: string; site: string; pv: number }[]) {
|
||||
if (!row.codein || !row.site) continue;
|
||||
const parSite = map.get(row.codein) ?? {};
|
||||
parSite[String(row.site)] = Number(row.pv);
|
||||
map.set(row.codein, parSite);
|
||||
}
|
||||
console.log(`[pg-ff] Prix de vente : ${map.size} articles tarifés pour ${codefou}`);
|
||||
return map;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 6. Commandes en cours
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in new issue
Block a user