main #9
@@ -45,4 +45,24 @@ public class BookingController {
|
||||
|
||||
}
|
||||
}
|
||||
public static class CreateBookingRequest {
|
||||
private LocalDate date;
|
||||
private long placeId;
|
||||
|
||||
public LocalDate getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setDate(LocalDate date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public long getPlaceId() {
|
||||
return placeId;
|
||||
}
|
||||
|
||||
public void setPlaceId(long placeId) {
|
||||
this.placeId = placeId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,4 +22,10 @@ public interface BookingRepository extends JpaRepository<Booking, Long> {
|
||||
List<Booking> findByDateIn(List<LocalDate> dates);
|
||||
|
||||
Optional<Booking> findById(Long id);
|
||||
|
||||
Optional<Booking> findByDateAndPlace_Id(LocalDate date, Long placeId);
|
||||
|
||||
List<Booking> findByDateAndEmployee_Code(LocalDate date, String employeeCode);
|
||||
|
||||
List<Booking> findByDateInAndEmployee_Code(List<LocalDate> dates, String employeeCode);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.example.nto.service;
|
||||
import com.example.nto.entity.Booking;
|
||||
import com.example.nto.entity.Employee;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@@ -20,4 +21,6 @@ public interface BookingService {
|
||||
Map<String, List<Booking.AvailablePlaceDto>> getAvailablePlaces(String code);
|
||||
|
||||
boolean isEmployeeExists(String code);
|
||||
Booking createBooking(String employeeCode, LocalDate date, long placeId);
|
||||
|
||||
}
|
||||
|
||||
@@ -103,6 +103,50 @@ public class BookingServiceImpl implements BookingService {
|
||||
|
||||
return result;
|
||||
}
|
||||
@Override
|
||||
public Booking createBooking(String employeeCode, LocalDate date, long placeId) {
|
||||
// Проверяем сотрудника
|
||||
Employee employee = employeeRepository.findByCode(employeeCode)
|
||||
.orElseThrow(() -> new RuntimeException("Employee not found with code: " + employeeCode));
|
||||
|
||||
// Проверяем место
|
||||
Place place = placeRepository.findById(placeId)
|
||||
.orElseThrow(() -> new RuntimeException("Place not found with id: " + placeId));
|
||||
|
||||
// Проверяем, что дата в пределах 3 дней от сегодня
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate maxDate = today.plusDays(3);
|
||||
|
||||
if (date.isBefore(today)) {
|
||||
throw new RuntimeException("Cannot book in the past. Date: " + date);
|
||||
}
|
||||
|
||||
if (date.isAfter(maxDate)) {
|
||||
throw new RuntimeException("Can only book up to 3 days in advance. Date: " + date);
|
||||
}
|
||||
|
||||
// Проверяем, не занято ли уже это место на эту дату
|
||||
Optional<Booking> existingPlaceBooking = bookingRepository.findByDateAndPlace_Id(date, placeId);
|
||||
if (existingPlaceBooking.isPresent()) {
|
||||
throw new RuntimeException("Place " + placeId + " is already booked for " + date);
|
||||
}
|
||||
|
||||
// Проверяем, нет ли у сотрудника уже брони на эту дату
|
||||
List<Booking> employeeBookings = bookingRepository.findByDateAndEmployee_Code(date, employeeCode);
|
||||
if (!employeeBookings.isEmpty()) {
|
||||
throw new RuntimeException("Employee already has a booking on " + date);
|
||||
}
|
||||
|
||||
// Создаем новое бронирование
|
||||
Booking booking = Booking.builder()
|
||||
.date(date)
|
||||
.place(place)
|
||||
.employee(employee)
|
||||
.build();
|
||||
|
||||
// Сохраняем в базу
|
||||
return bookingRepository.save(booking);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user