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

File:
1 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}
Note: See TracChangeset for help on using the changeset viewer.