Página 1 de 2

Validar CNPJ Numerico e Alfanumerico

Enviado: 24 Jun 2024 09:34
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)))

Validar CNPJ Numerico e Alfanumerico

Enviado: 24 Jun 2024 13:35
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

Validar CNPJ Numerico e Alfanumerico

Enviado: 24 Jun 2024 13:48
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

Validar CNPJ Numerico e Alfanumerico

Enviado: 24 Jun 2024 14:16
por toya
Vejam o exemplo que publiquei...
https://pctoledo.org/forum/viewto ... 43&t=27691

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

Enviado: 25 Jun 2024 10:06
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...

Validar CNPJ Numerico e Alfanumerico

Enviado: 26 Jun 2024 14:53
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 ?

Validar CNPJ Numerico e Alfanumerico

Enviado: 05 Jul 2024 11:54
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/

Validar CNPJ Numerico e Alfanumerico

Enviado: 11 Jul 2024 00:55
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.

Validar CNPJ Numerico e Alfanumerico

Enviado: 18 Jul 2024 09:35
por bencz
Bom dia!
Vish, @rochinha, quais delas ? ahahahah

Validar CNPJ Numerico e Alfanumerico

Enviado: 18 Jul 2024 17:39
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.

Validar CNPJ Numerico e Alfanumerico

Enviado: 17 Out 2024 13:39
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.

Validar CNPJ Numerico e Alfanumerico

Enviado: 18 Out 2024 11:11
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.

Validar CNPJ Numerico e Alfanumerico

Enviado: 18 Out 2024 12:42
por JoséQuintas
Foi rápido, acho que está tudo pronto.

Alguém tem um CNPJ alfanumérico pra eu testar no meu aplicativo ?

Validar CNPJ Numerico e Alfanumerico

Enviado: 18 Out 2024 13:00
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.

Validar CNPJ Numerico e Alfanumerico

Enviado: 23 Out 2024 10:31
por SOSSOFT
Mas onde está este cnpj alfanumerico?