From ef4576d1602844d7dcaec5b196a60780bba4c14a Mon Sep 17 00:00:00 2001 From: Olivier Date: Sun, 12 Jul 2026 18:11:51 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20de=20la=20d=C3=A9tection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/routes/investissements.js | 20 +++++++++--- .../src/pages/settings/DataCleanupSection.jsx | 32 +++++++++++++++---- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/backend/src/routes/investissements.js b/backend/src/routes/investissements.js index e23faa3..f09d41e 100644 --- a/backend/src/routes/investissements.js +++ b/backend/src/routes/investissements.js @@ -174,11 +174,18 @@ router.get('/comptes-courants', (req, res) => { res.json(rows); }); -// POST /api/investissements/fix-differe-dates +// POST /api/investissements/fix-differe-dates { seuilMois?: 3|6|12|18|24 } // Corrige date_premiere_echeance et date_cible des prêts différés dont les dates -// s'écartent de plus de 2 ans par rapport à date_souscription + duree_mois. +// s'écartent de plus de `seuilMois` mois par rapport à date_souscription + duree_mois. +const SEUILS_MOIS_VALIDES = [3, 6, 12, 18, 24]; +const SEUIL_MOIS_DEFAUT = 24; + router.post('/fix-differe-dates', (req, res, next) => { try { + const seuilMois = SEUILS_MOIS_VALIDES.includes(Number(req.body?.seuilMois)) + ? Number(req.body.seuilMois) + : SEUIL_MOIS_DEFAUT; + const rows = db.prepare(` SELECT i.id, i.nom_projet, i.date_souscription, i.duree_mois, i.date_premiere_echeance, i.date_cible, @@ -191,7 +198,9 @@ router.post('/fix-differe-dates', (req, res, next) => { AND i.duree_mois IS NOT NULL `).all(req.user.id); - const SEUIL_JOURS = 730; // 2 ans + // Approximation jours/mois (moyenne julienne) — cohérent avec l'ancien seuil fixe + // de 730 jours pour 24 mois (2 ans). + const SEUIL_JOURS = Math.round(seuilMois * 30.44); function addMonths(dateStr, months) { const d = new Date(dateStr + 'T00:00:00Z'); @@ -246,7 +255,8 @@ router.post('/fix-differe-dates', (req, res, next) => { recordHistory(inv.id, { type_evenement: 'correction_auto_dates', changements, - notes: 'Correction automatique (Nettoyage > Corriger les dates des prêts différés) : écart > 2 ans avec date_souscription + duree_mois', + notes: `Correction automatique (Nettoyage > Corriger les dates des prêts différés) : ` + + `écart > ${seuilMois} mois avec date_souscription + duree_mois`, }); // Régénère l'échéancier de projection avec la date corrigée — sans ça, @@ -282,7 +292,7 @@ router.post('/fix-differe-dates', (req, res, next) => { // sinon le prêt affiche un statut incohérent avec sa date jusqu'au lendemain. const statutsMisAJour = corriges.length > 0 ? checkStatutsRetard() : 0; - res.json({ updated: corriges.length, detail: corriges, statutsMisAJour }); + res.json({ updated: corriges.length, detail: corriges, statutsMisAJour, seuilMois }); } catch (err) { next(err); } diff --git a/frontend/src/pages/settings/DataCleanupSection.jsx b/frontend/src/pages/settings/DataCleanupSection.jsx index 36d40af..27caf93 100644 --- a/frontend/src/pages/settings/DataCleanupSection.jsx +++ b/frontend/src/pages/settings/DataCleanupSection.jsx @@ -12,6 +12,7 @@ export default function DataCleanupSection() { const [loadingReprocess, setLoadingReprocess] = useState(false); const [showDiffereModal, setShowDiffereModal] = useState(false); const [loadingDiffere, setLoadingDiffere] = useState(false); + const [seuilMoisDiffere, setSeuilMoisDiffere] = useState(24); const [showEcheancierModal, setShowEcheancierModal] = useState(false); const [loadingEcheancier, setLoadingEcheancier] = useState(false); const [showBackfillModal, setShowBackfillModal] = useState(false); @@ -56,7 +57,9 @@ export default function DataCleanupSection() { setErrorMsg(null); setSuccessMsg(null); try { - const { updated, detail, statutsMisAJour } = await api.post('/investissements/fix-differe-dates', {}); + const { updated, detail, statutsMisAJour } = await api.post('/investissements/fix-differe-dates', { + seuilMois: seuilMoisDiffere, + }); if (updated === 0) { setSuccessMsg('Aucune date incohérente détectée sur les prêts différés.'); } else { @@ -163,8 +166,8 @@ export default function DataCleanupSection() {
Recalcule la date de 1ère échéance et la date cible à partir de la date de souscription - et de la durée prévue. Seuls les prêts dont les dates s'écartent de plus de 2 ans - de la valeur calculée sont corrigés. + et de la durée prévue. Seuls les prêts dont les dates s'écartent de la valeur calculée + de plus qu'un seuil choisi (3 à 24 mois) sont corrigés.