This commit is contained in:
2026-10-30 08:13:34 +02:00
parent 53ff46b0a2
commit b45c1a816e
31 changed files with 1726 additions and 32 deletions
+3 -2
View File
@@ -8,7 +8,7 @@ export function navigationGroups(can, unit) {
const item=(id,label,permission,scope=null)=>({id,label,visible:can(permission,scope)});
return [
{id:'start',label:'Início',items:[{id:'home',label:'Página inicial',visible:true}]},
{id:'purchasing',label:'Compras',items:[{id:'purchasing_home',label:'Área de Compras',visible:can('company.view')},item('purchasing_budget','Controlo orçamental sintético','purchasing_budget.view',unit),item('supplier_payables','Obrigações a fornecedores — ensaio','supplier_payables.view',unit)]},
{id:'purchasing',label:'Compras',items:[{id:'purchasing_home',label:'Área de Compras',visible:can('company.view')},item('purchasing_budget','Controlo orçamental sintético','purchasing_budget.view',unit),item('supplier_payables','Obrigações a fornecedores — ensaio','supplier_payables.view',unit),item('supplier_payments','Pagamentos e afectações — ensaio','supplier_payables.view',unit)]},
{id:'stock',label:'Stock',status:'Em preparação',items:visibleStockSections(can).map(s=>({id:s.id,label:s.label,informational:true,visible:true}))},
{id:'services',label:'Clientes e serviços',items:[item('clients','Clientes','clients.view'),item('services','Catálogo de serviços','services.view'),item('service_drafts','Prestações em rascunho','service_drafts.view',unit)]},
{id:'billing',label:'Facturação',items:visibleBillingSections(can,unit).map(s=>({id:s.id,label:s.label,visible:true}))},
@@ -28,7 +28,8 @@ export function navigationTopics(groups) {
{id:'purchasing',label:'Compras',groups:['purchasing']},
{id:'stock',label:'Stock',groups:['stock']},
{id:'workshop',label:'Oficinas',groups:['workshop']},
{id:'finance',label:'Financeiro',groups:['receivables','accounting','costs']},
{id:'finance',label:'Financeiro',groups:['receivables','costs']},
{id:'accounting',label:'Contabilidade',groups:['accounting']},
{id:'settings',label:'Configuração',groups:['billing_support','admin']},
];
const known=new Set(layout.flatMap(t=>t.groups));
+1
View File
@@ -97,6 +97,7 @@ function App() {
{page === 'purchasing_budget' && <PurchasingBudgetWorkspace context={context} can={can} api={api} busy={busy} />}
{page === 'purchasing_home' && <PurchasingHome context={context} can={can} navigate={navigate}/>}
{page === 'supplier_payables' && <section className="panel"><h1>Obrigações a fornecedores</h1><p>Percurso sintético ligado ao núcleo comum. Preparação, validação distinta e consulta, sem pagamentos ou vencimento presumido.</p><a href="/supplier-payables">Abrir preparação e consulta de obrigações</a></section>}
{page === 'supplier_payments' && <section className="panel"><h1>Pagamentos e afectações a fornecedores</h1><p>Ensaio sintético: preparação e confirmação distintas, afectação explícita e saldo canónico. Não executa transferências bancárias.</p><a href="/supplier-payments">Abrir pagamentos e afectações sintéticas</a></section>}
{page === 'industrial_costs' && <IndustrialCostsWorkspace context={context} can={can} api={api} busy={busy} />}
{page === 'service_receivables' && <ServiceReceivablesWorkspace context={context} can={can} api={api} busy={busy} />}
{page === 'service_invoice_setup' && <ServiceInvoiceWorkspace context={context} can={can} api={api} perform={perform} busy={busy} />}