// pesquisa da tela
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, UnidadeDeMedidaFiltroVm filtro)
        {
            _ivas
                .CodigoContendo(filtro.Codigo)
                .NomeContendo(filtro.Descricao);
            var kendoGridVmn = new KendoGridVm()
            {
                QuantidadeDeRegistros = _ivas.Count(),
                Registros =
                    _builder.BuildList(_ivas.Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take).List())
                            .Cast<ListagemVm>()
                            .ToList()

            };
            return kendoGridVmn;
        }
        // pesquisa da tela
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, CondicaoPagamentoFiltroVm filtro)
        {
            _condicoesDePagamento
                .CodigoContendo(filtro.Codigo)
                .NomeContendo(filtro.Nome);
            var kendoGridVmn = new KendoGridVm()
            {
                QuantidadeDeRegistros = _condicoesDePagamento.Count(),
                Registros =
                    _builder.BuildList(_condicoesDePagamento.Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take).List())
                            .Cast<ListagemVm>()
                            .ToList()

            };
            return kendoGridVmn;
        }
        // Pesquisa da tela de Listar Pedidos ( Cabecalho)
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, PedidoVendaFiltroVm filtro)
        {
            if (!string.IsNullOrEmpty(filtro.CodigoDoCliente))
            {
                _pedidosVenda.DoCliente(filtro.CodigoDoCliente);

            }

            if (filtro.IdDoMaterial.HasValue)
            {
                _pedidosVenda.ContendoMaterial(filtro.IdDoMaterial.Value);
            }

            _pedidosVenda
                .DataCriacaoContendo(filtro.datacp)
                .PedidoCodigoContendo(filtro.id_pedido)
                .DataPedidoContendo(filtro.datap)
                .CotacaoRepresentante(filtro.CodigoDoRepresentante)
                .NoStatus(filtro.Status)
                .OrdenarPeloUltimoPedidoCriado();

            var kendoGridVmn = new KendoGridVm()
            {
                QuantidadeDeRegistros = _pedidosVenda.Count(),
                Registros = _pedidosVenda.GetQuery().Select(pedido =>
                    new PedidoVendaListagemVm
                    {
                        IdDaCotacao = pedido.Id_cotacao,
                        Status = pedido.Status.Descricao,
                        NumeroDoPedido = pedido.NumeroDoPedidoDoRepresentante,
                        DataDeCriacao =  pedido.Datacp.ToString("dd/MM/yyyy HH:mm:ss"),
                        DataDoPedido =  pedido.Datap.ToShortDateString(),
                        NomeDoCliente =  pedido.Cliente.Nome,
                        ValorTotal = pedido.ValorTotal,
                        ExibirBotaoDeImpressao = pedido.Status.Codigo == "C"
                    })
                    .Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take)
                    .Cast<ListagemVm>()
                    .ToList()
            };
            
            return kendoGridVmn;
        }
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, UsuarioFiltroVm usuarioFiltroVm)
        {
            _usuarios
                .LoginContendo(usuarioFiltroVm.Login)
                .NomeContendo(usuarioFiltroVm.Nome)
                .OrdenarPorNome();
            
            var kendoGridVmn = new KendoGridVm()
            {
                QuantidadeDeRegistros = _usuarios.Count(),
                Registros =
                    _builderUsuario.BuildList(_usuarios.Skip(paginacaoVm.Skip).Take(paginacaoVm.Take).List())
                            .Cast<ListagemVm>()
                            .ToList()

            };
            return kendoGridVmn;

        }
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, ClienteFiltroVm filtro)
        {

            var queryOver = ConstruirQuery(filtro);

            Cliente cliente = null;
            ClienteCadastroVm clienteVm = null;

            queryOver.SelectList(lista => lista
                .Select(x => cliente.Cnpj).WithAlias(() => clienteVm.Cnpj)
                .Select(x => cliente.Cpf).WithAlias(() => clienteVm.Cpf)
                .Select(x => cliente.Complemento).WithAlias(() => clienteVm.complemento)
                .Select(x => cliente.Email).WithAlias(() => clienteVm.email)
                .Select(x => cliente.Endereco).WithAlias(() => clienteVm.endereco)
                .Select(x => cliente.Id_cliente).WithAlias(() => clienteVm.id_cliente )
                .Select(x => cliente.Municipio).WithAlias(() => clienteVm.municipio)
                .Select(x => cliente.Nome).WithAlias(() => clienteVm.nome)
                .Select(x => cliente.Nr_ie_cli).WithAlias(() => clienteVm.nr_ie_for)
                .Select(x => cliente.Numero).WithAlias(() => clienteVm.numero)
                .Select(x => cliente.Pais).WithAlias(() => clienteVm.pais)
                .Select(x => cliente.Tel_cel).WithAlias(() => clienteVm.tel_cel)
                .Select(x => cliente.Tel_res).WithAlias(() => clienteVm.tel_res)
                .Select(x => cliente.Uf).WithAlias(() => clienteVm.uf)
                );

            var kendoGridVm = new KendoGridVm()
            {
                QuantidadeDeRegistros = queryOver.RowCount(),
                Registros = queryOver
                    .TransformUsing(Transformers.AliasToBean<ClienteCadastroVm>())
                    .Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take)
                    .List<ClienteCadastroVm>()
                    .Cast<ListagemVm>()
                    .ToList()
            };

            return kendoGridVm;

        }
        public KendoGridVm ListarParaSelecao(PaginacaoVm paginacaoVm, ClienteFiltroVm filtro)
        {
            var queryOver = ConstruirQuery(filtro);

            Cliente cliente = null;
            ClienteParaSelecaoVm clienteVm = null;

            queryOver.SelectList(lista => lista
                .Select(x => cliente.Id_cliente).WithAlias(() => clienteVm.Codigo)
                .Select(x => cliente.Nome).WithAlias(() => clienteVm.Nome)
                .Select(x => cliente.Cnpj).WithAlias(() => clienteVm.Cnpj)
                .Select(x => cliente.Cpf).WithAlias(() => clienteVm.Cpf)
                .Select(x => cliente.Municipio).WithAlias(() => clienteVm.Municipio)
                .Select(x => cliente.Uf).WithAlias(() => clienteVm.Uf)
                .Select(x => cliente.Tel_res).WithAlias(() => clienteVm.Telefone)
                );

            var kendoGridVm = new KendoGridVm()
            {
                QuantidadeDeRegistros = queryOver.RowCount(),
                Registros = queryOver
                    .TransformUsing(Transformers.AliasToBean<ClienteParaSelecaoVm>())
                    .Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take)
                    .List<ClienteParaSelecaoVm>()
                    .Cast<ListagemVm>()
                    .ToList()
            };

            return kendoGridVm;
        }
        // pesquisa da tela
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, MaterialFiltroVm filtro)
        {
            Material material = null;
            UnidadeDeMedida unidadeDeMedida = null;

            IQueryOver<Material, Material> queryOver = _unitOfWorkNh.Session.QueryOver(() => material);

            queryOver = queryOver.JoinAlias(x => x.UnidadeDeMedida, () => unidadeDeMedida);
                

            queryOver.Where(
                Restrictions.Disjunction()
                    .Add(() => material.Eliminacao == null)
                    .Add(() => material.Eliminacao != "X"));


            if (!string.IsNullOrEmpty(filtro.Tipo))
            {
                queryOver = queryOver.Where(m => m.Tip_mat == filtro.Tipo);
            }

            if (!string.IsNullOrEmpty(filtro.Codigo))
            {
                queryOver = queryOver.Where(m => m.Id_material.IsInsensitiveLike(filtro.Codigo, MatchMode.Anywhere));
            }

            if (!string.IsNullOrEmpty(filtro.Descricao))
            {
                queryOver = queryOver.Where(m => m.Descricao.IsInsensitiveLike(filtro.Descricao, MatchMode.Anywhere));
            }

            CondicaoDePrecoGeral condicaoDePrecoGeral = null;

            if (filtro.ComPrecoAtivo)
            {
                ClienteVenda areaDeVenda = _areasDeVenda.ObterPorId(filtro.IdDaAreaDeVenda);

                queryOver = queryOver.Where(m => m.Id_centro == areaDeVenda.Org_vendas);

                QueryOver<CondicaoDePrecoGeral, CondicaoDePrecoGeral> subQueryCondicaoGeral = 
                    QueryOver.Of(() => condicaoDePrecoGeral)
                    .Where(c => c.Org_vendas == areaDeVenda.Org_vendas)
                    .And(c => c.Can_dist == areaDeVenda.Can_dist)
                    .Select(Projections.Property(() => condicaoDePrecoGeral.Id_material));

                var disjuncaoDasSubqueries = Restrictions.Disjunction()
                    .Add(Subqueries.WhereProperty<Material>(m => m.Id_material).In(subQueryCondicaoGeral));

                if (!string.IsNullOrEmpty(filtro.IdDoCliente))
                {
                    CondicaoDePrecoCliente condicaoDePrecoCliente = null;

                    QueryOver<CondicaoDePrecoCliente, CondicaoDePrecoCliente> subQueryCondicaoCliente = 
                        QueryOver.Of(() => condicaoDePrecoCliente)
                        .Where(() => condicaoDePrecoCliente.Id_cliente == filtro.IdDoCliente)
                        .And(c => c.Org_vendas == areaDeVenda.Org_vendas)
                        .And(c => c.Can_dist == areaDeVenda.Can_dist)
                        .Select(Projections.Property(() => condicaoDePrecoCliente.Id_material));

                    disjuncaoDasSubqueries.Add(Subqueries.WhereProperty<Material>(m => m.Id_material).In(subQueryCondicaoCliente) );

                    Cliente cliente = _clientes.BuscaPeloCodigo(filtro.IdDoCliente).Single();

                    CondicaoDePrecoRegiao condicaoDePrecoRegiao = null;

                    QueryOver<CondicaoDePrecoRegiao, CondicaoDePrecoRegiao> subQueryCondicaoRegiao = QueryOver.Of(() => condicaoDePrecoRegiao)
                        .Where(() => condicaoDePrecoRegiao.Regiao == cliente.Uf)
                        .Select(Projections.Property(() => condicaoDePrecoRegiao.Id_material));

                    disjuncaoDasSubqueries.Add(Subqueries.WhereProperty<Material>(m => m.Id_material).In(subQueryCondicaoRegiao));

                }

                queryOver = queryOver.Where(disjuncaoDasSubqueries);
            }

            MaterialCadastroVm materialCadastroVm = null;

            queryOver.SelectList(lista => lista
                .Select(x => material.pro_id_material).WithAlias(() => materialCadastroVm.Id)
                .Select(x => material.Id_material).WithAlias(() => materialCadastroVm.Id_material)
                .Select(x => material.Descricao).WithAlias(() => materialCadastroVm.Descricao)
                .Select(x => material.Id_centro).WithAlias(() => materialCadastroVm.Centro)
                .Select(x => material.Tip_mat).WithAlias(() => materialCadastroVm.Tipo)
                //.Select(() => unidadeDeMedida.Descricao ) .WithAlias(() => materialCadastroVm.UnidadeMedida)
                //.Select(x => unidadeDeMedida.Id_unidademedida /*+ " - " + unidadeDeMedida.Descricao */) .WithAlias(() => materialCadastroVm.UnidadeMedida)
                .Select(Projections.SqlFunction("concat", NHibernateUtil.String,
                    Projections.Property(() => unidadeDeMedida.Id_unidademedida),
                    Projections.Constant(" - "),
                    Projections.Property(() => unidadeDeMedida.Descricao)))
                .WithAlias(() => materialCadastroVm.UnidadeMedida)
                );

            var kendoGridVm = new KendoGridVm()
            {
                QuantidadeDeRegistros = queryOver.RowCount(),
                Registros = queryOver
                    .TransformUsing(Transformers.AliasToBean<MaterialCadastroVm>())
                    .Skip(paginacaoVm.Skip)
                    .Take(paginacaoVm.Take)
                    .List<MaterialCadastroVm>()
                    .Cast<ListagemVm>()
                    .ToList()


            };

            return kendoGridVm;

        }
        public KendoGridVm ListarTransportadoras(PaginacaoVm paginacaoVm, TransportadoraFiltroVm filtro)
        {
            IQueryOver<Fornecedor, Fornecedor> queryOverRetorno;
            IQueryOver<Fornecedor, Fornecedor> queryOverBase = AplicarFiltros(filtro,false);
            queryOverBase = queryOverBase.And(f => f.Grupo_contas == "ZTRA");

            Fornecedor fornecedor = null;

            TransportadoraDoCliente transportadoraDoCliente = null;

            QueryOver<TransportadoraDoCliente, TransportadoraDoCliente> subQueryCliente = QueryOver.Of(() => transportadoraDoCliente)
                .Where(Restrictions.EqProperty(Projections.Property(() => fornecedor.Codigo), Projections.Property(() => transportadoraDoCliente.Transportadora.Codigo)))
                .And(x => x.TipoDeParceiro == filtro.TipoDeParceiro)
                .And(x => x.Cliente.Id_cliente == filtro.IdDoCliente)
                .Select(Projections.Property(() => transportadoraDoCliente.TipoDeParceiro));

            var queryCliente =  queryOverBase.Clone().WithSubquery.WhereExists(subQueryCliente);

            queryOverRetorno = queryCliente;

            int quantidadeDeTransportadoras = queryCliente.RowCount();

            Usuario usuarioConectado = _usuarios.UsuarioConectado();

            if (quantidadeDeTransportadoras > 0)
            {

                if (filtro.IdDaAreaDeVenda.HasValue)
                {
                    AplicarFiltroDeAreaDeVenda(queryCliente, filtro.IdDaAreaDeVenda.Value);
                    quantidadeDeTransportadoras = queryCliente.RowCount();
                }

                queryOverRetorno = queryCliente;
            }
            else if (!string.IsNullOrEmpty(usuarioConectado.CodigoDoFornecedor))
            {

                TransportadoraDoRepresentante transportadoraDoRepresentante = null;

                QueryOver<TransportadoraDoRepresentante, TransportadoraDoRepresentante> subQuery = QueryOver.Of(() => transportadoraDoRepresentante)
                    .Where(Restrictions.EqProperty(Projections.Property(() => fornecedor.Codigo), Projections.Property(() => transportadoraDoRepresentante.Transportadora.Codigo)))
                    .And(x => x.TipoDeParceiro == filtro.TipoDeParceiro)
                    .And(x => x.Representante.Codigo == usuarioConectado.CodigoDoFornecedor)
                    .Select(Projections.Property(() => transportadoraDoRepresentante.TipoDeParceiro));

                var queryOverRepresentante = queryOverBase.Clone().WithSubquery.WhereExists(subQuery);

                if (filtro.IdDaAreaDeVenda.HasValue)
                {
                    AplicarFiltroDeAreaDeVenda(queryOverRepresentante, filtro.IdDaAreaDeVenda.Value);
                }

                quantidadeDeTransportadoras = queryOverRepresentante.RowCount();

                queryOverRetorno = queryOverRepresentante;

            }

            var kendoGridVm = new KendoGridVm
            {
                QuantidadeDeRegistros = quantidadeDeTransportadoras,
                Registros =
                    _builderFornecedor.BuildList(queryOverRetorno.Skip(paginacaoVm.Skip).Take(paginacaoVm.Take).List())
                        .Cast<ListagemVm>()
                        .ToList()

            };

            return kendoGridVm;


        }
        public KendoGridVm Listar(PaginacaoVm paginacaoVm, FornecedorFiltroVm filtro)
        {
            IQueryOver<Fornecedor, Fornecedor> queryOver = AplicarFiltros(filtro, true);

            var kendoGridVm = new KendoGridVm
            {
                QuantidadeDeRegistros = queryOver.RowCount(),
                Registros =
                    _builderFornecedor.BuildList(queryOver.Skip(paginacaoVm.Skip).Take(paginacaoVm.Take).List())
                        .Cast<ListagemVm>()
                        .ToList()

            };
            return kendoGridVm;
        }