chore: sync cowork memory 2026-07-03 17:46

This commit is contained in:
2026-07-03 17:46:08 +02:00
parent aef55aeef2
commit 261bf103a3
103 changed files with 3590 additions and 0 deletions
@@ -0,0 +1,75 @@
---
name: project_istaxindicatif
description: Règle isTaxIndicatif — prelev indicatifs vs réels, net_recu brut vs net ; route reprocess en masse
metadata:
node_type: memory
type: project
originSessionId: 5682d634-7345-40a8-8184-f617d1dd8444
---
## Règle centrale `isTaxIndicatif`
```js
isTaxIndicatif = (fiscalite !== 'flat_tax') OR (fiscalite_override === 'exonere')
```
Cas couverts :
- Plateforme `sans_fiscalite_locale` ou `avec_fiscalite_locale` (étrangères) → indicatif
- Plateforme `flat_tax` mais investissement `exonere` (PEA-PME) → indicatif
- Plateforme `flat_tax` sans 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)`
```js
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)`
```js
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`
```js
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).