Commit Graph
167 Commits
Author SHA1 Message Date
MichaelandClaude Sonnet 4.6 740aed3181 feat: add analytics page with CA TTC comparison by supplier/nomenclature
- pg-ff-client: add pgGetCaByFournisseur() and pgGetCaByNomenclature()
  returning CA TTC per site and month for monthly N vs N-1 comparison
- analytics/page.tsx: server component with pivot logic to reshape raw
  query data into store-separated columns (292/579/total) with evolution %
- analytics/client.tsx: client controls (mode dropdown, month selector)
  and responsive table with color-coded evolution badges
- sidebar: add "Analytics" link to navigation

Features:
- Switch between "Fournisseur" and "Nomenclature" views
- Select any month for comparison vs same month prior year
- Columns split by store: Frouard/Nancy (292), Houdemont (579), Total
- Each store shows: CA this month, CA N-1, evolution %
- Footer totals row matching sum of detail rows
- FR locale currency formatting (€)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 09:40:31 +02:00
MichaelandClaude Sonnet 4.6 7a30783285 fix: force score=0 for zero-sale products and fix reception SQL sign
- score-engine: add hard guard (wQty=0 && wCa=0 → score=0) before any
  calculation to prevent edge cases (residual margin, percentile rank)
  from producing non-zero scores on unsold articles
- score-engine: set inactivity=24 when product has never sold, so the
  regularityMultiplier penalty (0.3) is correctly applied instead of 1
- pg-ff-client: remove erroneous negation on qte_recue — entry movements
  have positive qtemvt in the DB, negating them produced negative values
  that failed the > 0 check, hiding all entrées in tooltips and modals

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 09:19:57 +01:00
Michael 76b06419a0 feat: add PostgreSQL client to replace per-article HTTP calls with bulk SQL queries for FF Nancy data. 2026-03-23 16:56:22 +01:00
Michael ffa257fda1 feat: Implement product heatmap grid with comprehensive data aggregation and PostgreSQL client for product rows. 2026-03-23 16:09:09 +01:00
Michael c63a60c0cf feat: implement PostgreSQL client for FF Nancy API data with bulk SQL queries, replacing per-article HTTP calls. 2026-03-23 11:58:50 +01:00
Michael f24da605af feat: Implement direct PostgreSQL client for FF Nancy data, replacing per-article HTTP API calls. 2026-03-21 19:24:51 +01:00
Michael 46c799bd60 feat: Add dashboard page displaying network KPIs and store statistics, along with a new PostgreSQL data client. 2026-03-21 19:18:41 +01:00
Michael 3a74689f31 feat: Add PostgreSQL client for bulk fetching FF Nancy data, replacing per-article HTTP API calls. 2026-03-21 17:11:54 +01:00
Michael 6ee0e3294d feat: Introduce direct PostgreSQL client for FF Nancy data to replace HTTP API calls and add a new dashboard page. 2026-03-21 14:37:02 +01:00
Michael d1bbe290da feat: Implement dashboard layout and a new PostgreSQL client for optimized FF Nancy data fetching via bulk SQL queries. 2026-03-21 13:07:59 +01:00
Michael e3d241a5ff feat: add PostgreSQL client for FF Nancy to replace per-article HTTP API calls with bulk SQL queries. 2026-03-21 11:59:36 +01:00
Michael 1664aaf4cc feat: Implement initial dashboard page displaying key performance indicators, site statistics, top items, and monthly evolution. 2026-03-21 08:54:52 +01:00
Michael 1e393753fa feat: Implement PostgreSQL client for FF Nancy to replace per-article HTTP calls with bulk SQL queries. 2026-03-21 08:37:33 +01:00
Michael eb8ca92847 feat: Add PostgreSQL client for FF Nancy to replace per-article HTTP calls with bulk SQL queries. 2026-03-21 00:56:36 +01:00
Michael 966b13cdf0 feat: implement dashboard page displaying KPIs, site statistics, top items, and monthly evolution using a new PostgreSQL client. 2026-03-21 00:22:14 +01:00
Michael 7cb96966aa feat: implement PostgreSQL client for FF Nancy data, replacing per-article HTTP calls with bulk SQL queries. 2026-03-20 16:09:22 +01:00
Michael d5a422e738 feat: Implement dashboard page, its data fetching client, and shared sidebar component. 2026-03-20 14:43:19 +01:00
Michael e391550a30 feat: Introduce product assortment grid client and direct PostgreSQL data access for FF Nancy. 2026-03-20 14:25:30 +01:00
Michael 2e1988a6f5 feat: Implement PostgreSQL client for FF Nancy, replacing per-article HTTP API calls with bulk SQL queries. 2026-03-20 14:18:22 +01:00
Michael 8c5f1c16be feat: add PostgreSQL client for FF Nancy data, replacing per-article HTTP calls with bulk SQL queries. 2026-03-20 14:07:53 +01:00
Michael 1aed954606 feat: Replace per-article HTTP calls with direct bulk SQL queries via new PostgreSQL client for FF Nancy data. 2026-03-20 13:59:30 +01:00
Michael 4996e126b3 feat: implement PostgreSQL client to replace per-article HTTP API calls with bulk SQL queries for FF Nancy data. 2026-03-20 13:31:19 +01:00
Michael dd846247c9 feat: add PostgreSQL client to fetch FF Nancy data via bulk SQL queries, replacing per-article HTTP requests. 2026-03-20 13:23:07 +01:00
Michael 6827257f95 feat: Add PostgreSQL client for FF Nancy data, replacing HTTP API calls with efficient bulk SQL queries. 2026-03-20 13:07:09 +01:00
Michael b4f583415b feat: Add PostgreSQL client for FF Nancy data, replacing HTTP API calls with bulk SQL queries for improved performance. 2026-03-20 11:39:40 +01:00
Michael d5b518477a feat: Add PostgreSQL client for FF Nancy data, replacing per-article HTTP calls with bulk SQL queries for improved performance. 2026-03-20 11:30:54 +01:00
Michael 750017de14 feat: Add PostgreSQL client for FF Nancy data, replacing per-article HTTP API calls with bulk SQL queries for improved performance. 2026-03-20 11:17:24 +01:00
Michael 4b84b56aa6 feat: Introduce a PostgreSQL client for direct FF Nancy data access, replacing per-article HTTP API calls with bulk SQL queries. 2026-03-20 10:57:21 +01:00
Michael eb0fb14021 feat: Add PostgreSQL client for direct FF Nancy database access, replacing per-article HTTP API calls with bulk SQL queries. 2026-03-20 10:44:49 +01:00
Michael a875dbda86 feat: Add PostgreSQL client for FF Nancy to replace per-article HTTP calls with bulk SQL queries. 2026-03-20 10:37:47 +01:00
Michael 70b49c5c56 feat: Introduce getProductRows server action for fetching and processing comprehensive product data from PostgreSQL. 2026-03-20 10:25:24 +01:00
Michael f94d7753b4 feat: Implement direct PostgreSQL client for FF Nancy data, replacing HTTP API calls with bulk SQL queries for improved performance. 2026-03-20 10:12:39 +01:00
Michael 4dd1b5f7c7 feat: Introduce PostgreSQL client for bulk data retrieval and integrate it into product grid data fetching actions. 2026-03-20 10:05:30 +01:00
Michael 58d467a7ea feat: implement product row data retrieval and processing logic for the grid. 2026-03-20 09:58:32 +01:00
MichaelandClaude Sonnet 4.6 65f455b4e2 perf: referentiel+ranking only for articles with sales, per-article ranking
The ranking bulk endpoint is capped at 500 by the API server, making
it useless for full supplier matching. Per-article ranking (codein filter)
works correctly and is now called only for articles WITH sales data.

