import React,{useEffect,useState} from 'react'; const labels={clients:'Clientes',services:'Serviços',service_drafts:'Prestações em rascunho',billing_drafts:'Rascunhos de facturação'}; export default function ModuleRecordsWorkspace({context,can,api}) { const [data,setData]=useState(null),[error,setError]=useState(''),[busy,setBusy]=useState(false); async function load(){setData(await api('/api/module-records'));} useEffect(()=>{load().catch(e=>setError(e.message));},[context.token]); async function associate(e,area,id,version){ e.preventDefault();const form=e.currentTarget,values=Object.fromEntries(new FormData(form));setBusy(true);setError(''); try{await api('/api/module-records','POST',{area,id,version,...values});await load();form.reset();}catch(e){setError(e.message);}finally{setBusy(false);} } return

Associações de módulos

Configuração geral da empresa, sujeita aos direitos de consulta originais. Esta vista permite localizar os dados existentes que ainda não têm associação. Não é uma consulta operacional do módulo activo.

A associação e a sua retirada geram eventos novos e auditados; o original permanece. Não transfere responsabilidade financeira, não cria uma cópia e não concede acesso. Para associar são necessários gestão de acessos, consulta e edição do registo, além de acesso ao módulo de destino.

{error&&

{error}

}{!data?

A carregar…

:<>{Object.entries(data.records).map(([area,records])=>

{labels[area]}

{!records.length&&

Sem registos neste âmbito autorizado.

}{records.map(r=>
#{r.id} · {r.name} · versão {r.version}

{r.modules.length?`Associado a: ${r.modules.join(', ')}`:'Sem associação a módulo — pendente de conferência explícita.'}

{can('access.manage')&&can(`${area}.edit`,area.endsWith('_drafts')?context.unit?.id??null:null)&&
associate(e,area,r.id,r.version)}>
}
)}
)}}
; }