Validar CNPJ Numerico e Alfanumerico

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por toya »

Antevendo a alteração do padrão do CNPJ ajustei a rotina de validação co CNPJ...
Espero poder auxiliar os colegas no tocante ao assunto...

fonte:
Reforma Tributária - Nota Técnica nº49/2024, COCAD/SUARA/RFB - Novo formato de CNPJ em alfanumérico

Código: Selecionar todos

function CNPJ_validar(pCNPJ, plMsg )
// #toya: 24/06/2024 - 07:00:00 - mrb_2024 Release .001.001

Local lResult := .t.
local soma := 0
local dv := ""
local digito := 0
local num := 0
Local wCGC := iif(ValType(pCNPJ)="U", "", pCNPJ)
local i := 0
local j := 0
local Validos := "0123456789"

DEFAULT plMsg := .t.

wCGC := StrTran(wCGC, ".", "")   
wCGC := StrTran(wCGC, "-", "")   
wCGC := StrTran(wCGC, "/", "")
if Empty(wCGC)
    lResult := .t.
else
    if len(wCGC) < 14
        lResult := .f.
    else
		for i = 1 to 12
			if substr(wCGC, i, 1) $ "ABCDEFGHIJKLMNOPQRSTUWYXZ"
				Validos := "0123456789ABCDEFGHIJKLMNOPQRSTUWYXZ"
				exit	 
			endif
		next
        dv := ""
        num := 5
        for j = 1 to 2
            soma := 0
            for i = 1 to 12
                soma += (asc(substr(wCGC, i, 1)) - 48) * num
                num--
                if num == 1
                    num := 9
                endif
            next
            if j == 2
                soma+=( 2 * val(dv))
            endif
            digito = soma - (int(soma / 11) * 11)
            if digito == 0 .or. digito == 1
                dv := dv + "0"
            else
                dv := dv + str(11 - digito, 1)
            endif
            num := 6
        next
        if dv <> substr(wCGC, 13, 2)
            lResult := .f.
        endif
    endif
    if !lResult
    	if plMsg
        	Msg_OK("CNPJ Incorreto ou Digito Invalido..." + " [" + dv + "]" )
    	endif
	endif
endif

return lResult

function Msg_Ok(cMsg, cTitle)

Return(MessageBox(GetActiveWindow(), cMsg, cTitle, nOR(16,0)))
Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Ana Mitoooo
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 17 Out 2018 10:00
Localização: Sobradinho/DF

Validar CNPJ Numerico e Alfanumerico

Mensagem por Ana Mitoooo »

A fórmula de cálculo do dígito verificador do CNPJ Alfanumérico não muda: foi mantido o cálculo pelo módulo 11. Porém, para garantir a utilização dos atuais números do CNPJ (tipo numérico), será necessária a alteração do modo como se calcula o dígito verificador pelo módulo 11. Serão utilizados, no cálculo do módulo 11, os valores relativos a letras maiúsculas lastreadas na tabela denominada código ASCII, como solução para unificar a representação de caracteres alfanuméricos.

Na rotina de cálculo do Dígito Verificador (DV)no CNPJ, serão substituídos os valores numéricos e alfanuméricos pelo valor decimal correspondente ao código constante na tabela ASCII e dele subtraído o valor48. Desta forma os caracteres numéricos continuarão com os mesmos montantes, e os caracteres alfanuméricos terão os seguintes valores: A=17, B=18, C=19… e assim sucessivamente. Esta definição permitirá que o atual número do CNPJ tenha o mesmo cálculo do seu dígito verificador quando os sistemas iniciarem a identificação alfanumérica.

O desenho abaixo mostra a correspondência entre letras e números e seus respectivos valores na tabela ASCII:
Tabela ASCII
Tabela ASCII
Ana Mitoooo
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 17 Out 2018 10:00
Localização: Sobradinho/DF

Validar CNPJ Numerico e Alfanumerico

Mensagem por Ana Mitoooo »

