11 KiB
11 KiB
Plano de Desenvolvimento — Sistema de Chamados
Diretriz máxima: todas as respostas, comunicações e documentações devem ser redigidas em português brasileiro.
Contato principal
- Esdras Renan — monkeyesdras@gmail.com
Credenciais padrão (Better Auth)
- Administrador:
admin@sistema.dev/admin123 - Agente Demo:
agente.demo@sistema.dev/agent123 - Cliente Demo:
cliente.demo@sistema.dev/cliente123
Execute
pnpm auth:seedapós configurar.env. O script atualiza as contas acima ou cria novas conforme variáveisSEED_USER_*.
Sincronização com Convex
- Usuários e tickets demo são garantidos via
convex/seed.ts. - Após iniciar
pnpm convex:dev, acesse/dev/seeduma vez por ambiente local para carregar dados reais de demonstração no banco do Convex.
Setup local rápido
pnpm install- Ajuste
.env(ou crie a partir do exemplo) e confirmeNEXT_PUBLIC_CONVEX_URLapontando para o Convex local. pnpm auth:seed- (Opcional)
pnpm queues:ensure pnpm convex:dev- Em outro terminal:
pnpm dev
App Desktop (Agente de Máquinas)
- Código:
apps/desktop(Tauri v2 + Vite). - Padrões de URL:
- Produção: usa
https://tickets.esdrasrenan.com.brpor padrão (fallback em release). - Desenvolvimento: use
apps/desktop/.env(ver.env.example).
- Produção: usa
- Comandos úteis:
pnpm -C apps/desktop tauri dev— dev completo (abre WebView em 1420 + backend Rust).pnpm -C apps/desktop build— build do frontend (dist).pnpm -C apps/desktop tauri build— gera instaladores (bundle) por SO.
- Saída dos pacotes:
apps/desktop/src-tauri/target/release/bundle/. - Fluxo:
- Coleta perfil (hostname/OS/MAC/seriais/métricas).
- Provisiona via
POST /api/machines/registercomMACHINE_PROVISIONING_SECRET. - Envia heartbeats a cada 5 min para
/api/machines/heartbeatcom inventário básico. - Abre
APP_URL/machines/handshake?token=...para autenticar sessão na UI.
- Segurança: token salvo no cofre do SO (Keyring). Store guarda apenas metadados não sensíveis.
- Endpoint extra:
POST /api/machines/inventory(atualiza inventário por token ou provisioningSecret).
Desenvolvimento local — boas práticas (atualizado)
- Ambientes separados: mantenha seu
.env.localsó para DEV e o.envda VPS só para PROD. Nunca commitar arquivos.env. - Convex em DEV: rode
pnpm convex:deve aponte o front parahttp://127.0.0.1:3210viaNEXT_PUBLIC_CONVEX_URL. - Banco local: por padrão
DATABASE_URL=file:./prisma/db.sqlite. Se quiser isolar por projeto, usedb.dev.sqlite. - Seeds em DEV: use
pnpm auth:seed(usuários Better Auth) e acesse/dev/seeduma vez para dados de demonstração do Convex. - Seeds em PROD: só quando realmente necessário; não fazem parte do deploy automático.
Exemplo de .env.local (DEV)
# Base do app
NODE_ENV=development
NEXT_PUBLIC_APP_URL=http://localhost:3000
BETTER_AUTH_URL=http://localhost:3000
BETTER_AUTH_SECRET=dev-only-long-random-string
# Convex (DEV)
NEXT_PUBLIC_CONVEX_URL=http://127.0.0.1:3210
# Banco local (Prisma)
DATABASE_URL=file:./prisma/db.sqlite
# SMTP de desenvolvimento (ex.: Mailpit)
SMTP_ADDRESS=localhost
SMTP_PORT=1025
SMTP_TLS=false
SMTP_USERNAME=
SMTP_PASSWORD=
MAILER_SENDER_EMAIL="Dev <no-reply@localhost>"
# (Opcional) OAuth DEV – não usado por padrão neste projeto
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
Observações:
COOKIE_DOMAINnão é necessário em DEV neste projeto.- Variáveis de provisionamento de máquinas (
MACHINE_PROVISIONING_SECRET, etc.) só se você for testar as rotas de máquinas/inventário.
Passo a passo local
pnpm installpnpm prisma:generatepnpm convex:dev(terminal A)pnpm dev(terminal B)- (Opcional)
pnpm auth:seede visitarhttp://localhost:3000/dev/seed
Deploy via GitHub Actions (produção)
- Fluxo:
git push main⇒ runner self‑hosted na VPS sincroniza código e aplica o stack (Traefik/Swarm) sem derrubar o serviço (start-first). - Disparo do deploy web: apenas quando há mudanças em arquivos do app (src/, public/, prisma/, next.config.ts, package.json, pnpm-lock.yaml, tsconfig.json, middleware.ts, stack.yml).
- Disparo do deploy Convex: apenas quando há mudanças em
convex/**. - O
.envda VPS é preservado; caches do servidor (node_modules,.pnpm-store) não são tocados. - Banco Prisma (SQLite) persiste em volume nomeado (
sistema_db); não é recriado a cada deploy.
Bancos e seeds — DEV x PROD
- DEV: use os seeds à vontade (usuários com
pnpm auth:seed, dados demo do Convex em/dev/seed). - PROD: evite seeds automáticos; para criar um admin use
SEED_USER_*epnpm auth:seedem um container Node efêmero. - Alterações de schema: sempre via migrações (
prisma migrate). O CI aplicamigrate deployno start do container web.
Dicas rápidas
- Imagens em
public/: trocou o arquivo → push. Para bust de cache, versionar o nome (ex.:logo.v2.png) ou usar query (?v=sha). - Problemas de permissão de build: garanta que
.nextpertence ao usuário do runner (se necessário, remover.nextno host e rebuildar). - Se precisar inspecionar/backup do SQLite em PROD, prefira um bind dedicado (
/srv/apps/sistema-data:/app/data) ou usedocker run -v sistema_db:/datapara copiar o arquivo.
Checklist para novo computador
- Instale Node.js 20+ e habilite o Corepack (
corepack enable) para usar opnpm. - Garanta o
pnpmatualizado (corepack prepare pnpm@latest --activate) antes de clonar o repositório. - Clone o projeto:
git clone git@github.com:esdrasrenan/sistema-de-chamados.gite entre na pasta. - Copie o arquivo
.envjá configurado do computador atual para a raiz do repositório (nunca faça commit desse arquivo). - Instale as dependências com
pnpm install. - Gere os clientes locais necessários:
pnpm prisma:generate. - Semeie as credenciais Better Auth:
pnpm auth:seed. - Se for trabalhar com filas padrão, execute
pnpm queues:ensure. - Inicie o backend Convex em um terminal (
pnpm convex:dev) e, em outro, suba a aplicação Next.js (pnpm dev). - Acesse
http://localhost:3000e teste login com os usuários padrão listados acima antes de continuar o desenvolvimento.
Estado atual
- Autenticação Better Auth com guardas client-side (
AuthGuard) bloqueando rotas protegidas. - Menu de usuário (rodapé da sidebar) concentra acesso às configurações ("Meu perfil" →
/settings) e logout. Removemos o item redundante "Configurações" do menu lateral. - Formulários de novo ticket (dialog, página e portal) com seleção de responsável, placeholders claros e validação obrigatória de assunto/descrição/categorias.
- Relatórios, dashboards e páginas administrativas utilizam
AppShell, garantindo header/sidebar consistentes.- Use
SiteHeadernoheaderdoAppShellpara título/lead e ações. - O conteúdo deve ficar dentro de
<div className="mx-auto w-full max-w-6xl px-4 pb-12 lg:px-6">. - Persistir filtro global de empresa com
usePersistentCompanyFilter(localStorage) para manter consistência entre relatórios.
- Use
Entregas recentes
- Exportações CSV (Backlog, Canais, CSAT, SLA e Horas por cliente) com parâmetros de período.
- PDF do ticket (via pdfkit standalone), com espaçamento e traduções PT-BR.
- Play interno/externo com somatório por tipo por ticket e relatório por cliente.
- Admin > Empresas & clientes: cadastro/edição,
Cliente avulso?eHoras contratadas/mês. - Admin > Usuários: vincular colaborador à empresa.
- Dashboard: cards de filas (Chamados/Laboratório/Visitas) e indicadores principais.
- Lista de tickets: filtro por Empresa, coluna Empresa, alinhamento vertical e melhor espaçamento entre colunas.
Entregas recentes relevantes
- Correção do redirecionamento após logout evitando retorno imediato ao dashboard.
- Validações manuais dos formulários de rich text para eliminar
ZodErrordurante edição. - Dropdown de responsáveis na criação de tickets com preenchimento automático pelo autor e evento inicial de comentário.
- Indicadores visuais de campos obrigatórios e botão "Novo ticket" funcional no cabeçalho do detalhe.
- Seeds (Better Auth e Convex) ampliados para incluir agente e cliente de teste.
Fluxos suportados
Equipe interna (admin/agent/collaborator)
- Criar tickets com categorias, responsável inicial e anexos.
- Abrir novos tickets diretamente a partir do detalhe via dialog reutilizável.
- Acessar
/settingspara ajustes pessoais e efetuar logout pelo menu.
Papéis
- Papéis válidos:
admin,manager,agent,collaborator(papelcustomerremovido). - Gestores veem os tickets da própria empresa e só podem registrar comentários públicos.
Próximos passos sugeridos
- Disparo de e-mails automáticos quando uso de horas ≥ 90% do contratado.
- Ações rápidas (status/fila) diretamente na listagem de tickets.
- Limites e monitoramento para anexos por tenant.
- PDF do ticket com layout idêntico ao app (logo/cores/fontes).
Referências de endpoints úteis
- Backlog CSV:
/api/reports/backlog.csv?range=7d|30d|90d[&companyId=...] - Canais CSV:
/api/reports/tickets-by-channel.csv?range=7d|30d|90d[&companyId=...] - CSAT CSV:
/api/reports/csat.csv?range=7d|30d|90d - SLA CSV:
/api/reports/sla.csv - Horas por cliente CSV:
/api/reports/hours-by-client.csv?range=7d|30d|90d
Referências de inventário de máquinas
- UI (Admin > Máquinas): filtros, pesquisa e export detalhados — ver docs/admin-inventory-ui.md
- Endpoints do agente:
POST /api/machines/registerPOST /api/machines/heartbeatPOST /api/machines/inventory
Rotina antes de abrir PR
pnpm lintpnpm build --turbopackpnpm exec vitest run- Revisar toasts/labels em PT-BR e ausência de segredos no diff.
Convenções
- Convex deve retornar apenas tipos primitivos; converta datas via mappers em
src/lib/mappers. - Manter textos em PT-BR e evitar comentários supérfluos no código.
- Reutilizar componentes shadcn existentes e seguir o estilo do arquivo editado.
- Validações client-side críticas devem sinalizar erros inline e exibir toast.
Estrutura útil
convex/— queries e mutations (ex.:tickets.ts,users.ts).src/components/tickets/— UI interna (dialog, listas, header, timeline).src/components/portal/— formulários e fluxos do portal do cliente.scripts/— seeds Better Auth e utilidades.src/components/auth/auth-guard.tsx— proteção de rotas client-side.
Histórico resumido
- Scaffold Next.js + Turbopack configurado com Better Auth e Convex.
- Portal do cliente entregue com isolamento por
viewerId. - Fluxo de convites e painel administrativo operacionais.
- Iteração atual focada em UX de criação de tickets, consistência de layout e guardas de sessão.