none
Bloquear Save da Entidade RRS feed

  • Pergunta

  • Bom dia a Todos.

    Estou desenvolvendo um Plugin para detectar a duplicidade de um CPF na base de dados.

     

    Como deve funcionar: O Plugin executa em Evento Pré e verifica se o CPF digitado já consta na base, se sim devo exibir uma mensagem e impedir que o registro seja salvo.

     

    Como posso fazer essa parte de Impedir que o registro seja salvo?

     

    quinta-feira, 4 de novembro de 2010 18:26

Respostas

  • Carlos,

    Tentei reproduzir seu caso aqui e consegui a seguinte solução: Eu consigo travar a criação da nova conta porém o usuário não é informado o motivo da não realização do cadastro, se bem que a regra de detecção de duplicata estiver ativa ele será informada, você pode fazer da seguinte forma:

    acrescenta esse trecho no plugin pre da conta:

     

    //Cria o metodo

    public boolean ExisteCPF(String cpf){

    Laço{

    //busca os cpfs das contas

    if(cpf == vet){

    return true;

    }

    }

    return false;

    }

     

    no trecho create da conta acrescente:

    if(ExisteCPF(meuCPF) )

    throw new Exception("CPF existente!");

    //Não consegui fazer essa mensagem aparecer, mas pelo menos a pessoa nao consegue concluir o cadastro do cliente

     

    Se você utilizar a detecção de duplicatas junto com a customização do plugin, você conseguirá resolver o seu problema.

    • Marcado como Resposta Carlos Vinhas sexta-feira, 5 de novembro de 2010 13:28
    quinta-feira, 4 de novembro de 2010 20:18
  • Olá,

     

    Para parar a execução e mostrar mensagem ao usuário, utilize:

     throw new InvalidPluginExecutionException("mensagem");
    

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 12:13
    • Marcado como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 13:29
    sexta-feira, 5 de novembro de 2010 12:10
  • Muito Obrigado Pessoal,

    Consegui resolver com uma solução bem parecida com a que o Fernando propôs.

     

    Segue abaxo o código

              if (myContacts.BusinessEntityCollection.BusinessEntities.LongLength > 0)
              {
                throw new InvalidPluginExecutionException("Este CPF já encontra-se cadastrado");
              }
    

     

    sexta-feira, 5 de novembro de 2010 13:14

