public async Task<IEnumerable<Cliente>> ListaClientesAsync(FiltroBusquedaCliente filtroBusqueda, int indicePagina, int registrosPorPagina)
        {
            var numPagina = indicePagina - 1;
            if (numPagina < 0) numPagina = 0;

            var consulta = _contexto.Clientes.AsQueryable();

            if (filtroBusqueda.TieneFiltrosBusqueda)
            {
                if (!string.IsNullOrEmpty(filtroBusqueda.NombreOEmpresa))
                {
                    consulta = consulta.Where(m => m.NombreOEmpresa.Contains(filtroBusqueda.NombreOEmpresa));
                }

                if (!string.IsNullOrEmpty(filtroBusqueda.IdentificacionFiscal))
                {
                    consulta = consulta.Where(m => m.NumeroIdentificacionFiscal.Contains(filtroBusqueda.IdentificacionFiscal));
                }

                if (filtroBusqueda.Id.HasValue)
                {
                    consulta = consulta.Where(m => m.Id == filtroBusqueda.Id.Value);
                }
            }

            var clientes = await consulta.OrderBy(m => m.NombreOEmpresa).Skip(registrosPorPagina * numPagina).Take(registrosPorPagina).ToListAsync();

            return clientes;
        }
        public async Task<IPagedList<LineaListaGestionClientes>> ListaGestionClientesAsync(FiltroBusquedaCliente filtroBusqueda)
        {
            var consulta = _contexto.Clientes.AsQueryable();

            if (filtroBusqueda.TieneFiltrosBusqueda)
            {
                consulta = consulta.Where_FiltroBusqueda(filtroBusqueda);              
            }

            var consultaOrdenada = consulta.OrderBy_OrdenarPor(filtroBusqueda.OrdenarPorEnum);
                       
            var consultaClientes = consultaOrdenada
                .Select(m => new LineaListaGestionClientes
                {
                    Id = m.Id,
                    NombreOEmpresa = m.NombreOEmpresa,
                    NumeroIdentificacionFiscal = m.NumeroIdentificacionFiscal,
                    Email = m.Email,
                    Direccion = m.Direccion,
                    NombreComercial = m.NombreComercial,
                    NumFacturas = m.Facturas.Count                   
                });

           
            var clientes = await consultaClientes.ToPagedListAsync(filtroBusqueda.IndicePagina, filtroBusqueda.LineasPorPagina);           
                        
            return clientes;
        }
        public async Task<IEnumerable<Cliente>> ListaDiferentesClientesEnFacturasAsync(FiltroBusquedaCliente filtroBusqueda, int indicePagina, int registrosPorPagina)
        {
            var numPagina = indicePagina - 1;
            if (numPagina < 0) numPagina = 0;

            var consulta = _contexto.Facturas.Where(m=>m.IdComprador != null);

            if (filtroBusqueda.TieneFiltrosBusqueda)
            {
                if (!string.IsNullOrEmpty(filtroBusqueda.NombreOEmpresa))
                {
                    consulta = consulta.Where(m => m.CompradorNombreOEmpresa.Contains(filtroBusqueda.NombreOEmpresa));
                }

                if (!string.IsNullOrEmpty(filtroBusqueda.IdentificacionFiscal))
                {
                    consulta = consulta.Where(m => m.CompradorNumeroIdentificacionFiscal.Contains(filtroBusqueda.IdentificacionFiscal));
                }

                if (filtroBusqueda.Id.HasValue)
                {
                    consulta = consulta.Where(m => m.IdComprador == filtroBusqueda.Id.Value);
                }
            }

            var consultaClientes = consulta
                .Select(m => new Cliente
                {
                    Id = m.IdComprador.Value,
                    CodigoPostal = m.CompradorCodigoPostal,
                    Direccion = m.CompradorDireccion,
                    Email = m.CompradorEmail,
                    Localidad = m.CompradorLocalidad,
                    NombreOEmpresa = m.CompradorNombreOEmpresa,
                    NumeroIdentificacionFiscal = m.CompradorNumeroIdentificacionFiscal,
                    Provincia = m.CompradorProvincia
                }).Distinct();

            var clientes = await consultaClientes.OrderBy(m=>m.NombreOEmpresa).Skip(registrosPorPagina * numPagina).Take(registrosPorPagina).ToListAsync();

            return clientes;
        }
        public async Task<ActionResult> ListaGestionClientes(FiltroBusquedaCliente filtroBusqueda, int? pagina)
        {
            if (!filtroBusqueda.TieneFiltrosBusqueda)
            {
                filtroBusqueda = RecuperarFiltroBusqueda();

                if (pagina.HasValue)
                    filtroBusqueda.IndicePagina = pagina.Value;
            }

            var viewmodel = new ListaGestionClientesViewModel
            {
                FiltroBusqueda = filtroBusqueda,
                ListaClientes = await _servicioCliente.ListaGestionClientesAsync(filtroBusqueda)                    
            };

            GuardarFiltroBusqueda(filtroBusqueda);

            return View("ListaGestionClientes", viewmodel);
        }
        public static IQueryable<Cliente> Where_FiltroBusqueda(this IQueryable<Cliente> consulta, FiltroBusquedaCliente filtroBusqueda)
        {
            if (!string.IsNullOrEmpty(filtroBusqueda.NombreOEmpresa))
            {
                consulta = consulta.Where(m => m.NombreOEmpresa.Contains(filtroBusqueda.NombreOEmpresa) ||
                                               m.NombreComercial.Contains(filtroBusqueda.NombreOEmpresa)
                );
            }
            if (!string.IsNullOrEmpty(filtroBusqueda.IdentificacionFiscal))
            {
                consulta = consulta.Where(m => m.NumeroIdentificacionFiscal.Contains(filtroBusqueda.IdentificacionFiscal));
            }

            if (filtroBusqueda.Id.HasValue)
            {
                consulta = consulta.Where(m => m.Id == filtroBusqueda.Id.Value);
            }

            return consulta;
        }
 private void GuardarFiltroBusqueda(FiltroBusquedaCliente filtro)
 {
     Session["FiltroBusquedaClientes"] = filtro;
 }
 public async Task<ActionResult> AutocompletarPorIdentificacionFiscal(string term)
 {
     var filtroBusqueda = new FiltroBusquedaCliente { IdentificacionFiscal = term };
     var clientes = await _servicioCliente.ListaClientesAsync(filtroBusqueda, 1, 10);
     return Json(clientes, JsonRequestBehavior.AllowGet);
 }