diff --git a/manager/components/Finance.tsx b/manager/components/Finance.tsx index 08671a7..d72b32d 100644 --- a/manager/components/Finance.tsx +++ b/manager/components/Finance.tsx @@ -1189,6 +1189,20 @@ const Finance: React.FC = ({ data, updateData }) => { const valorPago = Number((payment as any).valor_pago || 0); const discount = Number(payment.discount || 0); + let additions = 0; + const isOverdue = ['overdue', 'atrasado'].includes((payment.status || '').toLowerCase()); + if (!isPaid && isOverdue && payment.dueDate) { + const dd = new Date(payment.dueDate + 'T00:00:00'); + const tt = new Date(); tt.setHours(0,0,0,0); + if (tt > dd) { + const baseA = payment.amount - discount; + const dDays = Math.ceil((tt.getTime() - dd.getTime()) / 86400000); + const fineAmt = baseA * ((Number(payment.lateFee) || 2) / 100); + const intAmt = baseA * (((Number(payment.interest) || 1) / 30) / 100) * dDays; + additions = fineAmt + intAmt; + } + } + if (isPaid) { const displayValue = valorPago > 0 ? valorPago : (payment.amount - discount); return ( @@ -1200,13 +1214,18 @@ const Finance: React.FC = ({ data, updateData }) => { return ( <>
- R$ {payment.amount.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} + R$ {(payment.amount + additions).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}
{discount > 0 && (
- R$ {discount.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}
)} + {additions > 0 && ( +
+ + R$ {additions.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} (Juros/Multa) +
+ )} ); } @@ -1286,6 +1305,20 @@ const Finance: React.FC = ({ data, updateData }) => { const isPaid = ['paid', 'pago', 'received', 'confirmed'].includes((payment.status || '').toLowerCase()); const valorPago = Number((payment as any).valor_pago || 0); const discount = Number(payment.discount || 0); + + let additions = 0; + const isOverdue = ['overdue', 'atrasado'].includes((payment.status || '').toLowerCase()); + if (!isPaid && isOverdue && payment.dueDate) { + const dd = new Date(payment.dueDate + 'T00:00:00'); + const tt = new Date(); tt.setHours(0,0,0,0); + if (tt > dd) { + const baseA = payment.amount - discount; + const dDays = Math.ceil((tt.getTime() - dd.getTime()) / 86400000); + const fineAmt = baseA * ((Number(payment.lateFee) || 2) / 100); + const intAmt = baseA * (((Number(payment.interest) || 1) / 30) / 100) * dDays; + additions = fineAmt + intAmt; + } + } if (isPaid) { const displayValue = valorPago > 0 ? valorPago : (payment.amount - discount); @@ -1298,13 +1331,18 @@ const Finance: React.FC = ({ data, updateData }) => { return ( <>
- R$ {payment.amount.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} + R$ {(payment.amount + additions).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}
{discount > 0 && (
- R$ {discount.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}
)} + {additions > 0 && ( +
+ + R$ {additions.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} (Multa/Juros) +
+ )} ); } diff --git a/portal/src/pages/Financeiro.tsx b/portal/src/pages/Financeiro.tsx index 0df5b03..096a68b 100644 --- a/portal/src/pages/Financeiro.tsx +++ b/portal/src/pages/Financeiro.tsx @@ -163,8 +163,22 @@ export default function Financeiro() { // Se está pago mas o banco ainda não sincronizou o valor_pago (fallback) if (isPaid) return payment.amount - (payment.discount || 0); - // Se está pendente ou atrasado, mostramos o que falta pagar (Líquido esperado) - return payment.amount - (payment.discount || 0); + const baseAmount = payment.amount - (payment.discount || 0); + + // Simulação Matemática de Atraso + if (status === 'overdue' && payment.dueDate) { + const dd = new Date(payment.dueDate + 'T00:00:00'); + const tt = new Date(); tt.setHours(0,0,0,0); + if (tt > dd) { + const dDays = Math.ceil((tt.getTime() - dd.getTime()) / 86400000); + const fineAmt = baseAmount * ((Number(payment.lateFee) || 2) / 100); + const intAmt = baseAmount * (((Number(payment.interest) || 1) / 30) / 100) * dDays; + return baseAmount + fineAmt + intAmt; + } + } + + // Se está pendente ou atrasado sem juros aplicáveis, mostramos o líquido esperado + return baseAmount; }; const totalPending = payments