ArtificialGuyBR

Home / Blog / Fixing things

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…

2 sources cited Fixing things

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:

ParteStack
apps/frontendReact 19, Vite com SWC, Tailwind CSS v4, Framer Motion, React Leaflet com OpenStreetMap, Lucide React
apps/apiNode.js, Express, Zod para validação de schema e payload, TypeScript estrito com build tsx, Helmet e CORS pré-configurados
Banco e autenticaçãoSupabase 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

  1. PharmaRoute — repositório — as duas visões, a tabela de stack, notas de banco e autenticação, e sugestões de hospedagem citadas acima.
  2. 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.