Desarrollar una aplicación fullstack que permita gestionar las mesas y reservas de un restaurante.
El sistema deberá permitir:
- Registrar mesas y su capacidad
- Definir turnos disponibles por día
- Registrar reservas para mesas en turnos específicos
- Cancelar reservas
- Consultar disponibilidad
- Generar un reporte simple de ocupación
- Node.js
- Express
- TypeORM
- Base de datos relacional (MySQL o PostgreSQL)
- Arquitectura en capas:
- Controllers
- Services
- Repositories
- Migraciones de base de datos con TypeORM:
- Las tablas deben crearse mediante migraciones, no con
synchronize: true - Scripts en package.json para generar y ejecutar migraciones:
npm run migration:generate— genera una migración a partir de cambios en las entidadesnpm run migration:run— ejecuta las migraciones pendientesnpm run migration:revert— revierte la última migración ejecutada
- Las migraciones deben almacenarse en
src/migrations/
- Las tablas deben crearse mediante migraciones, no con
- Script de datos de prueba (seed):
npm run seed— ejecuta un script que inicializa la base de datos con datos de prueba- Datos mínimos del seed:
- 4 mesas (capacidades variadas, al menos una con status OUT_OF_SERVICE)
- 3 turnos para la fecha de hoy (por ejemplo: 12:00–14:00, 18:00–20:00, 20:00–22:00)
- 2 reservas de ejemplo (al menos una CONFIRMED y una CANCELLED)
- El script debe ser idempotente: si se ejecuta más de una vez, no debe duplicar datos
- React
- React Router
- useState
- useEffect
- Fetch o Axios para consumir la API
Un restaurante necesita un sistema para administrar:
- Sus mesas
- Los turnos disponibles en cada día
- Las reservas realizadas por los clientes
- El nivel de ocupación del restaurante en una fecha determinada
No se requiere autenticación de usuarios.
El sistema representa únicamente la gestión interna del restaurante.
- id
- number (único)
- capacity (cantidad máxima de personas)
- status (AVAILABLE | OUT_OF_SERVICE)
- No puede haber dos mesas con el mismo número.
- La capacidad debe ser mayor a 0.
- Si una mesa está OUT_OF_SERVICE no puede recibir reservas.
- id
- date
- startTime
- endTime
- No pueden crearse turnos en fechas pasadas.
- No pueden existir turnos solapados en la misma fecha.
- Ejemplo inválido: 20:00--22:00 y 21:00--23:00
- Ejemplo válido: 18:00--20:00 y 20:00--22:00
- id
- customerName
- partySize
- status (CONFIRMED | CANCELLED)
- createdAt
- Pertenece a una mesa
- Pertenece a un turno
No se puede crear una reserva para una mesa con estado OUT_OF_SERVICE.
Si partySize > capacity de la mesa → la reserva debe rechazarse.
Para una misma mesa y turno solo puede existir una reserva con estado CONFIRMED.
Si la anterior está CANCELLED, se puede crear una nueva.
No se pueden crear reservas en turnos cuya fecha/hora ya haya pasado.
Cancelar una reserva cambia su estado a CANCELLED (no se elimina). Una vez cancelada, la mesa queda disponible para ese turno.
No puede repetirse el campo number.
No se pueden crear mesas con capacidad 0 o negativa.
En la misma fecha no pueden existir turnos con horarios superpuestos.
- Creación
- Listado
- Actualización
- Creación
- Listado
- Creación
- Listado
- Actualización
- Listado (sugerencia: GET /reports/occupancy?date=YYYY-MM-DD)
Debe devolver: - totalTables - reservedTables - availableTables - occupancyPercentage
Cálculo: (reservedTables / totalTables) * 100
- Listado de mesas
- Listado de turnos
- Crear reserva
- Listado de reservas
- Reporte de ocupación
- Navbar
- TableList
- ShiftList
- ReservationForm
- ReservationList
- OccupancyReport
Debe existir separación clara entre componentes.
Repositorio con: - /backend - /frontend - README con instrucciones de ejecución
Cada proyecto incluye un archivo PREGUNTAS.md con preguntas sobre las
decisiones técnicas tomadas durante la implementación:
/back/PREGUNTAS.md— Preguntas sobre arquitectura, manejo de errores HTTP, validaciones, TypeORM y migraciones./front/PREGUNTAS.md— Preguntas sobre componentes, estado, formularios, comunicación con la API y ruteo.
El alumno debe responder todas las preguntas en el mismo archivo, debajo de cada pregunta. Las respuestas deben ser breves, concretas y hacer referencia al código propio cuando corresponda.