import { Router } from 'express'; import { z } from 'zod'; import db from '../db/index.js'; const router = Router(); const schema = z.object({ investisseur_id: z.number().int().positive(), plateforme_id: z.number().int().positive(), date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), montant: z.number(), // positif ou négatif notes: z.string().optional(), }); /** * GET /api/corrections * ?scope=all → tous les investisseurs de l'utilisateur * ?annee=YYYY → filtre sur l'année */ router.get('/', (req, res) => { const userId = req.user.id; const scopeAll = req.query.scope === 'all'; const annee = req.query.annee; let where = scopeAll ? 'c.investisseur_id IN (SELECT id FROM investisseurs WHERE user_id = ?)' : 'c.investisseur_id = ?'; const args = [scopeAll ? userId : Number(req.header('X-Investisseur-Id'))]; if (annee) { where += ' AND substr(c.date,1,4) = ?'; args.push(annee); } const rows = db.prepare(` SELECT c.id, c.investisseur_id, c.plateforme_id, c.date, c.montant, c.notes, c.created_at, p.nom AS plateforme_nom, p.fiscalite, inv.nom AS investisseur_nom FROM corrections_solde c JOIN plateformes p ON p.id = c.plateforme_id JOIN investisseurs inv ON inv.id = c.investisseur_id WHERE ${where} ORDER BY c.date DESC, c.created_at DESC `).all(...args); res.json(rows); }); /** * POST /api/corrections */ router.post('/', (req, res) => { const userId = req.user.id; const data = schema.parse(req.body); // Vérifier que la plateforme appartient à l'utilisateur const plat = db.prepare('SELECT id FROM plateformes WHERE id = ? AND user_id = ?').get(data.plateforme_id, userId); if (!plat) return res.status(403).json({ error: 'Plateforme inconnue ou non autorisée' }); // Vérifier que l'investisseur appartient à l'utilisateur const inv = db.prepare('SELECT id FROM investisseurs WHERE id = ? AND user_id = ?').get(data.investisseur_id, userId); if (!inv) return res.status(403).json({ error: 'Investisseur inconnu ou non autorisé' }); const stmt = db.prepare(` INSERT INTO corrections_solde (investisseur_id, plateforme_id, date, montant, notes) VALUES (?, ?, ?, ?, ?) `); const result = stmt.run(data.investisseur_id, data.plateforme_id, data.date, data.montant, data.notes ?? null); res.status(201).json({ id: result.lastInsertRowid }); }); /** * DELETE /api/corrections/:id */ router.delete('/:id', (req, res) => { const userId = req.user.id; const id = Number(req.params.id); // Vérifier que la correction appartient à un investisseur de cet utilisateur const corr = db.prepare(` SELECT c.id FROM corrections_solde c JOIN investisseurs inv ON inv.id = c.investisseur_id WHERE c.id = ? AND inv.user_id = ? `).get(id, userId); if (!corr) return res.status(404).json({ error: 'Correction introuvable' }); db.prepare('DELETE FROM corrections_solde WHERE id = ?').run(id); res.status(204).end(); }); export default router;