/// <summary>
        /// Executes the current collection of registered commands
        /// </summary>
        /// <remarks>
        /// Opens the connection, begins a transaction, initializes all command, then executes each command.  Finally commits transaction.
        /// Upon failure, transaction is rolled-back.  Null commands automatically return 1 for execution.
        /// </remarks>
        /// <returns>List of integers returned from each registered command</returns>
        public List <int> Execute()
        {
            List <int> retVal = new List <int>();

            using (Microsoft.Data.SqlClient.SqlConnection conn = new Microsoft.Data.SqlClient.SqlConnection(_ConnectionString))
            {
                conn.Open();
                Microsoft.Data.SqlClient.SqlTransaction trans = conn.BeginTransaction();
                try
                {
                    int initialized = _Commands.Count;
                    for (int i = 0; i < initialized; i++)
                    {
                        if (_Commands[i] != null)
                        {
                            _Commands[i].Initialize(conn, trans);
                        }
                    }
                    for (int i = 0; i < _Commands.Count; i++)
                    {
                        if (_Commands[i] != null)
                        {
                            //  This following line allows for chaining.
                            //  in other words, a executing command can add more commands.
                            if (i >= initialized)
                            {
                                _Commands[i].Initialize(conn, trans);
                            }
                            retVal.Add(_Commands[i].Execute());
                        }
                        else
                        {
                            retVal.Add(1);
                        }
                    }
                    trans.Commit();
                }
                catch (Exception)
                {
                    try { trans.Rollback(); } catch (Exception) { }
                    throw;
                }
                finally
                {
                    _Commands.Clear();
                }
            }
            return(retVal);
        }
        private void CorrigirOrdens(long idSuperior)
        {
            var   itens      = Filter(item => item.IdSuperior == idSuperior).OrderBy(it => it.Ordem).ToList();
            var   strBuilder = new StringBuilder();
            short ordem      = 0;

            foreach (var it in itens)
            {
                ordem++;
                if (ordem != it.Ordem)
                {
                    strBuilder.AppendLine($"update ProjetoEstruturaOrganizacional set Ordem = {ordem} where Id = {it.Id};");
                }
            }

            if (strBuilder.Length > 0)
            {
                Exception excSql = null;
                using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString);
                connection.Open();
                var transaction = connection.BeginTransaction();
                using (var command = new Microsoft.Data.SqlClient.SqlCommand(strBuilder.ToString(), connection, transaction))
                {
                    try
                    {
                        command.ExecuteNonQuery();
                        transaction.Commit();
                    }
                    catch (Exception exc)
                    {
                        excSql = exc;
                        transaction.Rollback();
                    }
                }

                connection.Close();
                if (excSql != null)
                {
                    throw excSql;
                }
            }
        }
        protected override void AfterUpdate(Indicador oldValue, Indicador newValue)
        {
            if (oldValue.Identificador != newValue.Identificador && oldValue.TipoCalculo == TipoCalculo.NaoCalculado)
            {
                Exception excSql            = null;
                string    termoPesquisa     = $"[{oldValue.Identificador}]";
                string    novoIdentificador = $"[{newValue.Identificador}]";
                using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString);
                connection.Open();
                var    transaction = connection.BeginTransaction();
                string sqlUpdate   = $"update Indicador set Formula = replace(Formula, '{termoPesquisa}', '{novoIdentificador}') where TipoCalculo <> 1 and Formula like '%{termoPesquisa}%'";
                using (var command = new Microsoft.Data.SqlClient.SqlCommand(sqlUpdate, connection, transaction))
                {
                    try
                    {
                        command.ExecuteNonQuery();
                        transaction.Commit();
                    }
                    catch (Exception exc)
                    {
                        excSql = exc;
                        transaction.Rollback();
                    }
                }

                connection.Close();
                if (excSql != null)
                {
                    throw excSql;
                }
            }

            if (oldValue.Corporativo && !newValue.Corporativo)
            {
                var lista    = projetoEstruturaOrganizacionalRepository.Filter(item => item.Tipo == TipoProjetoEstruturaOrganizacional.Corporativo && item.IdIndicador == newValue.Id);
                var listaIds = new List <long>();
                lista?.ToList()?.ForEach(item => listaIds.Add(item.Id));
                projetoEstruturaOrganizacionalRepository.DeleteMany(listaIds);
            }
        }
        public void AvancarNivel(long id, long idSuperior)
        {
            CorrigirOrdens(idSuperior);
            var itens = Filter(item => item.IdSuperior == idSuperior).OrderBy(it => it.Ordem).ToList();

            if (itens.Last().Id == id)
            {
                throw new Exception("Item não pode avançar.");
            }
            short ordem          = itens.First(it => it.Id == id).Ordem;
            long  idAfterElement = itens.First(it => it.Ordem == ordem + 1).Id;

            Exception excSql = null;

            using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString);
            connection.Open();
            var    transaction = connection.BeginTransaction();
            string sql         = $"update ProjetoEstruturaOrganizacional set Ordem = {ordem + 1} where Id = {id}; update ProjetoEstruturaOrganizacional set Ordem = {ordem} where Id = {idAfterElement};";

            using (var command = new Microsoft.Data.SqlClient.SqlCommand(sql, connection, transaction))
            {
                try
                {
                    command.ExecuteNonQuery();
                    transaction.Commit();
                }
                catch (Exception exc)
                {
                    excSql = exc;
                    transaction.Rollback();
                }
            }

            connection.Close();
            if (excSql != null)
            {
                throw excSql;
            }
        }
