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.

;} }