Files
Apiflow/sync/tables/ranking.js
T
MichaelandClaude Opus 4.6 e189cc3045 fix(sync): ranking dedup + copy logs over HTTP
- ranking.js: déduplique par (gencod, site) avant batchUpsert pour éviter
  "ON CONFLICT DO UPDATE command cannot affect row a second time"
- server.js: bouton "Copier les logs" utilise execCommand fallback quand
  navigator.clipboard indisponible (accès HTTP sans HTTPS)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 12:06:27 +01:00

64 lines
2.5 KiB
JavaScript

const { getMssql, getPg } = require('../db');
const { batchUpsert, logSync, safeStr, safeNum, safeDecimal } = require('../utils');
const COLS = [
'gencod', 'site', 'libelle', 'foucentrale', 'nomfoucentrale',
'ranking_ca', 'ranking_qte', 'ranking_mag_ca', 'ranking_mag_qte', 'ranking_mag_marge',
'pv_calcule', 'pv_mag', 'pv_cen',
'codefamille', 'libellefamille', 'fichier',
'date_maj', 'date_integration', 'date_calcul_mag',
];
async function syncRanking(force) {
const ms = await getMssql();
const pg = getPg();
try {
const res = await ms.request().query(`
SELECT GENCOD, SITE, LIBELLE, FOUCENTRALE, NOMFOUCENTRALE,
RANKING_CA, RANKING_QTE, RANKING_MAG_CA, RANKING_MAG_QTE, RANKING_MAG_MARGE,
PV_CALCULE, PV_MAG, PV_CEN,
CODEFAMILLE, LIBELLEFAMILLE, FICHIER,
DATE_MAJ, DATE_INTEGRATION, DATE_CALCUL_MAG
FROM Ranking
WHERE GENCOD IS NOT NULL
`);
const rows = res.recordset.map(r => ({
gencod: safeStr(r.GENCOD),
site: safeStr(r.SITE) || '000',
libelle: safeStr(r.LIBELLE),
foucentrale: safeStr(r.FOUCENTRALE),
nomfoucentrale: safeStr(r.NOMFOUCENTRALE),
ranking_ca: safeNum(r.RANKING_CA),
ranking_qte: safeNum(r.RANKING_QTE),
ranking_mag_ca: safeNum(r.RANKING_MAG_CA),
ranking_mag_qte: safeNum(r.RANKING_MAG_QTE),
ranking_mag_marge: safeNum(r.RANKING_MAG_MARGE),
pv_calcule: safeDecimal(r.PV_CALCULE),
pv_mag: safeDecimal(r.PV_MAG),
pv_cen: safeDecimal(r.PV_CEN),
codefamille: safeStr(r.CODEFAMILLE),
libellefamille: safeStr(r.LIBELLEFAMILLE),
fichier: safeStr(r.FICHIER),
date_maj: r.DATE_MAJ || null,
date_integration: r.DATE_INTEGRATION || null,
date_calcul_mag: r.DATE_CALCUL_MAG || null,
}));
// Dédupliquer par (gencod, site) — garder la dernière occurrence
const seen = new Map();
for (const r of rows) seen.set(`${r.gencod}|${r.site}`, r);
const deduped = Array.from(seen.values());
const count = await batchUpsert(pg, 'ranking', deduped, ['gencod', 'site'], COLS);
await logSync(pg, 'ranking', count, 'ok');
console.log(`[ranking] ${count} lignes upsert`);
} catch (err) {
await logSync(pg, 'ranking', 0, 'error', err.message);
console.error(`[ranking] ERREUR: ${err.message}`);
}
}
module.exports = { syncRanking };