예제 #1
0
        /// <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);
        }
예제 #2
0
        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"));
            }
        }