PharmaRoute: CRM de campo para representante farmacéutico
App monorepo con dos vistas: agente en el móvil que traza visitas por ubicación e historial, y centro de mando en el escritorio con KPI, territorio y agenda…
On this page
PharmaRoute: CRM de campo para representante farmacéutico
TL;DR
- PharmaRoute es un sistema de relación y ruteo de campo para distribuidora, laboratorio e industria farmacéutica, dividido en dos vistas integradas en tiempo real: agente en el móvil y gestor en el escritorio.
- La vista del agente traza visitas por ubicación y por el historial consolidado de visitas de la farmacia, registra check-in en el sitio y añade un objetivo nuevo rápido con geocodificación inversa vía Nominatim.
- La vista del gestor es un centro de mando: KPI de negocio, eficiencia por agente, control de territorio con radio en Leaflet y agenda del equipo.
- La pila es un monorepo con NPM Workspaces: React 19 y Vite en el front, Node y Express con Zod y TypeScript en la API, y Supabase PostgreSQL con row-level security.
Qué es y para quién
PharmaRoute es un sistema completo de relación y ruteo de campo, escrito para la operación de distribuidora, laboratorio e industria farmacéutica. El README enmarca el problema como la ineficiencia logística del equipo de venta externa, que es un problema concreto y conocido: un representante con treinta farmacias en la ciudad, una ruta planeada de memoria en la mañana, y un gestor sin idea de qué visitas ocurrieron de verdad.
Es para el representante en el coche y para el gestor en el escritorio, y por eso las dos vistas son la decisión de diseño y no una función: la vista del móvil responde "a dónde voy ahora", y la del escritorio responde "se está cubriendo el territorio".
Qué hace cada vista
Vista del agente, en el móvil. Ruteo basado en ubicación, historial consolidado de visitas por farmacia, check-in en el sitio y adición rápida de objetivos nuevos con geocodificación inversa vía Nominatim. El historial es lo que hace útil la ruta en vez de decorativa: una ruta que ignora qué farmacia se visitó el mes pasado es una lista de direcciones.
Vista del gestor, en el escritorio. Un centro de mando con visión macro de KPI de negocio, eficiencia por agente, control de territorio con radio en Leaflet y agenda del equipo.
La pila
El proyecto es un monorepo gestionado con NPM Workspaces, que separa las dos apps por responsabilidad:
| Parte | Pila |
|---|---|
apps/frontend | React 19, Vite con SWC, Tailwind CSS v4, Framer Motion, React Leaflet con OpenStreetMap, Lucide React |
apps/api | Node.js, Express, Zod para validar schema y payload, TypeScript estricto con build tsx, Helmet y CORS preconfigurados |
| Base de datos y autenticación | Supabase PostgreSQL con row-level security, triggers SQL para estado operacional interno y creación de profile |
El README nombra hosting recomendado por parte — Vercel para el front, Railway o Render para la API — y eso es una sugerencia de despliegue, no un requisito.
Qué aporta la decisión de pila
Dos elecciones merecen nombrarse. Row-level security en Supabase significa que la frontera de datos la impone la base y no el manejador de ruta, lo que importa en un sistema donde el representante debe ver su territorio y el gestor debe ver la región. Triggers SQL para estado interno y profile significan que un cambio de estado operacional no depende de que el cliente haya enviado la petición correcta.
Y el par TypeScript con Zod significa que el payload se valida en la frontera en vez de confiarse porque lo envió el front.
Cómo correrlo en local
El setup local del README es una sección de requisitos seguida de configuración de entorno: instalar las dependencias del workspace, configurar la conexión con Supabase, aplicar schema y triggers, y después correr el front y la API. Node y un proyecto Supabase son las dos cosas necesarias antes de la primera ejecución; el README describe los pasos, no un comando único de arranque.
Cuándo usarlo, cuándo no
Úsalo como punto de partida para una operación de venta externa donde ruta y cobertura son el producto, y como ejemplo funcional de monorepo donde la vista del móvil y la del escritorio comparten una API y una base.
No lo uses como CRM de producción listo: el README lo llama MVP con sugerencias de hosting, y una operación real necesita lo que un MVP deja fuera — modo offline para el representante sin señal, auditoría de quién cambió una visita, e integración con el ERP de la distribuidora. Y no asumas geocodificación sin límite: la inversa pasa por Nominatim, un servicio público con su propia política de uso.
Sources
- PharmaRoute — repositorio — las dos vistas, la tabla de pila, notas de base de datos y autenticación, sugerencias de hosting citadas arriba.
- README.md — visión general del proyecto, pila, instrucciones de ejecución local.
Página del proyecto: PharmaRoute
Para el lado de almacén de la misma pregunta logística, mira el optimizador de distribución por código postal.
FAQ
¿Necesita un proveedor de mapas de pago? No. El mapa corre en React Leaflet con teselas de OpenStreetMap, y la geocodificación inversa pasa por Nominatim.
¿Qué base de datos usa? Supabase PostgreSQL, con row-level security habilitado y triggers SQL para estado operacional interno y creación de profile.
¿Es un monorepo? Sí, gestionado con NPM Workspaces, separando apps/frontend y apps/api por responsabilidad.
¿Cuáles son las dos vistas? Una vista en el móvil para el agente — ruta, historial de visitas, check-in, objetivos nuevos rápidos — y un centro de mando en el escritorio con KPI, eficiencia por agente, radio de territorio y agenda del equipo.