Integrantes:
- Aguinaga Pizarro, Piero Alessandro
- Muñoz Paucar, Fernando Jose
- Tabraj Morales, Sebastián
- Tinco Aliaga, César Abelardo
- Introducción
- Identificación del Problema o Necesidad
- Descripción de la Solución
- Modelo de Entidades
- Testing y Manejo de Errores
- Medidas de Seguridad Implementadas
- Eventos y Asincronía
- GitHub
- Conclusión
- Apéndices
La experiencia en restaurantes está evolucionando con la digitalización de los procesos. Este proyecto responde a la necesidad de mejorar la eficiencia en la toma de pedidos y la interacción entre los clientes y los meseros. Aunque el mesero sigue desempeñando un papel crucial, desde recibir a los clientes hasta entregar los pedidos y resolver dudas, el sistema busca facilitar el acceso al menú y optimizar el proceso de pedidos. Además, se incluye un método automatizado de evaluación del servicio mediante códigos QR, lo que permite a los administradores obtener retroalimentación precisa para mejorar la atención al cliente y premiar el buen desempeño de los meseros.
- Facilitar a los clientes la visualización del menú y la realización de pedidos mediante el escaneo de un código QR en la mesa, sin reemplazar el rol del mesero, quien continuará recepcionando a los clientes, entregando los pedidos y atendiéndolos en sus necesidades adicionales.
- Proporcionar una vía para que los clientes califiquen el servicio de los meseros al finalizar su consumo, mediante un segundo código QR que estará en la boleta, permitiendo a los administradores obtener comentarios y calificaciones de manera rápida y efectiva.
- Otorgar al administrador herramientas para la gestión del desempeño de los meseros, basadas en los comentarios y calificaciones de los clientes, para incentivar buenas prácticas mediante bonificaciones o menciones especiales.
El sistema busca resolver la necesidad de eficiencia y precisión en la toma de pedidos, a la vez que mantiene el contacto personal entre el mesero y el cliente. La intervención del mesero sigue siendo clave, ya que es quien recibe a los clientes, ofrece la atención durante su estancia y entrega los pedidos. Al mismo tiempo, la implementación de un sistema de evaluación mediante códigos QR permite al administrador recopilar comentarios precisos sobre el desempeño de cada mesero, incentivando la mejora continua y asegurando una experiencia de calidad para los clientes.
Es relevante solucionar este problema porque permite agilizar el proceso de pedidos, reduciendo errores y tiempos de espera, lo que incrementa la satisfacción del cliente. Además, el sistema de evaluación fomenta una cultura de mejora continua en los empleados, lo que beneficia tanto al restaurante como a los meseros.
- Manager: Encargo de gestión de personal, atención al cliente, gestión de inventarios y manejo de caja.
- Mesero: Encargado de la atención personal al cliente en el local.
- Repartidor: Encargado de la entrega de pedidos por delivery.
- Cliente registrado: Cliente con una cuenta creada en la aplicación del restaurante.
- Cliente general: Cliente de "al paso" que no está registrado en la aplicación del restaurante.
- Chef: Recibe órdenes y las prepara.
- User
- Client
- Repartidor
- Mesero
- Mesa
- Orden
- Reservation
- Delivery
- PedidoLocal
- Product
- ReviewMesero
- ReviewDelivery
- QR en la mesa para acceso al menú y pedidos: Los clientes pueden escanear un código QR para acceder al menú y realizar pedidos de forma digital.
- Carrito de compras virtual: Los clientes pueden agregar productos al carrito, modificarlos y personalizar sus pedidos.
- QR personalizado para meseros: Un código QR específico para cada mesero se incluye en la boleta, lo que permite una evaluación rápida y directa.
- Sistema de evaluación del servicio: Los clientes pueden calificar el servicio del mesero mediante un sistema de evaluación con estrellas.
- Panel de control para el administrador: El administrador puede gestionar las evaluaciones y calificaciones de los meseros.
- Lenguajes de programación: Java
- Frameworks: Express.js para la creación de API, Bootstrap para el frontend.
- Bases de datos: PostgreSQL para almacenamiento de datos.
- API externas: Google Maps API para la localización de clientes en pedidos a domicilio.
Clase padre para los usuarios del sistema, a su vez implementa la clase UserDetails.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único del usuario. | Debe ser único, generado automáticamente. |
name |
String |
Nombre del usuario. | Máximo 100 caracteres. No puede estar vacío. |
email |
String |
Correo electrónico del usuario. | Formato válido de correo. Debe ser único. |
password |
String |
Contraseña para la autenticación del usuario. | Mínimo 8 caracteres. Debe estar encriptada. |
role |
Enum |
Rol del usuario dentro del sistema. | Valores permitidos: ADMIN , REPARTIDOR , MESERO , CHEF . |
Representa a los clientes registrados del restaurante.
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
loyaltyPoints |
Integer |
Puntos de lealtad acumulados por el cliente. | No negativo. Puede tener límites de acuerdo con el sistema de lealtad. |
pedidosLocales |
List<PedidoLocal> |
Lista de pedidos realizados en el restaurante por el cliente. | Puede ser una lista vacía. |
deliverys |
List<Delivery> |
Lista de pedidos de delivery realizados por el cliente. | Puede ser una lista vacía. |
reservas |
List<Reserva> |
Lista de reservas realizadas por el cliente. | Puede ser una lista vacía. |
reviewsMesero |
List<ReviewMesero> |
Lista de reviews realizadas por el cliente a meseros. | Puede ser una lista vacía. |
reviewDelivery |
List<ReviewDelivery> |
Lista de reviews realizadas por el cliente a repartidores. | Puede ser una lista vacía. |
rango |
Enum |
Rango basado en puntos de lealtad del cliente. | Valores permitidos: BRONCE , SILVER , GOLD , PLATINUM . |
Métodos del endpoint /cliente
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service |
---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el ClienteResponseDto del cliente por su id. |
UsernameNotFoundException |
findClienteById(Long id) |
GET |
/ |
ADMIN |
Devuelve el ClienteResponseDto de todos los clientes. |
- | findAllClientes() |
POST |
/ |
ADMIN |
Crea un nuevo cliente con ClienteRequestDto . |
IllegalArgumentException |
createCliente(ClienteRequestDto dto) |
DELETE |
/{id} |
ADMIN |
Elimina un cliente por su id. | UsernameNotFoundException |
deleteCliente(Long id) |
PATCH |
/{id} |
ADMIN |
Actualiza un cliente por su id con PatchClienteDto . |
UsernameNotFoundException , IllegalArgumentException |
updateCliente(Long id, PatchClienteDto dto) |
GET |
/me |
CLIENTE |
Devuelve el ClienteResponseDto del usuario autenticado. |
UsernameNotFoundException |
getAuthenticatedCliente() |
DELETE |
/me |
CLIENTE |
Elimina el cliente autenticado. | UsernameNotFoundException |
deleteAuthenticatedCliente() |
PATCH |
/me |
CLIENTE |
Actualiza el cliente autenticado con PatchClienteDto . |
UsernameNotFoundException , IllegalArgumentException |
updateAuthenticatedCliente(PatchClienteDto dto) |
GET |
/me/pedidoLocal |
CLIENTE |
Devuelve el PedidoResponseDto todos los pedidos locales del usuario |
UsernameNotFoundException |
getAllPedidoLocal() |
GET |
/me/delivery |
CLIENTE |
Devuelve el PedidoResponseDto todos los deliverys del usario |
UsernameNotFoundException |
getAllDelivery() |
GET |
/me/reserva |
CLIENTE |
Devuelve el PedidoResponseDto todas las reservas del usuario. |
UsernameNotFoundException |
getAllReserva() |
GET |
/me/pedidoLocalActual |
CLIENTE |
Devuelve el PedidoResponseDto del pedido local en proceso del usuario. |
UsernameNotFoundException |
getActualPedidoLocal() |
GET |
/me/deliveryActual |
CLIENTE |
Devuelve el PedidoResponseDto del delivery en proceso del usuario. |
UsernameNotFoundException |
getActualDelivery() |
GET |
/me/reservaActual |
CLIENTE |
Devuelve el PedidoResponseDto de la reserva en proceso del usuario. |
UsernameNotFoundException |
getActualtReserva() |
Métodos adicionales del service:
Método | Descripción |
---|---|
updateLoyaltyPoints |
Agrega loyalty points y en caso cumpla las condiciones, cambia el rango del cliente. |
Representa a los meseros que atienden el restaurante
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
pedidosLocales |
List<PedidoLocal> |
Lista de pedidos locales que ha gestionado el mesero. | Puede ser una lista vacía. |
reviewsMesero |
List<ReviewMesero> |
Lista de reviews recibidas por el mesero. | Puede ser una lista vacía. |
ratingScore |
Double |
Promedio de puntaje de las evaluaciones recibidas por clientes. | Rango entre 0.0 y 5.0, con dos decimales de precisión. |
Métodos del endpoint /mesero
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service |
---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el MeseroResponseDto del empleado por su id. |
UsernameNotFoundException |
findMeseroById(Long id) |
GET |
/ |
ADMIN |
Devuelve el MeseroResponseDto de todos los empleados. |
- | findAllMeseros() |
POST |
/ |
ADMIN |
Crea un nuevo empleado con MeseroRequestDto . |
IllegalArgumentException |
createMesero(MeseroRequestDto dto) |
DELETE |
/{id} |
ADMIN |
Elimina un empleado por su id. | UsernameNotFoundException |
deleteMesero(Long id) |
PATCH |
/{id} |
ADMIN |
Actualiza un empleado por su id con PatchMeseroDto . |
UsernameNotFoundException , IllegalArgumentException |
updateMesero(Long id, PatchMeseroDto dto) |
GET |
/me |
MESERO |
Devuelve MeseroResponseDto del mesero autenticado. |
UsernameNotFoundException |
findMeseroById(Long id) |
GET |
/me/pedidosLocalesActuales |
MESERO |
Devuelve la lista de PedidoLocalResponseDto con el estado LISTO y RECIBIDO . |
UsernameNotFoundException |
findPedidosLocalesActuales(Long id) |
PATCH |
me/{idPedidoLocal}/encamino |
MESERO |
Cambia el estado de la entrega a Listo. | ResourceNotFoundException |
pedidoLocalListo(Long id) |
PATCH |
me/{idPedidoLocal}/entregado |
MESERO |
Cambia el estado de la entrega a Entregado . | ResourceNotFoundException |
pedidoLocalEntregado(Long id) |
Métodos adicionales del service:
Método | Descripción |
---|---|
updateRatingScore() |
Obtiene el promedio de los ratings de la review del mesero y actualiza el campo. |
asignarMesero() |
Verifica la cantidad de Pedidos Locales que tiene cada mesero y asigna al que tenga menor cantidad. |
Anotaciones
- Cada vez que se asigna un pedido a un
Mesero
, se manda un correo al mesero asignado. - Si el
ratingScore
delMesero
es bajo o alto, se manda un correo felicitando o advirtiendo alMesero
, también se manda un correo al administrador.
Representa a los Repartidores que atienden el restaurante
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
deliverys |
List<Delivery> |
Lista de entregas (deliverys) que ha gestionado el repartidor. | Puede ser una lista vacía. |
reviewsRepartidor |
List<ReviewDelivery> |
Lista de reviews recibidas por el repartidor. | Puede ser una lista vacía. |
ratingScore |
Double |
Promedio de puntaje de las evaluaciones recibidas por clientes. | Rango entre 0.0 y 5.0, con dos decimales de precisión. |
Métodos del endpoint /repartidor
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service |
---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el RepartidorResponseDto del repartidor por su id. |
UsernameNotFoundException |
findRepartidorById(Long id) |
GET |
/ |
ADMIN |
Devuelve el RepartidorResponseDto de todos los repartidores. |
- | findAllRepartidors() |
POST |
/ |
ADMIN |
Crea un nuevo repartidor con RepartidorRequestDto . |
IllegalArgumentException |
createRepartidor(RepartidorRequestDto dto) |
DELETE |
/{id} |
ADMIN |
Elimina un repartidor por su id. | UsernameNotFoundException |
deleteRepartidor(Long id) |
PATCH |
/{id} |
ADMIN |
Actualiza un repartidor por su id con PatchRepartidorDto . |
UsernameNotFoundException , IllegalArgumentException |
updateRepartidor(Long id, PatchRepartidorDto dto) |
GET |
/me |
REPARTIDOR |
Devuelve DeliveryResponseDto del mesero autenticado. | UsernameNotFoundException |
findRepartidorById(Long id) |
GET |
/me/deliverysActuales |
REPARTIDOR |
Devuelve la lista de DeliveryResponseDto con el estado "LISTO". | UsernameNotFoundException |
findDeliverysActuales(Long id) |
PATCH |
/me/{idDelivery}/encamino |
REPARTIDOR |
Cambia el estado de la entrega a En camino. | ResourceNotFoundException |
endDelivery(Long id) |
PATCH |
/me/{idDelivery}/entregado |
REPARTIDOR |
Cambia el estado de la entrega a Entregado . | ResourceNotFoundException |
endDelivery(Long id) |
Métodos adicionales del service:
Método | Descripción |
---|---|
updateRatingScore() |
Obtiene el promedio de los ratings de la review del repartidor y actualiza el campo. |
asignarRepartidor() |
Verifica la cantidad de deliverys que tiene cada repartidor y asigna al que tenga menor cantidad. |
Anotaciones
- Cada vez que se asigna un pedido a un
Repartidor
, se manda un correo alRepartidor
asignado. - Si el
ratingScore
delRepartidor
es bajo o alto, se manda un correo felicitando o advirtiendo alRepartidor
, también se manda un correo al administrador.
Representa las mesas del restaurante.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la mesa. | Debe ser único y generado automáticamente. |
qr |
String |
Código QR asociado a la mesa para acceder al menú. | Longitud máxima de 255 caracteres. |
numero |
Integer |
Número de la mesa en el restaurante. | Debe ser único en el contexto del restaurante. |
capacity |
Integer |
Capacidad máxima de personas que pueden sentarse en la mesa. | Valor mayor a 0. |
isAvailable |
Boolean |
Indica si la mesa está disponible (true = disponible, false = ocupada). | No tiene limitantes, es un valor booleano. |
Métodos del endpoint /mesa
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service |
---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el TableResponseDto de la mesa por su id. |
ResourceNotFoundException |
findTableById(Long id) |
GET |
/ |
ADMIN |
Devuelve el TableResponseDto de todas las mesas. |
- | findAllTables() |
POST |
/ |
ADMIN |
Crea una nueva mesa con TableRequestDto . |
IllegalArgumentException |
createTable(TableRequestDto dto) |
DELETE |
/{id} |
ADMIN |
Elimina una mesa por su id. | ResourceNotFoundException |
deleteTable(Long id) |
PATCH |
/{id} |
ADMIN |
Actualiza una mesa por su id con PatchTableDto . |
ResourceNotFoundException , IllegalArgumentException |
updateTable(Long id, PatchTableDto dto) |
GET |
/availableTables |
MESERO |
Devuelve el número de mesa de todas las mesas disponibles(ni reservadas ni ocupadas) en ese momento. | - | getAvailableTables() |
Métodos adicionales del service:
Método | Descripción |
---|---|
changeStatus() |
Conmuta la disponibilidad de la mesa |
Anotaciones
- Cada vez que se cree una mesa, se envia un correo con la imagen del QR, igualmente con el endpoint /mesa/QR/{id}
- El qr envía al link de crear pedidoLocal con la id de la mesa
Representa los pedidos realizados por los clientes.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único del pedido. | Debe ser único y generado automáticamente. |
precio |
Double |
Precio total del pedido. | Debe ser un valor mayor o igual a 0.0. |
productos |
List<Producto> |
Lista de productos individuales incluidos en el pedido. | Puede ser una lista vacía, pero no debe contener elementos nulos. |
detalle |
String |
Instrucciones especiales para el pedido (ej: sin gluten, extra salsa). | Longitud máxima de 500 caracteres. |
Métodos del endpoint /order
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service |
---|---|---|---|---|---|
GET |
/{id} |
CLIENTE |
Devuelve el OrderResponseDto de la orden por su id. |
ResourceNotFoundException |
findOrderById(Long id) |
GET |
/ |
ADMIN |
Devuelve el OrderResponseDto de todas las órdenes. |
- | findAllOrders() |
POST |
/ |
ADMIN |
Crea una nueva orden con OrderRequestDto . |
IllegalArgumentException |
createOrder(OrderRequestDto dto) |
DELETE |
/{id} |
ADMIN |
Elimina una orden por su id. | ResourceNotFoundException |
deleteOrder(Long id) |
PATCH |
/{id} |
ADMIN |
Actualiza una orden por su id con PatchOrderDto . |
ResourceNotFoundException , IllegalArgumentException |
updateOrder(Long id, PatchOrderDto dto) |
PATCH |
/{idOrden}/{idProducto}/{cantidad} |
CLIENTE , MESERO |
Agrega un producto a la orden. | ResourceNotFoundException , IllegalArgumentException |
addProducto(Long id, Long idProducto, cantidad) |
Representa los pedidos que son entregados a domicilio.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la entrega. | Debe ser único y generado automáticamente. |
cliente |
Cliente |
Cliente que solicitó el pedido (relación con la entidad Cliente ). |
No puede ser nulo; debe existir un cliente asociado. |
direccion |
String |
Dirección donde se entregará el pedido. | Longitud máxima de 255 caracteres; no puede estar vacía. |
costoDelivery |
Double |
Costo del servicio de entrega. | Debe ser un valor mayor o igual a 0.0. |
fecha |
LocalDate |
Fecha de creación de la entrega. | No puede ser nula; debe representar una fecha válida. |
hora |
LocalTime |
Hora de creación de la entrega. | No puede ser nula; debe representar una hora válida. |
status |
enum |
Estado del pedido (RECIBIDO , EN_PREPARACION ,LISTO ,EN_CAMINO , ENTREGADO ,CANCELADO ). |
Debe ser uno de los valores permitidos |
order |
Order |
Pedido relacionado con la entrega (relación con la entidad Order ). |
No puede ser nulo; debe existir un pedido asociado. |
repartidor |
Repartidor |
Empleado que realiza la entrega (relación con la entidad Repartidor ). |
No puede ser nulo; debe existir un repartidor asociado. |
precio |
Double |
Precio total del pedido entregado. | Debe ser un valor mayor o igual a 0.0. |
Métodos del endpoint /delivery
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el DeliveryResponseDto de la entrega por su id. |
ResourceNotFoundException |
findDeliveryById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el DeliveryResponseDto de todas las entregas. |
- | findAllDeliveries() |
- |
POST |
/ |
CLIENTE |
Crea una nueva entrega con DeliveryRequestDto . |
IllegalArgumentException |
createDelivery(DeliveryRequestDto dto) |
DeliveryCreadaEvent |
DELETE |
/{id} |
CLIENTE , REPARTIDOR |
Elimina una entrega por su id. | ResourceNotFoundException |
deleteDelivery(Long id) |
DeliveryEliminadaEvent |
PATCH |
/{id} |
ADMIN |
Actualiza una entrega por su id con PatchDeliveryDto . |
ResourceNotFoundException , IllegalArgumentException |
updateDelivery(Long id, PatchDeliveryDto dto) |
DeliveryActualizadaEvent |
PATCH |
/cocinando/{id} |
CHEF |
Cambia el estado de la entrega en preparación. | ResourceNotFoundException |
endDelivery(Long id) |
EstadoDeliveryPreparandoEvent |
PATCH |
/listo/{id} |
CHEF |
Cambia el estado de la entrega a listo. | ResourceNotFoundException |
endDelivery(Long id) |
EstadoDeliveryListoEvent |
GET |
/deliverysRecibidos |
CHEF |
Devuelve el DeliveryResponseDto de todos los delivery's recibidos en la aplicación. |
- | findDeliverysRecibidos() |
- |
Representa los pedidos realizados en el local
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la entrega de mesa. | Debe ser único y generado automáticamente. |
ordenes |
List<Order> |
Lista de órdenes pedidas por la mesa. | No puede ser nula; debe contener al menos una orden. |
mesero |
Mesero |
Empleado que realiza la entrega (relación con la entidad Mesero ). |
No puede ser nulo; debe existir un mesero asociado. |
fecha |
LocalDate |
Fecha de creación de la entrega. | No puede ser nula; debe representar una fecha válida. |
hora |
LocalTime |
Hora de creación de la entrega. | No puede ser nula; debe representar una hora válida. |
estado |
String |
Estado del pedido (RECIBIDO , EN_PREPARACION ,LISTO , ENTREGADO ). |
Debe ser uno de los valores permitidos |
precio |
Double |
Precio total de la entrega. | Debe ser un valor mayor o igual a 0.0. |
tipoPago |
String |
Método de pago utilizado (efectivo o QR). | Debe ser uno de los valores permitidos: EFECTIVO, QR. |
Métodos del endpoint /pedidolocal
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el PedidoLocalResponseDto del pedido local por su id. |
ResourceNotFoundException |
findPedidoLocalById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el PedidoLocalResponseDto de todos los pedidos locales. |
- | findAllPedidoLocals() |
- |
POST |
/ |
ADMIN |
Crea un nuevo pedido local con PedidoLocalRequestDto . |
IllegalArgumentException |
createPedidoLocal(PedidoLocalRequestDto dto) |
PedidoLocalCreadoEvent |
DELETE |
/{id} |
ADMIN |
Elimina un pedido local por su id. | ResourceNotFoundException |
deletePedidoLocal(Long id) |
PedidoLocalEliminadoEvent |
PATCH |
/{id} |
ADMIN |
Actualiza un pedido local por su id con PatchPedidoLocalDto . |
ResourceNotFoundException , IllegalArgumentException |
updatePedidoLocal(Long id, PatchPedidoLocalDto dto) |
PedidoLocalActualizadoEvent |
PATCH |
/cocinando/{id} |
CHEF |
Cambia el estado de la entrega en preparación. | ResourceNotFoundException |
cocinandoPedidoLocal(Long id) |
EstadoPedidoLocalPreparandoEvent |
PATCH |
/listo/{id} |
CHEF |
Cambia el estado de la entrega a listo. | ResourceNotFoundException |
listoPedidoLocal(Long id) |
EstadoPedidoLocalListoEvent |
GET |
/pedidosLocalesRecibidos |
CHEF |
Devuelve el PedidoLocalResponseDto de todos los pedidos locales recibidos en la aplicación. |
- | findPedidosLocalesRecibidos() |
- |
Representa las reservas realizadas por los clientes.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la reserva. | Debe ser único y generado automáticamente. |
client |
Client |
Cliente que realizó la reserva (relación con la entidad Client ). |
No puede ser nulo; debe existir un cliente asociado. |
reservationDate |
LocalDate |
Fecha en la que se realizará la reserva. | No puede ser nula; debe representar una fecha futura válida. |
reservationTime |
LocalTime |
Hora específica de la reserva. | No puede ser nula; debe representar una hora válida. |
numOfPeople |
Integer |
Número de personas para la reserva. | Debe ser mayor que 0. |
tableNumber |
Integer |
Número de la mesa asignada para la reserva. | Debe ser un valor positivo; debe estar disponible. |
status |
String |
Estado de la reserva: PENDIENTE ,CONFIRMADO ,CANCELADO |
Debe ser uno de los valores permitidos: PENDIENTE , CONFIRMADA , CANCELADA . |
specialRequests |
String |
Solicitudes especiales del cliente para la reserva. | Puede ser nulo; si se proporciona, no debe exceder 255 caracteres. |
Métodos del endpoint /reservation
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el ReservationResponseDto de la reservación por su id. |
ResourceNotFoundException |
findReservationById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el ReservationResponseDto de todas las reservaciones. |
- | findAllReservations() |
- |
POST |
/ |
ADMIN |
Crea una nueva reservación con ReservationRequestDto . |
IllegalArgumentException |
createReservation(ReservationRequestDto dto) |
ReservationCreadaEvent |
DELETE |
/{id} |
ADMIN |
Elimina una reservación por su id. | ResourceNotFoundException |
deleteReservation(Long id) |
ReservationEliminadaEvent |
PATCH |
/{id} |
ADMIN |
Actualiza una reservación por su id con PatchReservationDto . |
ResourceNotFoundException , IllegalArgumentException |
updateReservation(Long id, PatchReservationDto dto) |
ReservationActualizadaEvent |
PATCH |
/changestatus/{id} |
MESERO |
Finaliza la reservación. | ResourceNotFoundException |
endReservation(Long id) |
- |
Representa los productos (platos o bebidas) del menú.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único del producto. | Debe ser único y generado automáticamente. |
nombre |
String |
Nombre del producto. | No puede ser nulo; debe tener un tamaño mínimo de 1 carácter y un máximo de 100 caracteres. |
descripcion |
String |
Descripción del producto. | Puede ser nulo; si se proporciona, no debe exceder 255 caracteres. |
precio |
BigDecimal |
Precio del producto. | Debe ser un valor positivo; no puede ser nulo. |
category |
Enum |
Categoría del producto (entrada, plato principal, bebida). | No puede ser nulo; debe ser uno de los valores permitidos: DRINK , DESSERT , STARTER , APPETIZIER , MENU . |
isAvailable |
Boolean |
Disponibilidad del producto. | No puede ser nulo; indica si el producto está disponible (true) o no (false). |
Métodos del endpoint /product
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el ProductResponseDto del producto por su id. |
ResourceNotFoundException |
findProductById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el ProductResponseDto de todos los productos. |
- | findAllProducts() |
- |
POST |
/ |
ADMIN |
Crea un nuevo producto con ProductRequestDto . |
IllegalArgumentException |
createProduct(ProductRequestDto dto) |
ProductCreadoEvent |
DELETE |
/{id} |
ADMIN |
Elimina un producto por su id. | ResourceNotFoundException |
deleteProduct(Long id) |
ProductEliminadoEvent |
PATCH |
/{id} |
ADMIN |
Actualiza un producto por su id con PatchProductDto . |
ResourceNotFoundException , IllegalArgumentException |
updateProduct(Long id, PatchProductDto dto) |
ProductActualizadoEvent |
GET |
/category/{category} |
ADMIN |
Devuelve un producto filtrado por su categoría mediante ProductResponseDto . |
ResourceNotFoundException , IllegalArgumentException |
findProductoByCategory(String category) |
- |
PATCH |
/changeAvailability/{id} |
ADMIN |
Actualiza la disponibilidad de un producto con PatchProductDto . |
ResourceNotFoundException , IllegalArgumentException |
changeAvailability(idProducto) |
- |
GET |
/available |
ADMIN |
Devuelve una lista de productos disponibles. | ResourceNotFoundException |
findAvailableProducto() |
- |
Representa la evaluación del servicio prestado por el mesero.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la evaluación. | Debe ser único y generado automáticamente. |
mesero |
Mesero |
Mesero evaluado (relación con Mesero ). |
No puede ser nulo; debe referirse a un mesero existente. |
rating |
Integer |
Puntuación de la evaluación (de 0 a 5 estrellas). | No puede ser nulo; debe estar en el rango de 0 a 5. |
pedidoLocal |
Order |
Pedido asociado a la evaluación. | No puede ser nulo; debe referirse a un pedido existente. |
date |
LocalDateTime |
Fecha y hora de la evaluación. | No puede ser nulo; debe ser la fecha y hora actual o anterior. |
Métodos del endpoint /reviewMesero
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el ReviewMeseroResponseDto de la reseña del mesero por su id. |
ResourceNotFoundException |
findReviewMeseroById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el ReviewMeseroResponseDto de todas las reseñas de meseros. |
- | findAllReviewMeseros() |
- |
POST |
/ |
ADMIN |
Crea una nueva reseña de mesero con ReviewMeseroRequestDto . |
IllegalArgumentException |
createReviewMesero(ReviewMeseroRequestDto dto) |
ReviewMeseroCreadaEvent |
DELETE |
/{id} |
ADMIN |
Elimina una reseña de mesero por su id. | ResourceNotFoundException |
deleteReviewMesero(Long id) |
ReviewMeseroEliminadaEvent |
PATCH |
/{id} |
ADMIN |
Actualiza una reseña de mesero por su id con PatchReviewMeseroDto . |
ResourceNotFoundException , IllegalArgumentException |
updateReviewMesero(Long id, PatchReviewMeseroDto dto) |
ReviewMeseroActualizadaEvent |
Representa la evaluación del servicio prestado por el mesero.
Atributos:
Atributo | Tipo de Variable | Descripción | Criterios Limitantes |
---|---|---|---|
id |
Long |
Identificador único de la evaluación. | Debe ser único y generado automáticamente. |
repartidor |
Repartidor |
Repartidor evaluado (relación con Repartidor ). |
No puede ser nulo; debe referirse a un repartidor existente. |
client |
Client |
Cliente que realiza la evaluación (relación con Client ). |
No puede ser nulo; debe referirse a un cliente existente. |
rating |
Integer |
Puntuación de la evaluación (de 0 a 5 estrellas). | No puede ser nulo; debe estar en el rango de 0 a 5. |
comentarios |
String |
Comentarios adicionales del cliente sobre el servicio. | Opcional; puede ser nulo, pero debe tener un límite de longitud. |
delivery |
Delivery |
Asociación al delivery relacionado. | No puede ser nulo; debe referirse a un delivery existente. |
date |
LocalDateTime |
Fecha y hora de la evaluación. | No puede ser nulo; debe ser la fecha y hora actual o anterior. |
Métodos del endpoint /reviewDelivery
:
Método | Ruta | Roles Permitidos | Descripción | Excepciones | Métodos de Service | Eventos |
---|---|---|---|---|---|---|
GET |
/{id} |
ADMIN |
Devuelve el ReviewDeliveryResponseDto de la reseña del repartidor por su id. |
ResourceNotFoundException |
findReviewDeliveryById(Long id) |
- |
GET |
/ |
ADMIN |
Devuelve el ReviewDeliveryResponseDto de todas las reseñas de repartidores. |
- | findAllReviewDeliverys() |
- |
POST |
/ |
ADMIN |
Crea una nueva reseña de repartidor con ReviewDeliveryRequestDto . |
IllegalArgumentException |
createReviewDelivery(ReviewDeliveryRequestDto dto) |
ReviewDeliveryCreadaEvent |
DELETE |
/{id} |
ADMIN |
Elimina una reseña de repartidor por su id. | ResourceNotFoundException |
deleteReviewDelivery(Long id) |
ReviewDeliveryEliminadaEvent |
PATCH |
/{id} |
ADMIN |
Actualiza una reseña de repartidor por su id con PatchReviewDeliveryDto . |
ResourceNotFoundException , IllegalArgumentException |
updateReviewDelivery(Long id, PatchReviewDeliveryDto dto) |
ReviewDeliveryActualizadaEvent |
Descripción de Exceptions:
UsernameNotFoundException
: Cuando se busca porid
o por algún otro parámetro de usuario y el recurso no existe.IllegalArgumentException
: Cada que se escriba un dato mal en la búsqueda, saltará esta exception.ResourceNotFoundException
: Cuando se busca porid
o por algún otro parámetro ya sea de algún producto, delivery o entidad que no herede de User y el recurso no existe.
- Pruebas Unitarias
- Las pruebas unitarias se realizarán para cada endpoint de la aplicación. | Cliente termina pedidoLocal | Se evaluará la validez de la solicitud en los campos en endpoints POST y la respuesta obtenida en endpoint GET.
Tipo de prueba | Descripción | Criterio de éxito |
---|---|---|
Pruebas de respuesta | Se evaluará el código de respuesta HTTP y, en caso exista, el ResponseEntity del endpoint. |
El código de respuesta y la respuesta contiene los valores esperados. |
Pruebas de DTOs | Se evaluará la validez de la solicitud en los campos en endpoints POST y la respuesta obtenida en endpoint GET. | El ResponseEntity muestra los valores esperados y en caso de los POST, la aplicación no permite ingresar parámetros distintos a los posibles. |
Manejo de excepciones | Se evaluará el código de respuesta HTTP en situaciones de errores forzados. | Los endpoints responden con la excepción correspondiente. |
Pruebas de seguridad | Se evaluará que los usuarios autorizados puedan acceder a los endpoints y que los usuarios autenticados puedan acceder a los endpoints protegidos. | Los endpoints responden con las excepciones de seguridad correspondientes. |
- Pruebas de Sistema
- Simulación de los procesos de negocio implementados en postman: https://www.postman.com/orbital-module-architect-9093820/workspace/restaurante-qr/collection/33970905-308323e9-7bb9-45b3-a848-0c3c4a64fcf9?action=share&creator=33970905
Nombre de prueba | Descripción |
---|---|
Cliente start pedidoLocal | Simulación de los siguientes eventos: Mesero desocupa una mesa, Cliente crea orden, se crea pedidoLocal, aparece en el menú del Chef el pedido, Chef cambia estado a EN_PREPARACION , Chef cambia estado a LISTO , Mesero recibe notificación (no se simulará), Mesero cambia el estado a ENTREGADO , mesa no disponible, cliente deja reseña a mesero, cliente paga el pedidoLocal (no se simulará), mesa disponible. |
Cliente agrega orden | Simulación de los siguientes eventos: Se crea pedidoLocal, se prepara y entrega la comida (no se simulará), cambia el estado del pedido a ENTREGADO , Cliente añade orden al pedido, cambio el estado del pedido a RECIBIDO , se prepara y entrega la comida (no se simulará), cambia de estado del pedido a ENTREGADO . |
Cliente start delivery | Simulación de los siguientes eventos: Cliente hace login, Cliente crea orden, se crea delivery, aparecé en el menú del chef el pedido (delivery), Chef cambia el estado a EN_PREPARACION , Chef cambia estado a LISTO , Repartidor cambia estado a EN_CAMINO , Cliente paga (no se simulará), Cliente deja reseña, Repartidor cambia estado a ENTREGADO . |
Cliente start reserva | Simulación de los siguientes eventos: Cliente hace login, Cliente crea reserva, estado de mesa reservada = no disponible, se crea pedidoLocal. |
Disponibilidad mesas | Simulación de los siguientes eventos: Se crean las mesas en el restaurante, se crean pedido locales para cada mesa. Se evalúa la posibilidad de crear más pedidos locales en mesas ya ocupadas, y la posibilidad de hacer reservas y el menú de mesas disponibles. |
Disponibilidad mesas con reserva | Simulación de los siguientes eventos: Se crean las mesas en el restaurante, se crean pedido locales y reservas. Se evalúa la posibilidad de crear más reservas y el menú de mesas disponibles. |
Asignación de repartidores | Simulación de los siguientes eventos: Se crean 4 repartidores, se crean 8 delivery's, se evalúa que todos reciban dos pedidos. |
Asignación de meseros | Simulación de los siguientes eventos: Se crean 4 meseros, se crean 8 pedidos locales, se evalúa que todos reciban dos pedidos. |
Menú chef | Simulación de los siguientes eventos: Se crean pedidos locales y delivery's, se comprueba que aparezcan en el endpoint del Chef, algunos se marcan como LISTO , se comprueba que se actualice el menú del Chef. |
Visualización de menú | Simulación de los siguientes eventos: Se crea un menú de productos con diferentes categorías, se crean usuarios con diferentes rangos, se verifica que puedan ver los productos dependiendo de su rango. |
Se detectaron y corrigieron errores en la integración del carrito de compras y el panel de control del administrador. El manejo de excepciones garantiza una correcta experiencia de usuario.
El sistema utiliza un manejo global de excepciones para capturar errores inesperados, con mensajes claros para los usuarios y registros detallados para los administradores.
- Cifrado de contraseñas: Se utiliza bcrypt para el hash de contraseñas.
- Autenticación: Implementación de JWT (JSON Web Tokens) para autenticar usuarios.
- Autorización: Se implementan permisos basados en roles para el acceso a funcionalidades administrativas.
- Protección contra inyección SQL: Uso de consultas preparadas para evitar inyecciones.
- Mitigación de XSS y CSRF: Uso de tokens CSRF y sanitización de entradas de usuario.
El sistema usa eventos asincrónicos para el procesamiento de pedidos en segundo plano, asegurando que la experiencia del usuario no se vea interrumpida mientras el sistema procesa información como la actualización de estado de los pedidos.
Se usaron "issues" para asignar tareas, con fechas límite específicas para cada una. El progreso del proyecto fue gestionado mediante el tablero de GitHub Projects, gestionando de ese modo la prioridad de un issue como CRITICAL, HIGH, MEDIUM, LOW u OPTIONAL.
Se configuró un flujo de CI/CD (Integración Continua/Entrega Continua) con GitHub Actions para ejecutar pruebas automáticas y despliegues a un servidor de prueba.
El sistema permite a los clientes realizar pedidos de manera digital y evaluar el servicio, proporcionando una herramienta útil tanto para los clientes como para los administradores de los restaurantes.
- Profundización en la integración de sistemas de evaluación.
- Mejora de la experiencia en la implementación de flujos CI/CD.
Se podría implementar un sistema de notificaciones en tiempo real para los meseros y optimizar el proceso de evaluación con encuestas más detalladas.
Este proyecto está bajo la licencia MIT.
- Documentación de Node.js: https://nodejs.org/
- Documentación de MySQL: https://dev.mysql.com/doc/