Amélioration de l'importation de donnée

This commit is contained in:
2026-07-14 14:10:27 +02:00
parent 86a047a0c5
commit 4ef7cbee04
5 changed files with 729 additions and 49 deletions
+55
View File
@@ -700,6 +700,61 @@ router.delete('/:id', (req, res, next) => {
} catch (e) { next(e); }
});
// ── Purge des données d'une plateforme (dépôts/retraits, investissements, remboursements) ──
// La plateforme elle-même n'est jamais supprimée par cette route : seules les données
// rattachées le sont, afin de permettre une réimportation propre derrière.
const PurgeSchema = z.object({
scope: z.enum(['all', 'depots_retraits', 'investissements', 'remboursements']),
confirmNom: z.string().min(1),
});
router.post('/:id/purge-donnees', (req, res, next) => {
try {
const { scope, confirmNom } = PurgeSchema.parse(req.body);
const plat = db.prepare('SELECT id, nom FROM plateformes WHERE id = ? AND user_id = ?')
.get(req.params.id, req.user.id);
if (!plat) throw new HttpError(404, 'Plateforme introuvable');
// Sécurité supplémentaire : le nom retapé doit correspondre exactement (protection
// contre une confirmation validée par erreur sur la mauvaise plateforme).
if (confirmNom.trim() !== plat.nom) {
throw new HttpError(400, 'Le nom saisi ne correspond pas exactement au nom de la plateforme.');
}
const platId = plat.id;
const counts = { depots_retraits: 0, investissements: 0, remboursements: 0, simul_remboursements: 0 };
const tx = db.transaction(() => {
if (scope === 'depots_retraits' || scope === 'all') {
counts.depots_retraits = db.prepare('DELETE FROM depots_retraits WHERE plateforme_id = ?').run(platId).changes;
}
if (scope === 'remboursements') {
// Ne touche que les remboursements réels ; les investissements et leur échéancier restent.
counts.remboursements = db.prepare(`
DELETE FROM remboursements
WHERE investissement_id IN (SELECT id FROM investissements WHERE plateforme_id = ?)
`).run(platId).changes;
}
if (scope === 'investissements' || scope === 'all') {
// Compte avant suppression : les remboursements et l'échéancier simulé sont
// supprimés en cascade (ON DELETE CASCADE) par la suppression des investissements.
counts.remboursements = db.prepare(`
SELECT COUNT(*) AS n FROM remboursements
WHERE investissement_id IN (SELECT id FROM investissements WHERE plateforme_id = ?)
`).get(platId).n;
counts.simul_remboursements = db.prepare(`
SELECT COUNT(*) AS n FROM simul_remboursements
WHERE investissement_id IN (SELECT id FROM investissements WHERE plateforme_id = ?)
`).get(platId).n;
counts.investissements = db.prepare('DELETE FROM investissements WHERE plateforme_id = ?').run(platId).changes;
}
});
tx();
res.json({ ok: true, scope, plateforme: plat.nom, counts });
} catch (e) { next(e); }
});
// ── Reset aux valeurs du référentiel ──────────────────────────────────────
router.post('/:id/reset', (req, res, next) => {
try {