public List <UbicacionVehiculo> ListaUbicacionVehiculosEmpresaTipoPrecioDisponibles(int idEmpresa, int idTipoVehiculo, int precioMin, int precioMax)
        {
            VehiculoController            controladorVehiculo            = new VehiculoController();
            TipoVehiculoEmpresaController controladorTipoVehiculoEmpresa = new TipoVehiculoEmpresaController();

            List <UbicacionVehiculo> listado = new List <UbicacionVehiculo>();

            var tarifa = controladorTipoVehiculoEmpresa.ObtenerTarifaFijaTipoVehiculo(idEmpresa, idTipoVehiculo);

            if ((precioMin <= tarifa) && (tarifa <= precioMax))
            {
                List <Vehiculo> vehiculos = controladorVehiculo.ListarVehiculosDisponiblesPorTipo(idEmpresa, idTipoVehiculo);

                foreach (Vehiculo _veh in vehiculos)
                {
                    if (_veh.IdTipoVehiculo == idTipoVehiculo)
                    {
                        UbicacionVehiculo _ubicacion = this.UltimaUbicacion(idEmpresa, _veh.ID);
                        if (_ubicacion != null)
                        {
                            listado.Add(_ubicacion);
                        }
                    }
                }
            }

            return(listado);
        }
        public Viaje CancelarViaje(int idUsuario)
        {
            //OBTENGO EL ULTIMO VIAJE DEL USUARIO
            var query = (from viaje in _viajes.AsQueryable <Viaje>()
                         where viaje.IdUsuario == idUsuario
                         orderby viaje.FechaInicio descending
                         select viaje).FirstOrDefault();

            //VERIFICO QUE EL ULTIMO VIAJE DEL USUARIO ESTE FINALIZADO
            if (query.Estado == "Pendiente")
            {
                //OBTENGO EL VEHICULO
                bl.VehiculoController controladorVehiculo = new bl.VehiculoController();
                var vehiculo = controladorVehiculo.ObtenerVehiculo(query.IdEmpresa, query.IdVehiculo);

                //MODIFICO ESTADO DEL VEHICULO
                vehiculo.Estado = "Disponible";
                controladorVehiculo.ModificarVehiculo(query.IdEmpresa, vehiculo);

                query.Estado = "Cancelado";

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

                DateTime fechaReserva = query.FechaInicio;

                TimeSpan diferencia = cstTime.Subtract(fechaReserva);
                //DOY 3 MINUTOS PARA CANCELAR EL VIAJE SIN COBRAR
                if (diferencia.TotalMinutes >= 3)
                {
                    //SE LE COBRA LA TARIFA FIJA DEL VEHICULO
                    TipoVehiculoEmpresaController controladorTipoVehiculoEmpresa = new TipoVehiculoEmpresaController();
                    query.Precio = controladorTipoVehiculoEmpresa.ObtenerTarifaFijaTipoVehiculo(query.IdEmpresa, vehiculo.IdTipoVehiculo);

                    //OBTENGO COMISION A COBRARLE A LA EMPRESA
                    bl.EmpresaController controladorEmpresa = new EmpresaController();
                    var comisionEmpresa = controladorEmpresa.ObtenerComisionEmpresa(query.IdEmpresa);

                    var montoFinalEmpresa = Math.Round(query.Precio - (query.Precio * comisionEmpresa / 100), 2);

                    PagoEmpresa _pagoEmpresa = new PagoEmpresa
                    {
                        ViajeFinalizado = query,
                        Comision        = Math.Round((query.Precio - montoFinalEmpresa), 2),
                        Acreditado      = "NO",
                        CobroEmpresa    = montoFinalEmpresa
                    };

                    _pagoAEmpresas.InsertOne(_pagoEmpresa);


                    //ENVIO DE MAIL AL USUARIO

                    UsuarioController controladorUsuario = new UsuarioController();
                    var usuario = controladorUsuario.ObtenerUsuario(query.IdUsuario);

                    var apiKey = System.Environment.GetEnvironmentVariable("SENDGRID_APIKEY");
                    var client = new SendGridClient(apiKey);

                    var msg = new SendGridMessage();

                    msg.SetFrom(new EmailAddress("*****@*****.**", "Urban_Move"));

                    var recipients = new List <EmailAddress>
                    {
                        new EmailAddress(usuario.Email, usuario.Nombre),
                    };
                    msg.AddTos(recipients);

                    msg.SetSubject("Viaje Cancelado");

                    var body = "Estimado/a " + usuario.Nombre + " " + usuario.Apellido + "\n\nLe agradecemos su preferencia!! \n\n" +
                               "Al pasarse del tiempo permitido para Cancelar, se genero un costo de $ " + query.Precio.ToString() + ".\n" +
                               "Correspondiente a la tarifa fija del vehiculo reservado.\n\n" +
                               "Puede ingresar en el enlace a continuacion para abonar y poder seguir utilizando nuestros servicios.\n\n" +
                               "Gestion de Pago: http://urbanmove.azurewebsites.net/pagar \n\n" +
                               "Utilizar PayPal: http://urbanmove.azurewebsites.net/pay \n\n" +
                               "Lo saluda atentamente el equipo de Urban Move.";

                    msg.AddContent(MimeType.Text, body);

                    var response = client.SendEmailAsync(msg);
                }

                //GRABO LOS CAMBIOS EN EL VIAJE
                this.Update(query.InternalId, query);

                return(query);
            }
            else
            {
                return(null);
            }
        }