Last active
July 2, 2025 23:01
-
-
Save farribeiro/97446a97ce3410e196a20faa6786ae41 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- 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