import { Router } from 'express'; import { requireAdmin } from '../middleware/auth.js'; import db from '../db/index.js'; const router = Router(); /* ── GET /api/taux-credit-impot — liste complète (auth requis, pas admin) ── */ router.get('/', (req, res) => { const rows = db.prepare( 'SELECT * FROM taux_credit_impot ORDER BY nom_pays ASC' ).all(); res.json(rows); }); /* ── GET /api/taux-credit-impot/:code — par code pays (pour jointure plateforme) ── */ router.get('/pays/:code', (req, res) => { const row = db.prepare( 'SELECT * FROM taux_credit_impot WHERE UPPER(code_pays) = UPPER(?)' ).get(req.params.code); if (!row) return res.status(404).json({ error: 'Pays introuvable' }); res.json(row); }); /* ── POST /api/taux-credit-impot — créer (admin) ── */ router.post('/', requireAdmin, (req, res) => { const { nom_pays, code_pays, div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence, int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence, notice, statut_convention, date_suspension, ref_boi, } = req.body; if (!nom_pays?.trim()) { return res.status(400).json({ error: 'Le nom du pays est requis.' }); } try { const result = db.prepare(` INSERT INTO taux_credit_impot (nom_pays, code_pays, div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence, int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence, statut_convention, date_suspension, ref_boi, notice) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) `).run( nom_pays.trim(), code_pays?.trim()?.toUpperCase() || null, div_taux != null ? Number(div_taux) : null, div_taux_alt != null ? Number(div_taux_alt) : null, div_taux_alt_label?.trim() || null, div_exclusif_residence ? 1 : 0, int_taux != null ? Number(int_taux) : null, int_taux_alt != null ? Number(int_taux_alt) : null, int_taux_alt_label?.trim() || null, int_exclusif_residence ? 1 : 0, statut_convention || 'active', date_suspension || null, ref_boi?.trim() || null, notice?.trim() || null, ); const row = db.prepare('SELECT * FROM taux_credit_impot WHERE id = ?').get(result.lastInsertRowid); res.status(201).json(row); } catch (e) { if (e.message?.includes('UNIQUE')) { return res.status(409).json({ error: 'Ce pays existe déjà.' }); } throw e; } }); /* ── PUT /api/taux-credit-impot/:id — modifier (admin) ── */ router.put('/:id', requireAdmin, (req, res) => { const { nom_pays, code_pays, div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence, int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence, notice, statut_convention, date_suspension, ref_boi, } = req.body; if (!nom_pays?.trim()) { return res.status(400).json({ error: 'Le nom du pays est requis.' }); } const existing = db.prepare('SELECT id FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id)); if (!existing) return res.status(404).json({ error: 'Introuvable' }); db.prepare(` UPDATE taux_credit_impot SET nom_pays = ?, code_pays = ?, div_taux = ?, div_taux_alt = ?, div_taux_alt_label = ?, div_exclusif_residence = ?, int_taux = ?, int_taux_alt = ?, int_taux_alt_label = ?, int_exclusif_residence = ?, notice = ?, statut_convention = ?, date_suspension = ?, ref_boi = ?, updated_at = datetime('now') WHERE id = ? `).run( nom_pays.trim(), code_pays?.trim()?.toUpperCase() || null, div_taux != null && div_taux !== '' ? Number(div_taux) : null, div_taux_alt != null && div_taux_alt !== '' ? Number(div_taux_alt) : null, div_taux_alt_label?.trim() || null, div_exclusif_residence ? 1 : 0, int_taux != null && int_taux !== '' ? Number(int_taux) : null, int_taux_alt != null && int_taux_alt !== '' ? Number(int_taux_alt) : null, int_taux_alt_label?.trim() || null, int_exclusif_residence ? 1 : 0, notice?.trim() || null, statut_convention || 'active', date_suspension || null, ref_boi?.trim() || null, Number(req.params.id), ); const row = db.prepare('SELECT * FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id)); res.json(row); }); /* ── DELETE /api/taux-credit-impot/:id — supprimer (admin) ── */ router.delete('/:id', requireAdmin, (req, res) => { const existing = db.prepare('SELECT id FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id)); if (!existing) return res.status(404).json({ error: 'Introuvable' }); db.prepare('DELETE FROM taux_credit_impot WHERE id = ?').run(Number(req.params.id)); res.status(204).end(); }); export default router;