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}
)}
}
; }