import type {NormalBook} from '@/lib/irpc-normal'; import {newSpecialInput,newSpecialExpense,newAcceleratedAsset,specialSources,type SpecialInput,type Qualification} from '@/lib/irpc-special'; type Props={draft:Record;book:NormalBook;save:(b:NormalBook)=>void}; const states=[['','Informação em falta'],['known','Tratamento conhecido — qualificar condições'],['absent','Ausência declarada com suporte'],['not_applicable','Tratamento não aplicável — justificar']]as const; function QualificationFields({label,value,onChange}:{label:string;value:Qualification;onChange:(v:Qualification)=>void}){ const field=(key:'from'|'to'|'reference'|'periodReference',text:string)=>; return
{value.state==='known'&&}{field('reference','Prova das condições, ausência ou não aplicação')}{field('from','Período — início (AAAA-MM-DD)')}{field('to','Período — termo (AAAA-MM-DD)')}{field('periodReference','Suporte do período e da vigência aplicável')}
; } export function SimulationIrpcSpecial({draft,book:b,save}:Props){ const i=b.special; const start=()=>{const next=newSpecialInput(),p=b.periodsFx??b.schedules?.period;for(const part of[next.expenses,next.cooperative,next.acceleration])Object.assign(part.qualification,{from:p?.from??b.year+'-01-01',to:p?.to??b.year+'-12-31'});save({...b,special:next});}; if(!i)return
L7 — benefícios e casos especiais

Preparação opcional e separada do percursoL6 já entregue. Localização e sector não activam benefícios. A liquidação final permanece emL8.

; const change=(patch:Partial)=>save({...b,special:{...i,...patch}}); const yesno=(label:string,value:string,onChange:(v:''|'yes'|'no')=>void)=>; return
L7 — qualificação comum e tratamentos documentados

Reutiliza sujeito, NUIT, período, despesas e activos L6. Contexto herdado:sector {String(draft.sector_id??'por identificar')};província {String(draft.province_id??'por identificar')}. A localização, por si só, não concede benefícios. Os valores L6 continuam como referência;os efeitosL7 são apresentados separadamente. Saldo final a pagar/recuperar:âmbitoL8.

Despesas — tributação autónoma61(4)

{specialSources.expenses}

change({expenses:{...i.expenses,qualification}})}/> {i.expenses.rows.map((r,index)=>{const origin=b.schedules?.rows.find(x=>x.id===r.scheduleId),patch=(p:Partial)=>change({expenses:{...i.expenses,rows:i.expenses.rows.map(x=>x.id===r.id?{...x,...p}:x)}});return
{origin?origin.document+'/'+origin.line:'Parcela por corresponder'} — {origin?.amount??'Indeterminado'} MZN

O acréscimo36g já pertence aL6;esta linha só apura o eventual imposto autónomo.

{yesno('Incidência61(4) — parcela '+(index+1),r.eligible,eligible=>patch({eligible}))}
;})}
Cooperativas abrangidas — artigo12

{specialSources.cooperative} Este incremento exige base integralmente elegível;parcelas mistas continuam explícitas.

change({cooperative:{...i.cooperative,qualification}})}/>{(i.cooperative.qualification.state==='known'||i.cooperative.kind!==''||i.cooperative.allIncomeEligible!==''||i.cooperative.withheldIncome!=='')&&<>{yesno('Base ordinária integralmente elegível',i.cooperative.allIncomeEligible,allIncomeEligible=>change({cooperative:{...i.cooperative,allIncomeEligible}}))}}
Amortizações aceleradas — CBF16

{specialSources.acceleration} Apenas activos já suportados,primeiro ano civil2026 e método constante;outras combinações permanecem por corresponder.

change({acceleration:{...i.acceleration,qualification}})}/>{i.acceleration.qualification.state==='known'&&<>{yesno('EnquadramentoCBF3 e pressupostos9 documentados',i.acceleration.cbfRequirements,cbfRequirements=>change({acceleration:{...i.acceleration,cbfRequirements}}))}{yesno('Ausência documentada de outros benefícios a cumular',i.acceleration.noOtherBenefits,noOtherBenefits=>change({acceleration:{...i.acceleration,noOtherBenefits}}))}} {i.acceleration.rows.map((r,index)=>{const patch=(p:Partial)=>change({acceleration:{...i.acceleration,rows:i.acceleration.rows.map(x=>x.id===r.id?{...x,...p}:x)}});return
Activo qualificado {index+1}{yesno('Condições do activoCBF16 — '+(index+1),r.eligible,eligible=>patch({eligible}))}
;})}

Use «Calcular e guardar» abaixo para gravar uma nova versão e apresentar os efeitos. Os históricos anteriores são conservados. M20/M22 mantém apenas correspondências demonstradas;camposL7 não são preenchidos por aproximação.

; }