Commit 6d690346 by Antonio Rueda

Modificado los servicios y funciones disponibilidad para que devuelva número de…

Modificado los servicios y funciones disponibilidad para que devuelva número de habitaciones disponibles
parent 37574181
...@@ -24,6 +24,9 @@ import java.util.List; ...@@ -24,6 +24,9 @@ import java.util.List;
*/ */
@Entity @Entity
public class Hotel { public class Hotel {
public static record Disponibilidad(int numHabSimple, int numHabDoble) {}
@Id @Id
@GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.IDENTITY)
int id; int id;
...@@ -102,14 +105,12 @@ public class Hotel { ...@@ -102,14 +105,12 @@ public class Hotel {
} }
/** /**
* Comprueba si hay disponibilidad en las fechas indicadas * Devuelve la disponibilidad en las fechas indicadas
* @param fechaInicio fecha de inicio de la reserva * @param fechaInicio fecha de inicio de la reserva
* @param fechaFin fecha de final de la reserva * @param fechaFin fecha de final de la reserva
* @param numHabSimple número de habitaciones simples solicitadas * @return la disponibilidad en las fechas indicadas
* @param numHabDoble número de habitaciones dobles solicitadas
* @return true si hay disponibilidad, false en caso contrario
*/ */
public boolean disponible(LocalDate fechaInicio, LocalDate fechaFin, int numHabSimple, int numHabDoble) { public Disponibilidad disponibilidad(LocalDate fechaInicio, LocalDate fechaFin) {
// Obtener la fecha máxima donde hay registrada una reserva // Obtener la fecha máxima donde hay registrada una reserva
final var fechaMax = reservas.stream() final var fechaMax = reservas.stream()
.map(r -> r.fechaFin) .map(r -> r.fechaFin)
...@@ -117,21 +118,35 @@ public class Hotel { ...@@ -117,21 +118,35 @@ public class Hotel {
.map(f -> f.isBefore(fechaFin) ? f : fechaFin) .map(f -> f.isBefore(fechaFin) ? f : fechaFin)
.orElse(LocalDate.now()); .orElse(LocalDate.now());
for (var fecha = fechaInicio.plusDays(0); fecha.isBefore(fechaMax); fecha = fecha.plusDays(1)) int numHabSimpleDisponibles = numHabSimple;
if (!disponible(fecha, numHabSimple, numHabDoble)) int numHabDobleDisponibles = numHabDoble;
return false; for (var fecha = fechaInicio.plusDays(0); fecha.isBefore(fechaMax); fecha = fecha.plusDays(1)) {
var disponibilidadDia = disponibilidad(fecha);
return true; numHabSimpleDisponibles = Integer.min(numHabSimpleDisponibles, disponibilidadDia.numHabSimple);
numHabDobleDisponibles = Integer.min(numHabDobleDisponibles, disponibilidadDia.numHabDoble);
}
return new Disponibilidad(numHabSimpleDisponibles, numHabDobleDisponibles);
} }
/** /**
* Comprueba si hay disponibilidad en un día concreto * Indica si el hotel está disponible en las fechas indicadas
* @param fecha día a comprobar * @param fechaInicio fecha de inicio de la reserva
* @param fechaFin fecha de final de la reserva
* @param numHabSimple número de habitaciones simples solicitadas * @param numHabSimple número de habitaciones simples solicitadas
* @param numHabDoble número de habitaciones dobles solicitadas * @param numHabDoble número de habitaciones dobles solicitadas
* @return true si hay disponibilidad, false en caso contrario * @return true si el hotel está disponible
*/
public boolean disponible(LocalDate fechaInicio, LocalDate fechaFin, int numHabSimple, int numHabDoble) {
var disponibilidad = disponibilidad(fechaInicio, fechaFin);
return disponibilidad.numHabSimple >= numHabSimple && disponibilidad.numHabDoble > numHabDoble;
}
/**
* Devuelve la disponibilidad en un día concreto
* @param fecha día a comprobar
* @return la disponibilidad en la fecha dada
*/ */
public boolean disponible(LocalDate fecha, int numHabSimple, int numHabDoble) { public Disponibilidad disponibilidad(LocalDate fecha) {
int numHabSimpleDisponibles = numHabSimple; int numHabSimpleDisponibles = numHabSimple;
int numHabDobleDisponibles = numHabDoble; int numHabDobleDisponibles = numHabDoble;
...@@ -142,7 +157,7 @@ public class Hotel { ...@@ -142,7 +157,7 @@ public class Hotel {
} }
} }
return numHabSimpleDisponibles >= numHabSimple && numHabDobleDisponibles >= numHabDoble; return new Disponibilidad(numHabSimpleDisponibles, numHabDobleDisponibles);
} }
/** /**
......
...@@ -13,7 +13,6 @@ import jakarta.annotation.PostConstruct; ...@@ -13,7 +13,6 @@ import jakarta.annotation.PostConstruct;
import jakarta.validation.ConstraintViolationException; import jakarta.validation.ConstraintViolationException;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -98,7 +97,7 @@ public class ControladorReservas { ...@@ -98,7 +97,7 @@ public class ControladorReservas {
List<Hotel> hoteles; List<Hotel> hoteles;
if (nombre != null) { if (nombre != null) {
hoteles = servicioReservas.buscarHotel(nombre, localidad).stream() hoteles = servicioReservas.buscarHotel(nombre, localidad).stream()
.filter(h -> servicioReservas.disponible(h, desdeFinal, hastaFinal, numHabSimple, numHabDoble)).toList(); .filter(h -> h.disponible(desdeFinal, hastaFinal, numHabSimple, numHabDoble)).toList();
} }
else { else {
hoteles = servicioReservas.buscarHotelesDisponiblesPorLocalidad(localidad, desdeFinal, hastaFinal, numHabSimple, numHabDoble); hoteles = servicioReservas.buscarHotelesDisponiblesPorLocalidad(localidad, desdeFinal, hastaFinal, numHabSimple, numHabDoble);
...@@ -106,4 +105,13 @@ public class ControladorReservas { ...@@ -106,4 +105,13 @@ public class ControladorReservas {
return ResponseEntity.ok(hoteles.stream().map(h -> mapeador.dto(h)).toList()); return ResponseEntity.ok(hoteles.stream().map(h -> mapeador.dto(h)).toList());
} }
/*
@GetMapping("/hotel/{id}")
public ResponseEntity<Hotel> buscarHotel(int id) {
try {
Hotel hotel = servicioReservas.buscarHotel(id).orElse(HotelNoRegistrado::new);
}
*/
} }
...@@ -113,31 +113,26 @@ public class ServicioReservas { ...@@ -113,31 +113,26 @@ public class ServicioReservas {
public Hotel hotelConReservas(Hotel hotel) { public Hotel hotelConReservas(Hotel hotel) {
hotel = repositorioHoteles.actualizar(hotel); hotel = repositorioHoteles.actualizar(hotel);
// Usar cualquier operación que acceda a las reservas para que se carguen // Usar cualquier operación que acceda a las reservas para que se carguen
hotel.disponible(LocalDate.now(), 1, 1); hotel.disponibilidad(LocalDate.now());
return hotel; return hotel;
} }
/** /**
* Comprueba si hay disponibilidad en las fechas indicadas * Devuelve la disponibilidad en las fechas indicadas
* @param hotel hotel donde se compreuba la disponibilidad * @param hotel hotel donde se compreuba la disponibilidad
* @param fechaInicio fecha de inicio de la reserva * @param fechaInicio fecha de inicio de la reserva
* @param fechaFin fecha de final de la reserva * @param fechaFin fecha de final de la reserva
* @param numHabSimple número de habitaciones simples solicitadas * @return la disponibilidad en las fechas indicadas
* @param numHabDoble número de habitaciones dobles solicitadas
* @return true si hay disponibilidad, false en caso contrario
*/ */
@Transactional @Transactional
public boolean disponible(Hotel hotel, public Hotel.Disponibilidad disponibilidad(Hotel hotel,
@FutureOrPresent LocalDate fechaInicio, @FutureOrPresent LocalDate fechaInicio,
@FutureOrPresent LocalDate fechaFin, @FutureOrPresent LocalDate fechaFin) {
@PositiveOrZero int numHabSimple,
@PositiveOrZero int numHabDoble) {
hotel = repositorioHoteles.actualizar(hotel); hotel = repositorioHoteles.actualizar(hotel);
return hotel.disponible(fechaInicio, fechaFin, numHabSimple, numHabDoble); return hotel.disponibilidad(fechaInicio, fechaFin);
} }
/** /**
* Realiza una reserva en un hotel. La reserva debe ser correcta y haber disponibilidad. * Realiza una reserva en un hotel. La reserva debe ser correcta y haber disponibilidad.
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment