Amélioration de l'importation de donnée
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user