import React, { useEffect, useRef, useState } from 'react'; import {visibleWorkshopSections} from './workshop-menu.js'; import {EquipmentPicker}from'./WorkshopEquipmentWorkspace.jsx'; const kindLabels={assignment:'Responsável atribuído',task:'Tarefa',authorization:'Autorização registada',start:'Início autorizado',time:'Tempo relatado',material:'Material observado'}; const eventLabels={required:'Requisitado',delivered:'Entregue',consumed:'Aplicado/consumido',returned:'Devolvido'}; const decisionLabels={verified:'Verificado',refused:'Recusado',acknowledged:'Ocorrência reconhecida para auditoria — continua fora do âmbito'}; const iso=v=>new Date(v).toISOString(); export default function WorkshopWorkspace({context,can,api,busy,initialOrderId=null,navigate}) { const [data,setData]=useState(null),[orderId,setOrderId]=useState(initialOrderId??''),[error,setError]=useState(''),[working,setWorking]=useState(false),[taskId,setTaskId]=useState(''); const attempt=useRef(null); const[equipmentMode,setEquipmentMode]=useState('new'),[equipmentClient,setEquipmentClient]=useState(''); const allowed=r=>can(`workshop.${r}`,context.unit?.id??null); const load=async()=>{const d=await api('/api/workshop');setData(d);return d;}; useEffect(()=>{load().catch(e=>setError(e.message));},[context.token]); const order=data?.orders.find(o=>String(o.id)===String(orderId))??data?.orders[0]; const tasks=order?.entries.filter(e=>e.kind==='task'&&e.current)??[]; const task=tasks.find(e=>String(e.id)===String(taskId))??tasks[0]; const authorizations=order?.entries.filter(e=>e.kind==='authorization'&&e.current&&e.task_id===task?.id)??[]; const auth=authorizations.at(-1); const starts=order?.entries.filter(e=>e.kind==='start'&&!order.entries.some(t=>t.start_id===e.id))??[]; const disabled=busy||working; async function send(path,input) { setWorking(true);setError(''); const canonical=JSON.stringify([path,input]); if(attempt.current?.canonical!==canonical)attempt.current={canonical,key:crypto.randomUUID()}; try{await api('/api/workshop'+path,'POST',input,context.token,attempt.current.key);await load();attempt.current=null;} catch(e){setError(e.message);}finally{setWorking(false);} } function entry(kind,values) { const d={...values}; if(d.previous_id) { const previous=order.entries.find(e=>e.id===Number(d.previous_id)); if(!previous){setError('Seleccione uma origem existente desta ordem.');return;} d.previous_id=previous.id; d.origin=previous.origin; d.version=previous.version+1; } else {delete d.previous_id;d.version=1;} return send(`/orders/${order.id}/entries`,{kind,revision:order.revision,...d}); } const correctionFields=kind=><>; return <> {navigate&&}

WORKSHOP-RESOURCE-RECORD-v1

Oficina — registo de recursos

TESTE — SEM UTILIZAÇÃO OPERACIONAL

{context.single_installation?'Stock, custos, facturação e recebimentos usam percursos próprios ligados à origem, com decisões explícitas.':'Sem stock, custos, facturação ou recebimentos.'}

{error&&

{error}

}

Abertura não autoriza trabalho. Relatar uma ocorrência passada não lhe dá autorização retroactiva. Alterações concorrentes exigem nova revisão.

{!data?

A carregar…

:data.blocked?

Utilização operacional bloqueada

Disponível apenas na instância isolada ligada à base de testes.

:<> {allowed('open')&&

Abrir ordem de teste

send('/orders',{...v,client_id:Number(v.client_id)})}><>{context.workshop_catalogue_enabled&&}{context.workshop_catalogue_enabled&&equipmentMode==="existing"?:<>}