Fix
This commit is contained in:
1 parent
d5792fb3e2
commit
4cd4cbce71
4 files changed
+79
-12
No files matched your search
@@ -29,6 +29,13 @@ const Schema = z.object({
|
||||
date_souscription: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
|
||||
duree_mois: z.number().int().positive().nullable().optional(),
|
||||
montant_investi: z.number().positive(),
|
||||
// Capital réellement disponible à déployer, net des frais prélevés "à la source" à la
|
||||
// souscription (18/09/26, demande Olivier — cf. migration capital_investissable dans
|
||||
// db/index.js). Calculé et fourni par le front (InvestissementsPe.jsx / InvestissementPeDetail
|
||||
// .jsx) à partir de l'étape "Frais" de la modale ; NULL si inconnu (deal sans frais à la
|
||||
// source, ou pas encore resauvegardé depuis cette fonctionnalité) — auquel cas montant_investi
|
||||
// sert de repli partout où capital_investissable est utilisé.
|
||||
capital_investissable: z.number().nonnegative().nullable().optional(),
|
||||
objectif: z.string().optional(),
|
||||
statut: z.enum(['en_attente', 'valide', 'cloture', 'perte_definitive']).default('valide'),
|
||||
reference: z.string().optional(),
|
||||
@@ -170,11 +177,12 @@ 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, objectif, statut, reference, notes)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
|
||||
duree_mois, montant_investi, capital_investissable, objectif, statut, reference, notes)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||
`).run(
|
||||
investisseurId, body.plateforme_id, workspaceId, body.nom_deal, body.strategie || null,
|
||||
body.date_souscription, body.duree_mois ?? null, body.montant_investi, body.objectif || 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,
|
||||
);
|
||||
res.status(201).json({ id: r.lastInsertRowid, ...body });
|
||||
@@ -227,13 +235,13 @@ router.put('/:id', requireInvestisseur, (req, res, next) => {
|
||||
db.prepare(`
|
||||
UPDATE investissements_pe
|
||||
SET investisseur_id=?, plateforme_id=?, nom_deal=?, strategie=?, date_souscription=?,
|
||||
duree_mois=?, montant_investi=?, objectif=?, statut=?, reference=?, notes=?,
|
||||
updated_at=datetime('now')
|
||||
duree_mois=?, montant_investi=?, capital_investissable=?, objectif=?, statut=?,
|
||||
reference=?, notes=?, 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.objectif || null, body.statut,
|
||||
body.reference || null, body.notes || null, id,
|
||||
body.duree_mois ?? null, body.montant_investi, body.capital_investissable ?? null,
|
||||
body.objectif || null, body.statut, body.reference || null, body.notes || null, id,
|
||||
);
|
||||
res.json({ id, ...body });
|
||||
} catch (e) { next(e); }
|
||||
@@ -275,16 +283,21 @@ router.post('/:id/valorisations', requireInvestisseur, (req, res, next) => {
|
||||
|
||||
// Quand la répartition est renseignée (capital_deploye présent), la valorisation nette est
|
||||
// recalculée ici plutôt que reprise du body : capital_deploye + plus_value_latente +
|
||||
// capital_non_deploye (déduit = montant_investi du deal − capital_deploye, jamais négatif).
|
||||
// capital_non_deploye (déduit = capital investissable du deal − capital_deploye, jamais
|
||||
// négatif). Capital investissable = montant_investi net des frais "à la source" prélevés à
|
||||
// la souscription quand ils sont connus (deal.capital_investissable), sinon montant_investi
|
||||
// brut par repli (18/09/26, correctif Olivier — jusque-là on utilisait toujours le montant
|
||||
// brut, ce qui gonflait à tort le capital non déployé pour un deal avec frais à la source).
|
||||
// Sans répartition (mode simple, historique), comportement inchangé : le montant saisi est
|
||||
// utilisé tel quel et les deux colonnes restent NULL.
|
||||
let valorisationNette = body.valorisation_nette;
|
||||
let capitalDeploye = null;
|
||||
let plusValueLatente = null;
|
||||
if (body.capital_deploye != null) {
|
||||
const capitalInvestissable = deal.capital_investissable ?? deal.montant_investi;
|
||||
capitalDeploye = body.capital_deploye;
|
||||
plusValueLatente = body.plus_value_latente ?? 0;
|
||||
const capitalNonDeploye = Math.max(0, deal.montant_investi - capitalDeploye);
|
||||
const capitalNonDeploye = Math.max(0, capitalInvestissable - capitalDeploye);
|
||||
valorisationNette = Math.round((capitalDeploye + plusValueLatente + capitalNonDeploye) * 100) / 100;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user