import { inputText } from '../lib/input-text.ts'; import { SimulationFxSelection } from './simulation-fx-selection'; import { useState } from 'react'; import { currencyEventBook, currencyEventCurrent, currencyEventReportRows, currencyEventSource, currencyEventTreatments, newCurrencyEvent, recordCurrencyEvents, saveCurrencyEventBook, switchCurrencyEvent, type CurrencyEventBook, type CurrencyEventRow, } from '@/lib/iva-currency-events'; export function SimulationCurrencyEvents({ draft, onChange, }: { draft: Record; onChange: (field: string, value: string) => void; }) { const [error, setError] = useState(''); let book: CurrencyEventBook; try { book = currencyEventBook(draft); } catch (e) { return

{String(e)}

; } const save = (next: CurrencyEventBook) => { try { onChange('modelo_a_snapshot', saveCurrencyEventBook(draft, next)); setError(''); } catch (e) { setError(String(e)); } }; const change = (id: string, patch: Partial) => save({ ...book, rows: book.rows.map((r) => (r.id === id ? { ...r, ...patch } : r)), }); return (
Moeda e datas do facto gerador/exigibilidade

Facto gerador e exigibilidade são estados separados. Identifique a operação já preparada,sem repetir os seus cálculos. P104 permite a selecção operacional definida pela Tempo;os cenários antigos permanecem condicionados até selecção explícita,sem recálculo de históricos.

{currencyEventSource}

{error &&

{error}

} {book.rows.map((row) => (
{row.description || 'Operação por identificar'} —{' '} {row.period || 'mês por indicar'} {( [ ['description', 'Operação identificada'], [ 'operationRef', 'Referência da operação existente', ], ['period', 'Mês do contexto'], [ 'documentRef', 'Documento / referência da previsão', ], ['documentDate', 'Data do documento'], ['scope', 'Âmbito e parcelas abrangidas'], ['evidence', 'Factos ou pressupostos expressos'], ['amount', 'Montante total do âmbito identificado'], [ 'currency', 'Moeda do montante / destino da conversão', ], ] as const ).map(([field, label]) => ( ))} {row.treatment === 'foreign_scenario' ? ( <> change(row.id, patch)} /> {( [ ['sourceCurrency', 'Moeda original'], ['fxRate', 'Taxa de conversão indicada'], ['fxDate', 'Data efectiva da taxa'], ['fxSource', 'Fonte e exemplar da taxa'], [ 'fxRuleRef', 'Regra/pressuposto da escolha da taxa e data', ], ] as const ).map(([field, label]) => ( ))}

{row.fxSelection?.applied ? 'Conversão operacional após selecção explícita da taxa.' : 'Cenário histórico condicionado;selecção operacional ainda não aplicada.'}{' '} Não activa base fiscal,IVA ou dedução,nem altera os livros anteriores.

) : ( row.treatment && ( <> {( [ [ 'eventDate', 'Data própria do evento escolhido', ], [ 'eventRef', 'Referência e factos do evento7/8', ], [ 'reviewDate', 'Data até à qual os eventos foram conferidos', ], ] as const ) .filter( ([field]) => field !== 'eventDate' || ![ 'advance_payment', 'consignment_deadline', ].includes(row.treatment), ) .map(([field, label]) => ( ))} {[ 'consignment_deadline', 'service_early_charge', 'contract_effects', ].includes(row.treatment) && ( )} {row.treatment === 'contract_effects' && (

Este percurso7(7) exclui locação vinculativa e venda com reserva3(3)a/b. Confirme essa distinção nos factos.

)} {row.treatment === 'continuous_period' && (

Use o termo do período a que respeita cada pagamento sucessivo,não a data arbitrária de emissão.

)} {row.treatment === 'consignment_deadline' && (

7(6) fixa exigibilidade no termo180dias da consignação. P123 conserva a conferência da não devolução;embalagensP102 são distintas.

)} {![ 'import_clearance', 'import_auction', ].includes(row.treatment) && ( <> {row.invoiceRequired === 'yes' && ( <> {( [ [ 'legalDeadline', 'Termo legal do prazo de emissão aplicável', ], [ 'deadlineRef', 'Disposição,calendário e âmbito que fundamentam esse prazo', ], ] as const ).map(([field, label]) => ( ))} {row.invoiceState === 'issued' && ( <> {( [ [ 'invoiceDate', 'Data de emissão da factura', ], [ 'invoiceRef', 'Referência da factura', ], ] as const ).map( ([ field, label, ]) => ( ), )} )} {row.paymentState === 'received' && ( <> {( [ [ 'paymentDate', 'Data de recebimento', ], [ 'paymentAmount', 'Montante recebido', ], [ 'paymentRef', 'Referência e âmbito do recebimento', ], ] as const ).map( ([ field, label, ]) => ( ), )} )}

O recebimento anterior é separado do restante,sem dupla contagem. Para parcelas com factos distintos,use âmbitos distintos e conserve as referências.

)} )} ) )}

Trocar percurso conserva dados ocultos e referências;reveja as confirmações aplicáveis.

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

{currencyEventCurrent(draft, book) ? 'Resultados correspondentes às entradas guardadas.' : 'Entradas alteradas;histórico conservado.'}{' '} {book.history?.length ?? 0} versões anteriores.P104 conserva a natureza operacional ou condicionada indicada em cada resultado;semIVA/base/dedução activados.

{currencyEventReportRows(draft).map( ([, label, value, origin], i) => (
{label}
{value} {label.startsWith('P104') ? (
Fonte,âmbito e versão {origin}
) : ( {origin} )}
), )}
)}
); }