import { irpcBook } from '@/lib/irpc-withholdings'; import { newNormalBaseInput, newNormalLoss, type NormalBaseInput, type NormalLoss, } from '@/lib/irpc-normal-base'; import type { NormalBook } from '@/lib/irpc-normal'; export function SimulationIrpcTaxableBase({ draft, book, save, }: { draft: Record; book: NormalBook; save: (b: NormalBook) => void; }) { if (!book.profit) return null; const b = book.base; const change = (p: Partial) => save({ ...book, base: { ...(b ?? newNormalBaseInput()), ...p } }); let identity: { nuit: string; name: string } | null = null; try { const m = irpcBook(draft).mrfta; if (m && /^\d{9}$/.test(m.nuit)) identity = { nuit: m.nuit, name: m.name }; } catch { /* A missing withholding book does not block this independent path. */ } if (!b) return ( ); const loss = (id: string, p: Partial) => change({ losses: b.losses.map((l) => (l.id === id ? { ...l, ...p } : l)), }); const choices: Array<[string, string]> = [ ['', 'Por esclarecer'], ['yes', 'Sim, documentado'], ['no', 'Não, documentado'], ]; return (
Lucro tributável → matéria colectável simulada

Reutiliza o lucro tributável do cálculo actual, sem introduzir novamente os montantes. Esse lucro e a matéria colectável não são imposto a pagar. Recorte: regime geral, método declarativo, perdas fiscais próprias em exercícios anuais ordinários, com saldo e utilização propostos expressos. Não aplica benefícios positivos sem regra específica nem créditos de retenção.

{identity && (!b.subjectNuit || b.subjectNuit === identity.nuit) && ( )} {(b.lossesState === 'known' || b.losses.length > 0) && ( <> {b.losses.map((l, n) => (
Perda {n + 1} —{' '} {l.year || 'exercício por identificar'} {( [ 'year', 'subjectNuit', 'assessed', 'previouslyUsed', 'requested', 'reference', ] as const ).map((k) => ( ))} {( [ 'annualPeriods', 'generalActivity', 'balanceConfirmed', ] as const ).map((k) => ( ))}
))}

A utilização é escolhida explicitamente. O portal não presume ordem FIFO, não ultrapassa saldo ou lucro e não consome o saldo oficial ao simular ou guardar.

)} {(b.benefits.state === 'known' || b.benefits.amount !== '') && ( )}

Um benefício positivo conhecido permanece por corresponder; a referência não autoriza subtracção livre. Créditos à colecta, retenções sofridas e imposto a pagar seguem etapa própria.

); }