Files
crowdlending-app/.cowork/memory/ef8f4a3f-abbf-422c-8382-f0bf9d3a9cdf/memory/project_istaxindicatif.md
T

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
node_type type originSessionId
memory project 5682d634-7345-40a8-8184-f617d1dd8444

Règle centrale isTaxIndicatif

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)

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