import { inputText } from '../lib/input-text.ts'; import { useState } from 'react'; import { newServiceLocation, switchServiceTreatment, serviceLocationBook, serviceLocationConditions, ownServiceConditions, serviceLocationCurrent, serviceLocationReportRows, serviceLocationSource, serviceLocationTreatments, recordServiceLocations, saveServiceLocationBook, type ServiceLocationBook, type ServiceLocationRow, } from '@/lib/iva-service-location'; export function SimulationServiceLocation({ draft, onChange, }: { draft: Record; onChange: (field: string, value: string) => void; }) { const [error, setError] = useState(''); let book: ServiceLocationBook; try { book = serviceLocationBook(draft); } catch (cause) { return

{String(cause)}

; } const save = (next: ServiceLocationBook) => { try { onChange('modelo_a_snapshot', saveServiceLocationBook(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 (
Localização — serviços, imóveis, trabalhos, actividades e transporte

Oportunidade:{' '} {inputText(draft.context_opportunity || 'entrada geral')}. Regra geral:ponto de estabelecimento do prestador a partir do qual o serviço é prestado. Imóveis,execução total/essencial em bens móveis e actividades materiais têm percursos próprios,independentemente da sede do prestador.

Conferir primeiro a natureza e as regras especiais. Endereço/nacionalidade do cliente não substituem os factos relevantes. Digital e outros6(7)/(8)seguem os seus percursos. Classificação territorial não concede isenção nem calcula IVA.

{serviceLocationSource}

{error &&

{error}

} {book.rows.map((row) => (
{row.description || 'Operação por identificar'} —{' '} {row.period || 'mês por indicar'}
{( [ ['description', 'Serviço identificado'], [ 'operationRef', 'Referência da operação / pressuposto', ], ['operationDate', 'Data do serviço / prevista'], ['period', 'Mês do serviço'], [ 'documentRef', 'Documento da operação / referência da previsão', ], [ 'documentDate', 'Data do documento / prevista', ], [ 'scope', 'Âmbito: serviço, operação, período e condições', ], [ 'evidence', 'Fundamento factual / pressupostos', ], ] as const ).map(([field, label]) => ( ))} {row.treatment === 'transport_service' ? ( <>

Uma linha por trajecto;ida e volta separadas. Use a mesma unidade nas duas distâncias. Partida e chegada nacionais incluem percurso fora do país6(6).

{( [ [ 'routeRef', 'Trajecto e referência / pressuposto', ], ['totalDistance', 'Distância total'], [ 'nationalDistance', 'Distância fisicamente nacional', ], ] as const ).map(([field, label]) => ( ))} {( [ [ 'departure', 'País do ponto de partida', ], ['arrival', 'País do ponto de chegada'], ] as const ).map(([field, label]) => ( ))} ) : row.treatment === 'general_service' ? ( <> ) : ( row.treatment && ( <> ) )}

Mudar percurso conserva os locais e referências,mas exige rever os factos próprios. Campos sem aplicação ficam ocultos e conservados.

Factos próprios deste percurso {[ ...serviceLocationConditions, ...ownServiceConditions(row.treatment), ].map(([key, label]) => ( ))}
))} {!!book.rows.length && ( )} {book.result && ( <>

{serviceLocationCurrent(draft, book) ? 'Localizações correspondentes às entradas guardadas.' : 'Entradas alteradas;localizações históricas conservadas. Reveja e classifique novamente.'}{' '} {book.history?.length ?? 0} versões anteriores. Classificação não determina isenção,IVA ou campo11.

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