Una empresa de turismo quiere desarrollar un sistema para gestionar sus operaciones. El sistema debe permitir administrar experiencias turísticas, manejar reservas y realizar ciertas automatizaciones sobre los servicios ofrecidos.
Como operador de la empresa de turismo,
quiero crear, editar, consultar y eliminar experiencias turísticas de diferentes tipos (excursiones guiadas y paquetes de aventura),
para gestionar la oferta de servicios, controlar la capacidad, la duración, la disponibilidad, las reglas de reserva y el cálculo de precios de cada experiencia.
- Debo poder crear una experiencia turística usando la clase
Experience(o sus derivadasGuidedTouryAdventurePackage) indicando nombre, descripción, tipo, capacidad máxima y duración. - Para excursiones guiadas (
GuidedTour):- Debo poder asociar un guía (
TourGuide). - Implementar el método
requiresGuide()para que retornetrue. - Validar que haya un guía disponible antes de permitir reservas (
canBeBooked()).
- Debo poder asociar un guía (
- Para paquetes de aventura (
AdventurePackage):- Debo poder asociar múltiples actividades (
Activity). - Implementar el método
checkAvailability(fecha, cantidad)para validar que haya cupo en todas las actividades.
- Debo poder asociar múltiples actividades (
- El método
calculateTotalPrice(personas)debe estar implementado en cada experiencia, aplicando reglas específicas (por ejemplo, suma de precios de actividades en paquetes). - El método
applyDiscount(personas)debe aplicar descuentos automáticos para grupos grandes. - El método
checkAvailability(fecha, cantidad)debe validar la capacidad máxima y la disponibilidad de guías si corresponde. - Todos estos métodos deben ser implementados en los archivos correspondientes de
/src/models/. - Los tests deben cubrir la creación, consulta de disponibilidad, cálculo de precios y restricciones de reserva según el tipo de experiencia.
Como cliente del sistema,
quiero reservar experiencias turísticas y, si no hay cupo, inscribirme en una lista de espera,
para asegurarme de que mi reserva sea válida, recibir notificaciones si se libera un lugar y aprovechar descuentos para grupos grandes.
- Al reservar, se debe usar la clase
Booking, que asocia unaExperience, unCustomer, la fecha y la cantidad de personas. - Implementar en
Bookingel métodocalculateTotalCost()para calcular el costo total usando la lógica de la experiencia y aplicar descuentos. - El método
canBePaid()debe validar si la reserva puede ser pagada (por ejemplo, si está dentro del plazo). - Implementar la lógica de lista de espera:
- Añadir una estructura de lista de espera (puede ser un array estático o gestionado externamente).
- Métodos como
addCustomerToWaitingList(),getNextFromWaitingList()y lógica para avanzar automáticamente la lista cuando se cancela una reserva.
- El estado de la reserva (
status) debe actualizarse correctamente según las acciones (pendiente, confirmada, en espera, cancelada). - Los tests deben cubrir la validación de disponibilidad, funcionamiento de la lista de espera, cálculo de costos y aplicación de descuentos.
Como responsable administrativo,
quiero gestionar los pagos de las reservas, calcular los saldos pendientes y cancelar automáticamente las reservas impagas en el plazo límite,
para asegurar la correcta facturación, liberar cupos y mantener la información financiera actualizada y disponible para reportes.
- Cada reserva (
Booking) debe tener un atributopaymentDeadliney un método para verificar si el pago se realizó a tiempo. - Implementar en la clase
Paymentla lógica para registrar pagos, asociar el pago a una reserva y almacenar la fecha y el monto. - Si el pago no se realiza en el plazo, implementar la lógica automática para cambiar el estado de la reserva a "cancelada" y reasignar el cupo al siguiente en la lista de espera.
- Implementar en
Bookingel método para calcular el saldo pendiente y generar comprobantes/facturas (puede ser un objeto o string con los datos relevantes). - Agregar funciones para generar reportes de facturación y pagos pendientes, filtrando por experiencia, cliente o fecha.
- Los tests deben cubrir la gestión de plazos, cancelación automática, asignación de cupos, generación de comprobantes y reportes.
- Todos los métodos mencionados deben implementarse en los modelos correspondientes dentro de
/src/models/. - El código debe estar cubierto por tests automatizados en Jest, ubicados en
/tests/. - Se recomienda mantener la consistencia en nombres de métodos y atributos, y documentar cada función con comentarios claros sobre su propósito y uso.