+
+
+
+
+
Relatórios Disponíveis
+
+
+
+
+
+
+
+
+
Materiais por Categoria
+
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'materiais-categoria-pdf'}
+
+ {:else}
+
+ {/if}
+ PDF
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'materiais-categoria-excel'}
+
+ {:else}
+
+ {/if}
+ Excel
+
+
+
+ {#if materiaisQuery.data && Object.keys(materiaisPorCategoria).length > 0}
+
+ {#each Object.entries(materiaisPorCategoria) as [categoria, quantidade]}
+
+ {/each}
+
+ {:else}
+
+
+
Nenhum dado disponível
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
Movimentações do Mês
+
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'movimentacoes-mes-pdf'}
+
+ {:else}
+
+ {/if}
+ PDF
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'movimentacoes-mes-excel'}
+
+ {:else}
+
+ {/if}
+ Excel
+
+
+
+
+
+
+
{movimentacoesMes.entrada}
+
+
+
+
{movimentacoesMes.saida}
+
+
+
+
{movimentacoesMes.ajuste}
+
+
+
+
+
+
+
+
+
+
+
+
Materiais com Estoque Baixo
+
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'estoque-baixo-pdf'}
+
+ {:else}
+
+ {/if}
+ PDF
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'estoque-baixo-excel'}
+
+ {:else}
+
+ {/if}
+ Excel
+
+
+
+ {#if materiaisQuery.data}
+ {@const estoqueBaixo = materiaisQuery.data.filter(m => m.estoqueAtual <= m.estoqueMinimo)}
+ {#if estoqueBaixo.length > 0}
+
+
+
+
+ Material
+ Atual
+ Mínimo
+
+
+
+ {#each estoqueBaixo.slice(0, 10) as material}
+
+
+ {material.nome}
+ {material.codigo}
+
+
+ {material.estoqueAtual}
+
+
+ {material.estoqueMinimo}
+
+
+ {/each}
+
+
+
+ {#if estoqueBaixo.length > 10}
+
+ E mais {estoqueBaixo.length - 10} materiais...
+
+ {/if}
+ {:else}
+
+
+ Todos os materiais estão com estoque adequado!
+
+ {/if}
+ {/if}
+
+
+
+
+
+
+
+
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'alertas-pdf'}
+
+ {:else}
+
+ {/if}
+ PDF
+
+
+ {#if gerandoRelatorio && tipoRelatorioGerando === 'alertas-excel'}
+
+ {:else}
+
+ {/if}
+ Excel
+
+
+
+ {#if alertasQuery.data && alertasQuery.data.length > 0}
+
+ {#each alertasQuery.data.slice(0, 5) as alerta}
+
+
+
+ {#if materiaisQuery.data}
+ {@const material = materiaisQuery.data.find(m => m._id === alerta.materialId)}
+ {material?.nome || 'Carregando...'}
+ {/if}
+
+
+ Estoque: {alerta.quantidadeAtual} / Mínimo: {alerta.quantidadeMinima}
+
+
+
+ {#if alerta.tipo === 'estoque_zerado'}
+ Zerado
+ {:else}
+ Mínimo
+ {/if}
+
+
+ {/each}
+
+ {:else}
+
+
+ Nenhum alerta ativo
+
+ {/if}
+
+
+
+
+
diff --git a/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte b/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte
new file mode 100644
index 0000000..bcfdfd9
--- /dev/null
+++ b/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte
@@ -0,0 +1,1300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Requisições de Material
+
+
Gerencie requisições de material dos funcionários
+
+
+
+
+ Nova Requisição
+
+
+
+
+
+ {#if notice}
+
+ {notice.text}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
Filtros de Busca
+
+
+
+
+
+
+
+
+
+
+ Solicitante
+
+
+
+ Todos os solicitantes
+ {#if funcionariosQuery.data}
+ {#each funcionariosQuery.data as funcionario}
+ {funcionario.nome}
+ {/each}
+ {/if}
+
+
+ Filtre por funcionário solicitante
+
+
+
+
+
+
+
+
+ Setor
+
+
+
+ Todos os setores
+ {#if setoresQuery.data}
+ {#each setoresQuery.data as setor}
+ {setor.nome}
+ {/each}
+ {/if}
+
+
+ Filtre por setor
+
+
+
+
+
+
+
+
+ Status
+
+
+
+ Todos os status
+ Pendente
+ Aprovada
+ Atendida
+ Rejeitada
+ Cancelada
+
+
+ Filtre as requisições por status
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Lista de Requisições
+
+
+
+
+
+ Número
+ Solicitante
+ Setor
+ Status
+ Data
+ Ações
+
+
+
+ {#if requisicoes.length === 0}
+
+
+
+
+
Nenhuma requisição encontrada
+
Tente ajustar os filtros ou criar uma nova requisição
+
+
+
+ {:else}
+ {#each requisicoes as requisicao}
+ {@const solicitante = funcionariosQuery.data?.find(f => f._id === requisicao.solicitanteId)}
+ {@const setor = setoresQuery.data?.find(s => s._id === requisicao.setorId)}
+
+
+ {requisicao.numero}
+
+
+ {solicitante?.nome || 'Carregando...'}
+
+
+ {setor?.nome || 'Carregando...'}
+
+
+
+
+ {getStatusLabel(requisicao.status)}
+
+ {#if requisicao.status === 'rejeitada' && requisicao.motivoReprovacao}
+
+ Motivo: {requisicao.motivoReprovacao}
+
+ {/if}
+
+
+
+ {new Date(requisicao.criadoEm).toLocaleDateString('pt-BR')}
+
+
+
+
abrirModalVisualizar(requisicao._id)}
+ title="Visualizar requisição"
+ >
+
+
+ {#if requisicao.status === 'pendente'}
+
abrirModalAprovar(requisicao._id)}
+ title="Aprovar requisição"
+ >
+
+ Aprovar
+
+
abrirModalReprovar(requisicao._id)}
+ title="Reprovar requisição"
+ >
+
+ Reprovar
+
+ {:else if requisicao.status === 'aprovada'}
+
abrirModalAtender(requisicao._id)}
+ title="Atender requisição"
+ >
+
+ Atender
+
+ {/if}
+
+
+
+ {/each}
+ {/if}
+
+
+
+
+ {#if requisicoes.length > 0}
+
+
+ Mostrando {requisicoes.length} requisição{requisicoes.length !== 1 ? 'ões' : ''}
+ {#if requisicoesQuery.data && requisicoesQuery.data.length !== requisicoes.length}
+ de {requisicoesQuery.data.length} total
+ {/if}
+
+
+ {/if}
+
+
+
+
+ {#if showModalNova}
+
+
+
+
+
+
+
+
Nova Requisição de Material
+
Preencha os dados da requisição
+
+
+
+
+
+
+
+
+
+
Informações Básicas
+
+
+
+
+
+
+
+ Solicitante *
+
+
+
+ Selecione um funcionário
+ {#if funcionariosQuery.data}
+ {#each funcionariosQuery.data as funcionario}
+ {funcionario.nome}
+ {/each}
+ {/if}
+
+
+ Funcionário que está solicitando
+
+
+
+
+
+
+
+ Setor *
+
+
+
+ Selecione um setor
+ {#if setoresQuery.data}
+ {#each setoresQuery.data as setor}
+ {setor.nome}
+ {/each}
+ {/if}
+
+
+ Setor do solicitante
+
+
+
+
+
+
+
+
+
+
Itens da Requisição
+
+
+
+
+
+
+ Material
+
+
+ Selecione um material
+ {#if materiaisQuery.data}
+ {#each materiaisQuery.data as material}
+
+ {material.codigo} - {material.nome}
+
+ {/each}
+ {/if}
+
+
+
+
+
+ Quantidade
+
+ {
+ const value = parseInt((e.target as HTMLInputElement).value);
+ if (isNaN(value) || value < 1) {
+ (e.target as HTMLInputElement).value = '';
+ novoItemQuantidade = 0;
+ } else {
+ novoItemQuantidade = value;
+ }
+ }}
+ />
+
+
+
+
+
+
+ {#if novaRequisicaoItens.length > 0}
+
+
+
+
+ Material
+ Quantidade
+ Ações
+
+
+
+ {#each novaRequisicaoItens as item}
+ {@const material = materiaisQuery.data?.find(m => m._id === item.materialId)}
+
+
+ {material?.nome || 'Carregando...'}
+ {#if material?.codigo}
+ {material.codigo}
+ {/if}
+
+
+ {item.quantidade}
+ {material?.unidadeMedida || ''}
+
+
+ removerItem(item.id)}
+ title="Remover item"
+ >
+
+
+
+
+ {/each}
+
+
+
+ {:else}
+
+
+
+
Nenhum item adicionado
+
Adicione pelo menos um item à requisição
+
+
+ {/if}
+
+
+
+
+
+
+
+
+ Observações Gerais
+
+
+
+ Informações adicionais sobre a requisição
+
+
+
+
+
+
+ Cancelar
+
+
+ {#if criandoRequisicao}
+
+ Criando...
+ {:else}
+
+ Criar Requisição
+ {/if}
+
+
+
+
+ {/if}
+
+
+ {#if showModalAprovar}
+
+
+
+
+
+
+
+
Aprovar Requisição
+
Confirmar aprovação da requisição
+
+
+
+
+
+
+ {#if problemasEstoqueAprovar.length > 0}
+
+
+
+
+
Estoque Insuficiente
+
+ A requisição contém materiais com estoque insuficiente:
+
+
+ {#each problemasEstoqueAprovar as problema}
+
+ {problema.materialNome}: solicitado {problema.quantidadeSolicitada}, disponível {problema.estoqueAtual} (faltam {problema.falta})
+
+ {/each}
+
+
+ A aprovação permitirá atender apenas a quantidade disponível em estoque.
+
+
+
+
+ {:else}
+
+
+
+
+
Confirmar Aprovação
+
+ A requisição será aprovada e ficará disponível para atendimento.
+
+
+
+
+ {/if}
+
+
+
+ Cancelar
+
+ {#if problemasEstoqueAprovar.length === 0}
+
+ {#if processandoAprovar}
+
+ Aprovando...
+ {:else}
+
+ Confirmar Aprovação
+ {/if}
+
+ {/if}
+
+
+
+ {/if}
+
+
+ {#if showModalReprovar}
+
+
+
+
+
+
+
+
Reprovar Requisição
+
Informe o motivo da reprovação
+
+
+
+
+
+
+
+
+
+
+
Confirmar Reprovação
+
+ O motivo informado será registrado e poderá ser visualizado pelo solicitante da requisição.
+
+
+
+
+
+
+
+ Motivo da Reprovação *
+
+
+
+
+ Este motivo será registrado e poderá ser visualizado pelo solicitante
+
+
+
+
+
+
+ Cancelar
+
+
+ {#if processandoReprovar}
+
+ Reprovando...
+ {:else}
+
+ Confirmar Reprovação
+ {/if}
+
+
+
+
+ {/if}
+
+
+ {#if showModalVisualizar}
+
+
+
+
+
+
+
+
Detalhes da Requisição
+ {#if carregandoDetalhes}
+
Carregando...
+ {:else if erroDetalhes}
+
Erro: {erroDetalhes}
+ {:else if requisicaoDetalhes}
+
Número: {requisicaoDetalhes.numero}
+ {:else}
+
Carregando...
+ {/if}
+
+
+
+
+
+
+ {#if carregandoDetalhes}
+
+
+
+ {:else if erroDetalhes}
+
+
+
+
Erro ao carregar detalhes
+
{erroDetalhes}
+
+
+ {:else if requisicaoDetalhes}
+ {@const solicitanteDetalhes = funcionariosQuery?.data?.find(f => f._id === requisicaoDetalhes.solicitanteId)}
+ {@const setorDetalhes = setoresQuery?.data?.find(s => s._id === requisicaoDetalhes.setorId)}
+
+
+
+
+
+ Informações Básicas
+
+
+
+
+
Solicitante
+
{solicitanteDetalhes?.nome || 'Carregando...'}
+
+
+
+
+
Setor
+
{setorDetalhes?.nome || 'Carregando...'}
+
+
+
+
+
Status
+
+ {getStatusLabel(requisicaoDetalhes.status)}
+
+
+
+
+
+
Data de Criação
+
{new Date(requisicaoDetalhes.criadoEm).toLocaleString('pt-BR')}
+
+
+ {#if requisicaoDetalhes.aprovadoPor}
+ {@const aprovador = funcionariosQuery.data?.find(f => f._id === requisicaoDetalhes.aprovadoPor)}
+
+
+
Aprovado por
+
{aprovador?.nome || 'Carregando...'}
+ {#if requisicaoDetalhes.dataAprovacao}
+
+ {new Date(requisicaoDetalhes.dataAprovacao).toLocaleString('pt-BR')}
+
+ {/if}
+
+
+ {/if}
+ {#if requisicaoDetalhes.reprovadoPor}
+ {@const reprovador = funcionariosQuery.data?.find(f => f._id === requisicaoDetalhes.reprovadoPor)}
+
+
+
Reprovado por
+
{reprovador?.nome || 'Carregando...'}
+ {#if requisicaoDetalhes.dataReprovacao}
+
+ {new Date(requisicaoDetalhes.dataReprovacao).toLocaleString('pt-BR')}
+
+ {/if}
+ {#if requisicaoDetalhes.motivoReprovacao}
+
+
Motivo:
+
{requisicaoDetalhes.motivoReprovacao}
+
+ {/if}
+
+
+ {/if}
+
+
+
+
+
+
+
+ Itens da Requisição
+
+ {#if requisicaoDetalhes.itens && requisicaoDetalhes.itens.length > 0}
+
+
+
+
+ Material
+ Quantidade Solicitada
+ Quantidade Atendida
+ Observações
+
+
+
+ {#each requisicaoDetalhes.itens as item}
+ {@const material = materiaisQuery.data?.find(m => m._id === item.materialId)}
+
+
+ {material?.nome || 'Carregando...'}
+ {#if material?.codigo}
+ {material.codigo}
+ {/if}
+
+
+ {item.quantidadeSolicitada}
+ {material?.unidadeMedida || ''}
+
+
+ {#if item.quantidadeAtendida !== undefined}
+ {item.quantidadeAtendida}
+ {material?.unidadeMedida || ''}
+ {:else}
+ -
+ {/if}
+
+
+ {#if item.observacoes}
+ {item.observacoes}
+ {:else}
+ -
+ {/if}
+
+
+ {/each}
+
+
+
+ {:else}
+
+
+
Nenhum item encontrado nesta requisição
+
+ {/if}
+
+
+
+ {#if requisicaoDetalhes.observacoes}
+
+
+
+ Observações Gerais
+
+
+
+
{requisicaoDetalhes.observacoes}
+
+
+
+ {/if}
+
+
+
+ Fechar
+
+
+ {:else}
+
+
+
+
+
+ Fechar
+
+
+ {/if}
+
+
+ {/if}
+
+
+ {#if showModalAtender}
+
+
+
+
+
+
Atender Requisição
+
Registrar saídas de material
+
+
+
+
+
+
+
+
+
+
+
Confirmar Atendimento
+
+ Ao confirmar, serão registradas as saídas de material do estoque conforme os itens da requisição.
+
+
+
+
+
+
+
+ Tem certeza que deseja atender esta requisição? Isso registrará as saídas de material no estoque.
+
+
+
+
+
+ Cancelar
+
+
+ {#if processandoAtender}
+
+ Atendendo...
+ {:else}
+
+ Confirmar Atendimento
+ {/if}
+
+
+
+
+ {/if}
+
+
+
diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/+page.svelte
index aad3b70..092d0d6 100644
--- a/apps/web/src/routes/(dashboard)/recursos-humanos/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/recursos-humanos/+page.svelte
@@ -19,7 +19,10 @@
ArrowRight,
Clock,
XCircle,
- TrendingUp
+ TrendingUp,
+ Package,
+ ArrowLeftRight,
+ AlertTriangle
} from 'lucide-svelte';
import type { Component } from 'svelte';
@@ -155,6 +158,58 @@
Icon: List
}
]
+ },
+ {
+ categoria: 'Almoxarifado',
+ descricao: 'Controle de estoque e gestão de materiais',
+ Icon: Package,
+ gradient: 'from-amber-500/10 to-amber-600/20',
+ accentColor: 'text-amber-600',
+ bgIcon: 'bg-amber-500/20',
+ opcoes: [
+ {
+ nome: 'Dashboard',
+ descricao: 'Visão geral do almoxarifado',
+ href: '/almoxarifado',
+ Icon: BarChart3
+ },
+ {
+ nome: 'Cadastrar Material',
+ descricao: 'Adicionar novo material ao estoque',
+ href: '/almoxarifado/materiais/cadastro',
+ Icon: Plus
+ },
+ {
+ nome: 'Listar Materiais',
+ descricao: 'Visualizar e gerenciar materiais',
+ href: '/almoxarifado/materiais',
+ Icon: Package
+ },
+ {
+ nome: 'Movimentações',
+ descricao: 'Registrar entradas e saídas',
+ href: '/almoxarifado/movimentacoes',
+ Icon: ArrowLeftRight
+ },
+ {
+ nome: 'Requisições',
+ descricao: 'Gerenciar requisições de material',
+ href: '/almoxarifado/requisicoes',
+ Icon: ClipboardList
+ },
+ {
+ nome: 'Alertas',
+ descricao: 'Visualizar alertas de estoque baixo',
+ href: '/almoxarifado/alertas',
+ Icon: AlertTriangle
+ },
+ {
+ nome: 'Relatórios',
+ descricao: 'Relatórios e estatísticas',
+ href: '/almoxarifado/relatorios',
+ Icon: BarChart3
+ }
+ ]
}
];
diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte
index 26902f4..4f37d03 100644
--- a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte
@@ -3149,7 +3149,7 @@
['Data e Hora', dataHora],
['Status', registro.dentroDoPrazo ? 'Dentro do Prazo' : 'Fora do Prazo'],
['Tolerância', `${registro.toleranciaMinutos} minutos`],
- ['Sincronizado', registro.sincronizadoComServidor ? 'Sim (Servidor)' : 'Não (PC Local)']
+ ['Sincronizado', registro.sincronizadoComServidor ? 'Sim (Servidor)' : 'Não (Servidor interno)']
];
if (registro.justificativa) {
diff --git a/apps/web/src/routes/(dashboard)/ti/+page.svelte b/apps/web/src/routes/(dashboard)/ti/+page.svelte
index a0cf4f4..05d07dd 100644
--- a/apps/web/src/routes/(dashboard)/ti/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/ti/+page.svelte
@@ -50,6 +50,7 @@
| '/(dashboard)/ti/configuracoes-ponto'
| '/(dashboard)/ti/configuracoes-relogio'
| '/(dashboard)/ti/configuracoes-jitsi'
+ | '/(dashboard)/ti/configuracoes-almoxarifado'
| '/(dashboard)/configuracoes/setores';
type FeatureCard = {
@@ -272,12 +273,25 @@
{
title: 'Configurações de Relógio',
description:
- 'Configure a sincronização de tempo com servidor NTP ou use o relógio do PC como fallback.',
+ 'Configure a sincronização de tempo com servidor NTP ou use o servidor interno como fallback.',
ctaLabel: 'Configurar Relógio',
href: '/(dashboard)/ti/configuracoes-relogio',
palette: 'info',
icon: 'clock'
},
+ {
+ title: 'Configurações de Almoxarifado',
+ description:
+ 'Configure parâmetros do sistema de almoxarifado, alertas e regras de estoque. Acesso restrito à TI.',
+ ctaLabel: 'Configurar Almoxarifado',
+ href: '/(dashboard)/ti/configuracoes-almoxarifado',
+ palette: 'warning',
+ icon: 'control',
+ highlightBadges: [
+ { label: 'Restrito', variant: 'solid' },
+ { label: 'TI Only', variant: 'outline' }
+ ]
+ },
{
title: 'Monitoramento de Emails',
description:
diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes-almoxarifado/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes-almoxarifado/+page.svelte
new file mode 100644
index 0000000..a37f53c
--- /dev/null
+++ b/apps/web/src/routes/(dashboard)/ti/configuracoes-almoxarifado/+page.svelte
@@ -0,0 +1,677 @@
+
+
+
+
+
+
+
+ TI
+
+ Configurações de Almoxarifado
+
+
+
+
+
+
+
+
+
+
+
+ Configurações de Almoxarifado
+
+
+ Configure parâmetros do sistema de almoxarifado. Acesso restrito à TI.
+
+
+
+
+
+
+
+
+
+
Acesso Restrito
+
+ Esta página é restrita apenas para usuários com permissão de TI. Alterações aqui afetam
+ o comportamento de todo o sistema de almoxarifado.
+
+
+
+
+
+ {#if mensagem}
+
+ {mensagem.texto}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
Configurações de Busca de Código de Barras
+
+
+
+
+
+
+
APIs Gratuitas Disponíveis
+
+ As APIs Busca Unificada e Open Food Facts funcionam sem
+ credenciais e estão sempre disponíveis. Você só precisa configurar as credenciais abaixo
+ se desejar usar as APIs pagas (GS1 Brasil, Bluesoft Cosmo, Product-Search.net).
+
+
+
+
+
+
+
+
+
+
+
+ Ativar GS1 Brasil
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ativar Bluesoft Cosmo
+
+
+
+
+
+
+
+
+
+
+
+
+
Product-Search.net
+
+
+
+
+ Ativar Product-Search.net
+
+
+
+
+
+
+
+
+
+
+ {#if processandoCodigoBarras}
+
+ Salvando...
+ {:else}
+
+ Salvar Configurações de Código de Barras
+ {/if}
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes-relogio/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes-relogio/+page.svelte
index 039f7df..f5ef5ec 100644
--- a/apps/web/src/routes/(dashboard)/ti/configuracoes-relogio/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/ti/configuracoes-relogio/+page.svelte
@@ -69,7 +69,7 @@
// Date.now() retorna timestamp UTC (milissegundos desde epoch)
timestampUTC = Date.now();
timestampOriginal = timestampUTC;
- // Atualizar status para indicar que está usando relógio do PC
+ // Atualizar status para indicar que está usando servidor interno
statusSincronizacao = {
ultimaSincronizacao: Date.now(),
offsetSegundos: null,
@@ -305,7 +305,7 @@
'success',
resultado.usandoServidorExterno
? `Sincronização bem-sucedida! Offset: ${resultado.offsetSegundos}s | Horário atual: ${horarioAtual}`
- : 'Usando relógio do PC (servidor externo não disponível)'
+ : 'Usando servidor interno (servidor externo não disponível)'
);
} else {
mostrarMensagem('error', 'Falha na sincronização');
@@ -424,7 +424,7 @@
{statusSincronizacao?.usandoServidorExterno
? `Servidor NTP (${servidorNTP})`
- : 'Relógio do PC'}
+ : 'Servidor interno'}
{#if statusSincronizacao?.offsetSegundos !== null && statusSincronizacao?.offsetSegundos !== undefined}
@@ -527,7 +527,7 @@