Todas as Respostas

  • Boa tarde Carlos,

     

    Essa forma de implementação via Plugin pode resolver o problema, no entanto o CRM 4.0 possui funcionalidades de detecção de dados duplicados que podem resolver seu problema. Você pode ir no menu "Gerenciador de Dados" => Regras de detecção de duplicatas e cria uma regra para que o sistema informe quando houver dados repetidos e em "Gerenciador de Dados" => Configurações de Detecção de duplicatas habilitar a detecção na criação do registro, com isso ao tentar salvar será exibida uma msg informando os dados já existentes. No entanto a pessoa pode escolher salvar assim mesmo ou não, aí vai da política que você quer inserir na organização. Espero ter ajudado.

     

    Abraços!

    quinta-feira, 4 de novembro de 2010 18:48
  • Apenas complementando a sugestão do Fernando, ao utilizar a detecção de duplicata nativa da ferramenta. O CRM também vai entender a duplicação do registro na importação de dados pelo CRM.
    Adilson de Alencar Batista
    quinta-feira, 4 de novembro de 2010 19:11
  • Opa Fernando,

    Obrigado pela resposta. Porém aqui eu preciso implementar via plugin pois não podemos em hipótese alguma ter estes registros duplicados. E pelas regras de Detecção de Duplicatas do proprio CRM ele permite a inclusão do registro (se o cliente escolher "Sim" na tela da detecção).

     

    Fiz o código para verificar se existe o registro duplicado, porém não consigo barrar o usuário de salvar o registro.

    quinta-feira, 4 de novembro de 2010 19:14
  • Carlos,

    Tentei reproduzir seu caso aqui e consegui a seguinte solução: Eu consigo travar a criação da nova conta porém o usuário não é informado o motivo da não realização do cadastro, se bem que a regra de detecção de duplicata estiver ativa ele será informada, você pode fazer da seguinte forma:

    acrescenta esse trecho no plugin pre da conta:

     

    //Cria o metodo

    public boolean ExisteCPF(String cpf){

    Laço{

    //busca os cpfs das contas

    if(cpf == vet){

    return true;

    }

    }

    return false;

    }

     

    no trecho create da conta acrescente:

    if(ExisteCPF(meuCPF) )

    throw new Exception("CPF existente!");

    //Não consegui fazer essa mensagem aparecer, mas pelo menos a pessoa nao consegue concluir o cadastro do cliente

     

    Se você utilizar a detecção de duplicatas junto com a customização do plugin, você conseguirá resolver o seu problema.

    • Marcado como Resposta Carlos Vinhas sexta-feira, 5 de novembro de 2010 13:28
    quinta-feira, 4 de novembro de 2010 20:18
  • Oi Carlos,

    Há também a possíbilidade de implementar via javascript, conforme o exemplo abaixo:

    function valida_cpf(cpf)
    {
          var numeros, digitos, soma, i, resultado, digitos_iguais;
          digitos_iguais = 1;
          if (cpf.length < 11)
                return false;
          for (i = 0; i < cpf.length - 1; i++)
                if (cpf.charAt(i) != cpf.charAt(i + 1))
                      {
                      digitos_iguais = 0;
                      break;
                      }
          if (!digitos_iguais)
                {
                numeros = cpf.substring(0,9);
                digitos = cpf.substring(9);
                soma = 0;
                for (i = 10; i > 1; i--)
                      soma += numeros.charAt(10 - i) * i;
                resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
                if (resultado != digitos.charAt(0))
                      return false;
                numeros = cpf.substring(0,10);
                soma = 0;
                for (i = 11; i > 1; i--)
                      soma += numeros.charAt(11 - i) * i;
                resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
                if (resultado != digitos.charAt(1))
                      return false;
                return true;
                }
          else
                return false;
    }


    var exp = /\-|\.|\/|\(|\)| /g
    var cpfFormatado = crmForm.all.gl_cpf.DataValue;
    if(cpfFormatado == null){return;}
    /*Somente números*/
    cpfFormatado = cpfFormatado.replace(exp,"");

    /*validação de CPF*/
    if (valida_cpf(cpfFormatado)) {
       /*Formata como ###.###.###-##*/
       cpfFormatado = cpfFormatado.substr(0, 3) + '.' + cpfFormatado.substr(3, 3) + '.' + cpfFormatado.substr(6, 3) + '-' + cpfFormatado.substr(9, 2);
       /*Atualiza no formulário*/
       crmForm.all.gl_cpf.DataValue = cpfFormatado;
    }else{
       alert("Número de CPF inválido.");
       crmForm.all.gl_cpf.DataValue = "";
    }

     var input = crmForm.all.gl_cpf.DataValue;

    var soapBody ="<soap:Body>" +
    "<RetrieveMultiple xmlns="+
    "\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
    "<query xmlns:q1="+
    "\"http://schemas.microsoft.com/crm/2006/Query\" "+
    "xsi:type=\"q1:QueryByAttribute\">" +
    "<q1:EntityName>contact</q1:EntityName>" +
    "<q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
    "<q1:Attributes>" +
    "<q1:Attribute>fullname</q1:Attribute>" +
    "<q1:Attribute>contactid</q1:Attribute>" +
    "</q1:Attributes>" +
    "</q1:ColumnSet>" +
    "<q1:Attributes>" +
    "<q1:Attribute>gl_cpf</q1:Attribute>" +
    "</q1:Attributes>" +
    "<q1:Values>" +
    "<q1:Value xsi:type=\"xsd:string\">" + input + "</q1:Value>" +
    "</q1:Values>" +
    "</query>" +
    "</RetrieveMultiple>" +
    "</soap:Body>" ;

    var xml = "" +  
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +  
        "<soap:Envelope xmlns:soap=\"" +  
        "http://schemas.xmlsoap.org/soap/envelope/" +  
        "\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +  
        " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +  
        GenerateAuthenticationHeader() +  
        soapBody +
        "</soap:Envelope>" +  
        "";    

      var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");    
      xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);  
      xmlHttpRequest.setRequestHeader("SOAPAction",  
        " http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
      xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");  
      xmlHttpRequest.setRequestHeader("Content-Length", xml.length);  
      xmlHttpRequest.send(xml);    
      var resultXml = xmlHttpRequest.responseXML;  

    var businessEntities = resultXml.getElementsByTagName('BusinessEntity');
    if(businessEntities.length > 0){
       alert("Já existe uma pessoa física cadastrada com esse CPF.\n" + businessEntities[0].selectSingleNode('./q1:fullname').text);
     // window.open("/XYZ/sfa/conts/edit.aspx?id="+  businessEntities[0].selectSingleNode('./q1:contactid').text,"_self");
    }

    Uma vez que você identifica que já existe o CPF, pode tomar ações no formulário.

    []´s


    Carlos Amorim Junior
    "Colabore! A comunidade precisa de você."
    http://www.dynamicscrm.com.br
    sexta-feira, 5 de novembro de 2010 12:01
  • Olá,

     

    Para parar a execução e mostrar mensagem ao usuário, utilize:

     throw new InvalidPluginExecutionException("mensagem");
    

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 12:13
    • Marcado como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 13:29
    sexta-feira, 5 de novembro de 2010 12:10
  • Vinhas,

     

    Como o Amorim sugeriu acima, se a porta de entrada de dados for apenas o formulário do Dynamics CRM, não seria nescessario o plugin.

     

    Mas para todos os casos você pode colocar o o campo CPF como obrigatório e no OnChange colocar uma validação para buscar na base se existe o CPF cadastrado (fetch ou webservice).

    Se existe você simplesmente limpa o campo, desta forma o usuário não poderá seguir com o cadastro e evita ele digitar todos os dados do formulário desnecessariamente (ganha uns pontos com o keyuser ;) ).

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    sexta-feira, 5 de novembro de 2010 12:20
  • Perfeitamente Ricardo, Concordo com a solução.
    sexta-feira, 5 de novembro de 2010 12:25
  • Muito Obrigado Pessoal,

    Consegui resolver com uma solução bem parecida com a que o Fernando propôs.

     

    Segue abaxo o código

              if (myContacts.BusinessEntityCollection.BusinessEntities.LongLength > 0)
              {
                throw new InvalidPluginExecutionException("Este CPF já encontra-se cadastrado");
              }
    

     

    sexta-feira, 5 de novembro de 2010 13:14
  • Carlos Amorim, boa noite!

    Fiz um código parecido com o seu, porém os usuários só tem permissão de visualizar as contas deles, ou seja, como este script passa o parâmetro do usuário logado ele não identifica a duplicidade.

    Tem algum jeito de passar o parâmetro do crmadmin para que eu consiga resolver meu problema com um script, porque não tenho a manha em criação de plugin. No aguardo!

    • Editado Farley Faria quarta-feira, 15 de dezembro de 2010 21:18 faltou sobrenome
    quarta-feira, 15 de dezembro de 2010 21:14
  • Olá Jefferson,

     

    Por favor, peço que crie uma nova thread com a sua dúvida. Assim fica mais fácil para podermos ajuda-ló, e é uma documentação a mais para a comunidade ;)

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    sexta-feira, 17 de dezembro de 2010 12:12