public async Task ImportarAsync(ImportacaoDeQuestionariosDeFatoresAssociadosDto dto)
        {
            if (dto is null)
            {
                dto = new ImportacaoDeQuestionariosDeFatoresAssociadosDto();
                dto.AddErro("O DTO é nulo.");
                return;
            }

            if (_questaoConstructoDtos is null || !_questaoConstructoDtos.Any())
            {
                dto.AddErro("Importe a tabela de fatores associados antes.");
                return;
            }

            try
            {
                var dtQuestionario = CsvManager.GetCsvFile(dto.CaminhoDaPlanilha);
                if (dtQuestionario.Rows.Count <= 0)
                {
                    dto.AddErro("Não existem regitros na planilha para exportação.");
                    return;
                }

                var constructos = await _constructoRepository.GetAsync(dto.Edicao);

                var ciclosAnoEscolar = await _cicloAnoEscolarRepository.GetAsync();

                var questionarioItens = await _questionarioItemRepository.GetAsync(dto.QuestionarioId);

                var nextPK = await _fatorAssociadoQuestionarioRespostaDRERepository.GetNextPk();

                var respostasDRE = dtQuestionario
                                   .AsEnumerable()
                                   .Where(row => !string.IsNullOrWhiteSpace(row["Resposta"].ToString()))
                                   .Select(row => new FatorAssociadoQuestionarioRespostaDREDto
                {
                    AnoEscolar = int.Parse(row["AnoEscolar"].ToString()),
                    Quantidade = decimal.Parse(row["Quantidade"].ToString()),
                    Questao    = int.Parse(row["Questao"].ToString()),
                    Resposta   = row["Resposta"].ToString(),
                    UadSigla   = row["uad_sigla"].ToString(),
                })
                                   .ToList();

                var respostasDREAgrupadas = respostasDRE
                                            .GroupBy(x => new { x.AnoEscolar, x.UadSigla, x.Questao })
                                            .Select(x => new
                {
                    x.Key.AnoEscolar,
                    x.Key.Questao,
                    x.Key.UadSigla,
                    Quantidade = x.Sum(y => y.Quantidade)
                })
                                            .ToList();

                var entities            = new List <FatorAssociadoQuestionarioRespostaDRE>();
                var entitiesConstructos = new List <FatorAssociadoQuestionarioRespostaDREConstructo>();

                respostasDRE
                .ForEach(x =>
                {
                    var questionarioItem = questionarioItens.FirstOrDefault(y => y.Numero == x.Questao);
                    var cicloId          = ciclosAnoEscolar.First(z => z.AnoEscolar == x.AnoEscolar).CicloId;
                    var valor            = GetValorPercentual(x.Quantidade,
                                                              respostasDREAgrupadas.First(z => z.AnoEscolar == x.AnoEscolar && z.Questao == x.Questao && z.UadSigla == x.UadSigla).Quantidade);
                    var constructosRelacionados = GetConstructosRelacionados(dto.Edicao, cicloId, x.AnoEscolar, x.Questao, constructos);

                    var entity = new FatorAssociadoQuestionarioRespostaDRE
                    {
                        Id         = nextPK++,
                        AnoEscolar = x.AnoEscolar,
                        CicloId    = cicloId,
                        Edicao     = dto.Edicao,
                        FatorAssociadoQuestionarioId = FatorAssociadoQuestionarioIdEstudante,
                        ItemDescricao     = GetItemDescricao(questionarioItem, x),
                        ItemId            = GetItemId(questionarioItem, x),
                        UadSigla          = x.UadSigla,
                        Valor             = valor,
                        VariavelDescricao = $"{x.Questao} - {questionarioItem.Enunciado}",
                        VariavelId        = x.Questao.ToString()
                    };

                    entities.Add(entity);

                    if (constructosRelacionados?.Any() ?? false)
                    {
                        var dreConstructos = constructosRelacionados
                                             .Select(y => new FatorAssociadoQuestionarioRespostaDREConstructo
                        {
                            ConstructoId = y.ConstructoId,
                            FatorAssociadoQuestionarioRespostaDREId = entity.Id
                        })
                                             .ToList();

                        entitiesConstructos.AddRange(dreConstructos);
                    }
                });

                await _fatorAssociadoQuestionarioRespostaDRERepository.InsertAsync(entities);

                await _fatorAssociadoQuestionarioRespostaDREConstructoRepository.InsertAsync(entitiesConstructos);
            }
            catch (Exception ex)
            {
                dto.AddErro(ex.InnerException?.Message ?? ex.Message);
            }
        }
        public async Task ImportarAsync(ImportacaoDeQuestionariosDeFatoresAssociadosFamiliaDto dto, IEnumerable <QuestaoConstructoDto> questaoConstructoDtos)
        {
            if (dto is null)
            {
                dto = new ImportacaoDeQuestionariosDeFatoresAssociadosFamiliaDto();
                dto.AddErro("O DTO é nulo.");
                return;
            }

            try
            {
                _questaoConstructoDtos = questaoConstructoDtos;

                var questionarioItens = MontarQuestoes(dto);
                if (!dto.IsValid())
                {
                    return;
                }
                if (questionarioItens is null || !questionarioItens.Any())
                {
                    return;
                }

                if (_dtRespostas.Rows.Count <= 0)
                {
                    dto.AddErro("Não existem regitros na planilha para exportação.");
                    return;
                }

                var ciclosAnoEscolar = await _cicloAnoEscolarRepository.GetAsync();

                var constructos = await _constructoRepository.GetAsync(dto.Edicao);

                _nextPKDRE = await _fatorAssociadoQuestionarioRespostaDRERepository.GetNextPk();

                for (var numQuestao = 1; numQuestao <= 61; numQuestao++)
                {
                    var questao = questionarioItens.FirstOrDefault(x => x.Numero == numQuestao);
                    if (questao is null)
                    {
                        dto.AddErro("Questão não encontrada.");
                        continue;
                    }

                    var agrupamentosPorAnoEscolarUadEOpcao = _dtRespostas
                                                             .AsEnumerable()
                                                             .Where(row => !string.IsNullOrWhiteSpace(row[$"q{numQuestao}"].ToString()) && row[$"q{numQuestao}"].ToString() != "*")
                                                             .GroupBy(row => new { AnoEscolar = int.Parse(row["AnoEscolar"].ToString()), UadSigla = row["cod_DRE"].ToString(), Alternativa = row[$"q{numQuestao}"].ToString() })
                                                             .Select(x => new
                    {
                        x.Key.AnoEscolar,
                        x.Key.UadSigla,
                        x.Key.Alternativa,
                        Quantidade = x.Count()
                    })
                                                             .ToList();

                    var agrupamentosPorAnoEscolarEUad = agrupamentosPorAnoEscolarUadEOpcao
                                                        .GroupBy(x => new { x.AnoEscolar, x.UadSigla })
                                                        .Select(x => new
                    {
                        x.Key.AnoEscolar,
                        x.Key.UadSigla,
                        Quantidade = x.Sum(y => y.Quantidade)
                    })
                                                        .ToList();

                    foreach (var agrupamentoPorAnoEscolarEUad in agrupamentosPorAnoEscolarEUad)
                    {
                        if (agrupamentoPorAnoEscolarEUad.AnoEscolar == 0)
                        {
                            continue;
                        }
                        var cicloId = ciclosAnoEscolar.First(x => x.AnoEscolar == agrupamentoPorAnoEscolarEUad.AnoEscolar).CicloId;

                        foreach (var opcao in questao.Opcoes)
                        {
                            if (opcao.Letra == "NR")
                            {
                                continue;
                            }

                            var quantidadeDaOpcao = agrupamentosPorAnoEscolarUadEOpcao
                                                    .FirstOrDefault(x => x.AnoEscolar == agrupamentoPorAnoEscolarEUad.AnoEscolar &&
                                                                    x.UadSigla == agrupamentoPorAnoEscolarEUad.UadSigla &&
                                                                    x.Alternativa == opcao.Letra)
                                                    ?.Quantidade;

                            var valor = quantidadeDaOpcao is null
                                ? 0m
                                : (quantidadeDaOpcao.Value * 100m) / agrupamentoPorAnoEscolarEUad.Quantidade;

                            var entity = new FatorAssociadoQuestionarioRespostaDRE
                            {
                                AnoEscolar = agrupamentoPorAnoEscolarEUad.AnoEscolar,
                                CicloId    = cicloId,
                                Edicao     = dto.Edicao,
                                FatorAssociadoQuestionarioId = 6,
                                Id                = _nextPKDRE++,
                                ItemDescricao     = opcao.Descricao,
                                ItemId            = opcao.Numero,
                                UadSigla          = agrupamentoPorAnoEscolarEUad.UadSigla,
                                Valor             = valor,
                                VariavelDescricao = questao.Enunciado,
                                VariavelId        = questao.Numero.ToString()
                            };

                            _entitiesDRE.Add(entity);
                        }
                    }
                }

                await _fatorAssociadoQuestionarioRespostaDRERepository.InsertAsync(_entitiesDRE);
            }
            catch (Exception ex)
            {
                dto.AddErro(ex.InnerException?.Message ?? ex.Message);
            }
        }