main #9

Closed
student-20690 wants to merge 26 commits from (deleted):main into main
Showing only changes of commit 09e13d89c9 - Show all commits

View File

@@ -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);
} }
} */ }
} }