Código exemplo para atualizar validação existente:

Código: Selecionar todos

* nPos  [Int]
* sCNPJ [String, UpperCase]
* cPos  [Char]
* aDigito [Array[12], Int]

   For nPos := 1 To 12
      cPos := Subs( sCNPJ, nPos, 1 )
      aDigito[ nPos ] := Asc( cPos ) - 48
   Next
toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por toya »

Vejam o exemplo que publiquei...
https://pctoledo.org/forum/viewto ... 43&t=27691
Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Validar CNPJ alfanumérico, COCAD/SUARA/RFB nº 49, 2026+

Mensagem por JoséQuintas »

Lembrando que o governo precisa mudar seus sistemas pra isso.
Também os bancos, e demais instituições financeiras.
Não parece, mas a coisa é pesada.

Se pensar em boletos, equipamentos de leitura de código de barras, linha digitável, etc., pode ser que voltem atrás.
E se pensar na digitação disso, aí piorou, é meio impraticável e sujeita a erros.
Usar só teclado numérico pra terminais já era.

Talvez em 2027 saia o primeiro CNPJ assim, se não mudarem de idéia sobre o que fazer.

Então.....
Alteração em boletos, em CNAB, em nota fiscal eletrônica, sistemas das prefeituras, dos municípios, dos estados, e federais.
É ficar de olho nisso.
Daqui há um ano, se eles começarem a mudar, aí a gente se preocupa em mudar também.

Já pensou: caixa eletrônico com teclado alfanumérico pra digitar os novos códigos....
Vão começar a roubar caixa eletrônico só pra roubar o teclado, que não pode ser de má qualidade...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Validar CNPJ Numerico e Alfanumerico

Mensagem por alaminojunior »

JoséQuintas escreveu:Lembrando que o governo precisa mudar seus sistemas pra isso.
Também os bancos, e demais instituições financeiras.
Não parece, mas a coisa é pesada.

Se pensar em boletos, equipamentos de leitura de código de barras, linha digitável, etc., pode ser que voltem atrás.
E se pensar na digitação disso, aí piorou, é meio impraticável e sujeita a erros.
Usar só teclado numérico pra terminais já era.

Talvez em 2027 saia o primeiro CNPJ assim, se não mudarem de idéia sobre o que fazer.

Então.....
Alteração em boletos, em CNAB, em nota fiscal eletrônica, sistemas das prefeituras, dos municípios, dos estados, e federais.
É ficar de olho nisso.
Daqui há um ano, se eles começarem a mudar, aí a gente se preocupa em mudar também.

Já pensou: caixa eletrônico com teclado alfanumérico pra digitar os novos códigos....
Vão começar a roubar caixa eletrônico só pra roubar o teclado, que não pode ser de má qualidade...
Penso da mesma forma.
Não seria mais interessante aumentar o número de dígitos, ao invés dessa moda ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por bencz »

Agora sim, a brincadeira vai ser interessante... isso é tipo o proximo bug do milenio, só que versão Brasil!
Pessoal q usa CNPJ como chave, salvo em colunas do tipo 'int'

https://blog.tecnospeed.com.br/cnpj-alfanumerico/
Imagem
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por rochinha »

Amiguinhos,

Fala Bencz e como anda a linguagem de programação de sua autoria. xeretei outro dia.

Agora em relação ao CNPJ, ainda bem que sempre salvei como caracter completo com os símbolos.

Mas vai ter muita correria e ranger de dentes nos TIs por ai.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por bencz »

Bom dia!
Vish, @rochinha, quais delas ? ahahahah
Imagem
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Validar CNPJ Numerico e Alfanumerico

Mensagem por rochinha »

Amiguinhos,

Não lembro, vou chutar, acho que tinha algo a ver com montagem de formulas de cálculo. Acho que em alguma pesquisa sobre algo que eu estava buscando material me veio algum forum onde vi sua assinatura.

Não entrei no forum pois seria como um pizzaiolo entrar numa comunidade de fisica-quantica.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Validar CNPJ Numerico e Alfanumerico

