Files
SGF/resources/js/workshop-menu.js
2026-10-29 22:42:37 +02:00

33 lines
2.7 KiB
JavaScript

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()];
}