// el problema
Las rentadoras pequeñas y medianas en República Dominicana funcionan con reservas por teléfono y hojas de cálculo, sin visión en tiempo real de disponibilidad, ingresos ni utilización de la flota. Los dos fallos que cuestan dinero de verdad son las dobles reservas y los mantenimientos vencidos — y ambos son el resultado predecible de un calendario que vive en la cabeza de alguien.
// la construcción
Un sitio de reserva self-service respaldado por un panel operativo, con las invariantes aplicadas donde no se pueden esquivar.
›Prevención de doble reserva en la capa de datos, no en la UI: un hook pre-save corre una consulta de solapamiento de fechas contra toda renta pendiente y activa de ese vehículo y rechaza la escritura en conflicto. La garantía se sostiene cuando dos peticiones compiten, o cuando la reserva se crea fuera del flujo normal — una validación en el frontend no se sostiene en ninguno de los dos casos.
›Mantenimiento de flota como lógica de dominio y no como checklist: la fecha del último servicio determina la del próximo en un intervalo de 90 días, y un vehículo vencido es una consulta en lugar de algo que alguien tiene que recordar.
›Autorización por roles en la frontera de la API — un middleware compartido valida la sesión y el rol antes de que corra cualquier handler, así que las escrituras de flota y los agregados del panel rechazan a quien no sea admin sin importar lo que mande el cliente.
›KPIs del panel calculados en el servidor con pipelines de agregación de MongoDB — ingresos, rentas activas, vehículos más rentados y variaciones semana y mes contra mes llegan en un solo payload, así que el cliente pinta números en vez de recalcularlos.
// qué se entregó
Un prototipo funcional de punta a punta: modelado de datos, API REST, middleware de autenticación y autorización, la UI de flota y reserva del cliente, la gestión de vehículos y los endpoints de agregación detrás del panel de KPIs — todo verificado contra una base de datos real, con cobertura de Jest sobre las reglas de reserva. Nunca desplegado a un cliente que pague; queda como build de referencia para hacer que las garantías de disponibilidad y control de acceso sean estructurales y no advertencias.