mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-19 13:08:11 +02:00
Fournisseur : repli sur un fournisseur référencé quand aucun n'est marqué principal
Le Hit Parade, la recherche produit et les opportunités n'acceptaient que artfou1.preference = 1 : un article dont la préférence n'est pas renseignée dans FF (ou posée sur une ancienne fiche du même codein) s'affichait en « Sans fournisseur ». On prend désormais le principal s'il existe, sinon le fournisseur référencé le plus récent ; le Hit Parade cherche sur toutes les fiches du codein. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WT49YnjumAVBjCB4EUXNL1
This commit is contained in:
1 file changed
+27
-13
+27
-13
@@ -1226,6 +1226,13 @@ pub struct HitParadeRow {
|
|||||||
/// mouvements et fausser les sommes, et le LATERAL fournisseur ne s'exécute que
|
/// mouvements et fausser les sommes, et le LATERAL fournisseur ne s'exécute que
|
||||||
/// par article vendu (et non par ligne de mouvement).
|
/// par article vendu (et non par ligne de mouvement).
|
||||||
///
|
///
|
||||||
|
/// Fournisseur affiché : le principal (`artfou1.preference = 1`) s'il existe,
|
||||||
|
/// sinon n'importe quel fournisseur référencé — cherché sur toutes les fiches
|
||||||
|
/// portant le même codein (ré-créations d'article), la plus récente d'abord.
|
||||||
|
/// Exiger `preference = 1` laissait en « Sans fournisseur » les articles dont
|
||||||
|
/// la préférence n'est pas renseignée dans FF ou n'est posée que sur une
|
||||||
|
/// ancienne fiche du même codein.
|
||||||
|
///
|
||||||
/// Cas vérifié (codein 487673, site 579, jan→juil 2026) : 31 ventes brutes,
|
/// Cas vérifié (codein 487673, site 579, jan→juil 2026) : 31 ventes brutes,
|
||||||
/// 7 retours clients → 24 net. L'ancien SUM(ABS(qtemvt)) affichait 38 (retours
|
/// 7 retours clients → 24 net. L'ancien SUM(ABS(qtemvt)) affichait 38 (retours
|
||||||
/// additionnés) ; SUM(-qtemvt) donne 24, identique à l'API mensuel officielle.
|
/// additionnés) ; SUM(-qtemvt) donne 24, identique à l'API mensuel officielle.
|
||||||
@@ -1247,6 +1254,19 @@ pub async fn pg_get_hit_parade(date_debut: &str, date_fin: &str) -> anyhow::Resu
|
|||||||
AND a.codein IS NOT NULL
|
AND a.codein IS NOT NULL
|
||||||
GROUP BY TRIM(a.codein::text), m.site
|
GROUP BY TRIM(a.codein::text), m.site
|
||||||
),
|
),
|
||||||
|
fou AS (
|
||||||
|
SELECT DISTINCT ON (TRIM(a.codein::text))
|
||||||
|
TRIM(a.codein::text) AS codein,
|
||||||
|
af1.code,
|
||||||
|
af1.reference
|
||||||
|
FROM articles a
|
||||||
|
JOIN artfou1 af1 ON af1.art_no_id = a.no_id
|
||||||
|
WHERE TRIM(a.codein::text) IN (SELECT codein FROM ventes)
|
||||||
|
ORDER BY TRIM(a.codein::text),
|
||||||
|
(af1.preference = 1) DESC NULLS LAST,
|
||||||
|
a.no_id DESC,
|
||||||
|
af1.no_id DESC
|
||||||
|
),
|
||||||
attrs AS (
|
attrs AS (
|
||||||
SELECT DISTINCT ON (TRIM(a.codein::text))
|
SELECT DISTINCT ON (TRIM(a.codein::text))
|
||||||
TRIM(a.codein::text) AS codein,
|
TRIM(a.codein::text) AS codein,
|
||||||
@@ -1256,13 +1276,7 @@ pub async fn pg_get_hit_parade(date_debut: &str, date_fin: &str) -> anyhow::Resu
|
|||||||
COALESCE(n.code, '')::text AS nomenclature_code,
|
COALESCE(n.code, '')::text AS nomenclature_code,
|
||||||
COALESCE(n.libelle, 'Sans nomenclature')::text AS nomenclature
|
COALESCE(n.libelle, 'Sans nomenclature')::text AS nomenclature
|
||||||
FROM articles a
|
FROM articles a
|
||||||
LEFT JOIN LATERAL (
|
LEFT JOIN fou af ON af.codein = TRIM(a.codein::text)
|
||||||
SELECT af1.code, af1.reference
|
|
||||||
FROM artfou1 af1
|
|
||||||
WHERE af1.art_no_id = a.no_id AND af1.preference = 1
|
|
||||||
ORDER BY af1.code
|
|
||||||
LIMIT 1
|
|
||||||
) af ON TRUE
|
|
||||||
LEFT JOIN fouident fi ON fi.code = af.code
|
LEFT JOIN fouident fi ON fi.code = af.code
|
||||||
LEFT JOIN nomenclature n ON n.no_id = a.nom_no_id
|
LEFT JOIN nomenclature n ON n.no_id = a.nom_no_id
|
||||||
WHERE TRIM(a.codein::text) IN (SELECT codein FROM ventes)
|
WHERE TRIM(a.codein::text) IN (SELECT codein FROM ventes)
|
||||||
@@ -2253,8 +2267,8 @@ pub async fn pg_search_produits(term: &str, limit: i64) -> Vec<PgProduitSearchRo
|
|||||||
LEFT JOIN LATERAL (
|
LEFT JOIN LATERAL (
|
||||||
SELECT af1.code
|
SELECT af1.code
|
||||||
FROM artfou1 af1
|
FROM artfou1 af1
|
||||||
WHERE af1.art_no_id = m.no_id AND af1.preference = 1
|
WHERE af1.art_no_id = m.no_id
|
||||||
ORDER BY af1.code
|
ORDER BY (af1.preference = 1) DESC NULLS LAST, af1.no_id DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) af ON TRUE
|
) af ON TRUE
|
||||||
LEFT JOIN fouident fi ON fi.code = af.code
|
LEFT JOIN fouident fi ON fi.code = af.code
|
||||||
@@ -2339,8 +2353,8 @@ pub async fn pg_get_produits_by_code_centrale(codes_centraux: &[String]) -> Hash
|
|||||||
LEFT JOIN LATERAL (
|
LEFT JOIN LATERAL (
|
||||||
SELECT af1.code
|
SELECT af1.code
|
||||||
FROM artfou1 af1
|
FROM artfou1 af1
|
||||||
WHERE af1.art_no_id = m.no_id AND af1.preference = 1
|
WHERE af1.art_no_id = m.no_id
|
||||||
ORDER BY af1.code
|
ORDER BY (af1.preference = 1) DESC NULLS LAST, af1.no_id DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) af ON TRUE
|
) af ON TRUE
|
||||||
LEFT JOIN fouident fi ON fi.code = af.code
|
LEFT JOIN fouident fi ON fi.code = af.code
|
||||||
@@ -2907,8 +2921,8 @@ pub async fn pg_get_opportunites_famille(nom_no_id: i64, date_debut: &str, date_
|
|||||||
LEFT JOIN LATERAL (
|
LEFT JOIN LATERAL (
|
||||||
SELECT af1.code
|
SELECT af1.code
|
||||||
FROM artfou1 af1
|
FROM artfou1 af1
|
||||||
WHERE af1.art_no_id = r.no_id AND af1.preference = 1
|
WHERE af1.art_no_id = r.no_id
|
||||||
ORDER BY af1.code
|
ORDER BY (af1.preference = 1) DESC NULLS LAST, af1.no_id DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) af ON TRUE
|
) af ON TRUE
|
||||||
LEFT JOIN fouident fi ON fi.code = af.code
|
LEFT JOIN fouident fi ON fi.code = af.code
|
||||||
|
|||||||
Reference in new issue
Block a user