Páginas filhas
  • Integração RM x SmartLink Behavior Sharing - Visão desenvolvedor

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

O desenvolvimento e manutenção dos publicadores e consumidores de mensagens são de responsabilidade das equipes de segmentos. Os artefatos genéricos que controlam a fila de execução das mensagens são de responsabilidade da equipe de Framework.

...

...

Para que uma classe seja um provedor publicador de proteção de dadosmensagens, ,   deve-se atender aos pré-requisitos listados abaixo:

...

  1. Criar um projeto (classLibrary .NET) na solution do segmento em questão, com o seguinte padrão de nome: RM.[Segmento].XXX.DataProtectionSmartLink.ProviderService.
    1. Exemplo: RM.Glb.RHUSGDP.DataProtectionSmartLink.ProviderService.dll
  2. Adicionar referência para a dll "RM.GlbLib.DataProtection.ServiceSmartLink.dll";
  3. Criar uma classe que receba em seu construtor instâncias para as seguintes interfaces:

    1. "IRMSSmartLinkPublisherService": objeto responsável em incluir a mensagem na fila do RM.SmartLink.Client;

    2. "IRMSLogger": objeto usado para incluir logs relacionados à regra de negócio em questão. 
      Informações

      Esses logs serão persistidos automaticamente na tabela "GTotvsLinkLog"

       
    3. contenha métodos de construção da mensagem em questãoresponsável por conter métodos que herdando da ancestral "GlbDataProtectionProviderBase". O tipo genérico "Identifier" deve ser usado conforme descrito abaixo.

  4. A classe "GlbDataProtectionProviderBase" herda da classe RMSObject da Lib. Consequentemente, as classes de "providers" poderão chamar os métodos "CreateFacade" e "CreateModule" dentro de suas estruturas.
  5. Carimbar a classe com o atributo "GlbDataProtectionRoleAttr". Nesse atributo, devem ser informados os dados abaixo:
    1. Identificador único do provedor (novo guid);
    2. Nome do papel (essa informação será mostrada para o usuário no sistema LGDP que está sendo criado pela Totvs);
    3. Linha do Produto (RM,TREPORTS, etc)
    4. Aplicação (Folha de Pagament, Educacional, Globais, etc)
    5. ClassName (Nome do Menu Controller do segmento) - Pode ser localizado na tabela GDICDATAPROTECTION coluna CLASSNAME.
    6. CodSistema (Código Sistema do segmento) -Pode ser localizado na tabela GDICDATAPROTECTION coluna CODSISTEMA.
  6. Exemplo:

    Bloco de código
    languagec#
    firstline1
    linenumberstrue
    namespace RM.Glb.TesteUnitario
    {
      [GlbDataProtectionRoleAttr("7b886d91-86b1-4953-ad93-7da732d40515", "Funcionários", "RM", "Fop","FopFolhaActionModuleController", "P")]
      public class RHUDataProtectionProviderFuncionarios<FuncID> :
        GlbDataProtectionProviderBase<FuncionarioIDModel>
        where FuncID : FuncionarioIDModel, new()
      {
      }
    }
    
    
  7. Criar uma classe herdando de "IdentifierModelBase". Trata-se de uma estrutura contendo propriedades de pesquisa de um determinada pessoa.  Esse objeto será usado para localizar uma pessoa na base de dados. As propriedades dessa classe devem ser marcadas com o atributo "GlbDataProtectionIdentificationAttr". Nesse atributo, devem ser informados os seguintes campos:
    1. IdentificationName: Nome do campo físico  a ser pesquisado;
    2. TableName: Nome da tabela física no DB referente ao campo;
    3. Description: Descrição do identificador que aparecerá no SGDP;(Consultar na planilha https://docs.google.com/spreadsheets/d/1uPcsaDQlYOE-x1vAsTAtgpEeLTphI31yXq3Z84QZQ80/edit#gid=0 os tipos que devem ser informados)
    4. RelationTag: Marcação de relacionamento entre os campos. Exemplo: Se a pesquisa for feita pelo campo "CodColigada" + "Chapa" do funcionário,  nesse caso, essas duas propriedades devem ser marcadas com a mesma tag.
  8. Exemplo:

    Bloco de código
    languagec#
    firstline1
    linenumberstrue
    namespace RM.Glb.TesteUnitario
    {
      public class FuncionarioIDModel: IdentifierModelBase
      { 
        [GlbDataProtectionIdentifierAttr("CPF", "PPESSOA", "CPF")]
        public string CPF { get; set; }
       
        [GlbDataProtectionIdentifierAttr("CARTIDENTIDADE", "PPESSOA", "RG")]
        public string Rg { get; set; }
       
        [GlbDataProtectionIdentifierAttr("EMAIL", "PPESSOA", "E-MAIL")]
        public string Email { get; set; }
    
        [GlbDataProtectionIdentifierAttr("CARTMOTORISTA", "PPESSOA", "CNH")]
        public string CNH { get; set; }
      }
    }
    
  9. Métodos que podem ser sobrescritos no provedor:
    1. DoInitialize: método executado logo após a criação do objeto pelo gerenciador. Ele pode ser usado para inicializar dados de instancia da classe de provedor;
    2. DoCanAnonimize: método usado para verificar se uma determinada pessoa pode ou não ser anonimizada. 
    3. DoAfterAnonimize: método usado para executar regras de negócio que serão executadas imediatamente após a execução de todos os "updates" de anonimização realizados pela frame.
    4. DoFillIdentifier: método usado para para preenchimento de todas as propriedades do objeto "Identifier" repassado como parâmetro. Esse mecanismo será usado no processo de correlação entre os provedores. Nesse caso, todas as propriedades da classe de "IdentifierModel" do respectivo provider devem ser preenchidas.
    5. DoConfigAnonimize: método usado para repassar as configurações de tabelas necessárias para a camada de "manager". Através desse metado, a camada core tera condições de gerar automaticamente os updates a serem disparados pelo processo de anonimização.  Os campos anonimizados serão
    6. justamente os campos marcados na tabela GDicDataProtection por tabela.
    7. Informações

      Explicando melhor o método "DoFillIdentifier" que deve ser implementado pelos provedores.

      ***********************************************************************************************************

      Esse método deve ser utilizado para preenchimento das propriedades do objeto de Identifier.

      Esse método receberá como parametro uma instancia de um objeto do tipo "IdentifierModelBase"

      Se por exemplo, digamos que essa classe tenha as propriedades: [CPF, E-MAIL, RG]. 

      Se chegar uma instancia dessa classe com a propridade "CPF" preenchida: ex: CPF = "0154518548".

      Nesse caso, terá que existir um codigo para preenchimento das propriedades: [E-MAIL, RG]..

      Se chegar o "E-MAIL" preenchido, terá que existir um código para preenchimento: [CPF, RG]


      Esse ajuste é necessário para realização correta dos correlacimentos entre os provedores..

      Sem isso, o processo de anonimizçaão nao funcionará.

      Esse método deve ser utilizado para preenchimento das propriedades do objeto de Identifier.

      Esse método receberá como parametro uma instancia de um objeto do tipo "IdentifierModelBase"

      Se por exemplo, digamos que essa classe tenha as propriedades: [CPF, E-MAIL, RG]. 

      Se chegar uma instancia dessa classe com a propridade "CPF" preenchida: ex: CPF = "0154518548".

      Nesse caso, terá que existir um codigo para preenchimento das propriedades: [E-MAIL, RG]..

      Se chegar o "E-MAIL" preenchido, terá que existir um código para preenchimento: [CPF, RG]



  10. Exemplo:
  11. Bloco de código
    languagec#
    firstline1
    linenumberstrue
    using RM.Glb.DataProtection.Service.Domain;
    
    namespace RM.Glb.TesteUnitario
    {
      [GlbDataProtectionRoleAttr("7b886d91-86b1-4953-ad93-7da732d40515", "Funcionários", "RM", "Fop","FopFolhaActionModuleController", "P")]
      public class RHUDataProtectionProviderFuncionario<FuncID> :
      GlbDataProtectionProviderBase<FuncionarioIDModel>
        where FuncID : FuncionarioIDModel, new()
      {
        protected override void DoAfterAnonimize(FuncionarioIDModel identification)
        {
            //regras de negocio logo após a execuão dos updates de anonimização.
        }
    
        protected override CanAnonimizeResult DoCanAnonimize(FuncionarioIDModel identification)
        {
          CanAnonimizeResult result = new CanAnonimizeResult();
    
          if (!string.IsNullOrWhiteSpace(identification.Cpf))
          {
            result.CanAnonimize = false;
            RuleModel rule = new RuleModel();
            rule.Classificacao = "151/15";
            rule.Justificativa = "Não autorizada";
            result.Rules.Add(rule);
          }
          else if (!string.IsNullOrWhiteSpace(identification.Chapa))
          {
            result.CanAnonimize = true;
          }
          return result;
        }
    
        protected override void DoFillIdentifier(FuncionarioIDModel identifier)
        {
          identifier.Chapa = "00001";
          identifier.CodColigada = 1;
          identifier.Rg = "M71545";
          identifier.Nome = "Teste ok";
        }
    
        protected override void DoConfigAnonimize(AnonimizeMapperBuilder config)
        {
           config.AddTable(builder => builder
                            .WithTableName("PPESSOA")
                            .WithExcludedColumns("ESTADOCIVIL")
                            .WithPrimaryKey("CODIGO")
                            .WithDefaultValues("SEXO", "#")
                )
               .AddTable(builder => builder 
                            .WithTableName("PFUNC")
                            .WithPrimaryKey("CODCOLIGADA", "CHAPA")
                            .WithExcludedColumns("CODSECAO")
                            .WithDefaultValues("SITUACAOFGTS", "#")
                )
                .AddTable(builder => builder
                            .WithTableName("PFDEPEND")
                            .WithPrimaryKey("CODCOLIGADA", "CHAPA", "NRODEPENDENTE")
                            .WithExcludedColumns("CARTORIO")
                            .WithDefaultValues("LOCALNASCIMENTO", "ITAGUARA")
                )
                .AddRelation(builder => builder
                            .WithParentTable("PPESSOA")
                            .WithChildTable("PFUNC")
                            .WithParentColumns("CODCOLIGADA", "CODIGO")
                            .WithChildColumns("CODCOLIGADA", "CODPESSOA")
                )
                .AddRelation(builder => builder
                            .WithParentTable("PFUNC")
                            .WithChildTable("PFDEPEND")
                            .WithParentColumns("CODCOLIGADA", "CHAPA")
                            .WithChildColumns("CODCOLIGADA", "CHAPA")
                );
    
          //Para esse caso em especifico, serão gerados as seguinte sentenças sql.
          //Como exemplo, foram marcados os seguintes campos na GDicDataProtection.
          //PESSOA = DTNASCIMENTO, SEXTO, NACIONALIDADE
          //PFUNC = NOME, CODSECAO
          //PFDEPEND = NOME, DTDANSCIMENTO, ESTADOCIVIL
    
          //UPDATE PPESSOA SET DTNASCIMENTO = 01/01/1900, SEXO = '#', NACIONALIDADE = "X"
          //WHERE PPESSOA.CPF = '015454515'
    
          //UPDATE PFUNC SET NOME = 'XXX'
          //FROM PPESSOA
          //WHERE PPESSOA.CODIGO = PFUNC.CODPESSOA
          //AND PPESSOA.CPF = '015454515'
    
          //UPDATE PFDEPEND SET NOME = 'XXX', DTNASCIMENTO = '1999/01/01', ESTADOCIVIL = 'X'
          //FROM PFUNC INNER JOIN PPESSOA
          //  ON PFUNC.CODPESSOA = PPESSOA.CODIGO
          //WHERE PPESSOA.CPF = '015454515'
    
    
        }
      }
    }
    
    
    
  12. Informações

    No exemplo acima, o provider "RHUDataProtectionProviderFuncionario" usa a tabela "PPESSOA" porque no método "DoConfigAnonimize" está sendo usado o config.AddTable(builder => builder .WithTableName("PPESSOA"). Nesse caso, a tabela PPESSOA será anonimizada por ele porque as sentenças "updates" serão geradas para a tabela PPESSOA.

    Para desligar esse comportamento de geração automática da sentenças "UPDATE" basta usar o .WithExcludeUpdateClausule(). Sendo assim, usando o "WithExcludeUpdateClausule" esse provider funcionaria como "ponte" para correlacionamento com outros providers que usa a "PPESSOA".

    03


    provedor proteção de dados

    Para que uma classe seja um provedor de proteção de dados, , deve-se atender aos pré-requisitos listados abaixo:

    1. Criar um projeto (classLibrary .NET) na solution do segmento em questão, com o seguinte padrão de nome: RM.[Segmento].DataProtection.Provider.
      1. Exemplo: RM.RHU.DataProtection.Provider.dll
    2. Adicionar referência para a dll "RM.Glb.DataProtection.Service.dll";
    3. Criar uma classe herdando da ancestral "GlbDataProtectionProviderBase". O tipo genérico "Identifier" deve ser usado conforme descrito abaixo.

    4. A classe "GlbDataProtectionProviderBase" herda da classe RMSObject da Lib. Consequentemente, as classes de "providers" poderão chamar os métodos "CreateFacade" e "CreateModule" dentro de suas estruturas.
    5. Carimbar a classe com o atributo "GlbDataProtectionRoleAttr". Nesse atributo, devem ser informados os dados abaixo:
      1. Identificador único do provedor (novo guid);
      2. Nome do papel (essa informação será mostrada para o usuário no sistema LGDP que está sendo criado pela Totvs);
      3. Linha do Produto (RM,TREPORTS, etc)
      4. Aplicação (Folha de Pagament, Educacional, Globais, etc)
      5. ClassName (Nome do Menu Controller do segmento) - Pode ser localizado na tabela GDICDATAPROTECTION coluna CLASSNAME.
      6. CodSistema (Código Sistema do segmento) -Pode ser localizado na tabela GDICDATAPROTECTION coluna CODSISTEMA.
    6. Exemplo:

      Bloco de código
      languagec#
      firstline1
      linenumberstrue
      namespace RM.Glb.TesteUnitario
      {
        [GlbDataProtectionRoleAttr("7b886d91-86b1-4953-ad93-7da732d40515", "Funcionários", "RM", "Fop","FopFolhaActionModuleController", "P")]
        public class RHUDataProtectionProviderFuncionarios<FuncID> :
          GlbDataProtectionProviderBase<FuncionarioIDModel>
          where FuncID : FuncionarioIDModel, new()
        {
        }
      }
      
      

...