import type { AdvanceFiscalPeriod } from '@/lib/irpc-ppc-obligation'; import { SimulationIrpcPecObligation } from './simulation-irpc-pec-obligation'; import { SimulationIrpcPpcObligation } from './simulation-irpc-ppc-obligation'; import { SimulationIrpcInvestment } from './simulation-irpc-investment'; import { SimulationIrpcEconomic } from './simulation-irpc-economic'; import { FiscalProofParcelFields } from './fiscal-proof-parcel'; import { SimulationIrpcCarry } from './simulation-irpc-carry'; import { SimulationIrpcInternational } from './simulation-irpc-international'; import { SimulationIrpcPec } from './simulation-irpc-pec'; import { useState } from 'react'; import { advancePeriodBasis, advanceCalendar, newAdvancePeriodDeclaration, advanceCashflowAmount, annualAdvanceCashflow, annualAdvancePeriod, annualBook, newAnnualBook, saveAnnualBook, reuseAnnualAssessment, annualAssessment, annualWithholdingOptions, reuseAnnualWithholding, newAnnualPpc, recordAnnual, annualReportRows, annualHtml, annualSource, type AnnualBook, type AnnualPpc, } from '@/lib/irpc-annual-settlement'; type Props = { draft: Record; onChange: (field: string, value: string) => void; }; export function SimulationIrpcAnnual({ draft, onChange }: Props) { const [error, setError] = useState(''); if (draft.fiscal_component !== 'irpc') return null; if ( typeof draft.fiscal_period === 'string' && draft.fiscal_period && draft.fiscal_period !== '2026' ) return (

Esta estimativa anual tem cobertura documentada para 2026. O período escolhido, {draft.fiscal_period}, permanece inalterado; os dados e resultados anteriores ficam preservados, sem aplicar este cálculo a outro ano.

); try { const b = annualBook(draft), save = (next: AnnualBook) => { try { onChange('modelo_a_snapshot', saveAnnualBook(draft, next)); setError(''); } catch (e) { setError(String(e)); } }; if (!b) return (

Do imposto estimado ao saldo anual simulado

Reutiliza a colecta válida, retenções efectivamente sofridas por conta e PPC comprovados do próprio sujeito/exercício. PEC comprovado pode ser detalhado no próprio exercício; créditos com regras próprias permanecem separados.

{error &&

{error}

}
); const patch = (p: Partial) => save({ ...b, ...p }), a = annualAssessment(draft), advancePeriod = annualAdvancePeriod(draft, b), options = annualWithholdingOptions(draft); const field = ( key: 'subjectNuit' | 'year' | 'reference' | 'assessmentReference', label: string, ) => ( ); const group = (key: 'withholdings' | 'ppc', label: string) => ( <> ); return (

Imposto estimado, abatimentos e saldo anual simulado

A colecta acima é anterior aos abatimentos. Este saldo tem cálculo e histórico próprios; retenção entregue pela empresa por pagamento a terceiros não é retenção sofrida. O resultado continua simulado, sem submissão, pagamento ou reembolso automático.

{annualSource(b)}

{error &&

{error}

} {field('subjectNuit', 'NUIT do sujeito do fecho L8')} {field('year', 'Exercício do fecho L8')} {field( 'reference', 'Suporte do fecho da entidade e exercício L8', )}

Colecta disponível: {a.colecta ? a.colecta.numerator + '/' + a.colecta.denominator + ' MZN' : 'Indeterminada'} ;origem: {a.kind === 'special' ? 'L7 qualificado' : 'L6 normal'} ;NUIT:{a.subjectNuit || 'Por identificar'};exercício: {a.year || 'Por identificar'}.

{field( 'assessmentReference', 'Suporte da colecta reutilizada L8', )}
Retenções efectivamente sofridas por conta {group('withholdings', 'Retenções sofridas')} {options.length === 0 ? (

Não há afectações de comprovativosL5 neste contexto. Reutilize e reconcilie a retenção recebida emL5 ou declare ausência com suporte.

) : ( options.map((o) => (

{o.document || 'Prova por identificar'} ;emitente:{o.issuer};data:{o.date} ;parcelaL5:{o.amount}MZN; {o.reason || 'Retenção recebida/efectiva por conta reconciliada emL5.'}

)) )} {b.withholdings.rows.map((r, index) => { const change = (p: Partial) => patch({ withholdings: { ...b.withholdings, rows: b.withholdings.rows.map((x) => x.id === r.id ? { ...x, ...p } : x, ), }, }); return (
Retenção seleccionada {index + 1}

Rendimento:{r.rowId};prova:{r.paymentId} ;NUIT:{r.subjectNuit};exercício:{r.year}. Fonte conservada. Se mudou, retire esta selecção e seleccione a prova actual. O histórico mantém-se.

); })}
Estimativas PPC e PEC para a viabilidade

Simulação fiscal para avaliar a viabilidade do negócio e as necessidades de tesouraria. Os valores e meses previstos são estimativas; o portal não executa pagamentos nem submete declarações fiscais.

patch({ advancePeriodDeclaration: declaration }) } /> patch({ pecObligation })} /> patch({ ppcObligation })} />
PPC documentados como pagos {group('ppc', 'PPC efectuados')}

Regista comprovativos de pagamentos por conta; não calcula automaticamente a obrigação PPC nem usa pagamentos previstos no plano.

