Amine Benamrouche · Proyectos
← Volver a los proyectos

Send: plataforma de reparto de última milla

Resumen

Send es una startup de reparto de última milla que conecta comercios locales con repartidores. Fui el único desarrollador backend: construí una API REST de Laravel para una app móvil en Flutter (repartidores y vendedores) y un panel de administración en Vue.js, que también desarrollé de extremo a extremo.

La plataforma admite tres roles de usuario (administradores, vendedores y repartidores), cada uno autenticado mediante un guard de Laravel Sanctum propio. Los vendedores envían solicitudes de entrega para uno o varios puntos de entrega; el backend planifica una ruta, calcula el precio, asigna un repartidor y hace el seguimiento de la entrega hasta completarla.

Este fue mi primer proyecto profesional, construido desde el diseño de la base de datos hasta un backend y un panel completos, con unos 85 endpoints de API y 15 modelos principales. Send aún no se ha lanzado públicamente; el fundador prevé hacerlo pronto.

Optimización de rutas con varias paradas

Un vendedor puede agrupar varios puntos de entrega en una sola solicitud. Encontrar el camino demostrablemente más corto que pase por todos es el problema del viajante, NP-difícil y excesivo para el número de paradas que realmente lleva un solo repartidor. En su lugar, el backend usa una heurística del vecino más cercano:

Optimización de rutas por vecino más cercano que alimenta el motor de precios por zonas de distancia

Partiendo de la ubicación del vendedor, salta repetidamente a la parada restante más cercana y va sumando la distancia ortodrómica. Esa distancia total se asigna a un tramo de precios por zona de distancia (cada zona con su propia tarifa base, tarifa por km y tarifa por parada) para obtener el precio.

Es una aproximación voraz que usa la distancia en línea recta en lugar de la distancia real por carretera, una decisión de costes deliberada: a la escala en la que operaba la startup, integrar un servicio de rutas de pago no se justificaba.

Contribuciones técnicas principales

  • Arquitectura de API multirrol: diseño y construcción de tres superficies de API protegidas de forma independiente (administrador, vendedor, repartidor) sobre Laravel Sanctum, con endpoints compartidos para recursos transversales como pedidos y solicitudes de entrega.
  • Planificación de rutas y precios: implementación de la optimización de rutas por vecino más cercano descrita arriba, acoplada al motor de precios por zonas de distancia.
  • Asignación de repartidores: construcción de la asignación al repartidor disponible más cercano a partir de las ubicaciones en vivo, teniendo en cuenta el tipo de vehículo y la disponibilidad.
  • Panel de administración: construcción del panel operativo completo en Vue 3 / Vuetify (colas de alta y aprobación de repartidores y vendedores, configuración de precios y referidos, seguimiento de pagos y liquidaciones, y vistas de KPI y analítica), que consume la API que diseñé.
  • Notificaciones: integración de Firebase Cloud Messaging para notificaciones push a repartidores y vendedores, y de la API de WhatsApp Cloud para los mensajes de confirmación de pedido, entrega completada y solicitud de valoración a los vendedores.
  • Sistema de referidos: creación de un programa de referidos para vendedores con bonificaciones porcentuales registradas por entrega.
  • Autenticación y alta de usuarios: implementación del inicio de sesión con Google OAuth para los tres tipos de usuario, junto con la autenticación estándar por credenciales.

Stack técnico

ComponenteTecnologías
BackendPHP, Laravel
Base de datosMySQL
AutenticaciónLaravel Sanctum (multi-guard), Google OAuth
Arquitectura de la APIAPI REST
Panel de administraciónVue 3, Vuetify
Notificaciones pushFirebase Cloud Messaging
MensajeríaWhatsApp Cloud API

Retrospectiva

Send fue donde aprendí a hacerme cargo de un backend de principio a fin (esquema, API, integraciones y el panel que consume todo), sin un desarrollador sénior en quien apoyarme.

Qué cambiaría echando la vista atrás
  • Validación en clases FormRequest en lugar de en línea en el controlador
  • Lógica de negocio en clases de servicio en lugar de controladores sobrecargados
  • Respuestas mediante API Resources
  • Asignación de repartidores como job encolado con el bloqueo adecuado alrededor de la asignación, en lugar de ejecutarla en línea sin protección

Esa es la lección que hoy da forma a cómo estructuro cada base de código Laravel que toco.