import { inputText } from '../lib/input-text.ts'; import { useState } from 'react'; import { newExclusionBase, newExclusionPart, switchExclusionPart, exclusionBook, exclusionConditions, exclusionCurrent, exclusionReportRows, exclusionBaseSource, exclusionTreatments, partConditions, recordExclusions, saveExclusionBook, type ExclusionBook, type ExclusionRow, type ExclusionPart, } from '@/lib/iva-exclusion-base'; export function SimulationExclusionBase({ draft, onChange, }: { draft: Record; onChange: (field: string, value: string) => void; }) { const [error, setError] = useState(''); let book: ExclusionBook; try { book = exclusionBook(draft); } catch (cause) { return

{String(cause)}

; } const save = (next: ExclusionBook) => { try { onChange('modelo_a_snapshot', saveExclusionBook(draft, next)); setError(''); } catch (cause) { setError(String(cause)); } }; const change = (id: string, patch: Partial) => save({ ...book, rows: book.rows.map((row) => row.id === id ? { ...row, ...patch } : row, ), }); return (
Base tributável — exclusões da contraprestação

Oportunidade:{' '} {inputText(draft.context_opportunity || 'entrada geral')}. Prepare uma composição por operação,partindo do montante sem próprio IVA e com as inclusões aplicáveis já consideradas. Identifique as parcelas e se ainda estão incluídas;subtraia apenas essas parcelas,sem segunda exclusão.

Cada tratamento tem condições próprias. Indemnização judicial não é qualquer compensação;desconto deve estar concedido;pagamento por conta alheia exige nome/conta do adquirente e adequadas contas de terceiros. Nas embalagens,não se exige devolução já realizada:confira a não transmissão,a indicação separada e a menção de devolução acordada. Reutilize documentos ou declare pressupostos de projecção. Base não é IVA nem regularização.

{exclusionBaseSource}

{error &&

{error}

} {book.rows.map((row) => { const partChange = ( id: string, patch: Partial, ) => change(row.id, { parts: row.parts.map((p) => p.id === id ? { ...p, ...patch } : p, ), }); return (
{row.description || 'Operação por identificar'} —{' '} {row.period || 'mês por indicar'}
{( [ ['description', 'Operação identificada'], [ 'operationRef', 'Referência da operação / pressuposto', ], [ 'initialAmount', 'Montante inicial sem próprio IVA (moeda indicada)', ], [ 'initialRef', 'Referência do montante inicial e da sua composição', ], [ 'documentRef', 'Documento da operação / referência da previsão', ], [ 'documentDate', 'Data do documento / prevista', ], ['period', 'Mês da operação'], ['currency', 'Moeda de origem'], [ 'exclusionRef', 'Referência da composição e exclusões aplicáveis', ], [ 'evidence', 'Fundamento factual / pressupostos', ], ] as const ).map(([field, label]) => ( ))}
Condições das exclusões {exclusionConditions.map(([key, label]) => ( ))}
{row.parts.map((part) => (
{part.description || 'Parcela por identificar'} {( [ ['description', 'Descrição da parcela'], [ 'amount', 'Montante da parcela sem próprio IVA (moeda indicada)', ], [ 'reference', 'Referência da parcela / pressuposto', ], ] as const ).map(([field, label]) => ( ))} {part.treatment === 'third_party_payment' && ( <> )} {part.treatment === 'returnable_packaging' && ( )} {partConditions(part.treatment).map( ([key, label]) => ( ), )}

Mudar a natureza conserva os montantes e referências,mas exige rever a correspondência da parcela. Cada parcela será excluída uma única vez nesta operação. Os campos sem aplicação ficam ocultos e conservados.

))}
); })} {!!book.rows.length && ( )} {book.result && ( <>

{exclusionCurrent(draft, book) ? 'Exclusões correspondentes às entradas guardadas.' : 'Entradas alteradas;exclusões históricas conservadas. Reveja e determine novamente.'}{' '} {book.history?.length ?? 0} versões anteriores. IVA e campo11 não são preenchidos por estas bases.

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