Skip to content

Instantly share code, notes, and snippets.

@ellisonleao
Created December 21, 2016 18:13
Show Gist options
  • Save ellisonleao/9df23e2c57d388ac5a26b96cb50f6634 to your computer and use it in GitHub Desktop.
Save ellisonleao/9df23e2c57d388ac5a26b96cb50f6634 to your computer and use it in GitHub Desktop.
Validador Renavam Python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
def validar_renavam(renavam):
"""
No caso do RENAVAM, o DV (dígito verificador) módulo 11 é calculado
multiplicando cada dígito do número base pela sequência de multiplicadores
2, 3, 4, 5, 6, 7, 8, 9, 2 e 3, posicionados da direita para a esquerda.
O somatório destas multiplicações é multiplicado por 10 e depois dividido
por 11, e o resto desta divisão é o DV.
Porém, sempre que o resto da divisão for 10, o DV será 0.
"""
# valida casos menores e de tamanho > 11 digitos
if len(renavam) < 9 or len(renavam) > 11:
return False
# adiciona 2 zeros em casos de numeros antigos
if len(renavam) == 9:
renavam = '00{}'.format(renavam)
# remove ultimo digito (verificador)
renavam_sem_digito = renavam[:-1]
# inverte
renavam_sem_digito = renavam_sem_digito[::-1]
# Multiplica as strings reversas do renavam pelos numeros multiplicadores
# para apenas os primeiros 8 digitos de um total de 10
# Exemplo: renavam reverso sem digito = 69488936
# 6, 9, 4, 8, 8, 9, 3, 6
# * * * * * * * *
# 2, 3, 4, 5, 6, 7, 8, 9 (numeros multiplicadores - sempre os mesmos [fixo])
soma = 0
for i, digito in enumerate(renavam_sem_digito[:8]):
soma += int(digito) * (i + 2)
# Multiplica os dois ultimos digitos e soma
soma += int(renavam_sem_digito[8]) * 2
soma += int(renavam_sem_digito[9]) * 3
# mod11 = 284 % 11 = 9 (resto da divisao por 11)
mod11 = soma % 11
# Faz-se a conta 11 (valor fixo) - mod11 = 11 - 9 = 2
ultimo_digito_calculado = 11 - mod11
# ultimoDigito = Caso o valor calculado anteriormente seja 10 ou 11,
# transformo ele em 0. caso contrario, eh o proprio numero
if ultimo_digito_calculado >= 10:
ultimo_digito_calculado = 0
# Pego o ultimo digito do renavam original (para confrontar com o calculado)
# Comparo os digitos calculado e informado
if ultimo_digito_calculado == int(renavam[-1]):
return True
return False
"""
Tests
"""
class RenavamTests(unittest.TestCase):
def test_renavam_valido(self):
self.assertTrue(validar_renavam('60390908553'))
self.assertTrue(validar_renavam('34118026873'))
self.assertTrue(validar_renavam('44666210669'))
def test_renavam_invalido(self):
self.assertFalse(validar_renavam(''))
self.assertFalse(validar_renavam('1'))
self.assertFalse(validar_renavam('69488936'))
if __name__ == "__main__":
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment