export const workshopSections=[ {id:'workshop_panel',label:'Painel da oficina'}, {id:'workshop_clients',label:'Clientes'}, {id:'workshop_equipment',label:'Equipamentos'}, {id:'workshop_schedule',label:'Agendamentos',pending:'Calendário, disponibilidade e lembretes ainda não estão implementados. Não são criadas marcações ou enviados lembretes por este menu.'}, {id:'workshop_quotes',label:'Orçamentos',pending:'O orçamento comercial da reparação e o registo da aprovação do cliente ainda não estão implementados como documento próprio. As autorizações de trabalho existentes conservam o seu âmbito e evidência; não são convertidas em orçamentos.'}, {id:'workshop',label:'Ordens de serviço'}, {id:'workshop_stock',label:'Peças e stock',pending:'O stock de oficina, reservas, mínimos e inventário ainda não estão implementados neste módulo. Os apontamentos de material existentes são observações de ocorrências, não saldos nem movimentos de armazém.'}, {id:'workshop_purchasing',label:'Compras e fornecedores',pending:'O percurso completo de Compras ainda não está incorporado nesta composição da oficina. As demonstrações de obrigações e orçamento mantêm os seus contextos próprios; nenhuma compra é criada por esta página.'}, {id:'workshop_finance',label:'Facturação e caixa'}, {id:'workshop_team',label:'Equipa'}, {id:'workshop_reports',label:'Relatórios'}, {id:'workshop_settings',label:'Configurações'}, ]; export function visibleWorkshopSections(can,unit) { if(unit===null||!can('workshop.view',unit))return []; return workshopSections.filter(s=>s.id!=='workshop_clients'||can('clients.view')).filter(s=>s.id!=='workshop_finance' ||can('service_invoices.view',unit)||can('billing_drafts.view',unit)||can('service_receivables.view',unit)||can('workshop_billing.view',unit)); } export const workshopStates={open:'Aberta',in_review:'Apontamentos em revisão',exception_review:'Ocorrências fora do âmbito para revisão',records_verified:'Registos verificados — sem conclusão comercial'}; export function filterWorkshopOrders(orders,search='',state='') { const normalise=v=>String(v??'').normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLocaleLowerCase('pt'); const query=normalise(search).trim(); return orders.filter(o=>(!state||o.state===state)&&(!query||[o.reference,o.equipment?.identifier,o.equipment?.description,o.equipment?.serial,o.client_id,o.assigned_to].some(v=>normalise(v).includes(query)))); } export function visibleWorkshopEquipment(orders) { return [...new Map(orders.filter(o=>o.equipment).map(o=>[o.equipment.id,{...o.equipment,orders:orders.filter(other=>other.equipment?.id===o.equipment.id).map(other=>other.id)}])).values()]; }