Skip to content

Instantly share code, notes, and snippets.

@farribeiro
Last active July 2, 2025 23:01
Show Gist options
  • Save farribeiro/97446a97ce3410e196a20faa6786ae41 to your computer and use it in GitHub Desktop.
Save farribeiro/97446a97ce3410e196a20faa6786ae41 to your computer and use it in GitHub Desktop.
--- Função Centralizada de Cálculo do Dígito Verificador
-- Calcula um dígito verificador dado um número (CNPJ parcial ou completo) e o peso inicial
-- `numero_str`: string com os dígitos a serem calculados (ex: "123456780001" ou "123456780001X")
-- `peso_inicial`: o primeiro peso da sequência (ex: 5 para DV1, 6 para DV2)
function calcularDigitoVerificador(numero_str, peso_inicial)
local soma = 0
local peso_atual = peso_inicial
-- Itera sobre cada dígito da string fornecida
for i = 1, #numero_str do
local digito = numero_str:sub(i, i):byte() - 48 -- Converte para número diretamente
soma = soma + (digito * peso_atual)
-- Opcional: Para depuração, você pode reativar o print aqui
--print (digito, "x", peso_atual, "=", (digito * peso_atual))
peso_atual = peso_atual == 2 and 9 or peso_atual - 1 -- Atualiza o peso para o próximo dígito, seguindo a sequência (9 a 2, depois 9)
end
local dv_resto = soma % 11
local dv = dv_resto < 2 and 0 or 11 - dv_resto -- Regra padrão para dígitos verificadores de CNPJ
return dv, soma -- Retorna o dígito verificador e a soma para fins de depuração/visualização
end
--- Execução Principal
local cnpj_base = ("12ABC34501DE"):upper() -- Os 12 primeiros dígitos do CNPJ
-- --- CÁLCULO DO PRIMEIRO DÍGITO VERIFICADOR (DV1) ---
local dv1, soma_dv1 = calcularDigitoVerificador(cnpj_base, 5)
print ("---")
print ("Soma calculada para DV1: " .. soma_dv1)
print ("Primeiro Dígito Verificador (DV1): " .. dv1)
print ("---")
-- --- CÁLCULO DO SEGUNDO DÍGITO VERIFICADOR (DV2) ---
-- Criamos o CNPJ estendido com o DV1 para o cálculo do DV2
local dv2, soma_dv2 = calcularDigitoVerificador(cnpj_base .. tostring(dv1), 6)
print ("---")
print ("Soma calculada para DV2: " .. soma_dv2)
print ("Segundo Dígito Verificador (DV2): " .. dv2)
print ("---")
print ("CNPJ completo: " .. cnpj_base .. tostring(dv1) .. tostring(dv2)) -- CNPJ completo com os dígitos verificadores
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment