- Timestamp:
- 04/28/25 14:21:17 (3 weeks ago)
- Branches:
- main
- Children:
- e15e8d9
- Parents:
- f5b256e
- Location:
- src/main/java/com/example/rezevirajmasa/demo/service/impl
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java
rf5b256e rdeea3c4 1 1 package com.example.rezevirajmasa.demo.service.impl; 2 2 3 import com.example.rezevirajmasa.demo.dto.ReservationDTO; 4 import com.example.rezevirajmasa.demo.dto.RestaurantDTO; 3 5 import com.example.rezevirajmasa.demo.dto.UserDto; 4 6 import com.example.rezevirajmasa.demo.mappers.UserMapper; … … 12 14 import com.example.rezevirajmasa.demo.service.ReservationHistoryService; 13 15 import com.example.rezevirajmasa.demo.service.ReservationService; 16 import com.example.rezevirajmasa.demo.service.RestaurantService; 14 17 import com.example.rezevirajmasa.demo.service.UserService; 15 18 import org.springframework.beans.factory.annotation.Autowired; … … 31 34 @Service 32 35 public class ReservationImpl implements ReservationService { 36 33 37 @Autowired 34 38 private TableRepository tableRepository; … … 51 55 52 56 @Override 53 public void makeReservation(User user, TableEntity table, Restaurant restaurant, LocalDateTime localDateTime, LocalDateTime checkInTime, int partySize, String specialRequests) { 54 if (!table.isAvailable(checkInTime)) { 55 // Handle unavailability (throw an exception, return a specific response, etc.) 56 throw new RuntimeException("Table not available for the specified time slot"); 57 } 58 59 Reservation reservation = 60 new Reservation(user, table, restaurant, LocalDateTime.now(), partySize, specialRequests, "Reserved", checkInTime, checkInTime.plusHours(2), null); 61 62 // // Update table status or perform additional logic if needed 63 // tableRepository.save(table); 64 65 // Save the reservation 66 reservationRepository.save(reservation); 67 } 68 69 @Override 70 public Reservation makeReservationRest(Reservation reservation, User user) { 71 Optional<TableEntity> optionalTable = tableRepository.findById(reservation.getTable().getId()); 57 public Reservation makeReservationRest(ReservationDTO reservationDTO, User user) { 58 Reservation reservation = new Reservation(); 59 60 Optional<TableEntity> optionalTable = tableRepository.findById(reservationDTO.getTableNumber()); 61 72 62 if (optionalTable.isPresent()) { 73 63 TableEntity table = optionalTable.get(); 74 64 65 LocalDateTime reservationTime = reservationDTO.getReservationDateTime(); 66 LocalDateTime startTime = reservationTime.minusHours(2); 67 LocalDateTime endTime = reservationTime.plusHours(2); 68 69 boolean hasConflict = table.getReservations().stream() 70 .anyMatch(existingReservation -> { 71 LocalDateTime existingStartTime = existingReservation.getCheckInTime(); 72 LocalDateTime existingEndTime = existingReservation.getCheckOutTime(); 73 74 boolean scenario1 = existingStartTime.isBefore(startTime) && existingEndTime.isAfter(startTime); 75 76 boolean scenario2 = existingStartTime.isBefore(endTime) && existingEndTime.isAfter(startTime); 77 78 boolean scenario3 = existingStartTime.isAfter(startTime) && existingEndTime.isBefore(endTime); 79 80 boolean scenario4 = existingStartTime.isBefore(startTime) && existingEndTime.isAfter(endTime); 81 82 return scenario1 || scenario2 || scenario3 || scenario4; 83 }); 84 if (hasConflict) { 85 throw new InvalidReservationException("Unsuccessful reservation -> time slot not available"); 86 } 87 88 reservation.setTable(table); 89 reservation.setReservationDateTime(LocalDateTime.now()); 90 reservation.setSpecialRequests(reservationDTO.getSpecialRequests()); 91 reservation.setPartySize(reservationDTO.getPartySize()); 92 reservation.setStatus(reservationDTO.getStatus() != null ? reservationDTO.getStatus() : "Pending"); 93 reservation.setPaymentStatus(reservationDTO.getPaymentStatus() != null ? reservationDTO.getPaymentStatus() : "Unpaid"); 75 94 reservation.setUser(user); 76 77 LocalDateTime startTime = reservation.getCheckInTime().minusHours(2); 78 LocalDateTime endTime = reservation.getCheckInTime().plusHours(2); 79 80 table.getTimeSlots().removeIf( 81 x -> x.isAfter(startTime) && x.isBefore(endTime) 82 ); 95 reservation.setRestaurant(reservationDTO.getRestaurant()); 96 reservation.setCheckInTime(reservationTime); 83 97 reservation.setReservationDateTime(LocalDateTime.now()); 98 reservation.setCheckOutTime(reservationTime.plusHours(2)); 99 reservation.setRestaurant(reservationDTO.getRestaurant()); 100 84 101 return reservationRepository.save(reservation); 85 102 } else { 86 throw new InvalidReservationException("Unsuccessful reservation -> time slot not available"); 87 } 88 } 89 103 throw new InvalidReservationException("Invalid table number -> table not found"); 104 } 105 } 106 107 @Override 108 public Reservation updateReservation(Long reservationId, ReservationDTO reservationDTO, User user) { 109 Reservation existingReservation = findById(reservationId); 110 111 if (!existingReservation.getCheckInTime().equals(reservationDTO.getReservationDateTime())) { 112 TableEntity table = existingReservation.getTable(); 113 table.removeReservation(existingReservation); 114 115 LocalDateTime newStartTime = reservationDTO.getReservationDateTime().minusHours(2); 116 LocalDateTime newEndTime = reservationDTO.getReservationDateTime().plusHours(2); 117 boolean hasConflict = table.getReservations().stream() 118 .anyMatch(r -> r.getCheckInTime().isAfter(newStartTime) && r.getCheckInTime().isBefore(newEndTime)); 119 120 if (hasConflict) { 121 throw new InvalidReservationException("New time slot is not available."); 122 } 123 124 table.addReservation(existingReservation); 125 } 126 127 existingReservation.setCheckInTime(reservationDTO.getReservationDateTime()); 128 existingReservation.setCheckOutTime(reservationDTO.getReservationDateTime().plusHours(2)); 129 existingReservation.setReservationDateTime(LocalDateTime.now()); 130 existingReservation.setPartySize(reservationDTO.getPartySize()); 131 existingReservation.setSpecialRequests(reservationDTO.getSpecialRequests()); 132 existingReservation.setStatus(reservationDTO.getStatus() != null ? reservationDTO.getStatus() : existingReservation.getStatus()); 133 existingReservation.setPaymentStatus(reservationDTO.getPaymentStatus() != null ? reservationDTO.getPaymentStatus() : existingReservation.getPaymentStatus()); 134 135 return reservationRepository.save(existingReservation); 136 } 90 137 91 138 @Override 92 139 public List<Reservation> listAll() { 93 140 return reservationRepository.findAll(); 141 } 142 143 @Override 144 public List<Reservation> reservationsForTable(TableEntity table) { 145 return reservationRepository.findAllByTableAndCheckInTime(table, LocalDateTime.now()); 94 146 } 95 147 … … 106 158 TableEntity table = reservation.getTable(); 107 159 108 LocalDateTime from = reservation.getCheckInTime().minusHours(2); 109 LocalDateTime till = reservation.getCheckInTime().plusHours(2); 110 111 String[] hours = table.getRestaurant().getOperatingHours().split("-"); 112 LocalTime openingHourTime = LocalTime.parse(hours[0], DateTimeFormatter.ofPattern("HH:mm")); 113 LocalDateTime openingDateTime = openingHourTime.atDate(from.toLocalDate()); 114 LocalTime closingHourTime = LocalTime.of(22,45); 115 LocalDateTime closingDateTime = closingHourTime.atDate(till.toLocalDate()); 116 if(from.isBefore(openingDateTime)) { 117 from = openingDateTime; 118 } 119 if(till.isAfter(closingDateTime)) { 120 till = closingDateTime; 121 } 122 while (from.isBefore(reservation.getCheckInTime().plusHours(2))) { 123 table.addTimeSlot(from); 124 from = from.plusMinutes(15); 125 } 160 table.removeReservation(reservation); 161 126 162 reservationHistoryService.moveReservationToHistory(reservation, "Canceled", "Canceled by user"); 127 163 reservationRepository.delete(reservation); 164 128 165 return true; 129 166 } else { … … 132 169 } 133 170 134 135 171 @Override 136 172 public List<Reservation> findReservationByUser(User user) { 137 173 LocalDateTime now = LocalDateTime.now(); 138 return reservationRepository.findALlByUserAndCheckInTimeAfter(user, now); 174 return reservationRepository.findAllByUserAndCheckInTimeAfter(user, now); 175 } 176 177 @Override 178 public List<Reservation> findAllByUser(User user) { 179 return reservationRepository.findAllByUser(user); 139 180 } 140 181 … … 142 183 public List<Reservation> findReservationsByUserPast(User user) { 143 184 LocalDateTime now = LocalDateTime.now(); 144 return reservationRepository.findA LlByUserAndCheckInTimeBefore(user, now);185 return reservationRepository.findAllByUserAndCheckInTimeBefore(user, now); 145 186 } 146 187 … … 151 192 152 193 @Override 153 public List<Reservation> findReservationsToMove(LocalDateTime currentTime) { 154 return reservationRepository.findAllByCheckInTimeBefore(currentTime); 194 public void findReservationsToMove() { 195 List<Reservation> pastReservations = reservationRepository.findAllByCheckInTimeBefore(LocalDateTime.now()); 196 for(Reservation reservation : pastReservations) { 197 reservationHistoryService.moveReservationToHistory(reservation, "successful", "/"); 198 reservationRepository.delete(reservation); 199 } 155 200 } 156 201 … … 160 205 reservationRepository.delete(reservation); 161 206 } 207 208 @Override 209 public List<Reservation> findAllByRestaurant(Restaurant restaurant) { 210 return reservationRepository.findAllByRestaurantAndCheckInTimeAfter(restaurant, LocalDateTime.now()); 211 } 162 212 } -
src/main/java/com/example/rezevirajmasa/demo/service/impl/RestaurantServiceImpl.java
rf5b256e rdeea3c4 1 1 package com.example.rezevirajmasa.demo.service.impl; 2 2 3 import com.example.rezevirajmasa.demo.dto.ReservationDTO; 4 import com.example.rezevirajmasa.demo.dto.RestaurantDTO; 5 import com.example.rezevirajmasa.demo.dto.TableDTO; 6 import com.example.rezevirajmasa.demo.model.Reservation; 3 7 import com.example.rezevirajmasa.demo.model.Restaurant; 4 8 import com.example.rezevirajmasa.demo.model.TableEntity; 9 import com.example.rezevirajmasa.demo.model.User; 5 10 import com.example.rezevirajmasa.demo.model.exceptions.InvalidRestaurantIdException; 6 11 import com.example.rezevirajmasa.demo.repository.RestaurantRepository; 7 12 import com.example.rezevirajmasa.demo.repository.TableRepository; 13 import com.example.rezevirajmasa.demo.service.ReservationService; 8 14 import com.example.rezevirajmasa.demo.service.RestaurantService; 9 15 import com.example.rezevirajmasa.demo.service.TableService; 10 16 import com.sun.tools.jconsole.JConsoleContext; 11 17 import jakarta.transaction.Transactional; 18 import org.openqa.selenium.InvalidArgumentException; 12 19 import org.springframework.stereotype.Service; 13 20 import org.modelmapper.ModelMapper; 14 21 import java.time.LocalDate; 15 22 import java.time.LocalDateTime; … … 31 38 private final TableRepository tableRepository; 32 39 private final TableService tableService; 33 34 public RestaurantServiceImpl(RestaurantRepository restaurantRepository, TableRepository tableRepository, TableService tableService) { 40 private final ReservationService reservationService; 41 private ModelMapper modelMapper = new ModelMapper(); 42 43 public RestaurantServiceImpl(RestaurantRepository restaurantRepository, TableRepository tableRepository, TableService tableService, ReservationService reservationService) { 35 44 this.restaurantRepository = restaurantRepository; 36 45 this.tableRepository = tableRepository; 37 46 this.tableService = tableService; 38 } 39 40 @Override 41 public List<Restaurant> listall() { 47 this.reservationService = reservationService; 48 } 49 50 @Override 51 public List<RestaurantDTO> listall() { 52 List<Restaurant> restaurants = restaurantRepository.findAll(); 53 54 List<RestaurantDTO> restaurantDTOS = new ArrayList<>(); 55 56 for (Restaurant restaurant : restaurants) { 57 RestaurantDTO restaurantDTO = modelMapper.map(restaurant, RestaurantDTO.class); 58 List<TableDTO> tableDTOS = new ArrayList<>(); 59 for (TableEntity table : restaurant.getTablesList()) { 60 TableDTO tableDTO = modelMapper.map(table, TableDTO.class); 61 List<ReservationDTO> reservationDTOS = new ArrayList<>(); 62 for (Reservation reservation : table.getReservations()) { 63 ReservationDTO reservationDTO = modelMapper.map(reservation, ReservationDTO.class); 64 65 reservationDTOS.add(reservationDTO); 66 } 67 tableDTO.setReservations(reservationDTOS); 68 tableDTOS.add(tableDTO); 69 } 70 restaurantDTO.setTablesList(tableDTOS); 71 restaurantDTOS.add(restaurantDTO); 72 } 73 return restaurantDTOS; 74 } 75 76 @Override 77 public List<Restaurant> listAll() { 42 78 return restaurantRepository.findAll(); 43 79 } … … 51 87 @Override 52 88 public void save(Restaurant restaurant, int numberOfTables, List<Integer> tableCapacities, List<String> tableLocations, List<String> tableSmokingAreas, List<String> tableDescriptions) { 89 if (numberOfTables != tableCapacities.size() || numberOfTables != tableLocations.size() || numberOfTables != tableSmokingAreas.size() || numberOfTables != tableDescriptions.size()) { 90 throw new IllegalArgumentException("Mismatched table data. Number of tables does not match the size of the input lists."); 91 } 92 53 93 restaurantRepository.save(restaurant); 54 94 String[] hours = restaurant.getOperatingHours().split("-"); … … 60 100 LocalTime startTime = LocalTime.parse(hours[0], DateTimeFormatter.ofPattern("HH:mm")); 61 101 LocalTime endTime = LocalTime.parse(hours[1], DateTimeFormatter.ofPattern("HH:mm")); 62 System.out.println("IsBefore: " + startTime.isBefore(endTime) + " and equals: " + startTime.equals(endTime));63 102 64 103 for (int i = 0; i < numberOfTables; i++) { 65 104 TableEntity table = new TableEntity(); 66 67 // table.initializeTimeSlots(startTime, endTime);68 69 105 table.setCapacity(tableCapacities.get(i)); 70 106 table.setLocation(tableLocations.get(i)); 71 72 String smokingAreaString = tableSmokingAreas.get(i); 73 table.setSmokingArea(smokingAreaString.equalsIgnoreCase("on")); 107 table.setSmokingArea(tableSmokingAreas.get(i).equalsIgnoreCase("on")); 74 108 table.setDescription(tableDescriptions.get(i)); 75 109 table.setRestaurant(restaurant); 76 77 110 tableRepository.save(table); 78 111 } … … 84 117 } 85 118 @Override 86 public Restaurant findById(Long restaurantId) { 87 return restaurantRepository.findById(restaurantId).orElseThrow(InvalidRestaurantIdException::new); 88 } 119 public RestaurantDTO findById(Long restaurantId) { 120 Restaurant restaurant = restaurantRepository.findById(restaurantId) 121 .orElseThrow(InvalidRestaurantIdException::new); 122 123 RestaurantDTO restaurantDTO = modelMapper.map(restaurant, RestaurantDTO.class); 124 125 List<TableDTO> tableDTOS = new ArrayList<>(); 126 for (TableEntity table : restaurant.getTablesList()) { 127 TableDTO tableDTO = modelMapper.map(table, TableDTO.class); 128 129 List<ReservationDTO> reservationDTOS = new ArrayList<>(); 130 for (Reservation reservation : table.getReservations()) { 131 ReservationDTO reservationDTO = modelMapper.map(reservation, ReservationDTO.class); 132 reservationDTOS.add(reservationDTO); 133 } 134 135 tableDTO.setReservations(reservationDTOS); 136 tableDTOS.add(tableDTO); 137 } 138 139 restaurantDTO.setTablesList(tableDTOS); 140 141 return restaurantDTO; 142 } 143 144 @Override 145 public Restaurant findByIdRestaurant(Long restaurantId) { 146 return restaurantRepository.findById(restaurantId).orElseThrow(()-> new InvalidArgumentException("No restaurant with provided id")); 147 } 148 89 149 90 150 @Override … … 115 175 @Override 116 176 public List<Restaurant> listRestaurantBy(String search) { 117 // Get all restaurants from the repository118 177 List<Restaurant> allRestaurants = restaurantRepository.findAll(); 119 178 … … 134 193 135 194 for (Restaurant restaurant : restaurants) { 136 // Check if the restaurant has available time slots for today137 195 boolean hasAvailableTimeSlots = tableService.hasAvailableTimeSlotsForRestaurantAndDate(restaurant, today); 138 196 if (hasAvailableTimeSlots) { … … 146 204 @Override 147 205 public List<Restaurant> findRestaurantsByDateTimeAndPartySize(LocalDateTime dateTime, int partySize, String search) { 206 LocalDateTime checkOutTime = dateTime.plusHours(2); 148 207 List<Restaurant> allRestaurants = restaurantRepository.findAll(); 208 149 209 return allRestaurants.stream() 150 .filter(restaurant -> hasAvailableTable(restaurant, dateTime, partySize)) 210 .filter(restaurant -> restaurant.getTablesList().stream() 211 .anyMatch(table -> tableRepository.findAvailableTables(dateTime, checkOutTime, partySize) 212 .contains(table))) 151 213 .filter(restaurant -> isMatch(restaurant, search)) 152 214 .collect(Collectors.toList()); 153 215 } 154 216 155 private boolean hasAvailableTable(Restaurant restaurant, LocalDateTime dateTime, int partySize) {156 for (TableEntity table : restaurant.getTablesList()) {157 if (table.isAvailable(dateTime) && table.getCapacity() >= partySize) {158 return true;159 }160 }161 return false;162 }163 164 217 private boolean isMatch(Restaurant restaurant, String name) { 165 218 return name == null || name.isEmpty() || restaurant.getName().contains(name); … … 167 220 168 221 @Override 169 public List<Restaurant> findRestaurantsBySearchParams(LocalDateTime dateTime, int partySize, String search) { 222 public List<RestaurantDTO> findRestaurantsBySearchParams(LocalDateTime dateTime, int partySize, String search) { 223 List<Restaurant> availableRestaurants = new ArrayList<>(); 224 225 List<Restaurant> restaurantList; 170 226 if (search == null || search.isEmpty()) { 171 List<TableEntity> tableEntities = tableRepository.findAllByTimeSlotsContainingAndCapacityGreaterThanEqual(dateTime, partySize); 172 return tableEntities.stream() 173 .map(TableEntity::getRestaurant) 174 .distinct() 175 .collect(Collectors.toList()); 227 restaurantList = restaurantRepository.findAll(); 176 228 } else { 177 229 String searchTerm = "%" + search + "%"; 178 List<Restaurant> restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(searchTerm); 230 restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(searchTerm); 231 179 232 if (restaurantList.isEmpty()) { 180 233 restaurantList = restaurantRepository.findAllByCuisineTypeContaining(search); 181 234 } 182 return restaurantList; 183 } 235 } 236 237 for (Restaurant restaurant : restaurantList) { 238 boolean hasAvailableTable = restaurant.getTablesList().stream() 239 .anyMatch(table -> table.isAvailable(dateTime, partySize)); 240 241 if (hasAvailableTable) { 242 availableRestaurants.add(restaurant); 243 } 244 } 245 246 List<RestaurantDTO> restaurantDTOS = availableRestaurants.stream().map(this::convertToDto).toList(); 247 return restaurantDTOS; 184 248 } 185 249 … … 190 254 191 255 @Override 192 public List<Restaurant> findRestaurantsByCuisineType(String param) { 193 return restaurantRepository.findAllByCuisineType(param); 256 public List<RestaurantDTO> findRestaurantsByCuisineType(String param) { 257 List<Restaurant> restaurants = restaurantRepository.findAllByCuisineType(param); 258 return restaurants.stream().map(this::convertToDto).toList(); 259 } 260 261 public RestaurantDTO convertToDto(Restaurant restaurant) { 262 return modelMapper.map(restaurant, RestaurantDTO.class); 263 } 264 265 public TableDTO convertToDto(TableEntity table) { 266 return modelMapper.map(table, TableDTO.class); 267 } 268 269 public ReservationDTO convertToDto(Reservation reservation) { 270 return modelMapper.map(reservation, ReservationDTO.class); 194 271 } 195 272 } -
src/main/java/com/example/rezevirajmasa/demo/service/impl/TableServiceImpl.java
rf5b256e rdeea3c4 1 1 package com.example.rezevirajmasa.demo.service.impl; 2 2 3 import com.example.rezevirajmasa.demo.dto.ReservationDTO; 4 import com.example.rezevirajmasa.demo.dto.RestaurantDTO; 5 import com.example.rezevirajmasa.demo.dto.TableDTO; 6 import com.example.rezevirajmasa.demo.model.Reservation; 3 7 import com.example.rezevirajmasa.demo.model.Restaurant; 4 8 import com.example.rezevirajmasa.demo.model.TableEntity; 5 import com.example.rezevirajmasa.demo.model.exceptions.InvalidRestaurantIdException;6 9 import com.example.rezevirajmasa.demo.model.exceptions.InvalidTableNumberException; 10 import com.example.rezevirajmasa.demo.repository.ReservationRepository; 7 11 import com.example.rezevirajmasa.demo.repository.RestaurantRepository; 8 12 import com.example.rezevirajmasa.demo.repository.TableRepository; 9 13 import com.example.rezevirajmasa.demo.service.TableService; 14 import jakarta.persistence.Table; 15 import org.modelmapper.ModelMapper; 16 import org.openqa.selenium.InvalidArgumentException; 10 17 import org.springframework.cglib.core.Local; 11 18 import org.springframework.stereotype.Service; … … 18 25 import java.time.chrono.ChronoLocalDateTime; 19 26 import java.time.format.DateTimeFormatter; 27 import java.util.ArrayList; 20 28 import java.util.Iterator; 21 29 import java.util.List; … … 25 33 private final TableRepository tableRepository; 26 34 private final RestaurantRepository restaurantRepository; 35 private final ReservationRepository reservationRepository; 36 private ModelMapper modelMapper = new ModelMapper(); 27 37 28 public TableServiceImpl(TableRepository tableRepository, RestaurantRepository restaurantRepository ) {38 public TableServiceImpl(TableRepository tableRepository, RestaurantRepository restaurantRepository, ReservationRepository reservationRepository) { 29 39 this.tableRepository = tableRepository; 30 40 this.restaurantRepository = restaurantRepository; 31 } 32 33 @Override 34 public TableEntity findById(Long id) { 35 return tableRepository.findById(id).orElseThrow(InvalidTableNumberException::new); 41 this.reservationRepository = reservationRepository; 36 42 } 37 43 … … 41 47 } 42 48 49 @Override 50 public TableDTO findById(Long id) { 51 TableEntity table = tableRepository.findById(id) 52 .orElseThrow(InvalidTableNumberException::new); 53 54 TableDTO tableDTO = modelMapper.map(table, TableDTO.class); 55 56 List<ReservationDTO> reservationDTOS = new ArrayList<>(); 57 for (Reservation reservation : table.getReservations()) { 58 ReservationDTO reservationDTO = modelMapper.map(reservation, ReservationDTO.class); 59 reservationDTOS.add(reservationDTO); 60 } 61 62 tableDTO.setReservations(reservationDTOS); 63 64 return tableDTO; 65 } 66 67 @Override 68 public TableEntity findByIdTable(Long id) { 69 return tableRepository.findById(id).orElseThrow(() -> new InvalidArgumentException("Invalid table id")); 70 } 71 72 73 @Override 43 74 public void save(int numberOfTables, List<Integer> tableCapacities, List<String> tableLocations, List<String> tableSmokingAreas, List<String> tableDescriptions, Restaurant restaurant) { 44 75 for (int i = 0; i < numberOfTables; i++) { … … 55 86 @Override 56 87 public void deleteTimeSlotsForReservation(Long tableId, LocalDateTime reservationTime) { 57 LocalDateTime startTime = reservationTime.minusHours(2); 58 LocalDateTime endTime = reservationTime.plusHours(2); 59 60 TableEntity table = findById(tableId); 61 List<LocalDateTime> timeSlots = table.getTimeSlots(); 62 63 timeSlots.removeIf(timeSlot -> timeSlot.isAfter(startTime) && timeSlot.isBefore(endTime)); 64 65 table.setTimeSlots(timeSlots); 88 TableDTO tableDTO = findById(tableId); 89 TableEntity table = convertFromDTO(tableDTO); 90 LocalDate threeDaysAgo = LocalDate.now().minusDays(3); 91 table.cleanUnusedTimeSlots(threeDaysAgo); 66 92 67 93 tableRepository.saveAndFlush(table); … … 70 96 @Override 71 97 public void canceledTimeSlots(Long tableId, LocalDateTime reservationTime) { 72 Table Entity table= findById(tableId);73 List<LocalDateTime> timeSlots = table.getTimeSlots();98 TableDTO tableDTO = findById(tableId); 99 TableEntity table = convertFromDTO(tableDTO); 74 100 LocalDateTime startTime = reservationTime.minusHours(1).minusMinutes(45); 75 101 LocalDateTime endTime = reservationTime.plusHours(1).plusMinutes(45); 76 102 77 LocalDate localDate = reservationTime.toLocalDate();78 79 103 String[] hours = table.getRestaurant().getOperatingHours().split("-"); 80 104 LocalTime openingHourTime = LocalTime.parse(hours[0], DateTimeFormatter.ofPattern("HH:mm")); 105 LocalDateTime openingHour = openingHourTime.atDate(reservationTime.toLocalDate()); 106 LocalDateTime closingHour = LocalTime.of(23, 45).atDate(reservationTime.toLocalDate()); 81 107 82 LocalDateTime openingHour = openingHourTime.atDate(localDate); 83 LocalDateTime closingHour = LocalTime.of(23, 45).atDate(localDate); 84 if(startTime.isBefore(openingHour)) { 85 startTime = LocalDateTime.from(openingHour); 108 if (startTime.isBefore(openingHour)) { 109 startTime = openingHour; 86 110 } 87 while(startTime.isBefore(endTime) || startTime.equals(endTime)) { 88 timeSlots.add(startTime); 89 startTime = startTime.plusMinutes(15); 90 if(startTime.isAfter(closingHour) || startTime.equals(closingHour)) { 111 112 while (startTime.isBefore(endTime) || startTime.equals(endTime)) { 113 if (startTime.isAfter(closingHour) || startTime.equals(closingHour)) { 91 114 break; 92 115 } 116 117 Reservation reservation = new Reservation(); 118 reservation.setReservationDateTime(startTime); 119 reservation.setTable(table); 120 reservationRepository.save(reservation); 121 122 startTime = startTime.plusMinutes(15); 93 123 } 94 table.setTimeSlots(timeSlots); 124 95 125 tableRepository.saveAndFlush(table); 96 126 } … … 105 135 return tableRepository.findById(number).orElseThrow(InvalidTableNumberException::new); 106 136 } 137 107 138 @Override 108 139 public TableEntity deleteTable(Long number) { … … 116 147 List<TableEntity> tables = tableRepository.findByRestaurant(restaurant); 117 148 118 // Iterate through each table to check for available time slots119 149 for (TableEntity table : tables) { 120 150 boolean hasAvailableTimeSlots = hasAvailableTimeSlotsForTableAndDate(table, today); 121 151 if (hasAvailableTimeSlots) { 122 return true; // If any table has available time slots, return true152 return true; 123 153 } 124 154 } … … 128 158 129 159 public boolean hasAvailableTimeSlotsForTableAndDate(TableEntity table, LocalDate date) { 130 List<LocalDateTime> timeSlots = table.getTimeSlots(); 160 for (Reservation reservation : table.getReservations()) { 161 LocalDateTime startTime = reservation.getReservationDateTime(); 162 LocalDateTime endTime = startTime.plusHours(reservation.getTable().getReservationDurationHours()); 131 163 132 // Implement your logic to check if the table has available time slots for the given date 133 // This could involve querying the database for reservations for the given table and date, 134 // and checking if there are any open time slots. 135 // You may need to consider factors such as operating hours, existing reservations, etc. 136 // Return true if there are available time slots, false otherwise. 137 return false; 164 if (startTime.toLocalDate().equals(date) || endTime.toLocalDate().equals(date)) { 165 return false; 166 } 167 } 168 return true; 138 169 } 139 170 171 public RestaurantDTO convertToDto(Restaurant restaurant) { 172 return modelMapper.map(restaurant, RestaurantDTO.class); 173 } 174 175 public TableDTO convertToDto(TableEntity table) { 176 return modelMapper.map(table, TableDTO.class); 177 } 178 179 public ReservationDTO convertToDto(Reservation reservation) { 180 return modelMapper.map(reservation, ReservationDTO.class); 181 } 182 183 public TableEntity convertFromDTO(TableDTO tableDTO) { 184 return modelMapper.map(tableDTO, TableEntity.class); 185 } 140 186 }
Note:
See TracChangeset
for help on using the changeset viewer.