Modification de l'import avec prompt IA

This commit is contained in:
2026-07-04 23:09:46 +02:00
parent 8834236840
commit 8bcd7e603d
5 changed files with 493 additions and 48 deletions
+28 -1
View File
@@ -139,6 +139,14 @@ router.post('/apply', (req, res, next) => {
let inserted = 0, skipped = 0, duplicates = 0;
const errors = [];
// 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();
const trackPlatDate = (plateformeId, dateStr) => {
if (!plateformeId || !dateStr) return;
const cur = platMinDate.get(plateformeId);
if (!cur || dateStr < cur) platMinDate.set(plateformeId, dateStr);
};
const tx = db.transaction(() => {
for (let idx = 0; idx < rows.length; idx++) {
@@ -157,6 +165,7 @@ router.post('/apply', (req, res, next) => {
const dateOperation = normaliseDate(v('date_operation'));
const type = normaliseType(v('type'));
const montant = num(v('montant'));
trackPlatDate(plateformeId, dateOperation);
// Anti-doublon : même investisseur + plateforme + date + type + montant
const dup = db.prepare(`
@@ -186,6 +195,7 @@ router.post('/apply', (req, res, next) => {
const plateformeId = resolveRefId(v('plateforme_id'), platIdSet, platNameMap, 'Plateforme');
const nomProjet = String(v('nom_projet'));
const dateSouscription = normaliseDate(v('date_souscription'));
trackPlatDate(plateformeId, dateSouscription);
// Anti-doublon : même investisseur + plateforme + nom du projet + date de souscription
const dup = db.prepare(`
@@ -295,6 +305,23 @@ router.post('/apply', (req, res, next) => {
});
tx();
// Anomalie : une date importée précède la date d'ouverture déclarée sur la plateforme
const anomalies = [];
if (platMinDate.size > 0) {
for (const [plateformeId, minDate] of platMinDate) {
const plat = db.prepare('SELECT id, nom, date_ouverture FROM plateformes WHERE id = ? AND user_id = ?')
.get(plateformeId, req.user.id);
if (plat && plat.date_ouverture && minDate < plat.date_ouverture) {
anomalies.push({
plateforme_id: plat.id,
plateforme_nom: plat.nom,
date_ouverture_actuelle: plat.date_ouverture,
date_detectee: minDate,
});
}
}
}
db.prepare(`
INSERT INTO imports (user_id, investisseur_id, module, filename, rows_total, rows_inserted, rows_skipped, rows_duplicates, mapping_json)
VALUES (?,?,?,?,?,?,?,?,?)
@@ -313,7 +340,7 @@ router.post('/apply', (req, res, next) => {
// Clean up temp file
try { fs.unlinkSync(tempPath); } catch { /* */ }
res.json({ inserted, skipped, duplicates, total: rows.length, errors: errors.slice(0, 50) });
res.json({ inserted, skipped, duplicates, total: rows.length, errors: errors.slice(0, 50), anomalies });
} catch (e) { next(e); }
});