Lógica de reserva

3 respostas
spring-boot
Tiozera

Boa tarde, estou com problema que ta me deixando louco kkkkkk
É o seguinte, estou fazendo um sistema de Reserva, onde tem os campos data, horaInicio e horaFim, problema está na logica de não repetir naquele suposto dia. Entenderam ? Alguém teria uma ideia de como fazer ?

3 Respostas

Tiozera

não pode ter reserva naquele data e hora

Lucas_Camara

Montei uma ideia aqui:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class Main {
	
	private static final DateTimeFormatter PATTERN_DATA = DateTimeFormatter.ofPattern("dd/MM/yyyy");
	private static final List<Reserva> RESERVAS = new ArrayList<>();

	public static void main(String[] args) throws Exception {
		criarReserva("15/10/2021", "13:00", "14:00");
		criarReserva("15/10/2021", "14:00", "15:00");
		criarReserva("15/10/2021", "14:59", "16:00");
		
		System.out.println("Foram feitas " + RESERVAS.size() + " reservas.");
	}
	
	private static void criarReserva(String dia, String horaInicio, String horaFim) throws Exception {
		var reserva = new Reserva(LocalDate.parse(dia, PATTERN_DATA), LocalTime.parse(horaInicio), LocalTime.parse(horaFim));
		
		if (RESERVAS.isEmpty()) {
			RESERVAS.add(reserva);
		} else {
			for (Reserva r : RESERVAS) {
				if (r.seHaConflito(reserva)) {
					throw new Exception("Não foi possível registrar a reserva " + reserva + ", pois conflitou com a reserva: " + r);
				}
			}
			
			RESERVAS.add(reserva);
		}
	}
	
	static class Reserva {
		private final LocalDateTime inicio;
		private final LocalDateTime fim;
		
		public Reserva(LocalDate inicio, LocalTime horaInicio, LocalTime horaFim) {
			this.inicio = inicio.atTime(horaInicio);
			this.fim = inicio.atTime(horaFim);
		}

		public boolean seHaConflito(Reserva reserva) {
			return 
				(seIgualOuDepois(reserva.inicio, inicio) && reserva.inicio.isBefore(fim)) ||
				(seIgualOuDepois(reserva.fim, inicio) && reserva.fim.isBefore(fim));
		}
		
		private boolean seIgualOuDepois(LocalDateTime d1, LocalDateTime d2) {
			return d1.equals(d2) || d1.isAfter(d2);
		}

		public LocalDateTime getInicio() {
			return inicio;
		}

		public LocalDateTime getFim() {
			return fim;
		}

		@Override
		public String toString() {
			return "Reserva [" + inicio.toLocalDate().format(PATTERN_DATA) + " (" + inicio.toLocalTime() + " - " + fim.toLocalTime() + ")]";
		}
	}
}

Com certeza deve dá para melhorar o código, e talvez tenha alguma falha.

Tiozera

valeu amigo, já posso tirar uma ideia de como fazer no meu sistema web, irei tentar aplicar essa ideia.

Criado 15 de outubro de 2021
Ultima resposta 16 de out. de 2021
Respostas 3
Participantes 2