- requestTimeout 300000ms pour éviter timeout sur grosses tables (MvtArt) - Chaque étape sync est wrappée en try/catch pour ne pas bloquer les suivantes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
require('dotenv').config();
|
|
const cron = require('node-cron');
|
|
|
|
const { syncArticles } = require('./tables/articles');
|
|
const { syncFournisseurs } = require('./tables/fournisseurs');
|
|
const { syncStock } = require('./tables/stock');
|
|
const { syncMouvements } = require('./tables/mouvements');
|
|
const { syncCommandes } = require('./tables/commandes');
|
|
const { syncReferentiel } = require('./tables/referentiel');
|
|
const { syncRanking } = require('./tables/ranking');
|
|
const { closeAll } = require('./db');
|
|
const {
|
|
startDashboard, registerSyncFn,
|
|
setSyncRunning, isSyncRunning,
|
|
setProgress, clearProgress,
|
|
} = require('./server');
|
|
|
|
const forceMode = process.argv.includes('--force');
|
|
|
|
// Groupes dans l'ordre d'exécution
|
|
const STEPS = [
|
|
{ name: 'referentiel', fn: syncReferentiel },
|
|
{ name: 'articles', fn: syncArticles },
|
|
{ name: 'fournisseurs', fn: syncFournisseurs },
|
|
{ name: 'stock', fn: syncStock },
|
|
{ name: 'mouvements', fn: syncMouvements },
|
|
{ name: 'commandes', fn: syncCommandes },
|
|
{ name: 'ranking', fn: syncRanking },
|
|
];
|
|
|
|
async function syncAll(force = false) {
|
|
if (isSyncRunning()) {
|
|
console.log('Sync déjà en cours — ignorée.');
|
|
return;
|
|
}
|
|
setSyncRunning(true);
|
|
clearProgress();
|
|
const start = Date.now();
|
|
console.log(`\n=== SYNC START ${new Date().toISOString()} (force=${force}) ===`);
|
|
|
|
try {
|
|
for (let i = 0; i < STEPS.length; i++) {
|
|
const { name, fn } = STEPS[i];
|
|
setProgress(name, i + 1);
|
|
console.log(`[${i + 1}/${STEPS.length}] Sync ${name}…`);
|
|
try {
|
|
await fn(force);
|
|
} catch (err) {
|
|
console.error(`[${name}] ERREUR NON CATCHÉE: ${err.message}`);
|
|
}
|
|
}
|
|
} finally {
|
|
setSyncRunning(false);
|
|
clearProgress();
|
|
}
|
|
|
|
const elapsed = ((Date.now() - start) / 1000).toFixed(1);
|
|
console.log(`=== SYNC DONE en ${elapsed}s ===\n`);
|
|
}
|
|
|
|
registerSyncFn(syncAll);
|
|
|
|
if (forceMode) {
|
|
console.log('Mode force : sync complète en cours...');
|
|
syncAll(true)
|
|
.then(() => closeAll())
|
|
.then(() => process.exit(0))
|
|
.catch(err => {
|
|
console.error('Erreur fatale sync:', err.message);
|
|
process.exit(1);
|
|
});
|
|
} else {
|
|
startDashboard();
|
|
console.log('Service sync démarré — cron: 0 3 * * * (3h00 chaque nuit)');
|
|
cron.schedule('0 3 * * *', () => {
|
|
syncAll(false).catch(err => console.error('Erreur cron sync:', err.message));
|
|
});
|
|
}
|