/// <summary> /// Verifica se um aeroporto está disponível como ponto de partida para a data de reserva /// </summary> /// <param name="aeroportoId">id do aeroporto de partida</param> /// <param name="dataReserva">data de partida do jato do aeroporto</param> /// <returns>true se está disponivel, false senao</returns> private bool AeroportoDestinoDisponivel(int aeroportoId, int aeroportoDestinoId, DateTime dataReserva) { IEnumerable <Jato> jatos = _context.Jato .Include(j => j.Aeroporto) .ToList(); foreach (Jato jato in jatos) { TipoDisponibilidade disponibilidade = JatoDisponivelIntervalo(jato.JatoId, aeroportoId, aeroportoDestinoId, dataReserva); switch (disponibilidade) { case TipoDisponibilidade.Disponivel: case TipoDisponibilidade.DisponivelDeslocacao: return(true); } } return(false); }
public IActionResult ReservaConcluida(int idpartida, int iddestino, DateTime data, int jatoid, List <int> extrasids) { try { setupNav(); //Aeroporto partida = _context.Aeroporto.Single(a => a.AeroportoId == id); string idCliente = _userManager.GetUserAsync(this.User).Result.Id; Aeroporto aeroportoPartida = _context.Aeroporto.Single(a => a.AeroportoId == idpartida); Aeroporto aeroportoChegada = _context.Aeroporto.Single(a => a.AeroportoId == iddestino); Jato jato = _context.Jato .Include(a => a.ListaDisponibilidade) .Include(a => a.Aeroporto) .Single(a => a.JatoId == jatoid); TipoDisponibilidade disponibilidade = JatoDisponivelIntervalo(jatoid, idpartida, iddestino, data); if (disponibilidade == TipoDisponibilidade.NaoDisponivel) { throw new Exception("O jato não está disponível"); } double distancia = DistanciaEntreCoordenadas(aeroportoPartida.Latitude, aeroportoPartida.Longitude, aeroportoChegada.Latitude, aeroportoChegada.Longitude); double custo = CalcularCusto(distancia, jato, extrasids); long tempoDeViagem = CalcularTempoDeslocacaoTicks(jatoid, aeroportoPartida.AeroportoId, aeroportoChegada.AeroportoId); DateTime chegada = new DateTime(tempoDeViagem + data.Ticks); Cliente cliente = _context.Cliente.Include(c => c.ContaDeCreditos).Single(c => c.Id == idCliente); if (double.Parse(cliente.ContaDeCreditos.JetCashActual.ToString()) < custo) { throw new Exception("Os créditos não são suficientes"); } Reserva reserva = new Reserva() { AeroportoDestinoId = aeroportoChegada.AeroportoId, AeroportoPartidaId = aeroportoPartida.AeroportoId, Aprovada = false, Custo = decimal.Parse(custo.ToString()), DataPartida = data, DataChegada = chegada, JatoId = jatoid, Paga = false, Realizada = false, ApplicationUserId = idCliente, }; _context.Reserva.Add(reserva); Notificacao notificacaoCliente = new Notificacao() { Lida = false, UtilizadorId = idCliente, Mensagem = "Efetuou recentemente uma reserva, aguarde validação", Tipo = Notificacao.TYPE_SUCCESS, }; _context.Notificacao.Add(notificacaoCliente); _context.SaveChanges(); return(View("ReservaConcluida")); } catch (Exception ex) { ViewData["erro"] = ex.Message; return(View("ReservaNaoConcluida")); } }