import React,{useEffect,useState} from 'react'; import {workshopSections,visibleWorkshopSections,workshopStates,filterWorkshopOrders,visibleWorkshopEquipment} from './workshop-menu.js'; import WorkshopStockWorkspace from './WorkshopStockWorkspace.jsx'; import WorkshopScheduleWorkspace from './WorkshopScheduleWorkspace.jsx'; import WorkshopEquipmentWorkspace from './WorkshopEquipmentWorkspace.jsx'; const WorkshopOrderList=React.lazy(()=>import('./WorkshopOrderList.jsx')); export default function WorkshopMenuWorkspace({section,context,can,api,navigate}) { const unit=context.unit?.id??null,active=workshopSections.find(s=>s.id===section); const [data,setData]=useState(null),[error,setError]=useState(''),[reload,setReload]=useState(0),[search,setSearch]=useState(''),[state,setState]=useState(''); useEffect(()=>{ let current=true;setData(null);setError('');if((section==='workshop_equipment'&&context.workshop_catalogue_enabled===true)||(context.single_installation&&['workshop_panel','workshop_team','workshop_reports'].includes(section)))return()=>{current=false;}; if(unit===null||!can('workshop.view',unit)||!['workshop_panel','workshop_equipment','workshop_team','workshop_reports'].includes(section)&&!(section==='workshop_equipment'&&context.workshop_catalogue_enabled===true))return ()=>{current=false;}; api('/api/workshop').then(d=>{if(current)setData(d);}).catch(e=>{if(current)setError(e.message);}); return ()=>{current=false;}; },[context.token,section,reload]); if(!active)return null; const orders=filterWorkshopOrders(data?.orders??[],search,state); const link=(id,label,permission,scope=null)=>can(permission,scope)?:null; const orderTable=
{orders.map(o=>)}
OrdemEquipamentoClienteEstado registadoResponsávelAcção
{o.reference}#{o.id} · Revisão {o.revision}{o.equipment?.identifier}{o.equipment?.description}#{o.client_id}{workshopStates[o.state]??o.state}{o.assigned_to?`#${o.assigned_to}`:'Por atribuir'}
{!orders.length&&

Sem ordens visíveis para os filtros seleccionados.

}
; return

OFICINAS

{active.label}

{context.company.name} / {context.unit?.name??'Seleccione uma unidade'}

{section==='workshop_stock'&&unit!==null&&can('workshop_stock.view',unit)&&} {section==='workshop_schedule'&&context.workshop_schedule_enabled===true&&} {section==='workshop_equipment'&&context.workshop_catalogue_enabled===true&&}

Demonstração sintética. O estado operacional, a autorização de trabalho, a facturação e o pagamento são distintos. Abrir o menu não altera permissões nem confirma uma operação.

{context.single_installation&§ion==='workshop_purchasing'&&

Compras na mesma instalação

Requisições, propostas, ordens, recepções e obrigações mantêm os documentos e decisões próprios. Escolha explicitamente Compras e uma função autorizada para continuar.

Escolher função e módulo de Compras
} {context.commercial_quotes_enabled===true&§ion==='workshop_quotes'&&

Orçamentos de reparação

Proposta ligada à ordem, revisão comercial distinta e decisão documentada do cliente. Não substitui a autorização técnica de trabalho.

{can('commercial_quotes.view',unit)?:Escolher a função QA de preparação/revisão comercial}
} {active.pending&&!(context.commercial_quotes_enabled===true&§ion==='workshop_quotes')&&!(section==='workshop_schedule'&&context.workshop_schedule_enabled===true)&&!(context.single_installation&§ion==='workshop_purchasing')&&!(section==='workshop_stock'&&can('workshop_stock.view',unit))&&

Capacidade ainda não disponível

{active.pending}

{['workshop_stock','workshop_quotes'].includes(section)&&}{section==='workshop_stock'&&can('company.view')&&}{section==='workshop_purchasing'&&
{link('purchasing_budget','Controlo orçamental disponível','purchasing_budget.view',unit)}{link('supplier_payables','Obrigações a fornecedores disponíveis','supplier_payables.view',unit)}
}
} {section==='workshop_clients'&&

Cadastro de clientes existente

Reutilize o cadastro da empresa; não há um segundo registo de clientes para a oficina. Conta corrente e histórico de manutenção completo não são acrescentados por este menu.

{link('clients','Abrir clientes','clients.view')}
} {section==='workshop_finance'&&

Documentos e percursos financeiros existentes

{link('service_invoices','Facturas e documentos de teste','service_invoices.view',unit)}{link('billing_drafts','Rascunhos de facturação','billing_drafts.view',unit)}{link('workshop_billing','Oficina → rascunho','workshop_billing.view',unit)}{link('service_receivables','Recebimentos e afectações de teste','service_receivables.view',unit)}
{context.cash_enabled&&can('cash.view',unit)?<>

A custódia de Caixa exige classificação explícita e revisão distinta; não é inferida das facturas.

:

Caixa, despesas, abertura e fecho não estão disponibilizados neste contexto.

}
} {section==='workshop_settings'&&

Configurações existentes

{link('company','Dados da empresa','company.view')}{link('access','Acessos autorizados','access.manage')}{link('services','Catálogo de serviços','services.view')}{link('preview_model','Modelo de apresentação documental','issuer_documents.view')}{link('service_fiscal','Perfis fiscais existentes','service_fiscal.view')}

Catálogo de tipos de equipamento, características técnicas, política de oficina e gestão de cópias de segurança ainda não têm interface própria. Os perfis do documento são uma proposta; não atribuem direitos automaticamente.

} {context.single_installation&&['workshop_panel','workshop_team','workshop_reports'].includes(section)&&unit!==null&&can('workshop.view',unit)&&A abrir ordens…

}>
} {['workshop_panel','workshop_equipment','workshop_team','workshop_reports'].includes(section)&&!(context.single_installation&&['workshop_panel','workshop_team','workshop_reports'].includes(section))&&!(section==='workshop_equipment'&&context.workshop_catalogue_enabled===true)&&<>
{can('workshop.open',unit)&&}
{error?

Dados indisponíveis: {error}. Não é possível concluir que existam zero ordens.

:!data?

A carregar ordens autorizadas…

:data.blocked?

Ensaio indisponível neste ambiente

O percurso existente continua limitado à base sintética autorizada.

:<>

{section==='workshop_equipment'?'Pesquisar equipamentos nas ordens autorizadas':'Pesquisar ordens autorizadas'}

{section==='workshop_equipment'?<>

Equipamentos identificados nas ordens visíveis. O cadastro independente, tipos e características técnicas ainda não estão implementados.

{visibleWorkshopEquipment(orders).map(e=>)}
CódigoDescriçãoNúmero de sérieOrdens visíveis
{e.identifier}{e.description}{e.serial||'Não registado'}{e.orders.map(id=>)}
{!orders.length&&

Sem equipamentos nas ordens que correspondem aos filtros.

}:orderTable}

{section==='workshop_team'?'Responsáveis e horas de serviço':section==='workshop_reports'?'Consulta operacional disponível':'Âmbito do painel'}

{section==='workshop_team'?'A atribuição de responsáveis e o registo de horas mantêm-se nas ordens. O cadastro de recursos humanos, horários e disponibilidade não foram implementados.':section==='workshop_reports'?'Esta lista é uma consulta actual das ordens autorizadas. Relatório diário fechado, cortes, exportação e relatórios financeiros ainda não estão implementados.':'As ordens apresentadas respeitam a consulta e a atribuição autorizadas pelo servidor. Entradas, entregas do dia, alertas, indicadores de caixa ainda não dispõem das fontes necessárias neste percurso. Consulte a agenda no seu submenu próprio.'}

Os estados actuais de apontamentos não são convertidos nas fases futuras Recebida, Em reparação ou Entregue. Não se inferem margens, stock ou pendências de custódia.

} }
; }