import { inputText } from '../lib/input-text.ts'; 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:{' '} {inputText(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{' '} {inputText(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}
), )}
)}
); }