diff --git a/transacional/src/main/java/com/example/rent/dto/BookingDto.java b/transacional/src/main/java/com/example/rent/dto/BookingDto.java index e6020bdf..601d5da8 100644 --- a/transacional/src/main/java/com/example/rent/dto/BookingDto.java +++ b/transacional/src/main/java/com/example/rent/dto/BookingDto.java @@ -1,7 +1,6 @@ package com.example.rent.dto; -import java.time.LocalDate; import java.util.List; -public record BookingDto(String accommodationId, List guestIds, LocalDate intialDate, LocalDate endDate) { +public record BookingDto(String accommodationId, List guestIds, Integer rentalMonths) { } diff --git a/transacional/src/main/java/com/example/rent/exceptions/BusinessException.java b/transacional/src/main/java/com/example/rent/exceptions/BusinessException.java new file mode 100644 index 00000000..3f501fae --- /dev/null +++ b/transacional/src/main/java/com/example/rent/exceptions/BusinessException.java @@ -0,0 +1,9 @@ +package com.example.rent.exceptions; + +public class BusinessException extends RuntimeException { + + public BusinessException(String message) { + super(message); + } +} + diff --git a/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java b/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java index b16a8d3f..2643a393 100644 --- a/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java +++ b/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java @@ -7,32 +7,37 @@ import com.example.rent.enums.StatusReservation; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; public class BookingMapper { - public static Booking toEntity(BookingDto dto, Accommodation accommodation, List guestBookings) { - Booking booking = new Booking(); - booking.setAccommodation(accommodation); - booking.setGuests(guestBookings); - booking.setInitialDate(dto.intialDate()); - booking.setEndDate(dto.endDate()); - booking.setStatusReservation(StatusReservation.WAITING_PAYMENT); - booking.setCreationDate(LocalDateTime.now()); - booking.setExpiresDate(null); - return booking; - } +// public static Booking toEntity(BookingDto dto, Accommodation accommodation, List guestBookings) { +// Booking booking = new Booking(); +// booking.setAccommodation(accommodation); +// booking.setGuests(guestBookings); +// booking.setInitialDate(dto.intialDate()); +// booking.setEndDate(dto.endDate()); +// booking.setStatusReservation(StatusReservation.WAITING_PAYMENT); +// booking.setCreationDate(LocalDateTime.now()); +// booking.setExpiresDate(null); +// return booking; +// } public static BookingDto toDto(Booking booking) { List guestIds = booking.getGuests().stream() .map(guestBooking -> guestBooking.getGuest().getId()) .toList(); + int rentalMonths = (int) ChronoUnit.MONTHS.between( + booking.getInitialDate(), + booking.getEndDate() + ); + return new BookingDto( booking.getAccommodation().getId(), guestIds, - booking.getInitialDate(), - booking.getEndDate() + rentalMonths ); } } diff --git a/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java b/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java index 6e966362..536446f7 100644 --- a/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java +++ b/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java @@ -7,6 +7,7 @@ import com.example.rent.entities.User; import com.example.rent.enums.StatusAccommodation; import com.example.rent.enums.StatusReservation; +import com.example.rent.exceptions.BusinessException; import com.example.rent.mapper.BookingMapper; import com.example.rent.repository.AccommodationRepository; import com.example.rent.repository.BookingRepository; @@ -17,8 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; @@ -26,9 +27,10 @@ @Service public class BookingServiceImpl implements BookingService { - public static final int MIN_DAYS = 30; + public static final int MIN_MONTHS = 1; + public static final int MAX_MONTHS = 12; public static final int DAYS_FOR_EXPIRES = 3; - public static final String MINIMUM_RENTAL_TIME = "O período mínimo de aluguel é 30 dias"; + public static final String RENTAL_TIME_ERROR = "Período de locação inválido. Use um valor de 1 a 12 meses."; public static final String ACCOMMODATION_NOT_AVAILABLE = "O imóvel não está disponível para reserva."; public static final String USER_NOT_FOUND = "Usuário não encontrado"; public static final String ACCOMMODATION_NOT_FOUND = "Imóvel não encontrado"; @@ -49,7 +51,7 @@ public class BookingServiceImpl implements BookingService { @Override public Booking createBooking(BookingDto request) { - validateMinimumRentalTime(request); + validateRentalTime(request); var accommodation = findAccommodation(request); validateAccommodationCapacity(request, accommodation); verifyAccommodationStats(accommodation); @@ -61,9 +63,10 @@ public Booking createBooking(BookingDto request) { return bookingRepository.save(booking); } - protected void validateMinimumRentalTime(BookingDto request) { - if (ChronoUnit.DAYS.between(request.intialDate(), request.endDate()) < MIN_DAYS) { - throw new RuntimeException(MINIMUM_RENTAL_TIME); + protected void validateRentalTime(BookingDto request) { + Integer months = request.rentalMonths(); + if (months == null || months < MIN_MONTHS || months > MAX_MONTHS) { + throw new BusinessException(RENTAL_TIME_ERROR); } } @@ -81,13 +84,15 @@ protected void verifyAccommodationStats(Accommodation accommodation) { } protected Booking buildBooking(Accommodation accommodation, BookingDto request, List guests) { + LocalDate initialDate = LocalDate.now().plusDays(6); + LocalDate endDate = initialDate.plusMonths(request.rentalMonths()); Booking booking = new Booking(); booking.setAccommodation(accommodation); booking.setStatusReservation(StatusReservation.WAITING_PAYMENT); booking.setCreationDate(LocalDateTime.now()); booking.setExpiresDate(LocalDateTime.now().plusDays(DAYS_FOR_EXPIRES)); - booking.setInitialDate(request.intialDate()); - booking.setEndDate(request.endDate()); + booking.setInitialDate(initialDate); + booking.setEndDate(endDate); guests.forEach(e -> e.setReservation(booking)); booking.setGuests(guests); accommodation.setStatus(StatusAccommodation.BOOKING);