Gerador e Validador de CUIT/CUIL | Ferramenta de Identificação Fiscal Argentina
Gere números de teste válidos de CUIT/CUIL argentinos ou valide números existentes. Ferramenta online gratuita para desenvolvedores testarem sistemas de identificação fiscal e folha de pagamento com validação compatível com a AFIP.
Gerador de CUIT/CUIL
Digite um número de DNI de 8 dígitos ou use o gerador aleatório
Usando DNI gerado aleatoriamente
Documentação
Gerador e Validador de CUIT/CUIL Argentino
Introdução
No sistema tributário e trabalhista da Argentina, você constantemente encontrará dois identificadores críticos: CUIT (Chave Única de Identificação Tributária) e CUIL (Chave Única de Identificação Laboral). Pense no CUIT como o identificador fiscal para empresas e indivíduos que pagam impostos, enquanto o CUIL identifica trabalhadores no sistema de seguridade social. Ambos usam o mesmo formato de 11 dígitos e algoritmo de verificação, o que torna particularmente importante testar aplicações que lidam com esses números.
Ao desenvolver software para o mercado argentino, você precisa de dados de teste válidos. É aí que esta ferramenta entra. Você pode gerar números CUIT/CUIL matematicamente corretos para testes sem usar informações pessoais reais, ou validar números existentes para garantir que estejam em conformidade com o algoritmo oficial da AFIP. O que é particularmente útil é que a ferramenta lida tanto com o lado de geração (criando números válidos sob demanda) quanto com o lado de validação (identificando erros de formato, códigos de tipo inválidos e dígitos de verificação incorretos antes que causem problemas em produção).
Estrutura e Cálculo de CUIT/CUIL
Compreendendo o Formato
Um número CUIT/CUIL válido consiste em 11 dígitos normalmente exibidos no formato XX-XXXXXXXX-X. Veja como ele se divide:
-
Código de Tipo (primeiros 2 dígitos): Identifica o tipo de entidade
- 20, 23, 24: Indivíduos do sexo masculino (CUIL)
- 27: Indivíduos do sexo feminino (CUIL)
- 30, 33, 34: Empresas e organizações (CUIT)
-
Número de DNI (8 dígitos do meio): Para indivíduos, este é o número do documento de identidade nacional (DNI). Uma armadilha comum: se o DNI real tiver menos de 8 dígitos, você deve preenchê-lo com zeros à esquerda. Por exemplo, DNI 1234567 se torna 01234567 no CUIT/CUIL. Empresas recebem um número único atribuído.
-
Dígito de Verificação (último dígito): Este dígito de verificação valida todo o número usando um algoritmo ponderado. Se este dígito não corresponder ao cálculo, o CUIT/CUIL inteiro é inválido—algo que frequentemente pega os desenvolvedores de surpresa quando estão construindo manualmente dados de teste.
Cálculo do Dígito de Verificação
O dígito de verificação usa um algoritmo ponderado de módulo-11. Veja como funciona:
- Pegue os primeiros 10 dígitos do CUIT/CUIL (código de tipo + DNI)
- Multiplique cada dígito por seu peso correspondente: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Some todos os produtos
- Calcule: 11 menos (soma módulo 11)
- Trate casos especiais: se o resultado for 11, use 0; se for 10, use 9
O que mais confunde as pessoas são esses casos especiais nas etapas 5. Ao testar, ocasionalmente você obterá um resultado de 10 ou 11, e esquecer de mapear esses valores para 9 e 0, respectivamente, causa falhas de validação que podem ser difíceis de depurar se você não estiver ciente dessa regra.
Matematicamente, isso pode ser expresso como:
Onde:
- é o dígito de verificação
- é o -ésimo dígito dos primeiros 10 dígitos
- é o peso correspondente da sequência [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Casos especiais: se então , se então
Guia Passo a Passo
Usando o Gerador
-
Selecione a aba "Gerador" no topo da interface da ferramenta.
-
Escolha um Código de Tipo no menu suspenso:
- 20: Masculino (CUIL)
- 23: Empresa (CUIT)
- 24: Empresa Temporária (CUIT)
- 27: Feminino (CUIL)
- 30: Corporação (CUIT)
- 33: Associação Civil (CUIT)
- 34: Fundação (CUIT)
-
Insira um Número de DNI (opcional):
- Insira um número de DNI de 8 dígitos no campo fornecido
- Se deixado em branco, a ferramenta usará um DNI gerado aleatoriamente
- Se você inserir menos de 8 dígitos, o sistema completará com zeros à esquerda
-
Gerar DNI Aleatório (opcional):
- Clique no botão "Aleatório" para gerar um número de DNI aleatório de 8 dígitos
-
Visualizar o CUIT/CUIL Gerado:
- A ferramenta exibe automaticamente um CUIT/CUIL válido com base em suas entradas
- O formato será XX-XXXXXXXX-X com o dígito de verificação correto
-
Copiar o Resultado:
- Clique no ícone de cópia para copiar o CUIT/CUIL gerado para a área de transferência
- Uma mensagem de confirmação aparecerá quando copiado com sucesso
Usando o Validador
-
Selecione a aba "Validador" no topo da interface da ferramenta.
-
Insira o CUIT/CUIL para Validar:
- Insira o CUIT/CUIL no formato XX-XXXXXXXX-X
- A ferramenta formatará automaticamente sua entrada com hífens conforme você digita
- Você também pode inserir o número sem hífens (XXXXXXXXXXX)
-
Clique no Botão "Validar":
- A ferramenta verificará o formato, código de tipo e dígito de verificação
-
Visualizar o Resultado da Validação:
- Para números CUIT/CUIL válidos, uma mensagem de sucesso verde aparecerá
- Para números inválidos, uma mensagem de erro vermelha explicará o problema:
- Formato inválido (deve ser XX-XXXXXXXX-X)
- Código de tipo inválido (deve ser um dos: 20, 23, 24, 27, 30, 33, 34)
- Dígito de verificação inválido
-
Informações Adicionais:
- Para números válidos, a ferramenta exibe uma análise dos componentes:
- Código de tipo e seu significado
- Número de DNI
- Dígito de verificação
- Para números válidos, a ferramenta exibe uma análise dos componentes:
Erros Comuns e Melhores Práticas
Ao trabalhar com validação de CUIT/CUIL em suas aplicações, fique atento a estas armadilhas frequentes:
Problemas de Preenchimento com Zero: O bug mais comum que encontrei envolve números de DNI com zeros à esquerda. Quando alguém insere DNI "1234567", seu código precisa tratá-lo como "01234567" para construção de CUIT/CUIL. Muitas implementações convertem para inteiros para processamento, o que remove os zeros à esquerda. Use operações de string com preenchimento adequado.
Confusão de Código de Tipo: Nem todos os números de dois dígitos são códigos de tipo válidos. Apenas 20, 23, 24, 27, 30, 33, 34 funcionam. Vi sistemas que aceitam qualquer prefixo de dois dígitos, levando a números "aparentemente válidos" como 21-12345678-X que falham na validação da AFIP. Sempre valide o código de tipo antes de calcular o dígito de verificação.
Suposições de Gênero: Código de tipo 20 (masculino) e 27 (feminino) não são intercambiáveis. Se você estiver gerando CUILs automaticamente com base em dados demográficos, garanta que o código de tipo corresponda ao gênero real registrado no RENAPER (registro nacional da Argentina). Discrepâncias causam rejeição quando indivíduos tentam usar esses números em serviços governamentais.
Tratamento de Hífen: Algumas implementações requerem hífens, enquanto outras os rejeitam. Melhor prática: aceite ambos os formatos em campos de entrada (com ou sem hífens), remova os hífens antes da validação, armazene a versão sem hífen em bancos de dados e adicione hífens apenas para exibição.
Verificação Ausente: A validação de algoritmo detecta erros de formato, mas não confirma se o CUIT/CUIL está registrado. Em produção, valide primeiro o formato (rápido), depois verifique no banco de dados da AFIP (mais lento, mas autoritativo). Essa abordagem de duas etapas captura erros de digitação instantaneamente, garantindo que o número seja real.
Teste de Casos Extremos: Sempre teste com dígitos de verificação 0 e 9 — estes resultam de casos especiais no algoritmo. Também teste DNIs que começam com zeros para garantir que sua lógica de preenchimento funcione corretamente.
Casos de Uso e Aplicações Práticas
Desenvolvimento e Teste
Desenvolvimento de Software: Ao construir aplicações para o mercado argentino, você precisará de dados de teste que passem na validação sem usar informações reais de usuários. Aqui é onde isso se torna crítico:
- Plataformas de e-commerce: Processadores de pagamento e sistemas de faturamento requerem números CUIT/CUIL válidos. Durante testes de carga, você pode precisar de milhares de números válidos para simular registros de usuários realistas.
- Software de contabilidade: Módulos de relatórios fiscais verificam o formato CUIT/CUIL antes do envio para a AFIP. Testar essas regras de validação requer números que passem no algoritmo de dígito de verificação.
- Sistemas de gestão de RH: Processamento de folha de pagamento e contribuições de seguridade social dependem de números CUIL válidos. Um cenário comum: você está testando fluxos de integração de funcionários e precisa verificar se CUILs inválidos acionam mensagens de erro apropriadas.
- Aplicações bancárias: Processos de KYC (Conheça Seu Cliente) validam CUIT/CUIL como parte da abertura de conta. Na minha experiência, casos de borda como incompatibilidades de código de tipo frequentemente surgem durante testes de integração.
População de Banco de Dados: Ao semear bancos de dados de teste, usar números CUIT/CUIL algoritmicamente válidos garante que as restrições e gatilhos do banco de dados funcionem como esperado. Isso é particularmente importante ao testar scripts de migração de dados ou processos ETL que validam números de identificação.
Teste de Validação de Formulários: Teste tanto o caminho feliz quanto as condições de erro. Gere números válidos para confirmar o envio bem-sucedido, depois modifique o dígito de verificação para garantir que a validação do seu frontend e backend capture o erro antes que ele alcance seu banco de dados.
Teste de API: Testes de integração devem usar números CUIT/CUIL válidos em cargas de solicitação. Isso evita falsos negativos onde os testes falham devido a dados de teste inválidos em vez de bugs reais na lógica da API.
Automação de QA: Testes parametrizados se beneficiam da geração dinâmica de CUIT/CUIL. Em vez de codificar valores de teste que podem entrar em conflito entre execuções de teste, gere números válidos novos para cada execução de teste.
Propósitos Educacionais
Aprendendo Algoritmos de Validação: O algoritmo de verificação CUIT/CUIL demonstra aplicação prática de aritmética modular e dígitos de verificação ponderados. Esse mesmo padrão aparece em outros sistemas de identificação em todo o mundo—números de cartão de crédito (algoritmo de Luhn), códigos ISBN e números de IVA europeus todos usam abordagens semelhantes de soma de verificação ponderada. Entender como funciona a validação CUIT/CUIL fornece insight sobre por que esses algoritmos existem: eles capturam erros de transcrição como dígitos trocados ou erros de dígito único.
Ensinando Validação de Dados: Ao treinar desenvolvedores juniores em validação de entrada, o sistema CUIT/CUIL oferece um exemplo do mundo real que é mais complexo que validação de e-mail, mas mais simples que verificação criptográfica. Ele demonstra o princípio de defesa em profundidade: validação de formato (11 dígitos), validação de regras de negócio (códigos de tipo válidos) e validação algorítmica (dígito de verificação).
Desenvolvimento de Negócios Internacionais: Se você está construindo sistemas para mercados latino-americanos, entender CUIT/CUIL ajuda a compreender sistemas semelhantes em países vizinhos. O Brasil tem CPF/CNPJ, o Chile tem RUT e o Uruguai tem RUT—todos usam algoritmos de dígito de verificação. Os padrões que você aprende aqui se transferem para esses sistemas.
Alternativas e Considerações de Produção
Embora esta ferramenta funcione bem para desenvolvimento e teste, ambientes de produção têm requisitos diferentes:
Validação Oficial do Governo: Para aplicações ao vivo, a validação algorítmica sozinha não é suficiente—você precisa verificar se o CUIT/CUIL está realmente registrado na AFIP (Administração Federal de Receitas Públicas). A AFIP fornece serviços web para validação em tempo real, embora você precise se registrar e autenticar para acessá-los. O detalhe: um número pode ser matematicamente válido, mas não oficialmente atribuído, então sempre implemente ambas as camadas de validação em produção.
Bibliotecas e Pacotes: Se você está integrando validação CUIT/CUIL em sua base de código, considere estas bibliotecas estabelecidas em vez de criar a sua própria:
- JavaScript:
validar-cuitno npm lida com validação e formatação - PHP: Biblioteca
afip-phpfornece validação e integração de serviço web AFIP - Python:
py-cuitno PyPI implementa o algoritmo completo
Usar bibliotecas mantidas reduz o risco de bugs de implementação e geralmente inclui casos de borda que você pode perder em código personalizado.
Cálculo Manual: Para fins de aprendizado ou depuração, trabalhar no algoritmo manualmente ajuda a solidificar o entendimento. Pegue uma calculadora e um CUIT/CUIL de exemplo, depois siga o processo de multiplicação ponderada passo a passo.
Serviços de Validação Empresarial: Aplicações em grande escala podem se beneficiar de APIs de validação de terceiros que não apenas verificam o formato, mas também fazem referência cruzada com bancos de dados comerciais. Esses serviços podem sinalizar empresas inativas, identificar entidades sancionadas ou fornecer metadados adicionais sobre o titular do CUIT/CUIL.
História do Sistema CUIT/CUIL
O sistema de identificação CUIT/CUIL na Argentina evoluiu significativamente desde sua criação:
Origens e Implementação
O CUIT (Clave Única de Identificación Tributaria) foi introduzido pela primeira vez na Argentina na década de 1970 como parte dos esforços para modernizar o sistema de arrecadação de impostos. A Administração Federal de Receitas Públicas (AFIP) implementou esse identificador único para rastrear contribuintes de forma mais eficiente e reduzir a sonegação fiscal.
O CUIL (Clave Única de Identificación Laboral) foi posteriormente introduzido para identificar especificamente trabalhadores no sistema de seguridade social, criando uma distinção entre identificação fiscal e identificação trabalhista, mantendo um formato consistente.
Evolução e Digitalização
Na década de 1990, quando a Argentina passou por significativas reformas econômicas, o sistema CUIT/CUIL tornou-se cada vez mais importante para rastrear a atividade econômica. O sistema foi ainda mais digitalizado, e sistemas de verificação online foram implementados.
O início dos anos 2000 viu a integração do sistema CUIT/CUIL com diversos serviços digitais governamentais, tornando-o um componente essencial das iniciativas de governo eletrônico da Argentina. Esse período também marcou a padronização do algoritmo de verificação e formato que permanece em uso até hoje.
Desenvolvimentos Recentes
Nos últimos anos, a AFIP aprimorou os processos de segurança e verificação dos números CUIT/CUIL, implementando sistemas de validação mais sofisticados e integrando-os com outros bancos de dados governamentais. O sistema agora desempenha um papel crucial nos esforços da Argentina para combater a sonegação fiscal e formalizar a economia.
Atualmente, o CUIT/CUIL é usado não apenas para fins fiscais e de emprego, mas também para uma ampla gama de atividades, incluindo serviços bancários, transações imobiliárias, serviços públicos e compras online, tornando-se um identificador essencial para indivíduos e empresas que operam na Argentina.
Considerações de Implementação
Ao implementar a validação de CUIT/CUIL em seus próprios sistemas, considere estes aspectos técnicos:
Estabilidade do Algoritmo: O algoritmo de verificação de CUIT/CUIL atual permaneceu inalterado desde sua padronização nos anos 1990. De acordo com a documentação técnica da AFIP, a abordagem de dígito de verificação com módulo-11 ponderado está codificada na Resolução Geral 2854/2010 e regulamentações subsequentes. Essa estabilidade significa que as implementações raramente precisam de atualizações, mas você deve monitorar os comunicados da AFIP para quaisquer mudanças regulatórias.
Otimização de Desempenho: O algoritmo de verificação é computacionalmente barato—apenas 10 multiplicações, uma adição e uma operação de módulo. Para sistemas de alta vazão processando milhares de validações por segundo, o gargalo é tipicamente a latência de rede ao verificar no banco de dados da AFIP, não o algoritmo em si. Considere armazenar em cache os resultados de verificação da AFIP com TTLs apropriados (tipicamente 24 horas) para equilibrar atualidade com desempenho.
Codificação de Caracteres: Ao processar dados de CUIT/CUIL de fontes externas (PDFs, documentos digitalizados, web scraping), fique atento a problemas de codificação de caracteres. O hífen pode aparecer como travessão (U+2014), meia-risca (U+2013) ou sinal de menos (U+2212) em vez do hífen-menos padrão (U+002D). Normalize esses caracteres antes da validação para evitar falsos negativos.
Internacionalização: Se sua aplicação atende a múltiplos mercados latino-americanos, observe que o CUIT/CUIL da Argentina usa módulo-11 com pesos específicos, enquanto o RUT do Chile usa módulo-11 com pesos diferentes, e o CPF/CNPJ do Brasil usa módulo-11 com outro padrão. Não assuma que os algoritmos são idênticos—cada sistema de país tem regras distintas. Para uma compreensão mais ampla dos algoritmos de dígitos de verificação, consulte o padrão ISO/IEC 7064 que formaliza vários esquemas de verificação baseados em módulo.
Armazenamento em Banco de Dados: Armazene números de CUIT/CUIL sem hífens como CHAR(11) de comprimento fixo ou como BIGINT se seu banco de dados suportar inteiros de 11 dígitos sem perda de precisão. Adicione uma restrição de verificação que valide o dígito de verificação no nível do banco de dados como uma rede de segurança contra dados corrompidos. Crie índices neste campo para buscas eficientes quando os usuários pesquisarem por CUIT/CUIL.
Exemplos de Código
Python
1def calcular_digito_verificacao(tipo_codigo, dni):
2 # Converte para string e garante que o DNI tenha 8 dígitos com zeros à esquerda
3 tipo_codigo_str = str(tipo_codigo)
4 dni_str = str(dni).zfill(8)
5
6 # Combina código de tipo e DNI
7 digitos = tipo_codigo_str + dni_str
8
9 # Pesos para cada posição
10 pesos = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Calcula soma dos produtos
13 soma_produtos = sum(int(digitos[i]) * pesos[i] for i in range(10))
14
15 # Calcula dígito de verificação
16 digito_verificacao = 11 - (soma_produtos % 11)
17
18 # Casos especiais
19 if digito_verificacao == 11:
20 digito_verificacao = 0
21 elif digito_verificacao == 10:
22 digito_verificacao = 9
23
24 return digito_verificacao
25
26def gerar_cuit_cuil(tipo_codigo, dni=None):
27 import random
28
29 # Códigos de tipo válidos
30 codigos_tipo_validos = [20, 23, 24, 27, 30, 33, 34]
31
32 if tipo_codigo not in codigos_tipo_validos:
33 raise ValueError(f"Código de tipo inválido. Deve ser um dos seguintes: {codigos_tipo_validos}")
34
35 # Gera DNI aleatório se não fornecido
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Calcula dígito de verificação
40 digito_verificacao = calcular_digito_verificacao(tipo_codigo, dni)
41
42 # Formata CUIT/CUIL
43 return f"{tipo_codigo}-{str(dni).zfill(8)}-{digito_verificacao}"
44
45def validar_cuit_cuil(cuit_cuil):
46 # Remove hífens se presentes
47 cuit_cuil_limpo = cuit_cuil.replace("-", "")
48
49 # Verifica formato básico
50 if not cuit_cuil_limpo.isdigit() or len(cuit_cuil_limpo) != 11:
51 return False, "Formato inválido"
52
53 # Extrai partes
54 tipo_codigo = int(cuit_cuil_limpo[0:2])
55 dni = int(cuit_cuil_limpo[2:10])
56 digito_verificacao = int(cuit_cuil_limpo[10])
57
58 # Valida código de tipo
59 codigos_tipo_validos = [20, 23, 24, 27, 30, 33, 34]
60 if tipo_codigo not in codigos_tipo_validos:
61 return False, "Código de tipo inválido"
62
63 # Calcula e compara dígito de verificação
64 digito_calculado = calcular_digito_verificacao(tipo_codigo, dni)
65 if digito_calculado != digito_verificacao:
66 return False, "Dígito de verificação inválido"
67
68 return True, "CUIT/CUIL válido"
69
70# Exemplo de uso
71print(gerar_cuit_cuil(20, 12345678)) # Gera para DNI específico
72print(gerar_cuit_cuil(27)) # Gera com DNI aleatório
73print(validar_cuit_cuil("20-12345678-9")) # Valida um CUIT/CUIL
74JavaScript
1function calcularDigitoVerificacao(tipoCodigo, dni) {
2 // Converte para string e garante que o DNI tenha 8 dígitos com zeros à esquerda
3 const tipoCodStr = tipoCodigo.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Combina código de tipo e DNI
7 const digitos = tipoCodStr + dniStr;
8
9 // Pesos para cada posição
10 const pesos = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Calcula soma dos produtos
13 let somaProdutos = 0;
14 for (let i = 0; i < 10; i++) {
15 somaProdutos += parseInt(digitos[i]) * pesos[i];
16 }
17
18 // Calcula dígito de verificação
19 let digitoVerificacao = 11 - (somaProdutos % 11);
20
21 // Casos especiais
22 if (digitoVerificacao === 11) {
23 digitoVerificacao = 0;
24 } else if (digitoVerificacao === 10) {
25 digitoVerificacao = 9;
26 }
27
28 return digitoVerificacao;
29}
30
31function gerarCuitCuil(tipoCodigo, dni) {
32 // Códigos de tipo válidos
33 const codigosTipoValidos = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!codigosTipoValidos.includes(tipoCodigo)) {
36 throw new Error(`Código de tipo inválido. Deve ser um dos seguintes: ${codigosTipoValidos.join(', ')}`);
37 }
38
39 // Gera DNI aleatório se não fornecido
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Calcula dígito de verificação
45 const digitoVerificacao = calcularDigitoVerificacao(tipoCodigo, dni);
46
47 // Formata CUIT/CUIL
48 return `${tipoCodigo}-${dni.toString().padStart(8, '0')}-${digitoVerificacao}`;
49}
50
51function validarCuitCuil(cuitCuil) {
52 // Remove hífens se presentes
53 const cuitCuilLimpo = cuitCuil.replace(/-/g, '');
54
55 // Verifica formato básico
56 if (!/^\d{11}$/.test(cuitCuilLimpo)) {
57 return { isValid: false, errorMessage: 'Formato inválido' };
58 }
59
60 // Extrai partes
61 const tipoCodigo = parseInt(cuitCuilLimpo.substring(0, 2));
62 const dni = parseInt(cuitCuilLimpo.substring(2, 10));
63 const digitoVerificacao = parseInt(cuitCuilLimpo.substring(10, 11));
64
65 // Valida código de tipo
66 const codigosTipoValidos = [20, 23, 24, 27, 30, 33, 34];
67 if (!codigosTipoValidos.includes(tipoCodigo)) {
68 return { isValid: false, errorMessage: 'Código de tipo inválido' };
69 }
70
71 // Calcula e compara dígito de verificação
72 const digitoCalculado = calcularDigitoVerificacao(tipoCodigo, dni);
73 if (digitoCalculado !== digitoVerificacao) {
74 return { isValid: false, errorMessage: 'Dígito de verificação inválido' };
75 }
76
77 return { isValid: true };
78}
79
80// Exemplo de uso
81console.log(gerarCuitCuil(20, 12345678)); // Gera para DNI específico
82console.log(gerarCuitCuil(27)); // Gera com DNI aleatório
83console.log(validarCuitCuil("20-12345678-9")); // Valida um CUIT/CUIL
84Java
1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6 private static final List<Integer> CODIGOS_TIPO_VALIDOS = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7 private static final int[] PESOS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8
9 public static int calcularDigitoVerificacao(int tipoCodigo, int dni) {
10 // Converte para string e garante que o DNI tenha 8 dígitos com zeros à esquerda
11 String tipoCodStr = String.valueOf(tipoCodigo);
12 String dniStr = String.format("%08d", dni);
13
14 // Combina código de tipo e DNI
15 String digitos = tipoCodStr + dniStr;
16
17 // Calcula soma dos produtos
18 int somaProdutos = 0;
19 for (int i = 0; i < 10; i++) {
20 somaProdutos += Character.getNumericValue(digitos.charAt(i)) * PESOS[i];
21 }
22
23 // Calcula dígito de verificação
24 int digitoVerificacao = 11 - (somaProdutos % 11);
25
26 // Casos especiais
27 if (digitoVerificacao == 11) {
28 digitoVerificacao = 0;
29 } else if (digitoVerificacao == 10) {
30 digitoVerificacao = 9;
31 }
32
33 return digitoVerificacao;
34 }
35
36 public static String gerarCuitCuil(int tipoCodigo, Integer dni) {
37 if (!CODIGOS_TIPO_VALIDOS.contains(tipoCodigo)) {
38 throw new IllegalArgumentException("Código de tipo inválido. Deve ser um dos seguintes: " + CODIGOS_TIPO_VALIDOS);
39 }
40
41 // Gera DNI aleatório se não fornecido
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Calcula dígito de verificação
48 int digitoVerificacao = calcularDigitoVerificacao(tipoCodigo, dni);
49
50 // Formata CUIT/CUIL
51 return String.format("%d-%08d-%d", tipoCodigo, dni, digitoVerificacao);
52 }
53
54 public static ResultadoValidacao validarCuitCuil(String cuitCuil) {
55 // Remove hífens se presentes
56 String cuitCuilLimpo = cuitCuil.replace("-", "");
57
58 // Verifica formato básico
59 if (!cuitCuilLimpo.matches("\\d{11}")) {
60 return new ResultadoValidacao(false, "Formato inválido");
61 }
62
63 // Extrai partes
64 int tipoCodigo = Integer.parseInt(cuitCuilLimpo.substring(0, 2));
65 int dni = Integer.parseInt(cuitCuilLimpo.substring(2, 10));
66 int digitoVerificacao = Integer.parseInt(cuitCuilLimpo.substring(10, 11));
67
68 // Valida código de tipo
69 if (!CODIGOS_TIPO_VALIDOS.contains(tipoCodigo)) {
70 return new ResultadoValidacao(false, "Código de tipo inválido");
71 }
72
73 // Calcula e compara dígito de verificação
74 int digitoCalculado = calcularDigitoVerificacao(tipoCodigo, dni);
75 if (digitoCalculado != digitoVerificacao) {
76 return new ResultadoValidacao(false, "Dígito de verificação inválido");
77 }
78
79 return new ResultadoValidacao(true, null);
80 }
81
82 public static class ResultadoValidacao {
83 private final boolean isValid;
84 private final String mensagemErro;
85
86 public ResultadoValidacao(boolean isValid, String mensagemErro) {
87 this.isValid = isValid;
88 this.mensagemErro = mensagemErro;
89 }
90
91 public boolean isValid() {
92 return isValid;
93 }
94
95 public String getMensagemErro() {
96 return mensagemErro;
97 }
98 }
99
100 public static void main(String[] args) {
101 // Exemplo de uso
102 System.out.println(gerarCuitCuil(20, 12345678)); // Gera para DNI específico
103 System.out.println(gerarCuitCuil(27, null)); // Gera com DNI aleatório
104 System.out.println(validarCuitCuil("20-12345678-9").isValid()); // Valida um CUIT/CUIL
105 }
106}
107PHP
<?php function calcularDigitoVerificacao($tipoCodigo, $dni) { // Converte para string e garante que o DNI tenha 8 dígitos com zeros à esquerda $tipoCodStr = (string)$tipoCodigo; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Combina código de tipo e DNI $digitos = $tipoCodStr . $dniStr; // Pesos para cada posição $pesos = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Calcula soma dos produtos $somaProdutos = 0; for ($i = 0; $i < 10; $i++) { $somaProdutos += (int)$digitos[$i] * $pesos[$i]; } // Calcula dígito de verificação $digitoVerificacao = 11 - ($somaProdutos % 11); // Casos especiais if ($digitoVerificacao == 11) { $digitoVerificacao = 0; } else if ($digitoVerificacao == 10) { $digitoVerificacao = 9; } return $digitoVerificacao; } function gerarCuitCuil($tipoCodigo, $dni = null) { // Códigos de tipo válidos $codigosTipoValidos = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($tipoCodigo, $codigosTipoValidos)) { throw new Exception("Código de tipo inválido. Deve ser um dos seguintes: " . implode(', ', $codigosTipoValidos)); } // Gera DNI aleatório se não fornecido if ($dni === null) { $dni = rand(10000000, 99999999); } // Calcula dígito de verificação $digitoVerificacao = calcularDigitoVerificacao($tipoCodigo, $dni); // Formata CUIT/CUIL return sprintf("%d-%08d-%d", $tipoCodigo, $dni, $digitoVerificacao); } function validarCuitCuil($cuitCuil) { // Remove hífens se presentes $cuitCuilLimpo = str_replace('-', '', $cuitCuil); // Verifica formato básico if (!preg_match('/^\d{11}$/', $cuitCuilLimpo)) { return ['isValid' => false, 'errorMessage' => 'Formato inválido']; } // Extrai partes ## Perguntas Frequentes ### Qual é a diferença entre CUIT e CUIL? Aqui está a distinção prática: **CUIT** (Clave Única de Identificación Tributaria) identifica contribuintes—tanto indivíduos quanto empresas que declaram impostos na AFIP. **CUIL** (Clave Única de Identificación Laboral) identifica trabalhadores no sistema de seguridade social para fins de emprego e aposentadoria. Na prática, muitos indivíduos têm tanto um CUIL (do seu primeiro emprego) e podem posteriormente obter um CUIT (se se tornarem autônomos ou iniciarem um negócio). Os números usam formatação e regras de cálculo idênticas, então do ponto de vista de validação, você os trata da mesma forma. A distinção importa para fins administrativos: sistemas de folha de pagamento normalmente trabalham com CUIL, enquanto sistemas de faturamento e impostos usam CUIT. ### Quais códigos de tipo são usados para indivíduos e quais para empresas? Para indivíduos: - 20, 23, 24: Indivíduos do sexo masculino (CUIL) - 27: Indivíduos do sexo feminino (CUIL) Para empresas e organizações: - 30: Corporações (CUIT) - 33: Associações Civis (CUIT) - 34: Fundações (CUIT) ### Como o dígito de verificação é calculado? O algoritmo usa multiplicação ponderada: pegue cada um dos primeiros 10 dígitos, multiplique pelos pesos **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, some os produtos, então calcule 11 menos (soma módulo 11). Dois casos extremos confundem as pessoas: quando o cálculo resulta em 11, use 0 como dígito de verificação; quando resulta em 10, use 9. Esses casos especiais existem porque o dígito de verificação deve ser um único dígito (0-9). Este é um algoritmo de dígito de verificação módulo-11, semelhante ao usado em códigos ISBN-10 e outros sistemas de identificação em todo o mundo. ### Posso usar esta ferramenta para gerar números CUIT/CUIL reais e oficiais? Não—esta ferramenta gera dados de teste matematicamente válidos, mas os números não são oficialmente registrados na AFIP. Pense como gerar um número de cartão de crédito válido usando o algoritmo de Luhn: passa na validação de formato, mas não está conectado a uma conta real. Para registro oficial de CUIT/CUIL, indivíduos precisam visitar a AFIP com seu DNI, enquanto empresas devem completar procedimentos de registro corporativo. A ferramenta é estritamente para desenvolvimento, teste e uso educacional onde você precisa de dados que pareçam válidos e não entrem em conflito com números de identificação reais. ### Por que minha validação de CUIT/CUIL falha mesmo com o formato correto? Quando a validação falha apesar da formatação correta, verifique estes problemas comuns: 1. **Código de tipo inválido**: Apenas 20, 23, 24, 27, 30, 33, 34 são válidos. Usar 21, 25 ou outros números resultará em falha. 2. **Dígito de verificação incorreto**: O último dígito deve corresponder ao cálculo do algoritmo. Mesmo mudando um dígito na parte do DNI requer recalcular o dígito de verificação. 3. **Problemas de formato**: Deve ter exatamente 11 dígitos (XX-XXXXXXXX-X). Cuidado com espaços extras ou zeros iniciais ausentes. 4. **Caracteres ocultos**: Copiar e colar de PDFs ou sites às vezes introduz caracteres Unicode invisíveis que quebram a validação. Uma dica rápida de depuração: remova o último dígito e recalcule-o manualmente. Se não corresponder, esse é o seu problema. ### Os hífens são obrigatórios nos números CUIT/CUIL? Hífens são apenas para formatação de exibição—não fazem parte do número para fins de cálculo. Quando você vê **20-12345678-9**, o algoritmo só se importa com os 11 dígitos: **20123456789**. A maioria das implementações de validação remove os hífens antes do processamento, por isso nossa ferramenta aceita tanto **20-12345678-9** quanto **20123456789**. Em APIs e bancos de dados, você normalmente armazena a versão sem hífen e adiciona hífens apenas ao exibir para usuários. Esta abordagem previne que inconsistências de formatação causem falhas de validação. ### Um número CUIT/CUIL pode ter menos de 8 dígitos na parte do DNI? A parte do DNI deve sempre ter exatamente 8 dígitos—sem exceções. Se o DNI real de alguém tiver menos dígitos (o que acontece com DNIs mais antigos e de números mais baixos), você preenche com zeros à esquerda. Por exemplo, DNI **1234567** se torna **01234567** na estrutura CUIT/CUIL. Esta é uma fonte frequente de bugs ao converter entre formatos de DNI e CUIT/CUIL. Já vi sistemas falharem na validação porque esqueceram de preencher, tratando **1234567** como um número de 7 dígitos em vez de **01234567**. Sempre use funções de preenchimento com zero em seu código em vez de concatenação simples de strings. ### Como posso verificar se um CUIT/CUIL está oficialmente registrado na Argentina? Nossa ferramenta valida a correção matemática—formato, código de tipo e dígito de verificação. Mas não pode dizer se o número está realmente registrado na AFIP ou pertence a uma pessoa ou empresa real. Para verificação oficial, use os [serviços web da AFIP](https://www.afip.gob.ar/) ou sua ferramenta de pesquisa "Constancia de Inscripción". A AFIP oferece APIs para verificação automatizada, embora você precise se registrar como desenvolvedor e se autenticar. Em ambientes de produção, implemente ambas as camadas: primeiro execute validação algorítmica (rápida, captura erros de digitação e de formato), depois verifique no banco de dados da AFIP (mais lento, mas confirma se o número é real e ativo). ### Posso usar esta ferramenta em meu aplicativo comercial? Sim—o algoritmo de validação CUIT/CUIL é um padrão público definido pela AFIP, então você pode implementá-lo livremente em software comercial. Os exemplos de código aqui são destinados como implementações de referência. Para uso em produção, considere estas práticas recomendadas: implemente tratamento adequado de erros para casos extremos, adicione registro de log para depurar falhas de validação, valide contra o banco de dados oficial da AFIP (não apenas validação algorítmica), e mantenha sua implementação atualizada caso a AFIP altere as regras (embora o algoritmo atual esteja estável há décadas). ### A ferramenta armazena algum dos números CUIT/CUIL gerados ou validados? Não—todo processamento acontece no seu navegador (lado do cliente). Quando você gera ou valida um CUIT/CUIL, o cálculo é executado localmente usando JavaScript. Nada é enviado para nossos servidores, e não registramos, armazenamos ou rastreamos nenhum número que você insira ou gere. Esta abordagem do lado do cliente garante privacidade e também significa que a ferramenta funciona offline assim que a página carrega. Você pode verificar isso abrindo as ferramentas de desenvolvedor do seu navegador e observando a aba de rede—você não verá nenhuma solicitação enviada ao gerar ou validar números. ## Referências 1. AFIP (Administração Federal de Receitas Públicas). "CUIT/CUIL/CDI." Site Oficial. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministério do Trabalho, Emprego e Seguridade Social. "CUIL - Chave Única de Identificação Laboral." [https://www.argentina.gob.ar/trabalho](https://www.argentina.gob.ar/trabalho) 3. ANSES (Administração Nacional da Seguridade Social). "Obter meu CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Boletim Oficial da República Argentina. "Resolução Geral AFIP 2854/2010: Procedimento. Chave Única de Identificação Tributária (C.U.I.T.)." 5. Código Fiscal da República Argentina. "Identificação e Registro de Contribuintes." --- Seja você esteja construindo um sistema de faturamento, testando fluxos de integração de funcionários ou aprendendo sobre algoritmos de validação, esta ferramenta fornece a geração e validação de CUIT/CUIL que você precisa. Gere dados de teste que passem na validação algorítmica, verifique números antes de inseri-los no seu banco de dados ou explore como o algoritmo de dígito de verificação funciona na prática.