import {FiscalCalculationGaps} from './fiscal-calculation-gaps'; import {FiscalL3Preparation} from './fiscal-l3-preparation'; import { useState } from 'react'; import {AcquisitionClosure} from './acquisition-closure'; import {AcquisitionSubstitution} from './acquisition-substitution'; import {AcquisitionRefund} from './acquisition-refund'; import {AcquisitionBeverageRestitution} from './acquisition-beverage-restitution'; import {AcquisitionRegularizations} from './acquisition-regularizations'; import { AcquisitionOperationLink } from './acquisition-operation-link'; import { AcquisitionImportsExclusions } from './acquisition-imports-exclusions'; import { AcquisitionAllocationEditor } from './acquisition-allocation'; import { acquisitionRightVersion } from '@/lib/iva-acquisition-right'; import { acquisitionBook, acquisitionCurrent, acquisitionExcludedFields, acquisitionPlanReferences, acquisitionReportRows, recordAcquisitions, newAcquisition, reuseAcquisitions, saveAcquisitionBook, type Acquisition, type AcquisitionBook } from '@/lib/iva-acquisitions'; import { acquisitionTreatmentIssue, continueWithoutFormerExploration, formerExplorationSource, type AcquisitionTreatment } from '@/lib/iva-acquisition-continuity'; export function SimulationAcquisitions({draft,onChange}:{draft:Record;onChange:(field:string,value:string)=>void}) { const [error,setError]=useState(''); const [manualPeriod,setManualPeriod]=useState(''); let book:AcquisitionBook; try {book=acquisitionBook(draft);} catch(cause) {return

{String(cause)}

;} const save=(next:AcquisitionBook)=>{try {onChange('modelo_a_snapshot',saveAcquisitionBook(draft,next));setError('');}catch(cause){setError(String(cause));}}; const change=(id:string,patch:Partial)=>save({...book,...('deductionLink' in patch?{rightVersion:acquisitionRightVersion}:{}),rows:book.rows.map(row=>row.id===id?{...row,...patch}:row)}); const run=(action:()=>void)=>{try{action();setError('');}catch(cause){setError(cause instanceof Error?cause.message:String(cause));}}; let references:ReturnType=[]; try {references=acquisitionPlanReferences(draft);}catch { /* The action reports the concrete currency/source error without replacing saved values. */ } const labels:Record={'03':'Base à taxa reduzida','04':'IVA à taxa reduzida','05':'Isentas com direito à dedução','06':'Operações art.18(1)(b)','07':'Isentas sem direito','11':'Importações','12':'Regularizações a favor do sujeito passivo','13':'Regularizações a favor do Estado'}; const select=(row:Acquisition,key:keyof Acquisition,label:string,options:Array<[string,string]>)=>; const yesNo:Array<[string,string]>=[['yes','Sim'],['no','Não']]; return

Compras e apuramento parcial do Modelo A

Oportunidade em tratamento: {String(draft.context_opportunity||'entrada geral')}. Moeda de origem: {book.currency||'por indicar'}. A compra registada não gera automaticamente IVA dedutível.

{book.currency && draft.currency!==book.currency &&

As compras conservam {book.currency}; o projecto está em {String(draft.currency||'moeda por indicar')}. Reveja a moeda no projecto. Os montantes e o resultado anterior não foram convertidos ou reinterpretados.

} {!book.currency && !!draft.currency && }

Aquisições em MZN/2026,ligadas à operação de destino:com direito,sem direito ou indeterminadas. A/B/C/D distinguem compras internas,importações de bens,exclusões/excepções e afectação/proporções. Documento e dedução no mesmo mês;afectação mista,proporções18(6),dedução posterior e regularizações conservam percursos próprios. Nas projecções,cada confirmação é um pressuposto. Compras internas:indique dois valores entre líquido,IVA e bruto. Importações:IVA expressamente identificado no bilhete;custos líquido/bruto são opcionais,sem calcular direitos ou presumir taxa.

{error&&

{error}

}
Indicar mês da aquisição pelo documento ou pressuposto da projecção

Para compras introduzidas directamente, indique o mês aplicável sem depender de ter vendas nesse mês. A reutilização de valores do orçamento mantém a conferência da origem.

{book.rows.map(row=>
{row.description||'Aquisição adicional'} — {row.period} — campo{row.field} change(row.id,patch)}/> {!row.d?.method&&change(row.id,patch)}/>} change(row.id,patch)}/>
Enquadramento especial da aquisição / referência anterior {acquisitionTreatmentIssue(row.acquisitionTreatment)&&

{acquisitionTreatmentIssue(row.acquisitionTreatment)}

} {row.acquisitionTreatment==='former_exploration_exemption'&&<>

{formerExplorationSource}

A continuidade conserva montantes,moeda,mês,documento e respostas existentes. Não introduz taxa nem altera o IVA declarado; reveja as condições antes de calcular.

} {row.acquisitionTreatmentOrigin&&

Origem conservada: antiga referência14(2)(c),eliminada. {row.acquisitionTreatment==='former_exploration_exemption'?'A continuidade normal foi escolhida numa versão anterior; a referência antiga está agora seleccionada para análise.':'Continuidade normal escolhida expressamente; não é nova concessão de isenção.'}

}

