3.4 KiB
name, description, metadata
| name | description | metadata | ||||||
|---|---|---|---|---|---|---|---|---|
| project_istaxindicatif | Règle isTaxIndicatif — prelev indicatifs vs réels, net_recu brut vs net ; route reprocess en masse |
|
Règle centrale isTaxIndicatif
isTaxIndicatif = (fiscalite !== 'flat_tax') OR (fiscalite_override === 'exonere')
Cas couverts :
- Plateforme
sans_fiscalite_localeouavec_fiscalite_locale(étrangères) → indicatif - Plateforme
flat_taxmais investissementexonere(PEA-PME) → indicatif - Plateforme
flat_taxsans override → prelev réels
Comportement selon la règle
isTaxIndicatif |
Prelev calculés ? | Champs prelev | net_recu |
|---|---|---|---|
false |
Oui, réels | Modifiables | capital + cashback + interets_nets |
true |
Oui, indicatifs | Lecture seule, label "indicatif" | capital + cashback + interets_bruts |
Pourquoi : les plateformes étrangères et les PEA-PME ne prélèvent pas la flat tax à la source. Le montant versé à l'investisseur est le brut. Les prelev sont stockés à titre informatif pour la déclaration fiscale personnelle.
Backend — remboursements.js
Helper getTaxIndicatif(investissementId)
function getTaxIndicatif(investissementId) {
const row = db.prepare(`
SELECT p.fiscalite, i.fiscalite_override
FROM investissements i JOIN plateformes p ON p.id = i.plateforme_id
WHERE i.id = ?
`).get(investissementId);
return row.fiscalite !== 'flat_tax' || row.fiscalite_override === 'exonere';
}
computeChamps(body, isTaxIndicatif)
const interets_nets = round2(body.interets_bruts - body.prelev_sociaux - body.prelev_forfaitaire);
const net_recu = isTaxIndicatif
? round2(capital + cashback + body.interets_bruts)
: round2(capital + cashback + interets_nets);
Utilisé dans POST et PUT handlers.
Frontend — InvestissementDetail.jsx
const isExonere = inv?.fiscalite_override === 'exonere';
const isIndicatif = isExonere || currentPlat?.fiscalite !== 'flat_tax';
- Prelev + interets_nets :
readOnly={isIndicatif}, style grisé (var(--surface-2)), label "— indicatif" - Recalcul auto des prelev depuis taux PFU dans
updateRembField: toujours calculé, même en mode indicatif - Montant remboursé affiché = capital + cashback + interets_bruts si indicatif
Route reprocess en masse
POST /api/remboursements/reprocess — recalcule tous les remboursements type='normal' de l'utilisateur connecté (tous ses investisseurs).
Champs recalculés : taxe_locale, interets_bruts, prelev_sociaux, prelev_forfaitaire, interets_nets, net_recu + montant du retrait auto associé (depots_retraits avec source='auto_remboursement').
Logique : join investissements + plateformes + investisseurs, taux PFU de l'année du remboursement, isTaxIndicatif appliqué à net_recu.
Déclenchement UI : bouton dans Settings.jsx section nettoyage (groupe "Mes données") → modale de confirmation → appel api.post('/remboursements/reprocess', {}). ⚠️ Anciennement dans MonCompte.jsx — déplacé en Settings lors de la réorganisation NAV (juin 2026).
How to apply : toute nouvelle route ou formulaire manipulant prelev_sociaux, prelev_forfaitaire, interets_nets, net_recu doit appliquer cette règle. Checker getTaxIndicatif() (backend) ou isIndicatif (frontend).