Correction importation

This commit is contained in:
2026-07-14 15:03:08 +02:00
parent 3e4c0dffa8
commit 84f1cb19d5
3 changed files with 1241 additions and 2 deletions
+23 -1
View File
@@ -6,9 +6,10 @@ import fs from 'node:fs';
import db from '../db/index.js';
import { HttpError } from '../middleware/errorHandler.js';
import { requireInvestisseur } from '../middleware/investisseurScope.js';
import { generateSimul, generateSimulWithReinvestissements } from '../utils/schedule.js';
import { generateSimul, generateSimulWithReinvestissements, adjustSimulForActuals } from '../utils/schedule.js';
import { recordHistory, detectChangements, detectTypeEvenement } from './investissements.js';
import { checkDonneesIncompletes } from '../jobs/checkDonneesIncompletes.js';
import { syncInvestissementStatut } from './remboursements.js';
const router = Router();
@@ -332,6 +333,10 @@ router.post('/apply', (req, res, next) => {
let inserted = 0, skipped = 0, duplicates = 0;
const errors = [];
// Investissements touchés par un remboursement importé (module 'remboursements') — sert à
// reproduire après coup ce que fait la création manuelle d'un remboursement (statut auto
// + réajustement de l'échéancier), que l'import ne faisait pas jusqu'ici.
const affectedInvestissementIds = new Set();
// Date la plus ancienne rencontrée par plateforme (dépôts/retraits + investissements)
// — sert à détecter une date antérieure à la date d'ouverture déclarée sur la plateforme.
const platMinDate = new Map();
@@ -458,6 +463,7 @@ router.post('/apply', (req, res, next) => {
v('statut') || 'paye',
srcLabel,
);
affectedInvestissementIds.add(investissementId);
} else if (module === 'plateformes') {
const nom = String(v('nom') || '').trim();
@@ -524,6 +530,22 @@ router.post('/apply', (req, res, next) => {
}
}
// Reproduit après import ce que fait la création manuelle d'un remboursement :
// passage automatique au statut "rembourse" si le capital est intégralement remboursé,
// et réajustement de l'échéancier (troncature des échéances futures devenues caduques en
// cas de remboursement anticipé). Sans cela, un investissement soldé via import restait
// affiché "En cours" avec un échéancier complet non réajusté (contrairement à la saisie manuelle).
if (module === 'remboursements' && affectedInvestissementIds.size > 0) {
for (const invId of affectedInvestissementIds) {
try {
syncInvestissementStatut(invId);
adjustSimulForActuals(db, invId);
} catch (e) {
console.error(`[imports] réajustement post-import échoué pour l'investissement #${invId} :`, e.message);
}
}
}
// Anomalie : une date importée précède la date d'ouverture déclarée sur la plateforme
const anomalies = [];
if (platMinDate.size > 0) {
+1 -1
View File
@@ -86,7 +86,7 @@ function syncAutoRetrait(rembId, methode, netRecu, investissementId, dateRemb) {
);
}
function syncInvestissementStatut(investissement_id) {
export function syncInvestissementStatut(investissement_id) {
if (!investissement_id) return;
const inv = db.prepare('SELECT montant_investi FROM investissements WHERE id=?').get(investissement_id);
if (!inv) return;