From 4cd71ec9ad57a4722014bad5df4b1d83a2f5cb7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:39 +0000 Subject: [PATCH] Update src/main/java/com/example/nto/service/impl/BookingServiceImpl.java --- .../nto/service/impl/BookingServiceImpl.java | 85 +++++++++++++++++-- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java index d24b244..33c2eee 100644 --- a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java @@ -1,12 +1,85 @@ package com.example.nto.service.impl; +import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; +import com.example.nto.repository.BookingRepository; +import com.example.nto.repository.PlaceRepository; import com.example.nto.service.BookingService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class BookingServiceImpl implements BookingService { + + private final BookingRepository bookingRepository; + private final PlaceRepository placeRepository; + + @Value("${booking.days-ahead}") + private int daysAhead; + + @Override + public Map getBookingsByEmployee(Employee employee) { + List bookings = bookingRepository.findAllByEmployee(employee); + + return bookings.stream() + .collect(Collectors.toMap( + Booking::getDate, + b -> b, + (b1, b2) -> b1, + TreeMap::new + )); + } + + @Override + public Map> getAvailablePlaces() { + LocalDate start = LocalDate.now(); + List allPlaces = placeRepository.findAll(); + Map> result = new LinkedHashMap<>(); + + for (int i = 0; i <= daysAhead; i++) { + LocalDate date = start.plusDays(i); + + List bookingsForDate = bookingRepository.findAllByDate(date); + Set busyPlaceIds = bookingsForDate.stream() + .map(b -> b.getPlace().getId()) + .collect(Collectors.toSet()); + + List available = allPlaces.stream() + .filter(p -> !busyPlaceIds.contains(p.getId())) + .collect(Collectors.toList()); + + result.put(date, available); + } + + return result; + } + + @Override + public boolean existsBookingForEmployeeOnDate(Employee employee, LocalDate date) { + return bookingRepository.findAllByDate(date).stream() + .anyMatch(b -> b.getEmployee() != null && b.getEmployee().getId() == employee.getId()); + } + + @Override + public boolean isPlaceBookedOnDate(Place place, LocalDate date) { + return bookingRepository.existsByDateAndPlace(date, place); + } + + @Override + public Booking createBooking(Employee employee, LocalDate date, Place place) { + Booking booking = Booking.builder() + .date(date) + .employee(employee) + .place(place) + .build(); + + return bookingRepository.save(booking); + } }