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: {String(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}
)}
}
; }