diff --git a/frontend/src/pages/DepotsRetraits.jsx b/frontend/src/pages/DepotsRetraits.jsx
index 5fd9445..cbc2f11 100644
--- a/frontend/src/pages/DepotsRetraits.jsx
+++ b/frontend/src/pages/DepotsRetraits.jsx
@@ -56,12 +56,14 @@ function TrendBadge({ current, prev, invert = false }) {
+const DEBIT_TYPES = new Set(['retrait', 'souscription', 'prelevement_ir', 'prelevement_csg', 'prelevement_local']);
+
// Montant signé, identique à ce qui est affiché à l'écran (+ crédit / − débit),
// pour permettre de sommer directement l'extraction et contrôler le solde.
-// depot/remboursement/bonus → crédit (+) ; retrait/souscription → débit (−) ;
+// depot/remboursement/bonus → crédit (+) ; retrait/souscription/prélèvements → débit (−) ;
// correction → déjà signé en base (montant peut être positif ou négatif).
function signedMontant(r) {
- if (r.type === 'retrait' || r.type === 'souscription') return -Math.abs(r.montant);
+ if (DEBIT_TYPES.has(r.type)) return -Math.abs(r.montant);
if (r.type === 'correction') return r.montant;
return Math.abs(r.montant);
}
@@ -80,6 +82,8 @@ function mouvToCSV(rows) {
const MOUV_TYPE_LABELS = {
depot: 'Dépôt', retrait: 'Retrait', correction: 'Correction de solde',
remboursement: 'Remboursement', bonus: 'Bonus / Cashback', souscription: 'Souscription',
+ prelevement_ir: 'Prélèvement IR', prelevement_csg: 'Prélèvement CSG',
+ prelevement_local: "Prélèvement impôts à l'étranger",
};
function mouvToXLS(rows, multiDetenteur) {
@@ -215,20 +219,24 @@ function DetailPanel({ row, onEdit, onDeleteCorrection, onViewRemb, onViewInvest
const isRemb = row.type === 'remboursement' || row.type === 'bonus';
const isBonus = row.type === 'bonus';
const isSouscription = row.type === 'souscription';
+ const isPrelevement = row.type === 'prelevement_ir' || row.type === 'prelevement_csg' || row.type === 'prelevement_local';
const isAuto = row.source === 'auto_remboursement';
const typeLabel = isCorrection ? 'Correction de solde'
: isBonus ? 'Bonus / Cashback'
- : row.type === 'remboursement' ? 'Remboursement (porte-monnaie)'
+ : row.type === 'remboursement' ? 'Remboursement (porte-monnaie, brut)'
+ : row.type === 'prelevement_ir' ? 'Prélèvement impôt sur le revenu'
+ : row.type === 'prelevement_csg' ? 'Prélèvement CSG'
+ : row.type === 'prelevement_local' ? "Prélèvement impôts à l'étranger"
: isSouscription ? (row._isReinvest ? 'Réinvestissement' : 'Souscription à un investissement')
: row.type === 'depot' ? 'Dépôt' : 'Retrait';
const editLabel = isCorrection ? 'Modifier la correction de solde'
: row.type === 'depot' ? 'Modifier le dépôt' : 'Modifier le retrait';
- // Débit (−) pour retrait/souscription, crédit (+) pour dépôt/remboursement/bonus ;
+ // Débit (−) pour retrait/souscription/prélèvements, crédit (+) pour dépôt/remboursement/bonus ;
// la correction est déjà signée en base.
- const isDebitType = row.type === 'retrait' || isSouscription;
+ const isDebitType = row.type === 'retrait' || isSouscription || isPrelevement;
const isPos = isCorrection ? row.montant >= 0 : !isDebitType;
const sign = isPos ? '+' : '−';
const montantFmt = `${sign} ${fmtEUR(Math.abs(row.montant))}`;
@@ -243,9 +251,14 @@ function DetailPanel({ row, onEdit, onDeleteCorrection, onViewRemb, onViewInvest
isRemb && !isBonus && { label: 'Capital', value: fmtEUR(row._capital) },
isRemb && !isBonus && row._cashback > 0 && { label: 'Cashback', value: fmtEUR(row._cashback) },
isRemb && !isBonus && { label: 'Intérêts bruts', value: fmtEUR(row._interets_bruts) },
- isRemb && !isBonus && { label: 'Traitement fiscal', value: row._isFlatTax ? 'Flat tax France (PFU prélevé à la source)' : 'Étranger — indicatif, aucun prélèvement à la source ici' },
+ isRemb && !isBonus && { label: 'Traitement fiscal', value: row._isFlatTax
+ ? 'Flat tax France (PFU prélevé à la source — voir prélèvements associés)'
+ : row._taxeLocale > 0
+ ? "Étranger avec retenue fiscale locale — voir prélèvement associé"
+ : 'Étranger — indicatif, aucun prélèvement à la source ici' },
+ isPrelevement && row.libelle && { label: 'Projet', value: row.libelle },
isSouscription && row.libelle && { label: 'Projet', value: row.libelle },
- !isCorrection && !isRemb && !isSouscription && row.libelle && { label: 'Libellé', value: row.libelle },
+ !isCorrection && !isRemb && !isSouscription && !isPrelevement && row.libelle && { label: 'Libellé', value: row.libelle },
!isCorrection && !isRemb && row.reference && { label: 'Référence', value: row.reference },
row.notes && { label: 'Notes', value: row.notes },
].filter(Boolean);
@@ -295,8 +308,31 @@ function DetailPanel({ row, onEdit, onDeleteCorrection, onViewRemb, onViewInvest
{isBonus
? 'Bonus crédité directement au porte-monnaie de la plateforme.'
: row._isAutoSweep
- ? "Remboursement crédité sur le porte-monnaie puis reversé aussitôt sur le compte courant (retrait automatique associé, même montant). Effet net nul sur le solde. Modifiable depuis la page Remboursements."
- : "Remboursement versé sur le porte-monnaie de la plateforme (méthode « portefeuille »). Modifiable depuis la page Remboursements."}
+ ? "Remboursement (montant brut) crédité sur le porte-monnaie puis reversé aussitôt sur le compte courant (retrait automatique associé). Les prélèvements éventuels apparaissent en lignes séparées. Modifiable depuis la page Remboursements."
+ : "Montant brut du remboursement versé sur le porte-monnaie de la plateforme (méthode « portefeuille ») — les prélèvements éventuels apparaissent en lignes séparées. Modifiable depuis la page Remboursements."}
+
+
+ )}
+
+ {isPrelevement && (
+
+
+
+ {row.type === 'prelevement_local'
+ ? "Retenue fiscale prélevée localement à l'étranger, avant que le remboursement n'atteigne le porte-monnaie de la plateforme."
+ : "Prélèvement forfaitaire unique (PFU France) retenu à la source sur ce remboursement. Modifiable depuis la page Remboursements."}