getProductRows restructured:
- Phase 2A: mensuel + commandes in parallel (all articles)
- Phase 2B: referentiel + ranking in parallel, only for articlesWithData
  (articles that appear in mensuelMap)

For a 45060-article supplier with 5446 with sales:
- Referentiel: 45060 → 5446 calls (88% reduction)
- Ranking: 45060 → 5446 calls (88% reduction)

totalRankedProducts fetched from GET /api/ranking?limit=500 count.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:02:12 +01:00
MichaelandClaude Sonnet 4.6 383b8ccac7 fix: ranking bulk match by codein AND gencod/gtin, add entry key logging
The bulk ranking response (GET /api/ranking?limit=30000) may use
'gencod' instead of 'codein' as the article identifier. Added:
- gtin→codein lookup map built from article gtin fields
- Match entries by entry.codein first, then by entry.gencod→article.gtin
- Diagnostic logging of the first entry's keys and values to identify
  the correct identifier field in the API response
- Increased fallback per-article batchSize from 20 to 50

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 21:51:42 +01:00
MichaelandClaude Sonnet 4.6 1cd3ade77e perf: remove actif filter, increase batchSize, exclude Y articles without sales
- Remove actif/suspendu filter that caused wrong stats (893€ CA, 249 units)
  by incorrectly excluding products with sales. The parallel pagination
  and bulk ranking fixes are sufficient to handle large suppliers.
- Increase getMensuelByArticles and getReferentielByArticles batchSize
  from 20 to 50, reducing sequential batch iterations by ~2.5x.
- Filter gamme Y products with zero 12-month sales from returned rows.
  Reduces grid size (e.g. S053: 14775→fewer rows) without affecting
  products that actually sold. Y products with sales are preserved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 21:23:34 +01:00
MichaelandClaude Sonnet 4.6 be3a196744 perf: parallel article pagination + single-call full ranking fetch
Article pagination:
- fetchAllPages fallback now fetches 10 pages in parallel instead of
  sequentially. Stops as soon as any page returns < pageSize items.
  For S053 (30 pages), reduces sequential time by ~10x.

Ranking:
- getRankingByArticles now fetches the entire network ranking in one
  call (GET /api/ranking?limit=30000) and matches by codein.
  Replaces foucentrale bulk (which returned 0) and per-article fallback
  (which would be 8889 calls for S053).
