Initial commit
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user