---
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).
