PharmaRoute: CRM de campo para representante farmacêutico
App monorepo com duas visões: agente no celular que roteiriza visita por localização e histórico, e central de comando no desktop com KPI, território e agend…
On this page
PharmaRoute: CRM de campo para representante farmacêutico
TL;DR
- O PharmaRoute é um sistema de relacionamento e roteirização de campo para distribuidora, laboratório e indústria farmacêutica, dividido em duas visões integradas em tempo real: agente no celular e gestor no desktop.
- A visão do agente roteiriza visita por localização e pelo histórico consolidado de visita da farmácia, registra check-in no local e adiciona alvo novo rápido com geocoding reverso via Nominatim.
- A visão do gestor é uma central de comando: KPI de negócio, eficiência por agente, controle de território com raio no Leaflet e cronograma da equipe.
- A stack é monorepo com NPM Workspaces: React 19 e Vite no front, Node e Express com Zod e TypeScript na API, e Supabase PostgreSQL com row-level security.
O que é e para quem
O PharmaRoute é um sistema completo de relacionamento e roteirização de campo, escrito para a operação de distribuidora, laboratório e indústria farmacêutica. O README enquadra o problema como ineficiência logística da equipe de venda externa, que é um problema específico e conhecido: representante com trinta farmácias na cidade, rota planejada de manhã de cabeça, e gestor sem ideia de quais visitas de fato aconteceram.
É para o representante no carro e para o gestor na mesa, e é por isso que as duas visões são a decisão de projeto e não um recurso: a visão do celular responde "para onde eu vou agora", e a do desktop responde "o território está sendo coberto".
O que cada visão faz
Visão do agente, no celular. Roteirização baseada em localização, histórico consolidado de visita por farmácia, check-in no local e adição rápida de alvo novo com geocoding reverso via Nominatim. O histórico é o que torna a rota útil em vez de decorativa: rota que ignora qual farmácia foi visitada no mês passado é lista de endereço.
Visão do gestor, no desktop. Central de comando com visão macro de KPI de negócio, eficiência por agente, controle de território com raio no Leaflet e cronograma da equipe.
A stack
O projeto é um monorepo gerenciado com NPM Workspaces, que separa os dois apps por responsabilidade:
| Parte | Stack |
|---|---|
apps/frontend | React 19, Vite com SWC, Tailwind CSS v4, Framer Motion, React Leaflet com OpenStreetMap, Lucide React |
apps/api | Node.js, Express, Zod para validação de schema e payload, TypeScript estrito com build tsx, Helmet e CORS pré-configurados |
| Banco e autenticação | Supabase PostgreSQL com row-level security, gatilho SQL para estado operacional interno e criação de profile |
O README nomeia hospedagem recomendada por parte — Vercel para o front, Railway ou Render para a API — e isso é sugestão de deploy, não requisito.
O que a decisão de stack entrega
Duas escolhas valem nomear. Row-level security no Supabase significa que a fronteira de dado é imposta pelo banco, não pelo handler de rota, o que importa num sistema em que o representante deve ver o território dele e o gestor deve ver a região. Gatilho SQL para estado interno e profile significa que mudança de estado operacional não depende de o cliente ter mandado a requisição certa.
E o par TypeScript com Zod significa que payload é validado na fronteira em vez de confiado porque o front mandou.
Como rodar local
O setup local do README é uma seção de requisito seguida de configuração de ambiente: instalar as dependências do workspace, configurar a conexão com o Supabase, aplicar schema e gatilho, e então rodar front e API. Node e um projeto Supabase são as duas coisas necessárias antes da primeira execução; o README descreve os passos, não um comando único de start.
Quando usar, quando não usar
Use como ponto de partida para operação de venda externa em que rota e cobertura são o produto, e como exemplo funcional de monorepo em que a visão do celular e a do desktop compartilham uma API e um banco.
Não use como CRM de produção pronto: o README o chama de MVP com sugestão de hospedagem, e uma operação real precisa do que MVP deixa de fora — modo offline para representante sem sinal, auditoria de quem alterou uma visita, e integração com o ERP da distribuidora. E não presuma geocoding sem limite: o reverso passa pelo Nominatim, que é serviço público com política de uso própria.
Sources
- PharmaRoute — repositório — as duas visões, a tabela de stack, notas de banco e autenticação, e sugestões de hospedagem citadas acima.
- README.md — visão geral do projeto, stack, instruções de execução local.
Página do projeto: PharmaRoute
Para o lado de armazém da mesma pergunta logística, veja o otimizador de distribuição por CEP.
FAQ
Precisa de provedor de mapa pago? Não. O mapa roda em React Leaflet com tile do OpenStreetMap, e o geocoding reverso passa pelo Nominatim.
Qual banco ele usa? Supabase PostgreSQL, com row-level security habilitado e gatilho SQL para estado operacional interno e criação de profile.
É um monorepo? Sim, gerenciado com NPM Workspaces, separando apps/frontend e apps/api por responsabilidade.
Quais são as duas visões? Uma visão no celular para o agente — rota, histórico de visita, check-in, alvo novo rápido — e uma central de comando no desktop com KPI, eficiência por agente, raio de território e cronograma da equipe.