Ignore:
Timestamp:
04/28/25 14:21:17 (3 weeks ago)
Author:
Aleksandar Panovski <apano77@…>
Branches:
main
Children:
e15e8d9
Parents:
f5b256e
Message:

Big change done fully handle_reservation_update() trigger works

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  
    11package com.example.rezevirajmasa.demo.service.impl;
    22
     3import com.example.rezevirajmasa.demo.dto.ReservationDTO;
     4import com.example.rezevirajmasa.demo.dto.RestaurantDTO;
    35import com.example.rezevirajmasa.demo.dto.UserDto;
    46import com.example.rezevirajmasa.demo.mappers.UserMapper;
     
    1214import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
    1315import com.example.rezevirajmasa.demo.service.ReservationService;
     16import com.example.rezevirajmasa.demo.service.RestaurantService;
    1417import com.example.rezevirajmasa.demo.service.UserService;
    1518import org.springframework.beans.factory.annotation.Autowired;
     
    3134@Service
    3235public class ReservationImpl implements ReservationService {
     36
    3337    @Autowired
    3438    private TableRepository tableRepository;
     
    5155
    5256    @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
    7262        if (optionalTable.isPresent()) {
    7363            TableEntity table = optionalTable.get();
    7464
     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");
    7594            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);
    8397            reservation.setReservationDateTime(LocalDateTime.now());
     98            reservation.setCheckOutTime(reservationTime.plusHours(2));
     99            reservation.setRestaurant(reservationDTO.getRestaurant());
     100
    84101            return reservationRepository.save(reservation);
    85102        } 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    }
    90137
    91138    @Override
    92139    public List<Reservation> listAll() {
    93140        return reservationRepository.findAll();
     141    }
     142
     143    @Override
     144    public List<Reservation> reservationsForTable(TableEntity table) {
     145        return reservationRepository.findAllByTableAndCheckInTime(table, LocalDateTime.now());
    94146    }
    95147
     
    106158            TableEntity table = reservation.getTable();
    107159
    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
    126162            reservationHistoryService.moveReservationToHistory(reservation, "Canceled", "Canceled by user");
    127163            reservationRepository.delete(reservation);
     164
    128165            return true;
    129166        } else {
     
    132169    }
    133170
    134 
    135171    @Override
    136172    public List<Reservation> findReservationByUser(User user) {
    137173        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);
    139180    }
    140181
     
    142183    public List<Reservation> findReservationsByUserPast(User user) {
    143184        LocalDateTime now = LocalDateTime.now();
    144         return reservationRepository.findALlByUserAndCheckInTimeBefore(user, now);
     185        return reservationRepository.findAllByUserAndCheckInTimeBefore(user, now);
    145186    }
    146187
     
    151192
    152193    @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        }
    155200    }
    156201
     
    160205        reservationRepository.delete(reservation);
    161206    }
     207
     208    @Override
     209    public List<Reservation> findAllByRestaurant(Restaurant restaurant) {
     210        return reservationRepository.findAllByRestaurantAndCheckInTimeAfter(restaurant, LocalDateTime.now());
     211    }
    162212}
  • src/main/java/com/example/rezevirajmasa/demo/service/impl/RestaurantServiceImpl.java

    rf5b256e rdeea3c4  
    11package com.example.rezevirajmasa.demo.service.impl;
    22
     3import com.example.rezevirajmasa.demo.dto.ReservationDTO;
     4import com.example.rezevirajmasa.demo.dto.RestaurantDTO;
     5import com.example.rezevirajmasa.demo.dto.TableDTO;
     6import com.example.rezevirajmasa.demo.model.Reservation;
    37import com.example.rezevirajmasa.demo.model.Restaurant;
    48import com.example.rezevirajmasa.demo.model.TableEntity;
     9import com.example.rezevirajmasa.demo.model.User;
    510import com.example.rezevirajmasa.demo.model.exceptions.InvalidRestaurantIdException;
    611import com.example.rezevirajmasa.demo.repository.RestaurantRepository;
    712import com.example.rezevirajmasa.demo.repository.TableRepository;
     13import com.example.rezevirajmasa.demo.service.ReservationService;
    814import com.example.rezevirajmasa.demo.service.RestaurantService;
    915import com.example.rezevirajmasa.demo.service.TableService;
    1016import com.sun.tools.jconsole.JConsoleContext;
    1117import jakarta.transaction.Transactional;
     18import org.openqa.selenium.InvalidArgumentException;
    1219import org.springframework.stereotype.Service;
    13 
     20import org.modelmapper.ModelMapper;
    1421import java.time.LocalDate;
    1522import java.time.LocalDateTime;
     
    3138    private final TableRepository tableRepository;
    3239    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) {
    3544        this.restaurantRepository = restaurantRepository;
    3645        this.tableRepository = tableRepository;
    3746        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() {
    4278        return restaurantRepository.findAll();
    4379    }
     
    5187    @Override
    5288    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
    5393        restaurantRepository.save(restaurant);
    5494        String[] hours = restaurant.getOperatingHours().split("-");
     
    60100            LocalTime startTime = LocalTime.parse(hours[0], DateTimeFormatter.ofPattern("HH:mm"));
    61101            LocalTime endTime = LocalTime.parse(hours[1], DateTimeFormatter.ofPattern("HH:mm"));
    62             System.out.println("IsBefore: " + startTime.isBefore(endTime) + " and equals: " + startTime.equals(endTime));
    63102
    64103            for (int i = 0; i < numberOfTables; i++) {
    65104                TableEntity table = new TableEntity();
    66 
    67 //                table.initializeTimeSlots(startTime, endTime);
    68 
    69105                table.setCapacity(tableCapacities.get(i));
    70106                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"));
    74108                table.setDescription(tableDescriptions.get(i));
    75109                table.setRestaurant(restaurant);
    76 
    77110                tableRepository.save(table);
    78111            }
     
    84117    }
    85118    @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
    89149
    90150    @Override
     
    115175    @Override
    116176    public List<Restaurant> listRestaurantBy(String search) {
    117         // Get all restaurants from the repository
    118177        List<Restaurant> allRestaurants = restaurantRepository.findAll();
    119178
     
    134193
    135194        for (Restaurant restaurant : restaurants) {
    136             // Check if the restaurant has available time slots for today
    137195            boolean hasAvailableTimeSlots = tableService.hasAvailableTimeSlotsForRestaurantAndDate(restaurant, today);
    138196            if (hasAvailableTimeSlots) {
     
    146204    @Override
    147205    public List<Restaurant> findRestaurantsByDateTimeAndPartySize(LocalDateTime dateTime, int partySize, String search) {
     206        LocalDateTime checkOutTime = dateTime.plusHours(2);
    148207        List<Restaurant> allRestaurants = restaurantRepository.findAll();
     208
    149209        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)))
    151213                .filter(restaurant -> isMatch(restaurant, search))
    152214                .collect(Collectors.toList());
    153215    }
    154216
    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 
    164217    private boolean isMatch(Restaurant restaurant, String name) {
    165218        return name == null || name.isEmpty() || restaurant.getName().contains(name);
     
    167220
    168221    @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;
    170226        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();
    176228        } else {
    177229            String searchTerm = "%" + search + "%";
    178             List<Restaurant> restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(searchTerm);
     230            restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(searchTerm);
     231
    179232            if (restaurantList.isEmpty()) {
    180233                restaurantList = restaurantRepository.findAllByCuisineTypeContaining(search);
    181234            }
    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;
    184248    }
    185249
     
    190254
    191255    @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);
    194271    }
    195272}
  • src/main/java/com/example/rezevirajmasa/demo/service/impl/TableServiceImpl.java

    rf5b256e rdeea3c4  
    11package com.example.rezevirajmasa.demo.service.impl;
    22
     3import com.example.rezevirajmasa.demo.dto.ReservationDTO;
     4import com.example.rezevirajmasa.demo.dto.RestaurantDTO;
     5import com.example.rezevirajmasa.demo.dto.TableDTO;
     6import com.example.rezevirajmasa.demo.model.Reservation;
    37import com.example.rezevirajmasa.demo.model.Restaurant;
    48import com.example.rezevirajmasa.demo.model.TableEntity;
    5 import com.example.rezevirajmasa.demo.model.exceptions.InvalidRestaurantIdException;
    69import com.example.rezevirajmasa.demo.model.exceptions.InvalidTableNumberException;
     10import com.example.rezevirajmasa.demo.repository.ReservationRepository;
    711import com.example.rezevirajmasa.demo.repository.RestaurantRepository;
    812import com.example.rezevirajmasa.demo.repository.TableRepository;
    913import com.example.rezevirajmasa.demo.service.TableService;
     14import jakarta.persistence.Table;
     15import org.modelmapper.ModelMapper;
     16import org.openqa.selenium.InvalidArgumentException;
    1017import org.springframework.cglib.core.Local;
    1118import org.springframework.stereotype.Service;
     
    1825import java.time.chrono.ChronoLocalDateTime;
    1926import java.time.format.DateTimeFormatter;
     27import java.util.ArrayList;
    2028import java.util.Iterator;
    2129import java.util.List;
     
    2533    private final TableRepository tableRepository;
    2634    private final RestaurantRepository restaurantRepository;
     35    private final ReservationRepository reservationRepository;
     36    private ModelMapper modelMapper = new ModelMapper();
    2737
    28     public TableServiceImpl(TableRepository tableRepository, RestaurantRepository restaurantRepository) {
     38    public TableServiceImpl(TableRepository tableRepository, RestaurantRepository restaurantRepository, ReservationRepository reservationRepository) {
    2939        this.tableRepository = tableRepository;
    3040        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;
    3642    }
    3743
     
    4147    }
    4248
     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
    4374    public void save(int numberOfTables, List<Integer> tableCapacities, List<String> tableLocations, List<String> tableSmokingAreas, List<String> tableDescriptions, Restaurant restaurant) {
    4475        for (int i = 0; i < numberOfTables; i++) {
     
    5586    @Override
    5687    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);
    6692
    6793        tableRepository.saveAndFlush(table);
     
    7096    @Override
    7197    public void canceledTimeSlots(Long tableId, LocalDateTime reservationTime) {
    72         TableEntity table = findById(tableId);
    73         List<LocalDateTime> timeSlots = table.getTimeSlots();
     98        TableDTO tableDTO = findById(tableId);
     99        TableEntity table = convertFromDTO(tableDTO);
    74100        LocalDateTime startTime = reservationTime.minusHours(1).minusMinutes(45);
    75101        LocalDateTime endTime = reservationTime.plusHours(1).plusMinutes(45);
    76102
    77         LocalDate localDate = reservationTime.toLocalDate();
    78 
    79103        String[] hours = table.getRestaurant().getOperatingHours().split("-");
    80104        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());
    81107
    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;
    86110        }
    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)) {
    91114                break;
    92115            }
     116
     117            Reservation reservation = new Reservation();
     118            reservation.setReservationDateTime(startTime);
     119            reservation.setTable(table);
     120            reservationRepository.save(reservation);
     121
     122            startTime = startTime.plusMinutes(15);
    93123        }
    94         table.setTimeSlots(timeSlots);
     124
    95125        tableRepository.saveAndFlush(table);
    96126    }
     
    105135        return tableRepository.findById(number).orElseThrow(InvalidTableNumberException::new);
    106136    }
     137
    107138    @Override
    108139    public TableEntity deleteTable(Long number) {
     
    116147        List<TableEntity> tables = tableRepository.findByRestaurant(restaurant);
    117148
    118         // Iterate through each table to check for available time slots
    119149        for (TableEntity table : tables) {
    120150            boolean hasAvailableTimeSlots = hasAvailableTimeSlotsForTableAndDate(table, today);
    121151            if (hasAvailableTimeSlots) {
    122                 return true; // If any table has available time slots, return true
     152                return true;
    123153            }
    124154        }
     
    128158
    129159    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());
    131163
    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;
    138169    }
    139170
     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    }
    140186}
Note: See TracChangeset for help on using the changeset viewer.