60 lines
2.3 KiB
JavaScript
60 lines
2.3 KiB
JavaScript
import { Router } from 'express';
|
|
import { z } from 'zod';
|
|
import db from '../db/index.js';
|
|
import { HttpError } from '../middleware/errorHandler.js';
|
|
|
|
const router = Router();
|
|
|
|
const Schema = z.object({
|
|
nom: z.string().min(1),
|
|
type: z.enum(['compte_courant', 'pea_pme']).default('compte_courant'),
|
|
investisseur_id: z.number().int().positive().nullable().optional(),
|
|
banque: z.string().nullable().optional(),
|
|
exoneration_fiscale: z.enum(['aucune', 'pfnl_5ans']).default('aucune'),
|
|
});
|
|
|
|
router.get('/', (req, res) => {
|
|
const rows = db.prepare(`
|
|
SELECT c.id, c.nom, c.type, c.banque, c.exoneration_fiscale, c.investisseur_id, c.created_at,
|
|
inv.nom AS investisseur_nom, inv.prenom AS investisseur_prenom,
|
|
inv.type AS investisseur_type, inv.type_fiscal AS investisseur_type_fiscal
|
|
FROM comptes c
|
|
LEFT JOIN investisseurs inv ON inv.id = c.investisseur_id
|
|
WHERE c.user_id = ?
|
|
ORDER BY c.nom
|
|
`).all(req.user.id);
|
|
res.json(rows);
|
|
});
|
|
|
|
router.post('/', (req, res, next) => {
|
|
try {
|
|
const body = Schema.parse(req.body);
|
|
const r = db.prepare(
|
|
'INSERT INTO comptes (user_id, nom, type, banque, investisseur_id, exoneration_fiscale) VALUES (?,?,?,?,?,?)'
|
|
).run(req.user.id, body.nom, body.type, body.banque || null, body.investisseur_id ?? null, body.exoneration_fiscale ?? 'aucune');
|
|
res.status(201).json({ id: r.lastInsertRowid, ...body });
|
|
} catch (e) { next(e); }
|
|
});
|
|
|
|
router.put('/:id', (req, res, next) => {
|
|
try {
|
|
const body = Schema.parse(req.body);
|
|
const r = db.prepare(
|
|
`UPDATE comptes SET nom=?, type=?, banque=?, investisseur_id=?, exoneration_fiscale=?, updated_at=datetime('now') WHERE id=? AND user_id=?`
|
|
).run(body.nom, body.type, body.banque || null, body.investisseur_id ?? null, body.exoneration_fiscale ?? 'aucune', req.params.id, req.user.id);
|
|
if (r.changes === 0) throw new HttpError(404, 'Not found');
|
|
res.json({ id: Number(req.params.id), ...body });
|
|
} catch (e) { next(e); }
|
|
});
|
|
|
|
router.delete('/:id', (req, res, next) => {
|
|
try {
|
|
const r = db.prepare('DELETE FROM comptes WHERE id=? AND user_id=?')
|
|
.run(req.params.id, req.user.id);
|
|
if (r.changes === 0) throw new HttpError(404, 'Not found');
|
|
res.status(204).end();
|
|
} catch (e) { next(e); }
|
|
});
|
|
|
|
export default router;
|