import { inputText } from '../lib/input-text.ts'; import { useState } from 'react'; import { travelBook, travelConditions, travelCostKinds, travelCurrent, travelReportRows, travelSource, newTravel, newTravelCost, newTravelPeriod, recordTravel, saveTravelBook, switchTravelResources, type TravelBook, type TravelRow, type TravelPeriod, type TravelCost, } from '@/lib/iva-travel'; export function SimulationTravel({ draft, onChange, }: { draft: Record; onChange: (field: string, value: string) => void; }) { const [error, setError] = useState(''); let book: TravelBook; try { book = travelBook(draft); } catch (e) { return

{String(e)}

; } const save = (next: TravelBook) => { try { onChange('modelo_a_snapshot', saveTravelBook(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)), }); const period = (id: string, patch: Partial) => save({ ...book, periods: book.periods.map((p) => p.id === id ? { ...p, ...patch } : p, ), }); const cost = (row: TravelRow, id: string, patch: Partial) => change(row.id, { costs: row.costs.map((c) => (c.id === id ? { ...c, ...patch } : c)), }); return (
Agências de viagens — pacote, meios utilizados e margem do período

Preço único, actuação em nome próprio e meios de terceiros determinam o percurso específico. Meios próprios, intermediação e revenda simples conservam o regime geral aplicável. Reutilize documentos e referências; não é necessário criar certificados ou aprovadores.

A margem é global por operador e período do registo simulado, com âmbito completo declarado. Não somar margem por pacote nem misturar dados efectivos e projectados. A base não é IVA devido nem dedução. Facturação oficial, regularização e apuramento integral continuam fora deste cálculo.

Continuidade do trabalho fiscal: este incremento trata margem e eventos, sem calcular IVA devido ou dedução. A base e os eventos conservam as referências para o apuramento e liquidação restantes; deduções e regularizações seguem os seus percursos próprios e não ficam concluídas por esta entrega.

{travelSource}

{error &&

{error}

} {book.rows.map((row) => (
{row.description || 'Viagem por identificar'} —{' '} {row.period || 'período do registo por indicar'}
{( [ [ 'description', 'Viagem ou conjunto de serviços', ], [ 'operatorRef', 'Operador: referência da agência/organizador', ], [ 'operationRef', 'Referência da operação / pressuposto', ], [ 'period', 'Período do registo de contraprestação e custos', ], [ 'documentRef', 'Documento existente / referência da previsão', ], [ 'documentDate', 'Data do documento / prevista', ], [ 'scope', 'Âmbito: pacote, parcela, período e condições', ], ['evidence', 'Factos / pressupostos expressos'], [ 'agencyRef', 'Sede/estabelecimento a partir do qual presta e referência', ], ['currency', 'Moeda original do registo'], ] as const ).map(([field, label]) => ( ))} {row.retailer === 'yes' && ( <> )}
Factos do percurso {travelConditions.map(([key, label]) => ( ))}
{['third_party', 'mixed'].includes(row.resources) && ( <> {row.resources === 'mixed' && ( <> )}

Custos registados neste mesmo período; indicar montantes com IVA incluído. A lista vazia só representa ausência declarada de custos no âmbito completo. Publicidade, câmbio, comunicações da agência e comissões de venda não reduzem esta margem41(3); a sua eventual dedução não é calculada aqui.

{row.costs.map((c) => (
{c.description || 'Custo por identificar'} {( [ [ 'description', 'Custo identificado', ], [ 'amount', 'Montante com IVA incluído', ], [ 'ref', 'Referência existente do custo / pressuposto', ], ] as const ).map(([field, label]) => ( ))} {['direct', 'other'].includes(c.kind) && ( [ [ 'thirdParty', 'Fornecimento por terceiro', ], [ 'directBenefit', 'Benefício directo do cliente durante a viagem', ], ] as const ).map(([field, label]) => ( ))}
))} )}

Alterar meios ou percurso conserva referências e custos ocultos; reveja as confirmações próprias. Alterações de custos ou preço ficam em nova versão referenciada, sem regularização automática.

))}

Registo global por operador/período

{book.periods.map((p) => (
{p.period || 'Período por indicar'} —{' '} {p.operatorRef || 'operador por indicar'} {( [ ['period', 'Período do registo global'], [ 'operatorRef', 'Mesma referência do operador nas operações', ], ['scope', 'Âmbito completo do registo simulado'], [ 'registerRef', 'Referência do registo ou pressuposto de completude', ], ] as const ).map(([field, label]) => ( ))} {p.priorMode === 'manual' && ( <> )} {p.priorMode !== 'previous' && ( )}
))} {!!book.rows.length && ( )} {book.result && ( <>

{travelCurrent(draft, book) ? 'Resultados correspondem ao registo guardado.' : 'Entradas alteradas; resultado histórico conservado. Reveja o delta.'}{' '} {book.history?.length ?? 0} versões anteriores. Sem IVA devido ou dedução calculados.

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