Améliorations diverses

This commit is contained in:
ocroguennec committed 2026-09-19 19:00:12 +02:00
1 parent 8817ac693d
commit 49fab06012
15 files changed
+908 -147

No files matched your search

+26 -8
View File
@@ -44,6 +44,8 @@ const Schema = z.object({
statut: z.enum(['en_attente', 'valide', 'cloture', 'perte_definitive']).default('valide'),
reference: z.string().optional(),
notes: z.string().optional(),
// Mode de détention (19/09/26) — cf. migration mode_detention dans db/index.js.
mode_detention: z.enum(['direct', 'pea_pme', 'assurance_vie']).default('direct'),
});
const ValorisationSchema = z.object({
@@ -102,6 +104,11 @@ router.get('/', (req, res) => {
}
const workspaceId = resolveActiveWorkspaceId(req);
// Filtre optionnel par plateforme (19/09/26, page Plateformes PE) — mirroir du filtre
// plateforme_id déjà supporté par GET /depots-retraits et GET /remboursements.
const { plateforme_id } = req.query;
const platCond = plateforme_id ? 'AND ipe.plateforme_id = ?' : '';
const platArgs = plateforme_id ? [Number(plateforme_id)] : [];
const rows = db.prepare(`
SELECT ipe.*,
@@ -126,9 +133,9 @@ router.get('/', (req, res) => {
FROM investissements_pe ipe
JOIN plateformes p ON p.id = ipe.plateforme_id
JOIN investisseurs inv ON inv.id = ipe.investisseur_id
WHERE ${invCond} AND ipe.workspace_id = ?
WHERE ${invCond} AND ipe.workspace_id = ? ${platCond}
ORDER BY ipe.date_souscription DESC, ipe.id DESC
`).all(...invArgs, workspaceId);
`).all(...invArgs, workspaceId, ...platArgs);
const withTvpi = rows.map(r => ({
...r,
@@ -252,7 +259,15 @@ router.get('/mouvements-portefeuille', (req, res) => {
// (crowdlending) qui appelle cet endpoint. Pour depots_retraits en revanche (table partagée
// entre workspaces), il FAUT exclure explicitement le workspace appelant, pour ne pas
// dupliquer ce que le frontend a déjà récupéré via son propre GET /depots-retraits scopé.
//
// ?native=1 (19/09/26, page Plateformes PE) : bascule ce même endpoint pour un appel fait
// DEPUIS le workspace PE lui-même (plutôt que depuis crowdlending) — dans ce sens, les
// depots_retraits à renvoyer sont ceux DU workspace appelant (workspace_id = callerWorkspaceId),
// pas ceux d'un autre workspace. Les souscriptions/distributions/frais PE restent inchangées
// (déjà natives, sans filtre workspace_id — limite connue si plusieurs workspaces PE existent
// un jour, cf. commentaire ci-dessus, non résolue ici).
const callerWorkspaceId = resolveActiveWorkspaceId(req);
const native = req.query.native === '1';
const souscriptions = db.prepare(`
SELECT ipe.id AS deal_id, ipe.plateforme_id, p.nom AS plateforme_nom,
@@ -292,6 +307,7 @@ router.get('/mouvements-portefeuille', (req, res) => {
WHERE ${invCond}
`).all(...invArgs);
const drWorkspaceOp = native ? '=' : '!=';
const depots = db.prepare(`
SELECT dr.id AS dr_id, dr.plateforme_id, p.nom AS plateforme_nom,
plat_inv.nom AS plateforme_detenteur_nom,
@@ -301,7 +317,7 @@ router.get('/mouvements-portefeuille', (req, res) => {
JOIN plateformes p ON p.id = dr.plateforme_id
LEFT JOIN investisseurs plat_inv ON plat_inv.id = p.investisseur_id
JOIN investisseurs inv ON inv.id = dr.investisseur_id
WHERE dr.workspace_id != ? AND ${invCondDr}
WHERE dr.workspace_id ${drWorkspaceOp} ? AND ${invCondDr}
`).all(callerWorkspaceId, ...invArgsDr);
const rows = [
@@ -342,13 +358,14 @@ router.post('/', requireInvestisseur, (req, res, next) => {
const r = db.prepare(`
INSERT INTO investissements_pe
(investisseur_id, plateforme_id, workspace_id, nom_deal, strategie, date_souscription,
duree_mois, montant_investi, capital_investissable, objectif, statut, reference, notes)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
duree_mois, montant_investi, capital_investissable, objectif, statut, reference, notes,
mode_detention)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)
`).run(
investisseurId, body.plateforme_id, workspaceId, body.nom_deal, body.strategie || null,
body.date_souscription, body.duree_mois ?? null, body.montant_investi,
body.capital_investissable ?? null, body.objectif || null,
body.statut, body.reference || null, body.notes || null,
body.statut, body.reference || null, body.notes || null, body.mode_detention,
);
res.status(201).json({ id: r.lastInsertRowid, ...body });
} catch (e) { next(e); }
@@ -505,12 +522,13 @@ router.put('/:id', requireInvestisseur, (req, res, next) => {
UPDATE investissements_pe
SET investisseur_id=?, plateforme_id=?, nom_deal=?, strategie=?, date_souscription=?,
duree_mois=?, montant_investi=?, capital_investissable=?, objectif=?, statut=?,
reference=?, notes=?, updated_at=datetime('now')
reference=?, notes=?, mode_detention=?, updated_at=datetime('now')
WHERE id=?
`).run(
investisseurId, body.plateforme_id, body.nom_deal, body.strategie || null, body.date_souscription,
body.duree_mois ?? null, body.montant_investi, body.capital_investissable ?? null,
body.objectif || null, body.statut, body.reference || null, body.notes || null, id,
body.objectif || null, body.statut, body.reference || null, body.notes || null,
body.mode_detention, id,
);
res.json({ id, ...body });
} catch (e) { next(e); }