Exemple #1
0
        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);
            }
        }