Módulos (feature flags por grupo e unidade)
Tela onde você liga ou desliga funcionalidades inteiras do produto — 14 chaves fixas, como "Revisão por pares" ou "Central de comando" — para um grupo inteiro, com a opção de uma unidade específica sobrescrever o valor do grupo.

Antes de começar
- Componentes:
ModulesComponent(@pages/modules), acessado através deTenantModulesRouteComponent(grupo) eUnitModulesRouteComponent(unidade), com o editor de cada módulo emOrganizationModuleEditorComponent. - Rotas:
/admin/tenant/:id/modules(grupo),/admin/company/:id/modules(unidade). - Conceito de base: cascata de dois níveis
GRUPO → UNIDADE, com histórico de cada mudança preservado (nunca apagado) — ver Módulos — API.
Permissões e acesso
| Ação | Rota | Guard de rota | Quem pode editar |
|---|---|---|---|
| Ver/editar Módulos do grupo | /admin/tenant/:id/modules | permissionGuard('permission:read', 'route') no grupo | permission:manage no grupo |
| Ver/editar Módulos da unidade | /admin/company/:id/modules | permissionGuard('permission:read', 'route') + unit:read, na unidade | permission:manage no grupo ou na unidade |
Sem permission:manage, os toggles ficam visíveis mas desabilitados, com o aviso "Você pode
consultar os módulos, mas não possui permissão para alterá-los."
Neste levantamento, o item Módulos não aparece no menu lateral da unidade para
administrator (o menu usa a mesma checagem de escopo de grupo descrita na
visão geral do módulo) — mas a rota abre normalmente por URL
direta. Ao abrir, a tela mostra as 14 chaves corretamente, porém um toast "Você não possui
permissão para executar esta ação!" aparece e os botões Cancelar/Salvar ficam desabilitados
mesmo sem nenhuma edição pendente — sinal de que a permissão exigida pela chamada real de dados
(aparentemente permission:read/permission:manage num escopo que este perfil não tem) é mais
estrita do que a que o guard da rota checou para deixá-lo entrar.

As 14 chaves do catálogo
| Chave | Nome na tela | Descrição |
|---|---|---|
AI_INTEGRATION | Integração com IA | Disponibiliza integrações administrativas com provedores de inteligência artificial |
AI_REPORT | Laudo com IA | Habilita recursos de inteligência artificial no fluxo de laudos |
COMMAND_CENTER | Central de comando | Disponibiliza a visão operacional consolidada do grupo |
DELIVERY_PORTAL | Portal de entrega | Habilita o portal de entrega de exames e resultados |
DICOM_PRINT | Impressão DICOM | Habilita impressão e composição de imagens no padrão DICOM |
INTEGRATION | Integrações | Disponibiliza integrações operacionais com sistemas externos |
LINUX_SERVER | Servidor Linux | Habilita recursos dependentes do servidor Linux da unidade |
MESSAGING | Mensageria | Habilita comunicação e troca de mensagens na operação |
PEER_REVIEW | Revisão por pares | Disponibiliza o fluxo de revisão clínica por pares |
PERSONAL_APPS | Aplicativos pessoais | Habilita aplicativos associados ao perfil profissional |
PORTABLE | Portátil | Disponibiliza fluxos operacionais para equipamentos portáteis |
POWER_BI | Power BI | Habilita painéis e integrações analíticas do Power BI |
ROBOT | Robô | Habilita automações operacionais executadas por robôs |
WORKLIST | Lista de trabalho | Disponibiliza a lista de trabalho clínica para a organização |
Os nomes e descrições são fixos na interface (tradução local), não vêm do backend.
Caminho principal
- Abra Módulos no detalhe do grupo ou da unidade.
- Cada módulo aparece como um cartão com o nome, a descrição e um interruptor (toggle).
- Ligar ou desligar um toggle não grava na hora — a tela guarda a mudança em memória (o cartão já reflete o novo estado, otimisticamente) e habilita os botões Cancelar e Salvar no rodapé.
- Clique Salvar para confirmar todas as mudanças pendentes de uma vez — a tela dispara uma chamada por módulo alterado. Cancelar descarta tudo e recarrega o estado salvo.

Herança e restauração (só na tela da unidade)
Cada módulo mostra um selo indicando de onde vem o valor atual:
| Selo | Significado |
|---|---|
| Sistema | Nenhum override em nenhum nível — o módulo nunca foi mexido |
| Definido no grupo | O grupo ligou/desligou este módulo explicitamente, e a unidade não tem override próprio |
| Definido na unidade | A própria unidade tem um valor que vence sobre o do grupo, mesmo que seja para desligar algo que o grupo ligou |
Quando um módulo tem override (configured: true), aparece um botão Restaurar que remove o
override daquele nível e faz o valor voltar a ser herdado (do grupo, ou do sistema se o grupo
também não tiver definido nada).
Filtro
Busca por texto (nome, descrição ou chave) e um interruptor Apenas sobrescritos, que mostra só os módulos com um valor diferente do herdado.
Rotas e contratos relacionados
| Uso na tela | Rota de API |
|---|---|
| Listar/consultar módulos do grupo | Módulos — API |
| Listar/consultar módulos da unidade, com herança | Módulos — API |
| Ligar/desligar/restaurar | Módulos — API |
Validações
Frontend
Nenhuma validação de formato — é só ligar/desligar. A única regra de UX é o buffer local: nada é enviado até clicar Salvar.
Backend
Ver Módulos — API, seção Funcionamento — em
especial, a distinção entre enabled: false, configured: true (desligado explicitamente) e
enabled: false, configured: false (nunca mexido), e o fato de que cada mudança gera uma linha de
histórico (nunca é sobrescrita).
Caminhos alternativos e falhas
| Situação | O que acontece | Como se recupera |
|---|---|---|
Sem permission:manage | Toggles desabilitados, aviso informativo — sem toast de erro | Pedir a permissão a quem administra o grupo/unidade |
Permissão insuficiente na chamada real de dados (observado com administrator na unidade) | Toast "Você não possui permissão para executar esta ação!", botões desabilitados mesmo sem edição pendente | A confirmar — responsável: time de frontend; data: 24/09/2026. — a causa exata da divergência entre o guard de rota e a permissão da chamada não foi isolada |
| Falha ao salvar um ou mais módulos | Mensagem inline vermelha ("Não foi possível salvar todos os módulos. Revise as alterações e tente novamente.") com botão "Tentar novamente" — sem toast | Revisar as alterações pendentes e salvar de novo |
| Falha ao carregar a lista | Mensagem inline vermelha com botão "Tentar novamente" | Tentar de novo; se persistir, verificar permissão |