- totalRankedProducts = actual number of entries returned by the API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 20:58:03 +01:00
Michael 69c7d65482 feat: Add Claude settings to allow specific Git and Next.js Bash commands. 2026-03-19 20:06:11 +01:00
MichaelandClaude Sonnet 4.6 dcebf74f31 perf: replace N ranking API calls with 1 bulk fetch per supplier
getRankingByArticles now uses GET /api/ranking?foucentrale=<code>
to fetch all rankings for a supplier in a single request instead of
making one request per article. For a 500-article supplier this goes
from ~500 HTTP calls to 2 (count + bulk), eliminating the timeout
that caused the client-side crash on large suppliers.

Falls back to per-article requests if no codeFournisseur is provided
or if the bulk endpoint fails.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 18:53:49 +01:00
Michael aa69637f98 feat: Introduce bulk AI analyzer component to pre-classify products and prepare data for AI analysis, including context profiling. 2026-03-19 13:19:49 +01:00
Michael 34529f3934 feat: add FF Nancy API client for fetching suppliers, articles, and movements with pagination and data mapping. 2026-03-19 12:55:55 +01:00
Michael 8b7d81b20c feat: implement product grid with comprehensive product data fetching, processing, and heatmap display. 2026-03-19 12:41:03 +01:00
Michael 95795ce7e3 feat: Introduce AI analysis engine for product A/Z recommendations based on detailed business rules. 2026-03-18 22:15:14 +01:00
Michael e96bfa818d feat: Add a percentile composite score engine to calculate product performance based on sales, volume, and margin. 2026-03-18 21:41:29 +01:00
Michael c303427dd0 feat: implement a centralized HTTP client for the FF Nancy REST API, including data types, pagination, and functions for suppliers, articles, and movements. 2026-03-18 20:00:45 +01:00
MichaelandClaude Sonnet 4.6 8986f7d001 feat: integrate /referentiel endpoint for nomenclature, gamme, stock, PA
Replaces ventesProduits DB query with API call to /articles/:no_id/referentiel.
Called in parallel with mensuel and commandes.

Extracts:
- article.nom_code/nom_libelle → code3/libelle3 (nomenclature)
- gammes[0].gamme_code → codeGamme + codeGammeInit (frozen initial)
- prix.achat + fournisseurs[0].pcb → pa/prixAchat/pcb
- stock[] → stockActuel/stockTotal/stockValeur (real-time)
- performance.derniere_vente/derniere_entree → derniereVente/derniereLivraison

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 19:26:47 +01:00
MichaelandClaude Sonnet 4.6 47e617afd3 feat: restore reference, gtin, gamme initiale and nomenclature
api-ff-client.ts:
- FfArticle: add reference (ref_fou_principale) and gtin fields
- getArticlesByFournisseur: map ref_fou_principale → reference, gtin → gtin

get-product-rows.ts:
- ProductRow seeded with reference and gtin from API articles
- Phase 6: read codeGamme, codeGammeInit, code3, libelle3 from ventesProduits
  (read-only, DISTINCT ON codein ordered by updated_at DESC)
- Phase 7 snapshot still overrides DB gammes when a snapshot exists

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 18:08:21 +01:00
MichaelandClaude Sonnet 4.6 58f17152a1 feat: switch to /articles/:no_id/mensuel endpoint for sales & stock data
Replaces bulk mouvements pagination + per-article stock N+1 with a single
batched call to the new mensuel endpoint (confirmed working via diag).

api-ff-client.ts:
- Remove getStockByFournisseur (no longer needed)
- Add FfMensuelEntry/Ventes/Receptions interfaces
- Add getMensuelByArticles(articles, dateDebut, dateFin, batchSize=20)
  → Map<codein, FfMensuelEntry[]> using no_id as API identifier

get-product-rows.ts:
- Phase 2: getMensuelByArticles + getCommandesByFournisseur in parallel
- Phase 5: aggregate mois×site entries → sales12m, stock12m, workingStores
  - qte_vendue / ca_ht are negative → Math.abs()
  - stock carry-forward for months with no data
  - pa from prmp_fin_mois

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 18:00:55 +01:00
MichaelandClaude Sonnet 4.6 5c40a615c7 fix: correct API field names for articles and mouvements endpoints
Articles:
- noid: r.no_id (was r.noid)
- codefou: r.codefou_principal (was r.codefou)
- nomfou: r.nom_fou_principal (was r.nomfou)
- pcb: r.pcb_principal (was r.pcb)

Mouvements:
- datemvt: r.datmvt (was r.datemvt) — CRITICAL
- qte: r.qtemvt (was r.qte) — CRITICAL
- montant: r.mntmvtht (was r.montant) — CRITICAL
- marge: r.margemvt (was r.marge) — CRITICAL
- URL now uses dateDebut/dateFin params (confirmed working vs datedeb/datefin which ignores filter)

Sites fallback: use real codes 292/579 (Frouard/Houdemont)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 15:03:19 +01:00