Algoritmos – Validação de CNH

Introdução

Seguindo a sequência de algoritmos de validação de dígitos verificadores de documentos, vamos ver agora a numeração da CNH – Carteira Nacional de Habilitação.

Formato

O número da CNH é formado de 11 dígitos, sendo os dois últimos dígitos verificadores, calculados a partir dos nove primeiros dígitos, usando algumas regras diferenciadas para o segundo dígito caso o módulo 11 do primeiro seja maior que 9. A aplicação do módulo 11 é muito parecida em todos os casos, porém as regras diferenciadas é que são o “pulo do gato”.

Fonte em AdvPL

#include 'protheus.ch'	             

/* -----------------------------------------
Referências 
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=6343
https://www.devmedia.com.br/forum/validacao-do-numero-de-registro-de-cnh/354889
----------------------------------------- */

User Function TSTCNH()
Local cCNH
Local cDV 

cCNH := "527988023"
cDV := DV_CNH(cCNH)

conout("CNH ..... "+cCNH)
conout("DV ...... "+cDV)

return


/* ------------------------------------------
Geração de dígito verificador de CNH
Recebe o número da CNG em String, com 9 dígitos 
Calcula os dois dígitos verificadores
------------------------------------------ */

STATIC Function DV_CNH(cCNH)
Local nI , nVL  
Local nM1  := 9 , nM2  := 1
Local nDV1 := 0 , nDV2 := 0
Local lMaior := .F.

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

For nI := 1 to 9
	nVL := val( substr(cCNH,nI,1) )
	nDV1 += (  nVL * nM1 )
	nDV2 += (  nVL * nM2 )
	nM1--
	nM2++
	nVA := nVL
Next

// Determina o primeiro dígito verificador 
nDV1 := nDV1 % 11
If nDV1 > 9 
	nDV1 := 0 
	lMaior := .T.
Endif

// Determina o segundo dígito verificador 
nDV2 := nDV2 % 11
If lMaior
	// Regra diferenciada para caso o módulo 11 
	// do primeiro dígito verificador seja maior que 9
	If nDV2 - 2 < 0 
		nDV2 += 9
	ElseIf nDV2 - 2 >= 0 
		nDV2 -= 2
	Endif
Endif

// Ajuste final 
IF nDV2 > 9 
	nDV2 := 0 
Endif

// Retorna os dígitos calculados como string
Return chr(48+nDV1) + chr(48+nDV2)

Conclusão

Por hora, acabei de concluir que a caixa de Pandora está aberta, e sobre esse assunto ainda vão sair vários posts !!!

Agradeço a todos pela audiência e desejo a todos 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