Aplicação web que organiza o dia de vendedores de rua: o administrador cadastra clientes e monta a rota, o sistema calcula a melhor ordem de visita e o vendedor segue as paradas pelo celular.
Projeto desenvolvido por Pedro Paulo Lacerda. Sistema de roteirização para equipes de vendas externas.
- Cadastro de clientes com endereço estruturado, preenchimento automático por CEP (ViaCEP) e geocodificação automática via Nominatim (OpenStreetMap).
- Ajuste manual da localização: na edição, o pin do cliente pode ser arrastado no mapa para corrigir a posição.
- Carteira de clientes com busca, filtro por ativos e inativos e opção de ativar ou desativar cadastros.
- Montagem de rota: origem definida por endereço, seleção de até 10 clientes, escolha do vendedor responsável e otimização da ordem de visita, com prévia no mapa, distância e tempo estimados.
- Histórico de rotas com página de detalhes, trajeto desenhado no mapa e status de cada parada.
- Área mobile do vendedor (
/rota/hoje): paradas em ordem, barra de progresso, botões para ligar para o cliente, abrir a navegação no Google Maps e marcar a parada como concluída ou pulada. - Status automático da rota: passa de planejada para em andamento e concluída conforme as paradas avançam.
- Dashboard e usuários: totais de clientes, rotas e paradas concluídas, rotas recentes e gestão de usuários com perfis admin e vendedor.
- Front-end: Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, componentes shadcn/ui sobre Base UI, lucide-react, sonner
- Back-end: Supabase (Auth, Postgres e Edge Functions em Deno) e API Routes do Next.js
- Mapas e rotas: Leaflet com react-leaflet e tiles do OpenStreetMap, OSRM, Nominatim, ViaCEP e
@mapbox/polyline
sistemalogistica/
├── contexto_do_projeto.md # escopo, modelo de dados, fluxos e algoritmo
├── site/ # aplicação Next.js
│ └── src/
│ ├── app/(auth)/ # login
│ ├── app/(admin)/ # dashboard, clientes, rotas e usuários (desktop)
│ ├── app/(mobile)/ # rota do dia do vendedor
│ ├── app/api/ # geocode e optimize
│ ├── components/ # formulários, mapas e componentes de UI
│ └── lib/ # OSRM, otimizador, geocoding e clientes Supabase
└── supabase/functions/ # Edge Function create-user
Pré-requisitos: Node.js 20.9 ou superior (exigência do Next.js 16), um projeto no Supabase e a Supabase CLI para publicar a Edge Function.
-
Clone o repositório e instale as dependências dentro de
site/:git clone https://github.com/pplacerda07/sistemalogistica.git cd sistemalogistica/site npm install -
Crie o arquivo
site/.env.localcom as variáveis abaixo (o repositório não traz arquivo de exemplo):Variável Uso NEXT_PUBLIC_SUPABASE_URLURL do projeto Supabase NEXT_PUBLIC_SUPABASE_ANON_KEYchave pública (anon) do Supabase NOMINATIM_USER_AGENTidentificação enviada ao Nominatim, exigida pela política de uso do serviço OSRM_BASE_URLopcional: servidor OSRM (padrão: instância pública) NOMINATIM_BASE_URLopcional: servidor Nominatim (padrão: instância pública) -
Prepare o banco no Supabase. O modelo de dados de referência (tabelas
profiles,clientes,rotaseparadas, PostGIS, RLS e trigger de criação de perfil) está em contexto_do_projeto.md. O cadastro atual também grava os camposcep,logradouro,numero,complemento,bairro,cidadeeestadoemclientes, e a aplicação chama as funções RPCset_cliente_location,get_clientes_ativos_com_coordsecreate_rota_with_paradas, que precisam existir no banco. -
Na raiz do repositório, publique a Edge Function de criação de usuários.
SUPABASE_URL,SUPABASE_ANON_KEYeSUPABASE_SERVICE_ROLE_KEYsão fornecidas pelo próprio Supabase ao ambiente da função.supabase functions deploy create-user
-
Volte para
site/, rodenpm run deve abra http://localhost:3000. Após o login, admins vão para/dashboarde vendedores para/rota/hoje.
- Otimização de rota própria: o OSRM (
/table) devolve a matriz de tempos entre os pontos; a ordem inicial vem da heurística do vizinho mais próximo e é refinada com 2-opt, mantendo a origem fixa. Em seguida o OSRM (/route) retorna a polyline, a distância e a duração da ordem final (site/src/lib/optimizer.ts). - Route groups por perfil:
(admin),(mobile)e(auth)separam os layouts de desktop (sidebar) e celular (navegação inferior) no mesmo deploy. A página inicial redireciona conforme oroledo perfil e oproxy.tsdo Next.js 16 renova a sessão do Supabase a cada requisição. - Geocoding no servidor: a rota
/api/geocodefaz busca estruturada no Nominatim e, se não encontrar, repete a busca em texto livre, respeitando o limite de 1 requisição por segundo e um User-Agent configurável. - Criação de usuários em Edge Function: o painel chama a função
create-user(Deno), que confere se quem chama tem perfil admin e cria a conta pela API administrativa do Supabase Auth, já com nome e perfil.
Pedro Paulo Lacerda · github.com/pplacerda07