diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..34cff05 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = tab +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = true \ No newline at end of file diff --git a/RELATORIO_TESTES.md b/RELATORIO_TESTES.md deleted file mode 100644 index 3780090..0000000 --- a/RELATORIO_TESTES.md +++ /dev/null @@ -1,186 +0,0 @@ -# Relatório de Testes - Sistema de Central de Chamados - -**Data:** 16 de novembro de 2025 -**Testador:** Sistema Automatizado -**Página Testada:** `/ti/central-chamados` - -## Resumo Executivo - -Foram realizados testes completos na página de Central de Chamados do sistema SGSE. A maioria das funcionalidades está funcionando corretamente, mas foram identificados alguns problemas que precisam ser corrigidos. - -## Testes Realizados - -### ✅ Testes Bem-Sucedidos - -1. **Login no Sistema** - - Status: ✅ PASSOU - - Usuário logado: Deyvison (dfw@poli.br) - -2. **Visualização de SLAs Configurados** - - Status: ✅ PASSOU - - Tabela de SLAs exibe 7 SLAs ativos corretamente - - Resumo mostra: 4 Baixa, 2 Média, 1 Alta/Crítica - - Detalhes completos (tempos, prioridades) são exibidos corretamente - -3. **Cards de Prioridade** - - Status: ✅ PASSOU - - Cards mostram corretamente "Configurado" ou "Não configurado" - - Botão "Configurar" funciona corretamente - - Detalhes dos SLAs configurados são exibidos nos cards - -4. **Criação de SLA** - - Status: ✅ PASSOU - - SLA criado com sucesso para prioridade "Alta" - - Formulário preenche corretamente quando clica em "Configurar" - - Tabela atualiza automaticamente após criação - - Card de prioridade atualiza para "Configurado" - -5. **Edição de SLA** - - Status: ✅ PASSOU - - Botão "Editar" abre formulário com dados corretos - - Atualização funciona corretamente - -6. **Lista de Chamados** - - Status: ✅ PASSOU - - 4 chamados sendo exibidos corretamente - - Filtros funcionando (status, responsável, setor) - - Detalhes do chamado são exibidos ao selecionar - -7. **Atribuição de Responsável** - - Status: ✅ PASSOU - - Dropdown mostra 2 usuários TI: Deyvison e Suporte_TI - - Formulário está funcional - -8. **Prorrogação de Prazo** - - Status: ✅ PASSOU - - Dropdown de tickets carrega corretamente (4 tickets) - - Formulário permite selecionar tipo de prazo e horas - - Botão habilita quando todos os campos estão preenchidos - -### ⚠️ Problemas Identificados - -#### 1. Templates de Email - Listagem Após Criação - -- **Status:** ⚠️ PROBLEMA -- **Descrição:** Templates são criados com sucesso (mensagem "Templates padrão criados com sucesso" aparece), mas não são listados na interface após criação -- **Ação Realizada:** Botão "Criar templates padrão" foi clicado e retornou sucesso -- **Comportamento Esperado:** Templates deveriam aparecer em uma lista após criação -- **Comportamento Atual:** Seção continua mostrando "Nenhum template encontrado" -- **Severidade:** MÉDIA -- **Impacto:** Usuários não conseguem visualizar/editar templates de email após criação -- **Possível Causa:** Query de templates pode não estar sendo atualizada após criação, ou filtro pode estar excluindo templates de chamados - -#### 2. Warning no Console - Token de Autenticação - -- **Status:** ⚠️ AVISO (Não crítico) -- **Descrição:** `⚠️ [useConvexWithAuth] Token não disponível` aparece no console durante carregamento inicial -- **Severidade:** BAIXA -- **Impacto:** Não afeta funcionalidade (autenticação funciona corretamente após carregamento) -- **Observação:** Parece ser um problema de timing durante inicialização da página - -#### 3. Warning no Console - Formato de Query - -- **Status:** ⚠️ AVISO (Não crítico) -- **Descrição:** `🔍 [usuariosTI] Formato inesperado: object {data: undefined, isLoading: undefined, error: undefined, isStale: undefined}` aparece no console -- **Severidade:** BAIXA -- **Impacto:** Não afeta funcionalidade (usuários são carregados corretamente - 2 usuários TI encontrados) -- **Observação:** Indica possível inconsistência no formato de retorno da query durante carregamento inicial - -## Detalhes dos Testes - -### Teste de Criação de SLA - -- **Prioridade Testada:** Alta -- **Valores Inseridos:** - - Nome: "SLA - Alta - Teste" - - Tempo de Resposta: 2h - - Tempo de Conclusão: 8h - - Auto-encerramento: 24h - - Alerta: 2h antes -- **Resultado:** ✅ SLA criado e exibido na tabela e no card - -### Teste de Edição de SLA - -- **SLA Editado:** Prioridade Baixa -- **Alterações:** - - Nome: "SLA Baixa - Editado em Teste" - - Tempo de Resposta: 6h -- **Resultado:** ✅ Atualização bem-sucedida - -### Teste de Prorrogação - -- **Ticket Selecionado:** SGSE-202511-3750 -- **Prazo:** Conclusão -- **Horas Adicionais:** 24h -- **Motivo:** "Teste de prorrogação de prazo - necessário mais tempo para análise" -- **Resultado:** ✅ Formulário preenchido corretamente, botão habilitado - -## Lista de Erros Encontrados - -### Erros Críticos - -- **Nenhum erro crítico encontrado** - -### Erros de Funcionalidade - -1. **Templates de Email não aparecem após criação** - - Localização: Seção "Templates de Email - Chamados" - - Ação necessária: Verificar query de templates e atualização reativa após criação - -### Avisos (Warnings) - -1. **Token de autenticação não disponível durante carregamento inicial** - - Localização: Console do navegador - - Ação necessária: Melhorar timing de inicialização de autenticação - -2. **Formato inesperado de query durante carregamento** - - Localização: Console do navegador (usuariosTI) - - Ação necessária: Verificar formato de retorno de useQuery do convex-svelte - -## Recomendações - -### Prioridade ALTA - -1. **Corrigir listagem de templates de email após criação** - - Verificar se a query `templatesChamados` está sendo atualizada após criação - - Verificar se o filtro de templates está correto (deve incluir templates de chamados) - - Adicionar refresh automático após criação de templates - -### Prioridade MÉDIA - -2. **Investigar e corrigir warnings no console** - - Melhorar timing de autenticação para evitar warning inicial - - Padronizar formato de retorno de queries do convex-svelte - -### Prioridade BAIXA - -3. **Melhorar logs de debug** - - Reduzir verbosidade de logs informativos - - Manter apenas logs de erro e warnings importantes - -## Conclusão - -O sistema está **funcionalmente operacional**, com a maioria das funcionalidades testadas funcionando corretamente: - -✅ **Funcionalidades Testadas e Funcionando:** - -- Login e autenticação -- Visualização de SLAs (tabela e cards) -- Criação de SLAs -- Edição de SLAs -- Lista de chamados -- Atribuição de responsável -- Prorrogação de prazo (formulário funcional) -- Criação de templates (backend funciona, frontend não atualiza) - -⚠️ **Problemas Identificados:** - -- Templates não aparecem na lista após criação (problema de atualização reativa) -- Warnings no console (não afetam funcionalidade) - -**Status Geral:** ✅ **OPERACIONAL COM PEQUENOS AJUSTES NECESSÁRIOS** - -**Próximos Passos:** - -1. Corrigir atualização reativa de templates após criação -2. Investigar e resolver warnings do console (opcional, não crítico) diff --git a/apps/web/CONFIGURACAO_ENV.md b/apps/web/CONFIGURACAO_ENV.md new file mode 100644 index 0000000..91f3551 --- /dev/null +++ b/apps/web/CONFIGURACAO_ENV.md @@ -0,0 +1,29 @@ +# ⚙️ Configuração de Variáveis de Ambiente + +## 📁 Arquivo .env + +Crie um arquivo `.env` na pasta `apps/web/` com as seguintes variáveis: + +```env +# Google Maps API Key (opcional) +# Obtenha sua chave em: https://console.cloud.google.com/ +# Ative a "Geocoding API" para buscar coordenadas por endereço +# Deixe vazio para usar OpenStreetMap (gratuito, sem necessidade de chave) +VITE_GOOGLE_MAPS_API_KEY= + +# VAPID Public Key para Push Notifications (opcional) +VITE_VAPID_PUBLIC_KEY= +``` + +## 📖 Documentação Completa + +Para instruções detalhadas sobre como obter e configurar a Google Maps API Key, consulte: + +📄 **[GOOGLE_MAPS_SETUP.md](./GOOGLE_MAPS_SETUP.md)** + +## ⚠️ Importante + +- O arquivo `.env` não deve ser commitado no Git (já está no .gitignore) +- Variáveis de ambiente começam com `VITE_` para serem acessíveis no frontend +- Reinicie o servidor de desenvolvimento após alterar o arquivo `.env` + diff --git a/apps/web/GOOGLE_MAPS_SETUP.md b/apps/web/GOOGLE_MAPS_SETUP.md new file mode 100644 index 0000000..7ccfb87 --- /dev/null +++ b/apps/web/GOOGLE_MAPS_SETUP.md @@ -0,0 +1,174 @@ +# 📍 Configuração do Google Maps API para Busca de Coordenadas + +Este guia explica como configurar a API do Google Maps para obter coordenadas GPS de forma automática e precisa no sistema de Endereços de Marcação. + +## 🎯 Por que usar Google Maps? + +- ✅ **Maior Precisão**: Resultados mais exatos para endereços brasileiros +- ✅ **Melhor Cobertura**: Banco de dados mais completo e atualizado +- ✅ **Geocoding Avançado**: Entende melhor endereços incompletos ou parciais + +> **Nota**: O sistema funciona perfeitamente sem a API key do Google Maps, usando OpenStreetMap (gratuito). A configuração do Google Maps é opcional. + +--- + +## 📋 Passo a Passo + +### 1. Criar Projeto no Google Cloud Platform + +1. Acesse [Google Cloud Console](https://console.cloud.google.com/) +2. Clique em **"Criar Projeto"** ou selecione um projeto existente +3. Preencha o nome do projeto (ex: "SGSE-App") +4. Clique em **"Criar"** + +### 2. Ativar a Geocoding API + +1. No menu lateral, vá em **"APIs e Serviços"** > **"Biblioteca"** +2. Procure por **"Geocoding API"** +3. Clique no resultado e depois em **"Ativar"** +4. Aguarde alguns segundos para a ativação + +### 3. Criar Chave de API + +1. Ainda em **"APIs e Serviços"**, vá em **"Credenciais"** +2. Clique em **"Criar Credenciais"** > **"Chave de API"** +3. Copie a chave gerada (você precisará dela depois) + +### 4. Configurar Restrições de Segurança (Recomendado) + +Para proteger sua chave de API: + +1. Clique na chave criada para editá-la +2. Em **"Restrições de API"**: + - Selecione **"Restringir chave"** + - Escolha **"Geocoding API"** +3. Em **"Restrições de aplicativo"**: + - Para desenvolvimento local: escolha **"Referenciadores de sites HTTP"** + - Adicione: `http://localhost:*` e `http://127.0.0.1:*` + - Para produção: adicione o domínio do seu site +4. Clique em **"Salvar"** + +### 5. Configurar no Projeto + +1. No diretório `apps/web/`, copie o arquivo de exemplo: + ```bash + cp .env.example .env + ``` + +2. Abra o arquivo `.env` e adicione sua chave: + ```env + VITE_GOOGLE_MAPS_API_KEY=sua_chave_aqui + ``` + +3. Reinicie o servidor de desenvolvimento: + ```bash + npm run dev + ``` + +### 6. Verificar se está funcionando + +1. Acesse a página de **Endereços de Marcação** (`/ti/configuracoes-ponto/enderecos`) +2. Clique em **"Novo Endereço"** +3. Preencha um endereço e clique em **"Buscar GPS"** +4. Se configurado corretamente, verá a mensagem: *"Coordenadas encontradas via Google Maps!"* + +--- + +## 💰 Custos + +### Google Maps Geocoding API + +- **$5.00 por 1.000 requisições** (primeiros 40.000 são gratuitos por mês) +- **$0.005 por requisição** após os 40.000 gratuitos + +> 💡 Para a maioria dos casos de uso, os 40.000 gratuitos são suficientes! + +### OpenStreetMap (Fallback) + +- **100% Gratuito** e ilimitado +- Sem necessidade de configuração +- Precisão levemente menor, mas ainda muito boa + +--- + +## 🔄 Como funciona o sistema + +O sistema foi projetado para usar uma estratégia de **fallback inteligente**: + +1. **Primeiro**: Tenta buscar via Google Maps (se API key configurada) +2. **Se falhar ou não tiver API key**: Usa automaticamente OpenStreetMap +3. **Feedback**: Informa qual serviço foi usado na mensagem de sucesso + +Isso garante que o sistema sempre funcione, mesmo sem a API key do Google Maps. + +--- + +## 🔒 Segurança + +### ⚠️ Importante + +- **Nunca** commite o arquivo `.env` no Git (já está no .gitignore) +- **Nunca** compartilhe sua chave de API publicamente +- Configure **restrições de API** no Google Cloud Console +- Para produção, use variáveis de ambiente seguras no seu provedor de hospedagem + +### Configuração em Produção + +Para ambientes de produção (Vercel, Netlify, etc.): + +1. Acesse as configurações do projeto no seu provedor +2. Vá em **"Environment Variables"** ou **"Variáveis de Ambiente"** +3. Adicione: `VITE_GOOGLE_MAPS_API_KEY` com o valor da sua chave +4. Faça o deploy novamente + +--- + +## ❓ Solução de Problemas + +### A busca não está usando Google Maps + +- Verifique se a variável `VITE_GOOGLE_MAPS_API_KEY` está no arquivo `.env` +- Reinicie o servidor de desenvolvimento +- Verifique no console do navegador se há erros + +### Erro: "This API project is not authorized to use this API" + +- Verifique se a **Geocoding API** está ativada no projeto +- Aguarde alguns minutos após a ativação (pode levar até 5 minutos) + +### Erro: "API key not valid" + +- Verifique se copiou a chave corretamente +- Verifique se as restrições de API permitem o uso da Geocoding API +- Verifique se as restrições de aplicativo permitem seu domínio/endereço + +### Mensagem: "Coordenadas encontradas via OpenStreetMap" + +- Isso é normal se: + - Não há API key configurada + - A API key não é válida + - O Google Maps falhou na busca +- O sistema continua funcionando normalmente com OpenStreetMap + +--- + +## 📚 Recursos Úteis + +- [Google Cloud Console](https://console.cloud.google.com/) +- [Documentação Geocoding API](https://developers.google.com/maps/documentation/geocoding) +- [Preços Google Maps](https://developers.google.com/maps/billing-and-pricing/pricing) +- [OpenStreetMap Nominatim](https://nominatim.org/) + +--- + +## ✅ Resumo + +1. ✅ Crie projeto no Google Cloud +2. ✅ Ative Geocoding API +3. ✅ Crie chave de API +4. ✅ Configure restrições (recomendado) +5. ✅ Adicione `VITE_GOOGLE_MAPS_API_KEY` no `.env` +6. ✅ Reinicie o servidor + +**Pronto!** O sistema agora usará Google Maps para busca de coordenadas com maior precisão. + diff --git a/apps/web/src/lib/components/Sidebar.svelte b/apps/web/src/lib/components/Sidebar.svelte index fe64cde..bc99b9f 100644 --- a/apps/web/src/lib/components/Sidebar.svelte +++ b/apps/web/src/lib/components/Sidebar.svelte @@ -9,7 +9,7 @@ import NotificationBell from '$lib/components/chat/NotificationBell.svelte'; import ChatWidget from '$lib/components/chat/ChatWidget.svelte'; import PresenceManager from '$lib/components/chat/PresenceManager.svelte'; - import { getAvatarUrl } from '$lib/utils/avatarGenerator'; + import { Menu, User, Home, UserPlus, XCircle, LogIn, Tag, Plus, Check } from 'lucide-svelte'; import { authClient } from '$lib/auth'; import { resolve } from '$app/paths'; @@ -33,8 +33,8 @@ return currentUser.data.avatar; } - // Fallback: gerar avatar baseado no nome - return getAvatarUrl(currentUser.data.nome); + // Fallback: retornar null para usar o ícone User do Lucide + return null; }); // Função para gerar classes do menu ativo @@ -328,8 +328,9 @@ >Contato • - SuporteSuporte • Dashboard - {#each setores as s} + {#each setores as s (s.link)} {@const isActive = currentPath.startsWith(s.link)}