Origem: {row.sourceMonth===null?'Introdução directa':`Plano, mês ${row.sourceMonth} (${row.sourcePeriod??'por indicar'}): ${row.sourceAmount??'sem informação'} ${row.sourceCurrency}`}. O mês da encomenda/orçamento não determina a data do documento ou a dedução. Alterações não substituem o resultado anterior.

{row.sourceMonth===null && } {select(row,'field','Categoria',[['08','08 — Imobilizado'],['09','09 — Existências'],['10','10 — Outros bens e serviços'],...(row.bc?[['11','11 — Importações de bens'] as [string,string]]:[])])} {row.field==='11'&&} {select(row,'origin','Natureza dos dados',[['projected','Projectados / pressupostos'],['effective','Efectivos declarados']])} {row.sourceMonth!==null && } {(['net','vat','gross'] as const).map((field,index)=>)} {select(row,'documentType','Tipo de documento',row.domestic==='no'&&row.bc?[['customs','Bilhete de despacho de importação']]:[['invoice','Factura'],['equivalent','Documento equivalente']])} {!(row.bc&&row.domestic==='no')&&} {select(row,'domestic','Aquisição interna',yesNo)} {row.acquisitionTreatment!=='former_exploration_exemption'&&<> {!(row.bc&&row.domestic==='no')&&select(row,'supplierRegistered','Fornecedor inscrito no IVA',yesNo)} {select(row,'legalDocument','Documento emitido em forma legal',yesNo)} {select(row,'held','Documento na posse do adquirente / previsto na projecção',yesNo)} {select(row,'allocation','Afectação',[['taxable_only',row.d?.method==='reduced'?'Exclusiva à origem18(6)':row.deductionLink?'Exclusiva à operação ligada':'Exclusiva a operações tributadas'],['mixed',row.d?'Mista / parcial — métodoD':'Mista / parcial — preparar métodoD'],['no_right','Operações sem direito à dedução']])} {select(row,'exclusion','Exclusões de dedução',[['none','Sem exclusões ou casos especiais dos arts.18–20'],['excluded','Despesa excluída'],['special','Veículos, combustível, viagens, alojamento, comunicações, luxo ou outra situação especial — por enquadrar']])} {select(row,'integrity','Operação real / pressuposto regular, sem simulação, margem de segunda mão ou impedimentos do art.18(3–5)',yesNo)} }

Fundamento:CIVA18–21,fontes e versão no resultado. {row.d?'MétodoD aplicado apenas à parcela elegível pelas condiçõesB/C;fracções exactas,sem regularização anual automática ou restituiçãoL3.':row.bc?'Aplicam-se apenas as exclusões/excepções documentadas escolhidas;gasóleo50% conserva fracção exacta. Sem pro rata,proporções18(6) ou regularização neste incremento.':'Afectação parcial,despesa especial e dedução posterior exigem percurso próprio;use a análiseC quando aplicável.'}

{row.sourceMonth===null && } {row.sourceMonth!==null && }
)} {book.periods.map(period=>
{period.period} — cobertura das parcelas — {period.complete && period.absent.length===acquisitionExcludedFields.length?'confirmada':'por completar'} {book.rows.some(r=>r.bc)&&}

Campos fora deste lote: assinale apenas quando não existiram as respectivas operações. Uma parcela não assinalada permanece indeterminada.

{acquisitionExcludedFields.map(field=>)}
)}

O apuramento01–18 conserva o seu resultado antes dos créditos. O fechoA/B abaixo reutiliza a versão congelada,sem ordem de pagamento,submissãoAT ou promessa de reembolso.

{book.result&&<>

{acquisitionCurrent(draft,book)?'Resultado correspondente às entradas guardadas.':'Entradas ou origem alteradas: resultado histórico preservado; actualizar o cálculo.'}

{acquisitionReportRows(draft).map(([,label,value,origin],i)=>
{label}
{value}{origin}
)}
}
; }