/* Views: Gestão (usuários + unidades) e Configurações */ const { useState:gS } = React; function GestaoView({profile,onToast}){ const [tab,setTab]=gS('usuarios'); return (
{[['usuarios','Usuários'],['unidades','Unidades'],['perfis','Perfis & Acessos']].map(([k,l])=>( ))}
{tab==='usuarios' && } {tab==='unidades' && } {tab==='perfis' && }
); } function GestaoUsuarios({onToast}){ const [busca,setBusca]=gS(''); const [unitF,setUnitF]=gS('todas'); const [people,setPeople]=gS(MX.people.map((p,i)=>({...p, ativo: i!==11, ultimoAcesso:['há 5 min','há 1h','ontem','há 2h','há 3 dias','agora','ontem','há 4h','há 1 dia','há 6h','há 2 dias','há 8 dias'][i]}))); let list=people; if(unitF!=='todas') list=list.filter(p=>p.unit===unitF); if(busca.trim()) list=list.filter(p=>p.nome.toLowerCase().includes(busca.toLowerCase())); const toggle=(id)=>setPeople(people.map(p=>p.id===id?{...p,ativo:!p.ativo}:p)); return ( <>
{MX.units.map(u=>)}
setBusca(e.target.value)}/>
{list.map(p=>( ))}
ColaboradorCargoUnidadeÚltimo acessoStatus
{p.ini}
{p.nome}
{p.nivel}
{p.cargo} {MX.unitById(p.unit).nome} {p.ultimoAcesso} {p.ativo?'Ativo':'Inativo'}
); } function GestaoUnidades({onToast}){ return (
{MX.units.map(u=>{ const team=MX.people.filter(p=>p.unit===u.id); const atingido=Math.round(u.fatMes/u.metaMes*100); return (

{u.nome}

{u.tag}
Responsável: {u.resp}
Ativa
{[['Faturamento/mês',MX.fmtBRL(u.fatMes,{compact:true})],['Equipe',u.equipe+' pessoas'],['Casos ativos',u.casosAtivos]].map((x,i)=>(
{x[0]}
{x[1]}
))}
Meta do mês{atingido}%
{team.slice(0,5).map((p,i)=>(
{p.ini}
))} {team.length>5 &&
+{team.length-5}
}
); })}
); } function GestaoPerfis(){ const perfis=[ {nome:'Super Admin',desc:'Acesso total ao sistema, usuários e configurações globais',n:1,cor:'#a8554a'}, {nome:'Admin',desc:'Cria, edita e publica comunicados; gerencia canais',n:2,cor:'#9a743b'}, {nome:'CEO / Sócio Diretor',desc:'Todos os dashboards, unidades e métricas estratégicas',n:2,cor:'#b68b4c'}, {nome:'Gestor de Unidade',desc:'Visualiza dados da própria unidade: equipe e faturamento',n:3,cor:'#3f6079'}, {nome:'Advogado / Colaborador',desc:'Próprio faturamento, comunicados direcionados e jurídico',n:8,cor:'#3f7a57'}, ]; const matriz=[ ['Publicar comunicados',[1,1,0,0,0]], ['Ver todas as unidades',[1,1,1,0,0]], ['Gerenciar usuários',[1,1,0,0,0]], ['Faturamento consolidado',[1,0,1,0,0]], ['Faturamento próprio',[1,1,1,1,1]], ['Configurações globais',[1,0,0,0,0]], ]; return (
{perfis.map((p,i)=>(
{p.nome}
{p.desc}
{p.n}
usuários
))}

Matriz de permissões

RBAC — controle de acesso por papel
{matriz.map((m,i)=>( {m[1].map((v,j)=>( ))} ))}
PermissãoS.AdmAdmCEOGestorAdv
{m[0]} {v? : }
); } /* ============== CONFIGURAÇÕES ============== */ function ConfigView({onToast}){ const [mfa,setMfa]=gS(true); const [rotacao,setRotacao]=gS(false); const integ=[ {nome:'Omie ERP',desc:'Sincronização de faturamento e dados financeiros',status:'Conectado',cor:'var(--pos)',on:true,fase:'Fase 1'}, {nome:'WhatsApp Business API',desc:'Notificações críticas via WhatsApp',status:'Pendente',cor:'var(--warn)',on:false,fase:'Fase 2'}, {nome:'DOU · STF · STJ',desc:'Feed automático de novidades jurídicas',status:'Pendente',cor:'var(--warn)',on:false,fase:'Fase 2'}, {nome:'Google Workspace (SSO)',desc:'Autenticação única e agenda',status:'Inativo',cor:'var(--ink-3)',on:false,fase:'Fase 3'}, ]; const Toggle=({on,set})=>( ); return (

Aparência

Identidade visual do portal
Logo do escritório
PNG ou SVG · fundo transparente
Cores do tema
{[['Marinho','#2d3245'],['Dourado','#b68b4c'],['Fundo','#f4f1ea']].map((c,i)=>(
{c[0]}
))}

Segurança

Políticas de acesso e autenticação
{[['Autenticação em dois fatores (MFA)','Exigir segundo fator no login',mfa,setMfa],['Rotação de senha','Forçar troca a cada 90 dias',rotacao,setRotacao]].map((r,i)=>(
{r[0]}
{r[1]}
))}
Expiração de sessão8h de inatividade
Bloqueio após tentativas5 tentativas

Integrações

Conexões externas do portal
{integ.map((it,i)=>(
{it.nome}{it.fase}
{it.desc}
{it.status}
))}
Logs de auditoria imutáveis · conforme LGPD
); } window.GestaoView=GestaoView; window.ConfigView=ConfigView;