private async void btnImportar_Click(object sender, EventArgs e) { if (_questaoConstructoDtos is null || !_questaoConstructoDtos.Any()) { MessageBox.Show("Importe a tabela de fatores associados antes.", "Erro na importação", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var service = _importacaoDeQuestionariosDeFatoresAssociadosFactory.Create(rdbDRE.Checked, rdbEscola.Checked, rdbSME.Checked, _questaoConstructoDtos); if (service is null) { MessageBox.Show("Não foi possível criar o serviço para a importação.", "Erro na importação", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var questionario = cmbQuestionario.SelectedItem.ToString(); var questionarioId = int.Parse(questionario.Substring(0, questionario.IndexOf(" -"))); var dto = new ImportacaoDeQuestionariosDeFatoresAssociadosDto { Edicao = txtAno.Text, CaminhoDaPlanilha = txtArquivo.Text, QuestionarioId = questionarioId }; await service.ImportarAsync(dto); if (!dto.IsValid()) { MessageBox.Show(dto.Erros.FirstOrDefault(), "Erro na importação", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } MessageBox.Show("Importação realizada com sucesso.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); }
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 _fatorAssociadoQuestionarioRespostaEscolaRepository.GetNextPk(); var respostasEscola = dtQuestionario .AsEnumerable() .Where(row => !string.IsNullOrWhiteSpace(row["Resposta"].ToString())) .Select(row => new FatorAssociadoQuestionarioRespostaEscolaDto { 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(), EscCodigo = row["esc_codigo"].ToString() }) .ToList(); var respostasEscolaAgrupadas = respostasEscola .GroupBy(x => new { x.AnoEscolar, x.UadSigla, x.Questao, x.EscCodigo }) .Select(x => new { x.Key.AnoEscolar, x.Key.Questao, x.Key.UadSigla, x.Key.EscCodigo, Quantidade = x.Sum(y => y.Quantidade) }) .ToList(); var entities = new List <FatorAssociadoQuestionarioRespostaEscola>(); var entitiesConstructos = new List <FatorAssociadoQuestionarioRespostaEscolaConstructo>(); respostasEscola .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, respostasEscolaAgrupadas.First(z => z.AnoEscolar == x.AnoEscolar && z.Questao == x.Questao && z.UadSigla == x.UadSigla && z.EscCodigo == x.EscCodigo) .Quantidade); var constructosRelacionados = GetConstructosRelacionados(dto.Edicao, cicloId, x.AnoEscolar, x.Questao, constructos); var entity = new FatorAssociadoQuestionarioRespostaEscola { Id = nextPK++, AnoEscolar = x.AnoEscolar, CicloId = cicloId, Edicao = dto.Edicao, EscCodigo = x.EscCodigo, 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 FatorAssociadoQuestionarioRespostaEscolaConstructo { ConstructoId = y.ConstructoId, FatorAssociadoQuestionarioRespostaEscolaId = entity.Id }) .ToList(); entitiesConstructos.AddRange(dreConstructos); } }); await _fatorAssociadoQuestionarioRespostaEscolaRepository.InsertAsync(entities); await _fatorAssociadoQuestionarioRespostaEscolaConstructoRepository.InsertAsync(entitiesConstructos); } catch (Exception ex) { dto.AddErro(ex.InnerException?.Message ?? ex.Message); } }