Fix: prb de date sur les prêts différés
This commit is contained in:
@@ -131,6 +131,10 @@ export default function DrillCellPanel({
|
|||||||
const totalProjetes = projetes.reduce((s, p) => s + projRowValue(p), 0);
|
const totalProjetes = projetes.reduce((s, p) => s + projRowValue(p), 0);
|
||||||
const grandTotal = (showRecus ? totalRecus : 0) + (showProjetes ? totalProjetes : 0);
|
const grandTotal = (showRecus ? totalRecus : 0) + (showProjetes ? totalProjetes : 0);
|
||||||
|
|
||||||
|
/* Lignes visibles : masquer les lignes à 0 selon les critères actifs */
|
||||||
|
const recusVisible = recus.filter(r => recuRowValue(r) !== 0);
|
||||||
|
const projetesVisible = projetes.filter(p => projRowValue(p) !== 0);
|
||||||
|
|
||||||
/* ── Colonnes dynamiques ── */
|
/* ── Colonnes dynamiques ── */
|
||||||
const cols = [
|
const cols = [
|
||||||
inclureInterets && { key: 'interets', label: netMode ? 'Intérêts nets' : 'Intérêts bruts', color: chartInterets },
|
inclureInterets && { key: 'interets', label: netMode ? 'Intérêts nets' : 'Intérêts bruts', color: chartInterets },
|
||||||
@@ -327,14 +331,14 @@ export default function DrillCellPanel({
|
|||||||
background: hexToRgba(chartInterets, 0.07),
|
background: hexToRgba(chartInterets, 0.07),
|
||||||
color: 'var(--text-muted)', letterSpacing: '.04em', textTransform: 'uppercase',
|
color: 'var(--text-muted)', letterSpacing: '.04em', textTransform: 'uppercase',
|
||||||
}}>
|
}}>
|
||||||
Reçus ({recus.length})
|
Reçus ({recusVisible.length}{recusVisible.length !== recus.length ? `/${recus.length}` : ''})
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{recus.length === 0 ? (
|
{recusVisible.length === 0 ? (
|
||||||
<tr><td colSpan={colCount} style={{ padding: '10px 16px', color: 'var(--text-muted)', fontStyle: 'italic' }}>
|
<tr><td colSpan={colCount} style={{ padding: '10px 16px', color: 'var(--text-muted)', fontStyle: 'italic' }}>
|
||||||
Aucun remboursement reçu ce mois
|
{recus.length === 0 ? 'Aucun remboursement reçu ce mois' : 'Aucun montant à afficher avec les critères sélectionnés'}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
) : recus.map(r => (
|
) : recusVisible.map(r => (
|
||||||
<tr key={r.id}
|
<tr key={r.id}
|
||||||
style={{ borderBottom: '1px solid var(--border)', cursor: onEditRecu ? 'pointer' : 'default' }}
|
style={{ borderBottom: '1px solid var(--border)', cursor: onEditRecu ? 'pointer' : 'default' }}
|
||||||
title={onEditRecu ? 'Modifier ce remboursement' : undefined}
|
title={onEditRecu ? 'Modifier ce remboursement' : undefined}
|
||||||
@@ -354,7 +358,7 @@ export default function DrillCellPanel({
|
|||||||
<td style={{ ...tdStyle, ...numStyle, fontWeight: 600 }}>{fmtEUR(recuRowValue(r))}</td>
|
<td style={{ ...tdStyle, ...numStyle, fontWeight: 600 }}>{fmtEUR(recuRowValue(r))}</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
{recus.length > 0 && (
|
{recusVisible.length > 0 && (
|
||||||
<tr className="drill-row-fixed" style={{ background: 'var(--surface-2)', fontWeight: 700 }}>
|
<tr className="drill-row-fixed" style={{ background: 'var(--surface-2)', fontWeight: 700 }}>
|
||||||
<td colSpan={3 + (showPlatCol ? 1 : 0)} style={{ ...tdStyle, color: 'var(--text-muted)', fontSize: '0.8em' }}>
|
<td colSpan={3 + (showPlatCol ? 1 : 0)} style={{ ...tdStyle, color: 'var(--text-muted)', fontSize: '0.8em' }}>
|
||||||
Sous-total reçus
|
Sous-total reçus
|
||||||
@@ -383,7 +387,7 @@ export default function DrillCellPanel({
|
|||||||
color: 'var(--text-muted)', letterSpacing: '.04em', textTransform: 'uppercase',
|
color: 'var(--text-muted)', letterSpacing: '.04em', textTransform: 'uppercase',
|
||||||
}}>
|
}}>
|
||||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
||||||
<span>Projetés ({projetes.length})</span>
|
<span>Projetés ({projetesVisible.length}{projetesVisible.length !== projetes.length ? `/${projetes.length}` : ''})</span>
|
||||||
{projetes.length > 0 && (
|
{projetes.length > 0 && (
|
||||||
<button
|
<button
|
||||||
onClick={() => openBulkModal()}
|
onClick={() => openBulkModal()}
|
||||||
@@ -408,11 +412,11 @@ export default function DrillCellPanel({
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{projetes.length === 0 ? (
|
{projetesVisible.length === 0 ? (
|
||||||
<tr><td colSpan={colCount} style={{ padding: '10px 16px', color: 'var(--text-muted)', fontStyle: 'italic' }}>
|
<tr><td colSpan={colCount} style={{ padding: '10px 16px', color: 'var(--text-muted)', fontStyle: 'italic' }}>
|
||||||
Aucune projection ce mois
|
{projetes.length === 0 ? 'Aucune projection ce mois' : 'Aucun montant à afficher avec les critères sélectionnés'}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
) : projetes.map(p => (
|
) : projetesVisible.map(p => (
|
||||||
<tr key={p.id}
|
<tr key={p.id}
|
||||||
style={{ borderBottom: '1px solid var(--border)', opacity: 0.85, cursor: onEditProjet ? 'pointer' : 'default' }}
|
style={{ borderBottom: '1px solid var(--border)', opacity: 0.85, cursor: onEditProjet ? 'pointer' : 'default' }}
|
||||||
title={onEditProjet ? 'Saisir ce remboursement' : undefined}
|
title={onEditProjet ? 'Saisir ce remboursement' : undefined}
|
||||||
@@ -432,7 +436,7 @@ export default function DrillCellPanel({
|
|||||||
<td style={{ ...tdStyle, ...numStyle, fontStyle: 'italic', color: 'var(--text-muted)' }}>{fmtEUR(projRowValue(p))}</td>
|
<td style={{ ...tdStyle, ...numStyle, fontStyle: 'italic', color: 'var(--text-muted)' }}>{fmtEUR(projRowValue(p))}</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
{projetes.length > 0 && (
|
{projetesVisible.length > 0 && (
|
||||||
<tr className="drill-row-fixed" style={{ background: 'var(--surface-2)', fontWeight: 700 }}>
|
<tr className="drill-row-fixed" style={{ background: 'var(--surface-2)', fontWeight: 700 }}>
|
||||||
<td colSpan={3 + (showPlatCol ? 1 : 0)} style={{ ...tdStyle, color: 'var(--text-muted)', fontSize: '0.8em' }}>
|
<td colSpan={3 + (showPlatCol ? 1 : 0)} style={{ ...tdStyle, color: 'var(--text-muted)', fontSize: '0.8em' }}>
|
||||||
Sous-total projetés
|
Sous-total projetés
|
||||||
|
|||||||
@@ -561,6 +561,12 @@ export default function InvestissementDetail() {
|
|||||||
const showFinDeMois = (form.type_remb === 'in_fine' || form.type_remb === 'differe')
|
const showFinDeMois = (form.type_remb === 'in_fine' || form.type_remb === 'differe')
|
||||||
&& dayOfMonth(form.date_premiere_echeance) > 27;
|
&& dayOfMonth(form.date_premiere_echeance) > 27;
|
||||||
|
|
||||||
|
// Validation date d'échéance pour les prêts différés
|
||||||
|
if (form.type_remb === 'differe' && !form.date_premiere_echeance) {
|
||||||
|
setEditErr("La date d'échéance est requise pour un prêt différé.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
investisseur_id: Number(form.investisseur_id) || undefined,
|
investisseur_id: Number(form.investisseur_id) || undefined,
|
||||||
plateforme_id: Number(form.plateforme_id),
|
plateforme_id: Number(form.plateforme_id),
|
||||||
@@ -1590,12 +1596,14 @@ export default function InvestissementDetail() {
|
|||||||
freq_interets: t === 'differe' ? 'in_fine' : (form.freq_interets === 'in_fine' ? 'mensuel' : form.freq_interets),
|
freq_interets: t === 'differe' ? 'in_fine' : (form.freq_interets === 'in_fine' ? 'mensuel' : form.freq_interets),
|
||||||
};
|
};
|
||||||
if (t === 'differe') {
|
if (t === 'differe') {
|
||||||
if (form.date_premiere_echeance) next.date_cible = form.date_premiere_echeance;
|
// Recalculer la date d'échéance depuis souscription+durée (prioritaire sur l'ancienne valeur)
|
||||||
else if (form.date_souscription && form.duree_mois) {
|
if (form.date_souscription && form.duree_mois) {
|
||||||
const dpe = addMonthsFE(form.date_souscription, 1);
|
const dpe = addMonthsFE(form.date_souscription, 1);
|
||||||
const cible = addMonthsFE(dpe, Number(form.duree_mois) - 1);
|
const cible = addMonthsFE(dpe, Number(form.duree_mois) - 1);
|
||||||
next.date_premiere_echeance = cible;
|
next.date_premiere_echeance = cible;
|
||||||
next.date_cible = cible;
|
next.date_cible = cible;
|
||||||
|
} else if (form.date_premiere_echeance) {
|
||||||
|
next.date_cible = form.date_premiere_echeance;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (form.date_souscription) {
|
if (form.date_souscription) {
|
||||||
|
|||||||
@@ -680,6 +680,12 @@ export default function Investissements() {
|
|||||||
const showFinDeMois = (form.type_remb === 'in_fine' || form.type_remb === 'differe')
|
const showFinDeMois = (form.type_remb === 'in_fine' || form.type_remb === 'differe')
|
||||||
&& dayOfMonth(form.date_premiere_echeance) > 27;
|
&& dayOfMonth(form.date_premiere_echeance) > 27;
|
||||||
|
|
||||||
|
// Validation date d'échéance pour les prêts différés
|
||||||
|
if (form.type_remb === 'differe' && !form.date_premiere_echeance) {
|
||||||
|
setErr("La date d'échéance est requise pour un prêt différé. Vérifiez que la durée et la date de souscription sont renseignées.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
investisseur_id: Number(form.investisseur_id) || undefined,
|
investisseur_id: Number(form.investisseur_id) || undefined,
|
||||||
plateforme_id: Number(form.plateforme_id),
|
plateforme_id: Number(form.plateforme_id),
|
||||||
@@ -1366,13 +1372,14 @@ export default function Investissements() {
|
|||||||
freq_interets: t === 'differe' ? 'in_fine' : (form.freq_interets === 'in_fine' ? 'mensuel' : form.freq_interets),
|
freq_interets: t === 'differe' ? 'in_fine' : (form.freq_interets === 'in_fine' ? 'mensuel' : form.freq_interets),
|
||||||
};
|
};
|
||||||
if (t === 'differe') {
|
if (t === 'differe') {
|
||||||
if (form.date_premiere_echeance) {
|
// Recalculer la date d'échéance depuis souscription+durée (prioritaire sur l'ancienne valeur)
|
||||||
next.date_cible = form.date_premiere_echeance;
|
if (form.date_souscription && form.duree_mois) {
|
||||||
} else if (form.date_souscription && form.duree_mois) {
|
|
||||||
const dpe = addMonthsFE(form.date_souscription, 1);
|
const dpe = addMonthsFE(form.date_souscription, 1);
|
||||||
const cible = addMonthsFE(dpe, Number(form.duree_mois) - 1);
|
const cible = addMonthsFE(dpe, Number(form.duree_mois) - 1);
|
||||||
next.date_premiere_echeance = cible;
|
next.date_premiere_echeance = cible;
|
||||||
next.date_cible = cible;
|
next.date_cible = cible;
|
||||||
|
} else if (form.date_premiere_echeance) {
|
||||||
|
next.date_cible = form.date_premiere_echeance;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (form.date_souscription) {
|
if (form.date_souscription) {
|
||||||
@@ -1434,7 +1441,7 @@ export default function Investissements() {
|
|||||||
}} />
|
}} />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label>Date 1ère échéance *</label>
|
<label>{form.type_remb === 'differe' ? "Date d'échéance (versement unique) *" : 'Date 1ère échéance *'}</label>
|
||||||
<input type="date" required value={form.date_premiere_echeance}
|
<input type="date" required value={form.date_premiere_echeance}
|
||||||
onChange={e => {
|
onChange={e => {
|
||||||
const dpe = e.target.value;
|
const dpe = e.target.value;
|
||||||
|
|||||||
Reference in New Issue
Block a user