Respondido CRM 2011 - Validação de CNPJ

  • terça-feira, 17 de julho de 2012 19:46
     
     

    Galera Boa tarde,

    estou com uma duvida consigo sair verificando com um for se há duplicidade de CNPJ, por exemplo,

    já tenho o CNPJ xx.xxx.xxx/xxxx-xx e vou cadastrar outro cliente e (isso pra mim é impossível mas o cliente pediu) cadastro com esse mesmo CNPJ, na hora do evento OnChange quero sair verificando com um for nos Id's na XML mesmo sera que dá?

    Exemplo:
    for(i = 0; ??????? ;i++){
    {
           CNPJ[x] == CPNJ[i];
    }


Todas as Respostas

  • terça-feira, 17 de julho de 2012 20:04
    Moderador
     
     Resposta Proposta

    Willer,

    Pode simplificar tudo usando "Detecção de Duplicatas".

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

  • terça-feira, 17 de julho de 2012 20:13
     
     

    Onde encontro isso no CRM Thiago?

  • terça-feira, 17 de julho de 2012 20:19
     
     

    Willer,

    Os usuários tem acesso para verificar todos os registros da organização? ou apenas os registros que eles são proprietários?

    Se eles tem permissão para visualizar todos os registros da entidade em questão, a Detecção de Duplicata atende a necessidade (Conforme o Tiago informou).

    Caso contrário acredito que você terá que fazer um plugin para validar se o CNPJ existe na carteira de outros usuários.

    Adilson


    Adilson de Alencar Batista

  • terça-feira, 17 de julho de 2012 22:20
    Proprietário
     
     Resposta Proposta

    Willer, você encontra a opção mencionada pelo Tiago em Configurações -> Gerenciamento de Dados -> Configuração de Detecção de Duplicidades (para habilitar a função) e Regras de Detecção de Duplicidades (para configurar a detecção para a entidade e o campo a ser usado).

    neste link tem uma pequena explicação http://crmdm.blogspot.com.br/2012/02/duplicate-detection-in-crm-2011.html


    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

  • quarta-feira, 18 de julho de 2012 20:06
     
     

    Mas na verdade eu quero que nem deixe criar uma outra conta me entende? Se for igual o CNPJ não pode deixa criar...

  • quarta-feira, 18 de julho de 2012 20:12
     
     Resposta Proposta

    Willer,

    A funcionalidade padrão permite que possa excluir os registros semelhantes que estão com Status Inativo.

    Para que você possa identificar no momento da criação você pode criar um plugin que não permita a criação da conta com o CNPJ repetido.

    Adilson


    Adilson de Alencar Batista

    • Sugerido como Resposta Adilson Batista quarta-feira, 18 de julho de 2012 20:13
    •  
  • quinta-feira, 19 de julho de 2012 10:58
    Proprietário
     
     
    Willer, para bloquear de vez a criação a solução é como o Adilson mencionou. Um plugin poderia validar e bloquear a criação.

    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

  • quinta-feira, 19 de julho de 2012 19:10
     
     

    A algum tempo atras tive este mesmo cenário, e resolvi com JScrit.

    No meu caso, quando o usuário digita o CNPJ faço uma consulta via SOAP, se já existir limpo o campo CNPJ e dou um alerta, como este campo e  obrigatório o usuários não consegue salvar a nova conta.

    Se ajudar me avise que te ajudo no codigo.


  • segunda-feira, 23 de julho de 2012 14:24
     
     

    Cara se tu tiver a codificação já ajuda,

    mas na minha imaginação creio eu que é possível ver em código quantas contas temos cadastradas a partir daí acho que dá pra realizar uma verificação no CNPJ de cada conta e bloquear no campo CNPJ a criação de um CNPJ duplicado.

  • segunda-feira, 23 de julho de 2012 19:28
     
     

    Willer, Boa tarde

    da mesma forma que você pode resolver a sua outra duvida vc tbm pode solucionar esta

    com o link http://crmxpg.nl/wp/2010/12/17/retrieve-one-or-more-fields-in-ms-crm-using-fetchxml/ vc vai aprender como consultar uma entidade via js, com isso basta colocar função no seu evento onchange do campo e verificar através do valor deste campo se ele vai encontrar algum ou registro

    caso encontre não consiga solucionar hoje a noite posto um exemplo de como fazer isso

    Boa sorte


    Bruno Viegas | Desenvolvedor Web | Desenvolvedor Dynamics CRM

  • terça-feira, 24 de julho de 2012 18:10
     
     

    Então cara vou precisar do o seu exemplo pratico mesmo rsrsrs.


  • terça-feira, 24 de julho de 2012 18:59
     
      Contém Código

    Willer Albuquerque Primeiramento gostaria de te pedir desculpas por oferecer uma ajuda e demorar a te respondar.

    E proceguindo com sua duvida eu desenvolvi uma função em javascript que vc pode utilizar para fazer a consulta, mas nao so para o uso com o CNPJ mas vc pode fazer consulta em qualquer entidade e buscar qualquer campo.

    No exemplo abaixo pego o CNPJ e passo para esta função, ela vai pesquisar e me devolver o nome da CONTA que existe com este CNPJ, se nao existir ela me retorna “SEM DADOS”.

    Espero ter ajudado.

    //Exemplo de uso da função consulta
    var cnpj = Xrm.Page.getAttribute("new_cnpj").getValue();
     var existeCPF = (consulta("account","name","new_cnpj",cnpj)); 
    
    //função que faz a consulta.
    function consulta(entidadeASerPesquisada,campoSolicitado,condicaoComparacao,idCampoCompracao)
    
    {   
    
       
    var fetchMapping = "logical";
       
    var entityName = entidadeASerPesquisada;
       
    var firstColumn = campoSolicitado;          
    
       
    var linkEntity = entidadeASerPesquisada;
       
    var linkEntityTo =entidadeASerPesquisada+"id";
       
    var filterType = "and";
       
    var conditionAttribute = condicaoComparacao;
       
    var operator = "eq";
       
    var value = idCampoCompracao;
       
    var authenticationHeader = GenerateAuthenticationHeader();
       
    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'>"+ 
       
    authenticationHeader+ 
       
    "<soap:Body>"+ 
       
    "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
    
       
    "<fetchXml>&lt;fetch mapping='"+fetchMapping+"'&gt;"+ 
    
       
    "&lt;entity name='"+entityName+"'&gt;"+ 
       
    "&lt;attribute name='"+firstColumn+"'/&gt;"+     
    
       
    "&lt;link-entity name='"+linkEntity+"' to='"+linkEntityTo+"'&gt;"+
    
       
    "&lt;filter type='"+filterType+"'&gt;"+ 
       
    "&lt;condition attribute='"+conditionAttribute+"'"+
       
    " operator='"+operator+"' value='"+value+"'/&gt;"+ 
       
    "&lt;/filter&gt;"+ 
       
    "&lt;/link-entity&gt;"+ 
       
    "&lt;/entity&gt;"+ 
       
    "&lt;/fetch&gt;</fetchXml>"+ 
       
    "</Fetch>"+ 
       
    "</soap:Body>"+ 
       
    "</soap:Envelope>";
       
    var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
       
    xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
       
    xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
       
    xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
       
    xHReq.setRequestHeader("Content-Length", xml.length);
       
    xHReq.send(xml);
       
    var resultXml = xHReq.responseXML;
       
    var errorCount = resultXml.selectNodes('//error').length;
       
    if (errorCount != 0)
       
    {
           
    var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
           
    alert(msg);
           
    return false;
       
    }
       
    else
       
    {
           
    var resultSet = new String();
           
    resultSet = resultXml.text;
           
    resultSet.replace('&lt;','<');
     
          resultSet.replace('&gt;','>');
           
    var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           
    oXmlDoc.async = false;
    
           
    oXmlDoc.loadXML(resultSet);
           
    var results = oXmlDoc.getElementsByTagName('result');   
    
    
           
    var resultadoConsulta;
           
    try
           
    {      
               
    resultadoConsulta = results[0].selectSingleNode("./"+campoSolicitado).nodeTypedValue;          
    
               
    return resultadoConsulta;   
           
    }catch(e)
           
    {
               
    return resultadoConsulta = "SEM DADOS" ;  
           
    }
       
    }
    }
    
    
    

  • terça-feira, 24 de julho de 2012 22:07
    Proprietário
     
      Contém Código

    Willer pode usar tambem REST:

    var request = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/OrganizationData.svc/AccountSet?$select=campo_retorno&$filter=campo_cnpj eq '";
        request    += cnpj_verificar + "'";  
        $.ajax({
          type: "GET", contentType: "application/json; charset=utf-8", datatype: "json", url: request, async: false,
          beforeSend: 
            function (XMLHttpRequest) 
            { 
                XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
            },
          success: 
            function (data, textStatus, XmlHttpRequest) 
            {   
              if(data.d.results.length > 0){
                //achou o cnpj
              }
            },
          error: 
            function (XmlHttpRequest, textStatus, errorThrown) 
            { 
               //erro
            }
        });

    acho que com os exeplos pode resolver a questão. marque as respostas ok?

    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

  • quarta-feira, 25 de julho de 2012 16:51
     
     Respondido

    Ola Pessoal,

    pode ser Utilizado o Código abaixo, valido tanto para CPF quanto para CNPJ ele valida, mascara e verifica se tem algum duplicado.

    //Busca dados de Outra entidade Universal
    function GetEntityNodes(Entidade, Atributo, Parametro) {
        var DataXml = "" +
      "<?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() +
       " <soap:Body>" +
        " <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
         " <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
         " <q1:EntityName>" + Entidade + "</q1:EntityName>" +
         " <q1:ColumnSet xsi:type=\"q1:AllColumns\" />" +
         " <q1:Distinct>false</q1:Distinct>" +
         " <q1:Criteria>" +
          " <q1:FilterOperator>And</q1:FilterOperator>" +
          " <q1:Conditions>" +
           " <q1:Condition>" +
           " <q1:AttributeName>" + Atributo + "</q1:AttributeName>" +
           " <q1:Operator>Equal</q1:Operator>" +
           " <q1:Values>" +
           " <q1:Value xsi:type=\"xsd:string\">" + Parametro + "</q1:Value>" +
           " </q1:Values>" +
           " </q1:Condition>" +
          " </q1:Conditions>" +
         " </q1:Criteria>" +
         " </query>" +
        " </RetrieveMultiple>" +
       " </soap:Body>" +
      "</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", DataXml.length);
        xmlHttpRequest.send(DataXml);
        var Result = xmlHttpRequest.responseXML;
        var BusinessEntityNodes = Result.selectNodes("//RetrieveMultipleResult/BusinessEntities/BusinessEntity");
        return BusinessEntityNodes;
    }

    //Mascara e Valida CPF e CNPJ
    function validaMascaraCpfCnpj(CPFCNPJ) {
        if (CPFCNPJ != null) {
            var exp = /\-|\.|\/|\(|\)| /g;
            CPFCNPJ = CPFCNPJ.replace(exp, "");
            if ((CPFCNPJ.length == 11) || (CPFCNPJ.length == 14)) {
                if (CPFCNPJ.length == 11) {
                    /*Bloco de código de validação de CPF*/
                    var a = [];
                    var b = new Number;
                    var c = 11;
                    for (i = 0; i < 11; i++) {
                        a[i] = CPFCNPJ.charAt(i);
                        if (i < 9) b += (a[i] * --c);
                    }
                    if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11 - x }
                    b = 0;
                    c = 11;
                    for (y = 0; y < 10; y++) b += (a[y] * c--);
                    if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11 - x; }
                    if ((CPFCNPJ.charAt(9) != a[9]) || (CPFCNPJ.charAt(10) != a[10])) {
                        alert('Número de CPF inválido.');
                        CPFCNPJ = '';
                    }
                    else {
                        /*Formata como ###.###.###-##*/
                        CPFCNPJ = CPFCNPJ.substr(0, 3) + '.' + CPFCNPJ.substr(3, 3) + '.' + CPFCNPJ.substr(6, 3) + '-' + CPFCNPJ.substr(9, 2);
                    }
                }
                else if (CPFCNPJ.length == 14) {
                    /*Bloco de Código de Validação de CNPJ*/
                    var valida = new Array(6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);
                    var dig1 = new Number;
                    var dig2 = new Number;
                    var digito = new Number(eval(CPFCNPJ.charAt(12) + CPFCNPJ.charAt(13)));
                    for (i = 0; i < valida.length; i++) {
                        dig1 += (i > 0 ? (CPFCNPJ.charAt(i - 1) * valida[i]) : 0);
                        dig2 += CPFCNPJ.charAt(i) * valida[i];
                    }
                    dig1 = (((dig1 % 11) < 2) ? 0 : (11 - (dig1 % 11)));
                    dig2 = (((dig2 % 11) < 2) ? 0 : (11 - (dig2 % 11)));
                    if (((dig1 * 10) + dig2) != digito) {
                        alert("Número de CNPJ inválido.");
                        CPFCNPJ = '';
                    } else {
                        /*Formata como ##.###.###/####-##*/
                        CPFCNPJ = CPFCNPJ.substr(0, 2) + '.' + CPFCNPJ.substr(2, 3) + '.' + CPFCNPJ.substr(5, 3) + '/' + CPFCNPJ.substr(8, 4) + '-' + CPFCNPJ.substr(12, 2);
                    }
                }
                //Verifica Duplicidade
                var EntityClienteDuplicado = GetEntityNodes('account', 'new_cpfcnpj', CPFCNPJ);
                if (EntityClienteDuplicado.length != 0) {
                    var EntityNodeClienteDuplicado = EntityClienteDuplicado[0];
                    var Nomenode = EntityNodeClienteDuplicado.selectSingleNode("q1:name");
                    if (Nomenode != null) { Nomenode = Nomenode.text; } else { Nomenode = ''; }
                    var Numeronode = EntityNodeClienteDuplicado.selectSingleNode("q1:accountnumber");
                    if (Numeronode != null) { Numeronode = Numeronode.text; } else { Numeronode = ''; }
                    var CNPJnode = EntityNodeClienteDuplicado.selectSingleNode("q1:new_cpfcnpj");
                    if (CNPJnode != null) { CNPJnode = CNPJnode.text; } else { CNPJnode = ''; }
                    alert('Já exixte uma Conta cadastrada com o CPF - CNPJ -->  ' + Numeronode + ' - ' + CNPJnode + ' - ' + Nomenode);
                    CPFCNPJ = '';
                }
                //Fim Verifica Duplicidade
            } else {
                alert('CPF - CNPJ fora da faixa 11 ou 14 dígitos sequenciais! Ex: 02314604325 ou 125362142362179');
                CPFCNPJ = '';
            }
            Xrm.Page.getAttribute("new_cpfcnpj").setValue(CPFCNPJ);
        }
    }


    Tiago Henrique Consultor de Implantação

  • quarta-feira, 1 de agosto de 2012 13:29
     
     
    Em qual codigo? temos varios exemplos diferentes ai logo em cima.
  • quarta-feira, 1 de agosto de 2012 13:59
    Moderador
     
     Resposta Proposta

    Senhores vamos finalizar esta thread, já se estendeu demais pela dificuldade do título.

    Willer, existem várias linhas para trabalhar com validações de duplicidades:

    - Detecção de Duplicatas - recurso bem simples e nativo do CRM, onde através de regras previamente informadas, existe uma validação na criação e edição de novos registros. Mais detalhes em:

    http://www.youtube.com/watch?v=ZyQxFEAjRas

    http://msdn.microsoft.com/en-us/library/gg309427.aspx

    - Plugins - recurso em que precisamos usar o WCF ou SDK do CRM para consumir as informações e realizar regras de negócio, é necessário conhecimento em linguagens server e no SDK do CRM. Mais detalhes em:

    http://tiagomcardoso.wordpress.com/2012/01/02/crm-2011-plugin-crm-online/

    - JScript - recurso que precisamos usar objetos activex para fazer comunicação entre o client/server, não possui uma IDE de desenvolvimento e depuração 100% adequada as nossas necessidades e sempre deve ser revisto em novas versões de navegadores e do próprio CRM. Na versão 2011, pode optar por recuperar tanto com SOAP, quanto com REST, retornando XML ou JSON, basta escolher. Temos uma library que ajuda no trabalho:

    http://xrmservicetoolkit.codeplex.com/

    Baixei, adicione no formulário e use-a como necessitar.

    Quanto a lógica de como comparar CNPJ iguais, isso já existe bastante material à respeito.

    Aguardamos seus resultados.

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

  • terça-feira, 21 de agosto de 2012 19:01
     
     
    Isso também funcionaria para um campo lookup ou mesmo para um campo data?
  • quarta-feira, 22 de agosto de 2012 13:43
     
     
    Willer Albuquerque Você poderia amadurecer melhor sua pergunta acima, pois a duvida anterios e sobre validação de CNPJ e CPF, porque você esta querendo usar um campo tipo lookup ou data?, estou tentando entender sua duvida para que possa adequar o script a sua necessidade.
  • quarta-feira, 22 de agosto de 2012 14:44
     
     

    Finalizando...

    Você pode utilizar o código abaixo dentro do CRM, só precisa passar com paramento os campos solicitados que o código já verifica se é duplicado e informa ao usuário. Aconselho colocar no evento onChange do campo cpf-cnpj:

     

    /*   Busca Dados em Outra Entidade   */
    function getEntityNodes(entidade, atributo, parametro) {
        var DataXml = "" +
      "<?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() +
       " <soap:Body>" +
        " <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
         " <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
         " <q1:EntityName>" + entidade + "</q1:EntityName>" +
         " <q1:ColumnSet xsi:type=\"q1:AllColumns\" />" +
         " <q1:Distinct>false</q1:Distinct>" +
         " <q1:Criteria>" +
          " <q1:FilterOperator>And</q1:FilterOperator>" +
          " <q1:Conditions>" +
           " <q1:Condition>" +
           " <q1:AttributeName>" + atributo + "</q1:AttributeName>" +
           " <q1:Operator>Equal</q1:Operator>" +
           " <q1:Values>" +
           " <q1:Value xsi:type=\"xsd:string\">" + parametro + "</q1:Value>" +
           " </q1:Values>" +
           " </q1:Condition>" +
          " </q1:Conditions>" +
         " </q1:Criteria>" +
         " </query>" +
        " </RetrieveMultiple>" +
       " </soap:Body>" +
      "</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", DataXml.length);
        xmlHttpRequest.send(DataXml);
        var Result = xmlHttpRequest.responseXML;
        var BusinessEntityNodes = Result.selectNodes("//RetrieveMultipleResult/BusinessEntities/BusinessEntity");
        return BusinessEntityNodes;
    }

    function verificaDuplicatas(entidade, atributo, parametro) {
        var entityNodes = getEntityNodes(entidade, atributo, parametro);
        if (Xrm.Page.getAttribute(parametro).getValue() != null) {
            if (entityNodes.length != 0) {
                var entityNode = entityNodes[0];
                var Nomenode = entityNode.selectSingleNode("q1:name");
                var CNPJnode = entityNode.selectSingleNode("q1:" + atributo);
                var CodigoCliente = entityNode.selectSingleNode("q1:accountnumber");
                if (Xrm.Page.getAttribute('accountnumber').getValue() != CodigoCliente.text) {
                    alert('Já exixte um Registro cadastrado com o CPF-CNPJ -->  ' + CNPJnode.text + ' - ' + Nomenode.text);
                    Xrm.Page.getAttribute(atributo).setValue(null);
                }
            }

        }
    }

    /*

    exemplo
    verificaDuplicatas('account', 'new_cpfcnpj', 'new_cpfcnpj');

    */


    Tiago Henrique Consultor de Implantação