public String IniciarViaje(int idEmpresa, int idVehiculo, string codigo)
        {
            String mensaje = " ";

            var query = (from viaje in _viajes.AsQueryable <Viaje>()
                         where viaje.IdVehiculo == idVehiculo && viaje.IdEmpresa == idEmpresa &&
                         viaje.CodigoReserva == codigo
                         select viaje).First();

            if (query != null)
            {
                TimeZoneInfo cstZone      = TimeZoneInfo.FindSystemTimeZoneById("Montevideo Standard Time");
                DateTime     cstTime      = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cstZone);
                DateTime     fechaReserva = query.FechaInicio;

                TimeSpan diferencia = cstTime.Subtract(fechaReserva);

                if (diferencia.TotalMinutes <= 5)
                {
                    if (query.Estado == "Pendiente")
                    {
                        query.FechaInicio = cstTime;
                        query.Estado      = "En Curso";
                        this.Update(query.InternalId, query);
                        mensaje = "OK";
                    }
                    else if (query.Estado == "Finalizado")
                    {
                        mensaje = "El viaje ya fue Finalizado.";
                    }
                    else if (query.Estado == "En Curso")
                    {
                        mensaje = "El viaje ya esta en Curso.";
                    }
                    else
                    {
                        mensaje = "El viaje fue Cancelado.";
                    }
                }
                else
                {
                    mensaje = "Su tiempo de reserva expiro por " + diferencia.Minutes + " minutos.";

                    VehiculoController controladorVehiculo = new VehiculoController();
                    dal.Vehiculo       _vehiculo           = controladorVehiculo.ObtenerVehiculo(idEmpresa, idVehiculo);

                    _vehiculo.Estado = "Disponible";
                    controladorVehiculo.ModificarVehiculo(idEmpresa, _vehiculo);

                    query.Estado = "Cancelado";
                    this.Update(query.InternalId, query);
                }
            }

            return(mensaje);
        }
        public Viaje Create(Viaje viaje)
        {
            UsuarioController controladorUsuario = new UsuarioController();
            var usuario = controladorUsuario.ObtenerUsuario(viaje.IdUsuario);

            if (usuario != null)
            {
                String _puedeReservar = this.PuedeReservar(viaje.IdUsuario);

                if (_puedeReservar == "OK")
                {
                    VehiculoController controladorVehiculo = new VehiculoController();
                    dal.Vehiculo       _vehiculo           = controladorVehiculo.ObtenerVehiculo(viaje.IdEmpresa, viaje.IdVehiculo);

                    if (_vehiculo.Estado == "Disponible")
                    {
                        //OBTENGO EL HORARIO DESDE TIPOVEHICULO EMPRESA
                        TipoVehiculoEmpresaController controladorTipoVehiculo = new TipoVehiculoEmpresaController();
                        dal.TipoVehiculoEmpresa       _tipoVehiculoEmp        = controladorTipoVehiculo.ObtenerTipoDeVehiculo(viaje.IdEmpresa, _vehiculo.IdTipoVehiculo);

                        TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Montevideo Standard Time");
                        DateTime     cstTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cstZone);

                        //COMPRUEBO QUE LA HORA ESTE COMPRENDIDA EN LA DEL VEHICULO
                        if ((_tipoVehiculoEmp.HorarioInicio <= cstTime.Hour) && (cstTime.Hour <= _tipoVehiculoEmp.HorarioFin))
                        {
                            _vehiculo.Estado  = "Ocupado";
                            viaje.FechaInicio = cstTime;
                            Random rnd = new Random();
                            viaje.CodigoReserva = rnd.Next(1000, 9999).ToString();
                            viaje.Estado        = "Pendiente";
                            viaje.Precio        = 0;
                            viaje.Pago          = "NO";
                            viaje.Puntuacion    = 0;
                            viaje.Comentario    = "";

                            _viajes.InsertOne(viaje);
                            controladorVehiculo.ModificarVehiculo(viaje.IdEmpresa, _vehiculo);

                            return(viaje);
                        }
                        else
                        {
                            viaje.Estado = "2";
                            return(viaje);
                        }
                    }
                    else
                    {
                        viaje.Estado = "1";
                        return(viaje);
                    }
                }
                else if (_puedeReservar == "Pago Pendiente")
                {
                    viaje.Estado = "3";
                    return(viaje);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                viaje.Estado = "4";
                return(viaje);
            }
        }