/// <summary>
 /// Obtém os superiores de um usuário para uma determinada cadeia
 /// </summary>
 /// <param name="IdCadeia">Id da cadeia</param>
 /// <param name="IdUsuario">Id da cadeia</param>
 /// <param name="parametrosFuncaoHierarquia">Parâmetros para executar a store procedure para a hierarquia</param>
 /// <returns>Superiores do usuário, onde a última linha será o súperior de mais alto nível e responsável pela cadeia</returns>
 private static DataTable ObterSuperioresUsuario(int IdCadeia, int IdUsuario,
     CadeiaAutorizacaoDataSet.ParemetroFuncaoHierarquiaDataTable parametrosFuncaoHierarquia)
 {
     DataTable superiores = null;
     // Identificando o mecanismo para obter a hierarquia
     // Casdo seja através da função armazenada
     if (parametrosFuncaoHierarquia != null)
     {
         superiores = ObterSuperioresPorFuncao(IdCadeia, IdUsuario, parametrosFuncaoHierarquia);
     }
     else
     {
         // Caso seja através das tabelas de hierarquia
         superiores = ObterSuperioresPorTabelas(IdCadeia, IdUsuario);
     }
     return superiores;
 }
 /// <summary>
 /// Obtém os superiores do usuário executando a stored function de hierarquia
 /// </summary>
 /// <param name="IdCadeia">Id da cadeia</param>
 /// <param name="IdUsuario">Id do usuário</param>
 /// <param name="parametrosFuncaoHierarquia">Parâmetros para executar a stored function de hierarquia</param>
 /// <returns></returns>
 private static DataTable ObterSuperioresPorFuncao(int IdCadeia, int IdUsuario,
     CadeiaAutorizacaoDataSet.ParemetroFuncaoHierarquiaDataTable parametrosFuncaoHierarquia)
 {
     // Obtendo o nome da funcao para a hierarquia da cadeia
     string nomeFuncao = ObterNomeFuncaHierarquia(IdCadeia);
     if (string.IsNullOrEmpty(nomeFuncao))
     {
         throw new SecvException("Função de hirarquia não encontrada");
     }
     BdUtil bd = new BdUtil(nomeFuncao);
     //bd.Command.CommandType = CommandType.Text;// StoredProcedure;
     // Preparando os parâmetros
     foreach (DataRow parametro in parametrosFuncaoHierarquia)
     {
         string nome = parametro["nome"].ToString();
         DbType tipo = (DbType)Enum.Parse(typeof(DbType), parametro["tipo"].ToString(), true);
         object valor = parametro["valor"];
         bd.AdicionarParametro(nome, tipo, valor);
     }
     return bd.ObterDataTable();
 }
 public static System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(System.Xml.Schema.XmlSchemaSet xs) {
     System.Xml.Schema.XmlSchemaComplexType type = new System.Xml.Schema.XmlSchemaComplexType();
     System.Xml.Schema.XmlSchemaSequence sequence = new System.Xml.Schema.XmlSchemaSequence();
     CadeiaAutorizacaoDataSet ds = new CadeiaAutorizacaoDataSet();
     xs.Add(ds.GetSchemaSerializable());
     System.Xml.Schema.XmlSchemaAny any1 = new System.Xml.Schema.XmlSchemaAny();
     any1.Namespace = "http://www.w3.org/2001/XMLSchema";
     any1.MinOccurs = new decimal(0);
     any1.MaxOccurs = decimal.MaxValue;
     any1.ProcessContents = System.Xml.Schema.XmlSchemaContentProcessing.Lax;
     sequence.Items.Add(any1);
     System.Xml.Schema.XmlSchemaAny any2 = new System.Xml.Schema.XmlSchemaAny();
     any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
     any2.MinOccurs = new decimal(1);
     any2.ProcessContents = System.Xml.Schema.XmlSchemaContentProcessing.Lax;
     sequence.Items.Add(any2);
     System.Xml.Schema.XmlSchemaAttribute attribute1 = new System.Xml.Schema.XmlSchemaAttribute();
     attribute1.Name = "namespace";
     attribute1.FixedValue = ds.Namespace;
     type.Attributes.Add(attribute1);
     System.Xml.Schema.XmlSchemaAttribute attribute2 = new System.Xml.Schema.XmlSchemaAttribute();
     attribute2.Name = "tableTypeName";
     attribute2.FixedValue = "ParemetroFuncaoHierarquiaDataTable";
     type.Attributes.Add(attribute2);
     type.Particle = sequence;
     return type;
 }
        /// <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;
        }
 public static System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(System.Xml.Schema.XmlSchemaSet xs) {
     CadeiaAutorizacaoDataSet ds = new CadeiaAutorizacaoDataSet();
     System.Xml.Schema.XmlSchemaComplexType type = new System.Xml.Schema.XmlSchemaComplexType();
     System.Xml.Schema.XmlSchemaSequence sequence = new System.Xml.Schema.XmlSchemaSequence();
     xs.Add(ds.GetSchemaSerializable());
     System.Xml.Schema.XmlSchemaAny any = new System.Xml.Schema.XmlSchemaAny();
     any.Namespace = ds.Namespace;
     sequence.Items.Add(any);
     type.Particle = sequence;
     return type;
 }