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
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
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?