예제 #5
0
        public async Task <IActionResult> registerStudent(StdEnr input)
        {
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlCommand    com  = new SqlCommand();
            Study         study;

            {
                com.Connection  = conn;
                com.CommandText = "select IdStudy, Name from Studies where Name = @name";

                com.Parameters.AddWithValue("name", input.Studies);

                conn.Open();

                try
                {
                    SqlDataReader dataReader = await com.ExecuteReaderAsync();

                    await dataReader.ReadAsync();

                    study = new Study
                    {
                        IdStudy = int.Parse(dataReader["IdStudy"].ToString()),
                        Name    = dataReader["Name"].ToString()
                    };
                    if (study == null)
                    {
                        return(BadRequest());
                    }
                }
                catch
                {
                    return(null);
                }
            }
            conn = new SqlConnection(_connectionString);
            com  = new SqlCommand();

            conn.Open();
            SqlTransaction transaction = conn.BeginTransaction();

            com.Connection  = conn;
            com.Transaction = transaction;
            com.CommandText =
                @"declare @enrollmentId int
                      select
                          @enrollmentId = e.IdEnrollment
                      from Enrollment e
                          left join Studies s on e.IdStudy = s.IdStudy
                      where e.IdStudy = @studyId and e.Semester = 1
                      
                      if @enrollmentId is null
                      begin

                          select @enrollmentId = max(IdEnrollment) + 1 from Enrollment
                          insert into Enrollment values (@enrollmentId, 1, @studyId, getdate());

                      end

                      insert into Student values (@index, @firstName, @lastName, @birthDate, @enrollmentId)";

            com.Parameters.AddWithValue("studyId", study.IdStudy);
            com.Parameters.AddWithValue("index", input.IndexNumber);
            com.Parameters.AddWithValue("firstName", input.FirstName);
            com.Parameters.AddWithValue("lastName", input.LastName);
            com.Parameters.AddWithValue("birthDate", input.BirthDate);

            try
            {
                await com.ExecuteNonQueryAsync();

                await transaction.CommitAsync();
            }
            catch (Exception e)
            {
                await transaction.RollbackAsync();
            }

            return(StatusCode(200));
        }
        public ImpotacaoLancamentosDto GerarLancamentos(IEnumerable <ImpotacaoLancamentos> lancamentos)
        {
            var builderErros  = new System.Text.StringBuilder();
            var builderStatus = new System.Text.StringBuilder();
            var comandos      = new List <Tuple <string, decimal, decimal, long?> >();
            int numeroLinha   = 0;

            foreach (var item in lancamentos)
            {
                numeroLinha++;
                var erros   = new System.Text.StringBuilder();
                var projeto = databaseContext.Projeto.FirstOrDefault(it => it.Id == item.IdProjeto);

                if (projeto is null)
                {
                    erros.Append(" O ID de projeto não existe. ");
                }

                var dataAtual = DateTime.UtcNow.Date;
                if (!projeto.Ativo || projeto.DataInicio.Date > dataAtual || projeto.DataTermino < dataAtual)
                {
                    erros.Append(" O projeto deve estar ativo e dentro da vigência atual. ");
                }

                var indicador = databaseContext.Indicador.FirstOrDefault(it => it.Identificador == item.Identificador);
                if (indicador is null)
                {
                    erros.Append(" O identificador não existe. ");
                }

                if (erros.Length > 1)
                {
                    builderErros.AppendLine($"A linha {numeroLinha} está com problema(s): '{erros.ToString()}'.");
                }
                else if (builderErros.Length == 0)
                {
                    var     lancamento     = databaseContext.IndicadorLancamentos.FirstOrDefault(it => it.IdProjeto == item.IdProjeto && it.IdIndicador == indicador.Id && it.Ano == item.Ano && it.Mes == item.Mes);
                    decimal valorMeta      = 0.00m;
                    decimal valorRealizado = 0.00m;
                    string  status         = "Valor da meta e valor do realizado foram zerados porque o tipo de cálculo do indicador está definido como 'Meta e realizado calculados'.";

                    if (indicador.TipoCalculo == TipoCalculo.NaoCalculado)
                    {
                        valorMeta      = item.ValorMeta;
                        valorRealizado = item.ValorRealizado;
                        status         = string.Empty;
                    }
                    else if (indicador.TipoCalculo == TipoCalculo.SomenteMeta)
                    {
                        valorRealizado = item.ValorRealizado;
                        status         = "Valor da meta foi zerado porque o tipo de cálculo do indicador está definido como 'Meta calculada'.";
                    }
                    else if (indicador.TipoCalculo == TipoCalculo.SomenteRealizado)
                    {
                        valorMeta = item.ValorMeta;
                        status    = "Valor do realizado foi zerado porque o tipo de cálculo do indicador está definido como 'Realizado calculado'.";
                    }

                    if (lancamento is null)
                    {
                        comandos.Add(new Tuple <string, decimal, decimal, long?>($"insert into IndicadorLancamento (IdProjeto, IdIndicador, Ano, Mes, ValorMeta, ValorRealizado) values ({item.IdProjeto}, {indicador.Id}, {item.Ano}, {item.Mes}, @p1, @p2);", valorMeta, valorRealizado, null));
                        builderStatus.Append($"<p style='color:green'>A linha {numeroLinha} foi <b>inserida</b> com sucesso. (<i style='color:orange'>{status}</i>)</p><br/>").Replace("(<i style='color:orange'></i>)", string.Empty);
                    }
                    else
                    {
                        comandos.Add(new Tuple <string, decimal, decimal, long?>("update IndicadorLancamento set ValorMeta = @p1, ValorRealizado = @p2 where Id = @p3;", valorMeta, valorRealizado, lancamento.Id));
                        builderStatus.Append($"<p style='color:blue'>A linha {numeroLinha} foi <b>atualizada</b> com sucesso. (<i style='color:orange'>{status}</i>)</p><br/>").Replace("(<i style='color:orange'></i>)", string.Empty);
                    }
                }
            }

            if (builderErros.Length > 1)
            {
                return(new ImpotacaoLancamentosDto
                {
                    Sucesso = false,
                    Mensagem = builderErros.ToString().Replace(Environment.NewLine, "<br/>")
                });
            }

            string erro = null;

            using var context = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString);
            context.Open();
            using var transaction = context.BeginTransaction();
            foreach (var item in comandos)
            {
                using var cmd = new Microsoft.Data.SqlClient.SqlCommand(item.Item1, context, transaction);
                try
                {
                    cmd.Parameters.AddWithValue("p1", item.Item2);
                    cmd.Parameters.AddWithValue("p2", item.Item3);

                    if (item.Item4.HasValue)
                    {
                        cmd.Parameters.AddWithValue("p3", item.Item4.Value);
                    }

                    cmd.ExecuteNonQuery();
                }
                catch (Exception exc)
                {
                    erro = exc.Message;
                    break;
                }
            }

            try
            {
                if (erro is null)
                {
                    transaction.Commit();
                }
                else
                {
                    transaction.Rollback();
                }

                context.Close();
            }
            catch { }

            if (erro != null)
            {
                return(new ImpotacaoLancamentosDto
                {
                    Sucesso = false,
                    Mensagem = erro
                });
            }

            return(new ImpotacaoLancamentosDto
            {
                Sucesso = true,
                Mensagem = builderStatus.ToString()
            });
        }