Ejemplo n.º 1
0
        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);

                _nextPKSME = await _fatorAssociadoQuestionarioRespostaSMERepository.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 agrupamentosPorAnoEscolarEOpcao = _dtRespostas
                                                          .AsEnumerable()
                                                          .Where(row => !string.IsNullOrWhiteSpace(row[$"q{numQuestao}"].ToString()) && row[$"q{numQuestao}"].ToString() != "*")
                                                          .GroupBy(row => new { AnoEscolar = int.Parse(row["AnoEscolar"].ToString()), Alternativa = row[$"q{numQuestao}"].ToString() })
                                                          .Select(x => new
                    {
                        x.Key.AnoEscolar,
                        x.Key.Alternativa,
                        Quantidade = x.Count()
                    })
                                                          .ToList();

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

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

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

                            var quantidadeDaOpcao = agrupamentosPorAnoEscolarEOpcao
                                                    .FirstOrDefault(x => x.AnoEscolar == agrupamentoPorAnoEscolar.AnoEscolar && x.Alternativa == opcao.Letra)
                                                    ?.Quantidade;

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

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

                            _entitiesSME.Add(entity);
                        }
                    }
                }

                await _fatorAssociadoQuestionarioRespostaSMERepository.InsertAsync(_entitiesSME);
            }
            catch (Exception ex)
            {
                dto.AddErro(ex.InnerException?.Message ?? ex.Message);
            }
        }
        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 _fatorAssociadoQuestionarioRespostaSMERepository.GetNextPk();

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

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

                var entities            = new List <FatorAssociadoQuestionarioRespostaSME>();
                var entitiesConstructos = new List <FatorAssociadoQuestionarioRespostaSMEConstructo>();

                respostasSME
                .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,
                                                              respostasSMEAgrupadas.First(z => z.AnoEscolar == x.AnoEscolar && z.Questao == x.Questao).Quantidade);
                    var constructosRelacionados = GetConstructosRelacionados(dto.Edicao, cicloId, x.AnoEscolar, x.Questao, constructos);

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

                    entities.Add(entity);

                    if (constructosRelacionados?.Any() ?? false)
                    {
                        var SMEConstructos = constructosRelacionados
                                             .Select(y => new FatorAssociadoQuestionarioRespostaSMEConstructo
                        {
                            ConstructoId = y.ConstructoId,
                            FatorAssociadoQuestionarioRespostaSMEId = entity.Id
                        })
                                             .ToList();

                        entitiesConstructos.AddRange(SMEConstructos);
                    }
                });

                await _fatorAssociadoQuestionarioRespostaSMERepository.InsertAsync(entities);

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