final
This commit is contained in:
@@ -54,11 +54,9 @@ public class BookingServiceImpl implements BookingService {
|
|||||||
public boolean isEmployeeExists(String code) {
|
public boolean isEmployeeExists(String code) {
|
||||||
return employeeRepository.findByCode(code).isPresent();
|
return employeeRepository.findByCode(code).isPresent();
|
||||||
}
|
}
|
||||||
@Override
|
public Map<String, List<AvailablePlaceDto>> getAvailablePlaces(String employeeCode) {
|
||||||
public Map<String, List<Booking.AvailablePlaceDto>> getAvailablePlaces(String employeeCode) {
|
|
||||||
Employee employee = employeeRepository.findByCode(employeeCode)
|
Employee employee = employeeRepository.findByCode(employeeCode)
|
||||||
.orElseThrow(() -> new EmployeeNotFoundException("Unauthorized"));
|
.orElseThrow(() -> new RuntimeException("Employee not found"));
|
||||||
|
|
||||||
LocalDate today = LocalDate.now();
|
LocalDate today = LocalDate.now();
|
||||||
List<LocalDate> targetDates = List.of(
|
List<LocalDate> targetDates = List.of(
|
||||||
today,
|
today,
|
||||||
@@ -66,24 +64,21 @@ public class BookingServiceImpl implements BookingService {
|
|||||||
today.plusDays(2),
|
today.plusDays(2),
|
||||||
today.plusDays(3)
|
today.plusDays(3)
|
||||||
);
|
);
|
||||||
|
|
||||||
List<Place> allPlaces = placeRepository.findAll();
|
List<Place> allPlaces = placeRepository.findAll();
|
||||||
List<Booking> bookings = bookingRepository.findByDateIn(targetDates);
|
List<Booking> bookings = bookingRepository.findByDateIn(targetDates);
|
||||||
Map<LocalDate, List<Booking>> bookingsByDate = bookings.stream()
|
Map<LocalDate, List<Booking>> bookingsByDate = bookings.stream()
|
||||||
.collect(Collectors.groupingBy(Booking::getDate, Collectors.toList()));
|
.collect(Collectors.groupingBy(Booking::getDate));
|
||||||
Map<String, List<Booking.AvailablePlaceDto>> result = new LinkedHashMap<>(); // Используем LinkedHashMap для сохранения порядка
|
Map<String, List<AvailablePlaceDto>> result = new HashMap<>();
|
||||||
|
|
||||||
for (LocalDate date : targetDates) {
|
for (LocalDate date : targetDates) {
|
||||||
String dateKey = date.toString();
|
String dateKey = date.toString(); // Формат: "yyyy-MM-dd"
|
||||||
List<Booking> dayBookings = bookingsByDate.getOrDefault(date, List.of());
|
List<Booking> dayBookings = bookingsByDate.getOrDefault(date, List.of());
|
||||||
|
|
||||||
Set<Long> occupiedPlaceIds = dayBookings.stream()
|
Set<Long> occupiedPlaceIds = dayBookings.stream()
|
||||||
.map(booking -> booking.getPlace().getId())
|
.map(booking -> booking.getPlace().getId())
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
List<Booking.AvailablePlaceDto> available = allPlaces.stream()
|
List<AvailablePlaceDto> available = allPlaces.stream()
|
||||||
.filter(place -> !occupiedPlaceIds.contains(place.getId()))
|
.filter(place -> !occupiedPlaceIds.contains(place.getId()))
|
||||||
.map(place -> {
|
.map(place -> {
|
||||||
Booking.AvailablePlaceDto dto = new Booking.AvailablePlaceDto();
|
AvailablePlaceDto dto = new AvailablePlaceDto();
|
||||||
dto.setId(place.getId());
|
dto.setId(place.getId());
|
||||||
dto.setPlace(place.getPlace());
|
dto.setPlace(place.getPlace());
|
||||||
return dto;
|
return dto;
|
||||||
@@ -97,21 +92,13 @@ public class BookingServiceImpl implements BookingService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public Booking createBooking(String employeeCode, LocalDate date, long placeId) {
|
public Booking createBooking(String employeeCode, LocalDate date, long placeId) {
|
||||||
// 1. Проверяем существование сотрудника (401 если нет)
|
|
||||||
Employee employee = employeeRepository.findByCode(employeeCode)
|
Employee employee = employeeRepository.findByCode(employeeCode)
|
||||||
.orElseThrow(() -> new EmployeeNotFoundException("Employee with code '" + employeeCode + "' not found"));
|
.orElseThrow(() -> new EmployeeNotFoundException("Employee with code '" + employeeCode + "' not found"));
|
||||||
|
|
||||||
// 2. Проверяем существование места (400 если нет)
|
|
||||||
Place place = placeRepository.findById(placeId)
|
Place place = placeRepository.findById(placeId)
|
||||||
.orElseThrow(() -> new InvalidBookingException("Place with id " + placeId + " not found"));
|
.orElseThrow(() -> new InvalidBookingException("Place with id " + placeId + " not found"));
|
||||||
|
|
||||||
// 3. Валидация даты (400 если невалидно)
|
|
||||||
validateBookingDate(date);
|
validateBookingDate(date);
|
||||||
|
|
||||||
// 4. Проверяем, не занято ли место (409 если занято)
|
|
||||||
checkPlaceAvailability(date, placeId);
|
checkPlaceAvailability(date, placeId);
|
||||||
|
checkEmployeeBookingConflict(employeeCode, date);
|
||||||
|
|
||||||
Booking booking = Booking.builder()
|
Booking booking = Booking.builder()
|
||||||
.date(date)
|
.date(date)
|
||||||
.place(place)
|
.place(place)
|
||||||
@@ -145,15 +132,17 @@ public class BookingServiceImpl implements BookingService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* private void checkEmployeeBookingConflict(String employeeCode, LocalDate date) {
|
private void checkEmployeeBookingConflict(String employeeCode, LocalDate date) {
|
||||||
List<Booking> employeeBookingsOnDate = bookingRepository.findByDateAndEmployee_Code(date, employeeCode);
|
List<Booking> employeeBookingsOnDate = bookingRepository.findByDateAndEmployee_Code(date, employeeCode);
|
||||||
if (!employeeBookingsOnDate.isEmpty()) {
|
if (!employeeBookingsOnDate.isEmpty()) {
|
||||||
throw new BookingConflictException("Employee already has a booking on " + date);
|
throw new BookingConflictException("Employee already has a booking on " + date);
|
||||||
}
|
}
|
||||||
} */
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user