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 { 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; 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 (

L8 — da colecta 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), options = annualWithholdingOptions(draft); const field = ( key: 'subjectNuit' | 'year' | 'reference' | 'assessmentReference', label: string, ) => ( ); const group = (key: 'withholdings' | 'ppc', label: string) => ( <> ); return (

L8 — colecta, 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.

); })}
PPC efectivamente 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.

); } }