Mensagem por Mario Mesquita »

Boa tarde, pessoal.

Acho que agora é oficial:

Receita Federal publicou no Diário Oficial da União desta quarta-feira (16/10) a Instrução Normativa RFB nº 2.229/2024, que altera o formato do Cadastro Nacional da Pessoa Jurídica (CNPJ). Em resposta à crescente demanda por novos números de CNPJ, o formato será modificado para incluir letras e números. A transição para o formato alfanumérico será progressiva e está prevista para julho de 2026.

Pra julho/2026. Menos mal...

Saudações,
Mario.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Validar CNPJ Numerico e Alfanumerico

Mensagem por JoséQuintas »

TUDO, de TODOS, vai ser alterado para o novo CNPJ.
Comunicação bancária, boletos, NFE, CTE, MDFE, NFSE, webservices em geral, até as coisas do próprio governo.
Muita coisa pode mudar até lá, até mesmo impedir a entrada do novo CNPJ.
Também podem aproveitar essa mudança pra já mudar outras coisas.

É o bug do milênio brasileiro.
É ficar em alerta.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Validar CNPJ Numerico e Alfanumerico

Mensagem por JoséQuintas »

Foi rápido, acho que está tudo pronto.

Alguém tem um CNPJ alfanumérico pra eu testar no meu aplicativo ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Validar CNPJ Numerico e Alfanumerico

Mensagem por JoséQuintas »

MySQL

Código: Selecionar todos

CREATE FUNCTION ze_ValidCNPJ( cCnpj VARCHAR(20) )
RETURNS int(11)

BEGIN

DECLARE cNumero VARCHAR(20);
DECLARE lOk INT(11);
SET cNumero = ze_SoNumeroCnpj( cCnpj );
IF LENGTH( cNumero ) <> 14 THEN
   RETURN IF( LENGTH( cNumero ) = 0, 1, 0 );
END IF;
SET cNumero = LPAD( cNumero, 14, '0' );
SET cNumero = SUBSTR( cNumero, 1, 12 );
SET cNumero = CONCAT( cNumero, ze_CalculaDigito( cNumero, 11 ) );
SET cNumero = CONCAT( cNumero, ze_CalculaDigito( cNumero, 11 ) );
SET lOk =  ( Right( cCnpj, 2 ) = Right( cNumero, 2 ) );
IF lOk THEN
   SET cCnpj = CONCAT( SUBSTR( cNumero, 1, 2 ), '.',
               SUBSTR( cNumero, 3, 3 ), '.',
               SUBSTR( cNumero, 6, 3 ), '/',
               SUBSTR( cNumero, 9, 4 ), '-',
               SUBSTR( cNumero, 13, 2 ) );
END IF;

RETURN lOk;

END

Código: Selecionar todos

CREATE FUNCTION ze_SoNumeroCnpj( cValue TEXT )
RETURNS TEXT CHARSET latin1

BEGIN

DECLARE cNewValue TEXT;
DECLARE nPos INT(11) DEFAULT 1;
DECLARE cChar VARCHAR(1);

SET cNewValue := '';
WHILE nPos <= LENGTH( cValue ) DO
   SET cChar := SUBSTR( cValue, nPos, 1 );
   IF ( cChar >= '0' AND cChar <= '9' ) OR ( cChar >= 'A' and cChar <= 'Z' ) THEN
      SET cNewValue := CONCAT( cNewValue, cChar );
   END IF;
   SET nPos = nPos + 1;
END WHILE;

RETURN cNewValue;

END

Código: Selecionar todos

CREATE FUNCTION ze_CalculaDigito(
	cNumero VARCHAR(100),
	nModulo INT(11)
   )
RETURNS VARCHAR(1)

/* 2024.10.18 CNPJ alpha */

BEGIN

DECLARE nFator INT(11);
DECLARE nSoma  INT(11);
DECLARE nPos   INT(11);
DECLARE nResto INT(11);

