Améliorations diverses
This commit is contained in:
1 parent
8817ac693d
commit
49fab06012
15 files changed
+908
-147
No files matched your search
@@ -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); }
|
||||
|
||||
Reference in new issue
Block a user