Algoritmos – Validação de CNPJ

Introdução

Continuando a sequência de funções de validação e dígitos verificadores, vamos ver o cálculo do dígito do CNPJ – Cadastro Nacional da Pessoa Jurídica.

Formato

O CNPJ é formado por 14 números, dos quais os 12 primeiros são usados para o cálculo do primeiro digito verificador, e o segundo dígito é calculado a partir dos 12 primeiros números mais o primeiro dígito verificador. Destes 12 números de dados, o último bloco de quatro números é usado para representar a matriz e/ou filiais da mesma empresa.O CNPJ é representado no formato “99.999.999/9999-99”.

Fonte AdvPL

O fonte abaixo mostra um exemplo de uso e o fonte do cálculo do dígito verificador do CNPJ, buscando o melhor nível de otimização.

#include 'protheus.ch'  

// -----------------------------------
// Referências
// https://www.geradorcnpj.com/algoritmo_do_cnpj.htm

User Function TSTCNPJ()
Local cCNPJ 
cCNPJ := '121213450001' // 12.121.345/0001-xx
conout(cCNPJ)
conout(DV_CNPJ(cCNPJ))
Return


/*  ------------------------------------------
Dígito verificador de CNPJ
Recebe o CNPJ como string de 12 números
Retorna os 2 digitos verificadores como string
------------------------------------------- */

STATIC Function DV_CNPJ(cCNPJ)
Local nI , nVL  
Local nM1 := 5, nM2 := 6
Local nDV1 := 0, nDV2 := 0

// Calculo dos valores dos digitos baseado 
// no fator multiplicativo de acordo com a posição 
// de cada dígito. 

For nI := 1 to 12
	nVL := val( substr(cCNPJ,nI,1) )
	nDV1 += (  nVL * nM1 )
	nDV2 += (  nVL * nM2 )
	nM1--           
	IF nM1 < 2 
		nM1 := 9
	Endif
	nM2--           
	IF nM2 < 2 
		nM2 := 9
	Endif
Next

// Cálculo do primeiro dígito
nDV1 := nDV1 % 11
IF nDV1 < 2 
	nDV1 := 0 
Else
	nDV1 := 11 - nDV1
Endif

// Cálculo do segundo digito 
nDV2 += ( nDV1 * 2 )  
nDV2 := nDV2 % 11
IF nDV2 < 2 
	nDV2 := 0 
Else
	nDV2 := 11 - nDV2
Endif

// Retorna os dígitos verificadors como String
Return chr(48+nDV1)+chr(48+nDV2)

Funcionamento

De forma muito parecida com todas as demais funções de validação, o cálculo principal se faz com o módulo 11 da somatória da multiplicação de cada dígito por um fator de peso. Você encontra a explicação completa e exemplificada nas referências no final do post.

Conclusão

Desejo a todos um bom proveito das funções publicadas, e TERABYTES DE SUCESSO 😀

Referências

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s