IF LENGTH( cNumero ) < 1 THEN
   RETURN '';
END IF;

SET nFator = 2;
SET nSoma = 0;
SET nPos = LENGTH( cNumero );

IF nModulo = 10 THEN
   WHILE nPos > 0 DO
      SET nSoma = nSoma + ( ASCII( SUBSTR( cNumero, nPos, 1 ) ) - 48 ) * nFator ) ;
      SET nFator = nFator + 1;
      SET nPos = nPos - 1;
   END WHILE;
ELSE
   WHILE nPos > 0 DO
      SET nSoma = nSoma + ( ASCII( SUBSTR( cNumero, nPos, 1 ) ) - 48 ) * nFator ) ;
      IF nFator = 9 THEN
         SET nFator = 2;
      ELSE
         SET nFator = nFator + 1;
      END IF;
      SET nPos = nPos - 1;
   END WHILE;
END IF;

SET nResto = 11 - MOD( nSoma, 11 );
IF nResto > 9 THEN
   SET nResto = 0;
END IF;

RETURN CAST( nResto AS CHAR(1) );

END

harbour

Código: Selecionar todos

FUNCTION ValidCnpj( cCnpj )

   LOCAL cNumero, lOk, cPicture := "@R 99.999.999/9999-99"

   cNumero := PadL( SoNumeroCnpj( cCnpj ), 14, "0" )
   cNumero := Left( cNumero, 12 )
   cNumero := cNumero + CalculaDigito( cNumero, "11" )
   cNumero := cNumero + CalculaDigito( cNumero, "11" )
   lOk     := ( SoNumero( cNumero ) == SoNumero( cCnpj ) )
   IF lOk
      cCnpj := Pad( Transform( cNumero, cPicture ), Max( 18, Len( cCnpj ) ) )
   ENDIF

   RETURN lOk

Código: Selecionar todos

FUNCTION SoNumeroCnpj( cTxt )

   LOCAL cSoNumeros := "", cChar

   FOR EACH cChar IN cTxt
      IF ( cChar >= "0" .AND. cChar <= "9" ) .OR. ( cChar >= "A" .AND. cChar <= "Z" )
         cSoNumeros += cChar
      ENDIF
   NEXT

   RETURN cSoNumeros

Código: Selecionar todos

FUNCTION CalculaDigito( cNumero, cModulo )

   LOCAL nFator, nPos, nSoma, nResto, nModulo, cCalculo

   hb_Default( @cModulo, "11" )
   IF Empty( cNumero )
      RETURN ""
   ENDIF
   cCalculo := AllTrim( cNumero )
   nModulo  := Val( cModulo )
   nFator   := 2
   nSoma    := 0
   IF nModulo == 10
      FOR nPos = Len( cCalculo ) To 1 Step -1
         nSoma += Val( Substr( cCalculo, nPos, 1 ) ) * nFator
         nFator += 1
      NEXT
   ELSE
      FOR nPos = Len( cCalculo ) To 1 Step -1
         nSoma += ( Asc( Substr( cCalculo, nPos, 1 ) ) - 48 ) * nFator
         IF nFator == 9
            nFator := 2
         ELSE
            nFator += 1
         ENDIF
      NEXT
   ENDIF
   nResto := 11 - Mod( nSoma, 11 )
   IF nResto > 9
      nResto := 0
   ENDIF
   cCalculo := Str( nResto, 1 )

   RETURN cCalculo
Só falta um CNPJ alfanumérico pra testar...

Como sempre falo:
É errado querer ganhar tempo na criação de fonte.
Tem que fazer fonte simples e claro, pra ganhar tempo na manutenção.
O que poderia ser problema em 2026, não é mais, será tempo livre pra alguma outra coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
SOSSOFT
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 23 Out 2024 10:04

Validar CNPJ Numerico e Alfanumerico

Mensagem por SOSSOFT »

Mas onde está este cnpj alfanumerico?
Responder