{b.ppc.rows.map((r, index) => { const change = (p: Partial) => patch({ ppc: { ...b.ppc, rows: b.ppc.rows.map((x) => x.id === r.id ? { ...x, ...p } : x, ), }, }); return (
PPC {index + 1} {( [ ['document', 'Comprovativo'], ['issuer', 'Emitente'], ['date', 'Data (AAAA-MM-DD)'], ['subjectNuit', 'NUIT beneficiário'], ['year', 'Exercício do comprovativo'], ['currency', 'Moeda do comprovativo'], ['proofAmount', 'Montante comprovado'], ['amount', 'Parcela a abater'], [ 'reference', 'Suporte do pagamento e afectação', ], ] as const ).map(([key, label]) => ( ))}
); })}
{[ ...(b.pecPayments ? [] : [['pec', 'PEC'] as const]), ...(b.internationalCredits ? [] : [ [ 'credits', 'Créditos com regras próprias', ] as const, ]), ].map(([key, label]) => (
{label} — tratamento separado {(b[key].state === 'known' || b[key].amount) && ( )}
))} {annualReportRows(draft).map((r, n) => (

{r[1]} — {r[2]} — {r[3]}

))}
); } catch (e) { return (

PreparaçãoL8 não recuperável:{String(e)}. Originais e históricos conservados.

); } } export function SimulationIrpcAdvanceCashflow({ book, period, }: { book: AnnualBook; period?: AdvanceFiscalPeriod; }) { if (!book.ppcObligation && !book.pecObligation) return null; const m = annualAdvanceCashflow(book, period); const show = advanceCashflowAmount; return (
Saídas previstas PPC/PEC por mês
{period && (

Período preparado em L6: {period.from || 'por confirmar'} —{' '} {period.to || 'por confirmar'}.

)}

Reúne as estimativas PPC e a hipótese de tesouraria PEC. Os comprovativos pagos e o fecho anual permanecem separados; esta vista não acrescenta outra saída ao fluxo financeiro do negócio.

{m.total ? 'Total da projecção: ' + show(m.total) : 'Projecção parcial — total por determinar.'}

{!!m.pending.length && (
    {m.pending.map((p) => (
  • {p}
  • ))}
)} {!!m.rows.length && (
{m.rows.map((r) => ( ))}
Projecção mensal das estimativas PPC e PEC
Mês PPC PEC {m.total ? 'Total previsto' : 'Subtotal conhecido'}
{r.month} {m.ppcKnown ? show(r.ppc) : 'Por determinar'} {m.pecKnown ? show(r.pec) : 'Por determinar'} {show(r.knownSubtotal)}
)} {!m.rows.length && m.total && (

Sem saída PPC/PEC estimada neste recorte.

)}

Meses e montantes dependem das fontes e opções preparadas acima. A opção PEC concentrada conserva o mês escolhido; esta apresentação não certifica o prazo legal.

); } export function SimulationIrpcAdvancePeriodDeclaration({ draft, book, onChange, }: { draft: Record; book: AnnualBook; onChange: ( value: NonNullable, ) => void; }) { const period = annualAdvancePeriod(draft, book), calendar = advanceCalendar(period, book.year, book.subjectNuit), d = book.advancePeriodDeclaration; if (!d && !calendar.candidate) return null; if (!d) return (
Período anual não civil

Confronte o fundamento do período L6 e os doze meses do período anterior. As datas sugeridas não substituem o suporte documental.

); const patch = (values: Partial) => onChange({ ...d, ...values, confirmed: '' }); const labels = { subjectNuit: 'NUIT dos períodos', year: 'Exercício de termo', currentFrom: 'Início do período L6 declarado', currentTo: 'Termo do período L6 declarado', currentReference: 'Fundamento documentado do período anual não civil', previousFrom: 'Início do período anterior', previousTo: 'Termo do período anterior', previousReference: 'Fonte e correspondência do período anterior', }; return (
Correspondência dos períodos anuais

{calendar.mode === 'annual_non_civil' ? 'Correspondência documental conferida;previsões nos meses do período L6.' : calendar.mode === 'civil' ? 'L6 usa o ano civil;referência anterior conservada sem aplicação.' : calendar.pending.join(' ')}

PPC: imposto anterior{' '} {book.ppcObligation?.previousTax || 'por confirmar'}{' '} MZN;retenções{' '} {book.ppcObligation?.previousWithholdings || 'por confirmar'}{' '} MZN. PEC: volume anterior{' '} {book.pecObligation?.previousTurnover || 'por confirmar'}{' '} MZN;PPC anteriores{' '} {book.pecObligation?.previousPpcPaid || 'por confirmar'} MZN.

{d.confirmed === 'yes' && (d.ppcBasisKey !== advancePeriodBasis(book, 'ppc') || d.pecBasisKey !== advancePeriodBasis(book, 'pec')) && ( )}
0} > Conferir ou alterar períodos {(Object.keys(labels) as Array).map( (key) => ( ), )}

No PPC, indique que o período anterior não é um ano civil completo. Os doze meses e a continuidade são conferidos pelas datas e fontes aqui indicadas.

Guardar conserva estas escolhas. Uma alteração nas datas L6 exige reconferência; o portal não autoriza uma mudança do período fiscal.

); }