Initial commit

This commit is contained in:
Olivier CROGUENNEC
2026-06-13 14:57:15 +02:00
commit 48ed7fe65e
209 changed files with 49979 additions and 0 deletions
+125
View File
@@ -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;