/// <summary>
 /// Atualiza a participacão de um usuário
 /// </summary>
 /// <param name="IdParticipacao">Id da Participação</param>
 /// <param name="participacao">participação do usuário (Autorizado ou Não Autorizado)</param>
 public static void AtualizarParticipacaoUsuario(int IdParticipacao, Autorizacao autorizacao, string Mensagem)
 {
     using (Escopo escopo = new Escopo(OpcaoTransacao.Requerido))
     {
         string sql = @"UPDATE CadeiaAutorizacao.UsuarioParticipacao
                      SET Usp_Autorizacao = @Autorizacao,
                          Usp_Mensagem = @Mensagem
                      WHERE Usp_Id = @IdParticipacao";
         BdUtil bd = new BdUtil(sql);
         bd.AdicionarParametro("@IdParticipacao", DbType.Int32, IdParticipacao);
         bd.AdicionarParametro("@Autorizacao", DbType.Int16, autorizacao);
         bd.AdicionarParametro("@Mensagem", DbType.String, Mensagem);
         bd.ExecuteNonQuery();
         // Verificando se a participacao do usuário finalizou a instância da cadeia
         // Aprovando ou Não aprovando
         int IdInstacia = ObterIDInstaciaPelaParticipacao(IdParticipacao);
         int respAutorizacao = VerificarAutorizacao(IdInstacia, IdParticipacao);
         AtualizarStatusInstancia(IdInstacia, respAutorizacao);
         if (respAutorizacao == 1 || respAutorizacao == 2)
         {
             //Executando o método do sistema indicando o resultado da autorização
             ExecutarMetodoSistema(IdParticipacao, autorizacao, Mensagem);
         }
         escopo.Terminar();
     }
 }
        /// <summary>
        /// Cria uma nova instância de cadeia de autorização (tabela: CadeiaAutorizacaoInstancia)
        /// Adicionando também as paticipações dos superiores hierárquicos do usuário participante
        /// </summary>
        /// <param name="IdCadeia">Id da cadeia de autorização</param>
        /// <param name="IdProprietario">Id do usuário proprietário da instância da cadeia</param>
        /// <param name="valor">valor</param>
        /// <param name="descricao">descrição (título)</param>
        /// <param name="conteudo">conteúdo da instância</param>
        /// <param name="parametrosFuncaoHierarquia">Coleção com os parâmetros para executar a função de hierarquia.
        /// deverá ser null quando a cadeia não possuir função armazenada de hierarquia</param>
        /// <returns>Id da instância cadeia. O sistema deverá armazenar este valor, pois quando
        /// esta instância de cadeia for finalizada este valor será fornecido
        /// ao método do sistema especificado em CadeiaAutorizacao.Cau_MetodoSistema
        /// </returns>
        public static int Incluir(int IdCadeia, int IdProprietario, float? valor,
            string descricao, string conteudo,
            CadeiaAutorizacaoDataSet.ParemetroFuncaoHierarquiaDataTable parametrosFuncaoHierarquia)
        {
            int IdInstancia = 0;
            using (Escopo escopo = new Escopo(OpcaoTransacao.Requerido))
            {
                IdInstancia = IncluirInstancia(descricao, DateTime.Now, StatusCadeia.Aberta, valor, conteudo,
                                                   IdCadeia, IdProprietario);

                // Recuperar os superiores do usuário (através da funções ou tabelas de hierarquia) e
                // para cada superior inserir uma linha na tabela UsuarioParticipante,
                // onde o usuário de maior hierarquia será o Responsável
                DataTable superiores = ObterSuperioresUsuario(IdCadeia, IdProprietario, parametrosFuncaoHierarquia);
                // Incluíndo a participação de cada superior
                for (int i = 0; i < superiores.Rows.Count; i++)
                {
                    DataRow superior = superiores.Rows[i];
                    // Se a hierarquia for descoberta através das tabelas
                    if (parametrosFuncaoHierarquia == null)
                    {
                        // A participação padrão é 2 = Colaborador
                        TipoParticipacao participacao = TipoParticipacao.Colaborador;
                        // O úlimo será o superior de mais alto nível, sendo o responsável
                        if (i == superiores.Rows.Count - 1)
                        {
                            participacao = TipoParticipacao.Responsavel;
                        }
                        // Adicionando a participação do superior
                        IncluirParticipante(IdInstancia, Convert.ToInt32(superior["IdSuperior"]), DateTime.Now, participacao);
                    }
                    else // Se a hierarquia for descoberta através de stored function
                    {
                        IncluirParticipante(IdInstancia, Convert.ToInt32(superior["IdSuperior"]), DateTime.Now, (TipoParticipacao) superior["Participacao"]);
                    }
                }
                escopo.Terminar();
            }
            return IdInstancia;
        }
 /// <summary>
 /// Adiciona um substituto para um usuário, copiando as participações para
 /// o substituto
 /// </summary>
 /// <param name="IdUsuario">Id do usuário</param>
 /// <param name="IdSubstituto">Id do substituto</param>
 public static void AdicionarSubstituto(int IdUsuario, int IdSubstituto)
 {
     using (Escopo escopo = new Escopo(OpcaoTransacao.Requerido))
     {
         // Inserir na tabela susbstituição
         InserirSubstituicao(IdUsuario, IdSubstituto);
         // Copiar as participações do usuário para o substituto
         CopiarParticipacoes(IdUsuario, IdSubstituto);
         escopo.Terminar();
     }
 }