126 lines
4.7 KiB
JavaScript
126 lines
4.7 KiB
JavaScript
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;
|