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); } }