protected void PreencherComboQuestionario()
        {
            using (var rel = new RelatorioQuestionario())
            {
                var listaQuestionarios = rel.ListaQuestionario(ObterFiltro()).OrderBy(x => x.Nome).ToList();

                if (string.IsNullOrWhiteSpace(txtQuestionario.Text))
                {
                    ViewState["_Questionario"] = Helpers.Util.ObterListaAutocomplete(listaQuestionarios);

                    txtQuestionario.Text = "";
                }

                var idTipoQuestionario = 0;
                if (!int.TryParse(ddlTipoQuestionario.SelectedValue, out idTipoQuestionario))
                {
                    IList <TipoQuestionario> tiposQuestionario = null;

                    if (listaQuestionarios.Any())
                    {
                        var questionarioIDs = listaQuestionarios.Select(x => x.ID).ToList();
                        tiposQuestionario = new ManterTipoQuestionario().ObterTodosIQueryable()
                                            .Where(x => x.ListaQuestionario.Any(y => questionarioIDs.Contains(y.ID)))
                                            .OrderBy(x => x.Nome)
                                            .ToList();
                    }
                    else
                    {
                        tiposQuestionario = new ManterTipoQuestionario().ObterTodos().OrderBy(x => x.Nome).ToList();
                    }

                    WebFormHelper.PreencherLista(tiposQuestionario, ddlTipoQuestionario, true);
                }
            }
        }
        protected void txtQuestionario_OnTextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txtQuestionario.Text))
            {
                LimparCampos();
            }
            else
            {
                var idQuestionario = int.Parse(txtQuestionario.Text);

                if (idQuestionario == 0)
                {
                    WebFormHelper.ExibirMensagem(enumTipoMensagem.Atencao, "Questionário inválido selecionado.");
                }
                else
                {
                    using (var rel = new RelatorioQuestionario())
                    {
                        if (string.IsNullOrWhiteSpace(txtSolucaoEducacional.Text))
                        {
                            ViewState["_SE"] = Helpers.Util.ObterListaAutocomplete(rel.ListaSolucaoEducacional(idQuestionario));

                            txtSolucaoEducacional.Text = "";
                        }

                        LimparCampos();
                    }
                }
            }
        }
        private void GerarDadosRespondentes(DTORelatorioQuestionarioRespondente resultadoRespondente = null)
        {
            resultadoRespondente = resultadoRespondente ??
                                   (Cache["dsRelatorioRespondente"] as DTORelatorioQuestionarioRespondente);

            if (resultadoRespondente == null)
            {
                throw new AcademicoException("Relatório respondente não encontrado para exibição. Tente novamente");
            }

            // Dados padrões da consulta.
            var enunciados = resultadoRespondente.Enunciados.OrderBy(x => x.Id).ToList();
            var questoes   = resultadoRespondente.Questoes.OrderBy(x => x.IdEnunciado).ThenBy(x => x.Id).ToList();

            // As respostas não recebem as respostas diretamente. Elas recebem DTOs com as respostas.
            var dtoRespostas = RelatorioQuestionario.ConverterDtoRespostas(
                ParticipacoesPaginaAtual(resultadoRespondente.Consulta),
                questoes);

            rptEnunciados.DataSource = enunciados;
            rptQuestoes.DataSource   = questoes;
            rptRespostas.DataSource  = dtoRespostas;


            // Glory Bind.
            rptEnunciados.DataBind();
            rptQuestoes.DataBind();
            rptRespostas.DataBind();
        }
        /// <summary>
        /// Buscar dados estatísticos, a partir dos dados respondentes.
        /// </summary>
        public List <DTORelatorioQuestionarioEstatistico> ExecutarRelatorioEstatistico()
        {
            try
            {
                using (var rel = new RelatorioQuestionario())
                {
                    // Obtém primeiro os dados respondentes para calcular os dados estatísticos.
                    var dadosRespondentes = ExecutarRelatorioRespondente(false);

                    var resultado = rel.ObterRelatorioEstatistico(dadosRespondentes.Enunciados,
                                                                  dadosRespondentes.Questoes, dadosRespondentes.Consulta);

                    Cache["dsRelatorioEstatistico"] = resultado;

                    return(resultado);
                }
            }
            catch (AcademicoException ex)
            {
                WebFormHelper.ExibirMensagem(enumTipoMensagem.Alerta, ex.Message);
            }
            catch
            {
                WebFormHelper.ExibirMensagem(enumTipoMensagem.Alerta,
                                             "Resultado não pode ser processado, por favor adicione mais filtros.");
            }

            return(new List <DTORelatorioQuestionarioEstatistico>());
        }
        protected void ddlTipoQuestionario_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            using (var rel = new RelatorioQuestionario())
            {
                int idTipoQuestionario;

                if (int.TryParse(ddlTipoQuestionario.SelectedValue, out idTipoQuestionario))
                {
                    PreencherComboQuestionario();
                }
            }
        }
        protected void PreencherCombos(object sender, EventArgs e)
        {
            using (var rel = new RelatorioQuestionario())
            {
                ViewState["_Demandas"] = Helpers.Util.ObterListaAutocomplete(rel.ListaProcessos());

                switch (ObterTipoRelatorioSelecionado())
                {
                case enumTipoRelatorioResposta.Respondente:
                case enumTipoRelatorioResposta.Estatistico:

                    PreencherComboQuestionario();

                    ListBoxesStatus.PreencherItens(rel.ListaStatus(), "ID", "Nome");

                    if (ObterTipoRelatorioSelecionado() == enumTipoRelatorioResposta.Estatistico)
                    {
                        // Relatório estatístico sempre será de pesquisa.
                        ddlTipoQuestionario.SelectedValue = ((int)enumTipoQuestionario.Pesquisa).ToString();
                    }
                    else
                    {
                        WebFormHelper.PreencherLista(new ManterTipoQuestionario().ObterTodos().OrderBy(x => x.Nome).ToList(), ddlTipoQuestionario,
                                                     true);
                    }

                    txtQuestionario.Text = "";

                    LimparCampos();

                    break;

                case enumTipoRelatorioResposta.Consolidado:
                    var listaSe = rel.ListaSolucaoEducacionalPorCategorias(ucCategorias1.IdsCategoriasMarcadas);

                    ViewState["_SE"] = Helpers.Util.ObterListaAutocomplete(listaSe);

                    txtSolucaoEducacional.Text = "";

                    LimparCampos();

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
        }
        protected void txtOferta_OnTextChanged(object sender, EventArgs e)
        {
            using (var rel = new RelatorioQuestionario())
            {
                var filtro = ObterFiltro();

                if (filtro.IdOferta.HasValue)
                {
                    ViewState["_Turma"] = Helpers.Util.ObterListaAutocomplete(rel.ListaTurma(filtro));
                }

                txtTurma.Text = "";

                PreencherComboQuestionario();
            }
        }
        protected void cbxProfessor_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbxProfessor.SelectedIndex > 0)
            {
                using (var rel = new RelatorioQuestionario())
                {
                    var lista =
                        Helpers.Util.ObterListaAutocomplete(rel.ListaSolucaoEducacionalPorProfessor(ObterFiltro()));

                    ViewState["_SE"] = lista;

                    txtOferta.Text = "";

                    LimparCampos();
                }
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            // Persistir o preenchimento das soluções quando o relatório for Consolidado.
            if (ObterTipoRelatorioSelecionado() == enumTipoRelatorioResposta.Consolidado)
            {
                ucCategorias1.TreeNodeCheckChanged += PreencherCombos;
            }

            if (IsPostBack)
            {
                return;
            }

            // No primeiro load, define a página atual como 0.
            PaginaAtual = 1;

            using (var rel = new RelatorioQuestionario())
            {
                PreencherCombos(null, null);

                ucCategorias1.PreencherCategorias(false);

                if (RelatorioTutor)
                {
                    divDemandas.Visible             =
                        divTipoQuestionario.Visible =
                            divQuestionario.Visible = false;

                    // Relatório de tutor sempre será de pesquisa.
                    ddlTipoQuestionario.SelectedValue = ((int)enumTipoQuestionario.Pesquisa).ToString();

                    divTutor.Visible = true;

                    WebFormHelper.PreencherLista(rel.ListaProfessor(), cbxProfessor, false, true);

                    txtSolucaoEducacional.Attributes.Add("data-mensagemVazia", "Selecione um tutor");
                }

                ListBoxesUF.PreencherItens(rel.ListaUf(), "ID", "Nome");
                ListBoxesNivelOcupacional.PreencherItens(rel.ListaNivelOcupacional(), "ID", "Nome");

                var lista = rel.ListaSolucaoEducacional();
                ViewState["_SE"] = Helpers.Util.ObterListaAutocomplete(lista);
            }
        }
        /// <summary>
        /// Obter dados respondentes (perguntas e respostas dos usuários, agrupadas pelos nomes das questões.
        /// </summary>
        /// <returns></returns>
        public DTORelatorioQuestionarioRespondente ExecutarRelatorioRespondente(bool salvarEmChave = true)
        {
            using (var rel = new RelatorioQuestionario())
            {
                var dadosRespondentes = rel.ObterRelatorioRespondente(ObterFiltro());

                // Armazenar em Cache para ser utilizado posteriormente, caso necessário.
                if (salvarEmChave)
                {
                    Cache["dsRelatorioRespondente"] = dadosRespondentes;
                    Cache["camposSeremExibidosRelatorioRespondente"] =
                        chkListaCamposVisiveisRespondente.Items.Cast <ListItem>()
                        .Where(x => x.Selected)
                        .Select(x => x.Value)
                        .ToList();
                }

                // Obter todos os questionários com as respostas dos usuários.
                return(dadosRespondentes);
            }
        }
        protected void txtSolucaoEducacional_OnTextChanged(object sender, EventArgs e)
        {
            using (var rel = new RelatorioQuestionario())
            {
                var filtro = ObterFiltro();

                if (filtro.IdSolucaoEducacional != null)
                {
                    ViewState["_Oferta"] = Helpers.Util.ObterListaAutocomplete(rel.ListaOferta(filtro));
                }

                txtOferta.Text = "";

                PreencherComboQuestionario();

                var listaQuestionarios = new RelatorioQuestionario().ListaQuestionario(ObterFiltro()).OrderBy(x => x.Nome).ToList();

                IList <TipoQuestionario> tiposQuestionario = null;

                if (listaQuestionarios.Any())
                {
                    var questionarioIDs = listaQuestionarios.Select(x => x.ID).ToList();
                    tiposQuestionario = new ManterTipoQuestionario().ObterTodosIQueryable()
                                        .Where(x => x.ListaQuestionario.Any(y => questionarioIDs.Contains(y.ID)))
                                        .OrderBy(x => x.Nome)
                                        .ToList();
                }
                else
                {
                    tiposQuestionario = new ManterTipoQuestionario().ObterTodos().OrderBy(x => x.Nome).ToList();
                }

                WebFormHelper.PreencherLista(tiposQuestionario, ddlTipoQuestionario, true);


                LimparCampos();
            }
        }
        protected void rblTipoRelatorio_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            // Esconde todos os campos e os exibe de acordo com o tipo de relatório.
            divDemandas.Visible                                         =
                divTipoQuestionario.Visible                             =
                    divQuestionario.Visible                             =
                        divRelatorioRespondente.Visible                 =
                            divRelatorioEstatistico.Visible             =
                                divRelatorioConsolidado.Visible         =
                                    divStatus.Visible                   =
                                        divUf.Visible                   =
                                            divNivelOcupacional.Visible = false;

            // Limpar o evento e o postback da seleção da categoria, pois só serve para o consolidado.
            ucCategorias1.TreeNodeCheckChanged = null;

            ddlTipoQuestionario.Enabled = true;

            var tipoRelatorioSelecionado = ObterTipoRelatorioSelecionado();

            // Preencher os filtros personalizados de cada tipo de relatório.
            PreencherFiltros(tipoRelatorioSelecionado);

            switch (tipoRelatorioSelecionado)
            {
            case enumTipoRelatorioResposta.Respondente:
                filtroCamposExibidos.Visible = false;

                // Limpar e exibir drop de questionários.
                txtQuestionario.Text = "";
                LimparCampos();

                // Só exibe os campos abaixo se não for relatório de tutor.
                divDemandas.Visible             =
                    divTipoQuestionario.Visible =
                        divQuestionario.Visible = !RelatorioTutor;

                divStatus.Visible           = true;
                divUf.Visible               = true;
                divNivelOcupacional.Visible = true;

                break;

            case enumTipoRelatorioResposta.Estatistico:
                filtroCamposExibidos.Visible = true;

                // O relatório consolidado só funciona para relatórios do tipo de Pesquisa.
                ddlTipoQuestionario.Enabled       = false;
                ddlTipoQuestionario.SelectedValue = ((int)enumTipoQuestionario.Pesquisa).ToString();

                LimparCampos();

                // Limpar e exibir drop de questionários.
                txtQuestionario.Text = "";

                PreencherComboQuestionario();

                // Só exibe os campos abaixo se não for relatório de tutor.
                divDemandas.Visible             =
                    divTipoQuestionario.Visible =
                        divQuestionario.Visible = !RelatorioTutor;

                divStatus.Visible           = true;
                divUf.Visible               = true;
                divNivelOcupacional.Visible = true;

                break;

            case enumTipoRelatorioResposta.Consolidado:
                ucCategorias1.TreeNodeCheckChanged = PreencherCombos;

                filtroCamposExibidos.Visible = true;

                // Exibir diretamente a lista de Soluções Educacionais, sem precisar da listagem de questionários.
                using (var rel = new RelatorioQuestionario())
                {
                    var lista = rel.ListaSolucaoEducacional();

                    ViewState["_SE"] = Helpers.Util.ObterListaAutocomplete(lista);

                    txtSolucaoEducacional.Text = "";

                    LimparCampos();
                }

                break;
            }

            // Forçar a recriação das categorias.
            ucCategorias1.PreencherCategorias(false);
        }