Salta al contingut

Generador i Validador de CUIT/CUIL | Eina d'Identificació Fiscal Argentina

Genera números de proves vàlids de CUIT/CUIL argentins o valida els existents. Eina en línia gratuïta per a desenvolupadors que proven sistemes d'identificació fiscal i nòmina amb validació compatible amb AFIP.

Generador de CUIT/CUIL

Introduïu un número de DNI de 8 dígits o utilitzeu el generador aleatori

CUIT/CUIL Generat
23-46391388-9

Utilitzant DNI generat aleatòriament

Calculadora de càrrega...
📚

Documentació

Generador i Validador de CUIT/CUIL Argentí

Introducció

En els sistemes fiscals i laborals de l'Argentina, trobareu constantment dos identificadors crítics: CUIT (Clave Única de Identificación Tributaria) i CUIL (Clave Única de Identificación Laboral). Penseu en el CUIT com l'identificador fiscal per a empreses i individus que paguen impostos, mentre que el CUIL identifica els treballadors en el sistema de seguretat social. Tots dos utilitzen el mateix format de 11 dígits i l'algoritme de verificació, la qual cosa fa especialment important provar aplicacions que gestionen aquests números.

Quan es desenvolupa programari per al mercat argentí, cal disposar de dades de prova vàlides. Aquí és on entra en joc aquesta eina. Podeu generar números CUIT/CUIL matemàticament correctes per a proves sense utilitzar informació personal real, o validar números existents per assegurar-se que s'ajusten a l'algoritme oficial de l'AFIP. El que és particularment útil és que l'eina gestiona tant el costat de generació (creant números vàlids a demanda) com el costat de validació (detectant errors de format, codis de tipus no vàlids i dígits de verificació incorrectes abans que causin problemes en producció).

Estructura i Càlcul de CUIT/CUIL

Comprensió del Format

Un número CUIT/CUIL vàlid consta de 11 dígits normalment mostrats en el format XX-XXXXXXXX-X. Aquí és com es descompon:

  1. Codi de Tipus (primers 2 dígits): Identifica el tipus d'entitat

    • 20, 23, 24: Individus masculins (CUIL)
    • 27: Individus femenins (CUIL)
    • 30, 33, 34: Empreses i organitzacions (CUIT)
  2. Número de DNI (8 dígits centrals): Per a individus, aquest és el seu número de document d'identitat nacional (DNI). Un error comú: si el DNI real té menys de 8 dígits, cal omplir amb zeros al principi. Per exemple, DNI 1234567 es converteix en 01234567 al CUIT/CUIL. Les empreses reben un número únic assignat.

  3. Dígit de Verificació (últim dígit): Aquest dígit de control valida tot el número mitjançant un algorisme ponderat. Si aquest dígit no coincideix amb el càlcul, el CUIT/CUIL sencer és invàlid, cosa que sovint sorprèn els desenvolupadors quan construeixen manualment dades de prova.

Càlcul del Dígit de Verificació

El dígit de verificació utilitza un algorisme ponderat de mòdul-11. Aquí és com funciona:

  1. Agafeu els primers 10 dígits del CUIT/CUIL (codi de tipus + DNI)
  2. Multipliqueu cada dígit pel seu pes corresponent: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Sumeu tots els productes
  4. Calculeu: 11 menys (suma mòdul 11)
  5. Gestioneu casos especials: si el resultat és 11, useu 0; si és 10, useu 9

El que més sovint confon la gent són els casos especials als passos 5. En proves, ocasionalment obtindreu un resultat de 10 o 11, i oblidar-se de mapear-los a 9 i 0 respectivament causa errors de validació que poden ser difícils de depurar si no es té en compte aquesta regla.

Matemàticament, es pot expressar com:

VD=11((i=110di×wi)mod11)VD = 11 - ((\sum_{i=1}^{10} d_i \times w_i) \bmod 11)

On:

  • VDVD és el dígit de verificació
  • did_i és el ii-èsim dígit dels primers 10 dígits
  • wiw_i és el pes corresponent de la seqüència [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Casos especials: si VD=11VD = 11 llavors VD=0VD = 0, si VD=10VD = 10 llavors VD=9VD = 9

Guia Pas a Pas

Ús del Generador

  1. Seleccioneu la pestanya "Generador" a la part superior de la interfície de l'eina.

  2. Trieu un Codi de Tipus del menú desplegable:

    • 20: Home (CUIL)
    • 23: Empresa (CUIT)
    • 24: Empresa Temporal (CUIT)
    • 27: Dona (CUIL)
    • 30: Corporació (CUIT)
    • 33: Associació Civil (CUIT)
    • 34: Fundació (CUIT)
  3. Introduïu un Número de DNI (opcional):

    • Introduïu un número de DNI de 8 dígits al camp proporcionat
    • Si es deixa en blanc, l'eina farà servir un DNI generat aleatòriament
    • Si introduïu menys de 8 dígits, el sistema els completarà amb zeros al davant
  4. Generar DNI Aleatori (opcional):

    • Feu clic al botó "Aleatori" per generar un número de DNI aleatori de 8 dígits
  5. Veure el CUIT/CUIL Generat:

    • L'eina mostra automàticament un CUIT/CUIL vàlid basat en els vostres inputs
    • El format serà XX-XXXXXXXX-X amb el dígit de verificació correcte
  6. Copiar el Resultat:

    • Feu clic a la icona de còpia per copiar el CUIT/CUIL generat al vostre portapapers
    • Apareixerà un missatge de confirmació quan es copiï amb èxit

Ús del Validador

  1. Seleccioneu la pestanya "Validador" a la part superior de la interfície de l'eina.

  2. Introduïu el CUIT/CUIL a Validar:

    • Introduïu el CUIT/CUIL en el format XX-XXXXXXXX-X
    • L'eina formatarà automàticament el vostre input amb guions mentre escriviu
    • També podeu introduir el número sense guions (XXXXXXXXXXX)
  3. Feu clic al botó "Validar":

    • L'eina comprovarà el format, el codi de tipus i el dígit de verificació
  4. Veure el Resultat de la Validació:

    • Per a números CUIT/CUIL vàlids, apareixerà un missatge de success en verd
    • Per a números invàlids, apareixerà un missatge d'error en vermell que explicarà el problema:
      • Format invàlid (ha de ser XX-XXXXXXXX-X)
      • Codi de tipus invàlid (ha de ser un dels: 20, 23, 24, 27, 30, 33, 34)
      • Dígit de verificació invàlid
  5. Informació Addicional:

    • Per a números vàlids, l'eina mostra un desglossament dels components:
      • Codi de tipus i el seu significat
      • Número de DNI
      • Dígit de verificació

Errors Comuns i Millors Pràctiques

Quan es treballa amb la validació de CUIT/CUIL a les aplicacions, cal parar atenció a aquests errors freqüents:

Problemes de Zero-Padding: El bug més comú que he trobat implica números de DNI amb zeros inicials. Quan algú introdueix DNI "1234567", el codi necessita tractar-lo com "01234567" per a la construcció de CUIT/CUIL. Moltes implementacions converteixen a enters per processar, la qual cosa elimina els zeros inicials. Feu servir operacions de cadena amb l'emplenament adequat.

Confusió de Codi de Tipus: No tots els números de dos dígits són codis de tipus vàlids. Només 20, 23, 24, 27, 30, 33, 34 funcionen. He vist sistemes que accepten qualsevol prefix de dos dígits, la qual cosa porta a números "amb aspecte de vàlids" com 21-12345678-X que fallen la validació d'AFIP. Sempre valideu el codi de tipus abans de calcular el dígit de verificació.

Suposicions de Gènere: Els codis de tipus 20 (masculí) i 27 (femení) no són intercanviables. Si genereu CUILs automàticament basant-vos en dades demogràfiques, assegureu-vos que el codi de tipus coincideixi amb el gènere real registrat a RENAPER (registre nacional de l'Argentina). Els desajustos provoquen el rebuig quan els individus intenten usar aquests números amb serveis governamentals.

Gestió de Guions: Algunes implementacions requereixen guions mentre que d'altres els rebutgen. Millor pràctica: accepteu tots dos formats en camps d'entrada (amb o sense guions), elimineu els guions abans de la validació, emmagatzemeu la versió sense guions a les bases de dades i afegiu guions només per a propòsits de visualització.

Verificació Perduda: La validació algorítmica detecta errors de format però no confirma que el CUIT/CUIL estigui registrat. En producció, valideu primer el format (ràpid), després verifiqueu amb la base de dades d'AFIP (més lent però autoritari). Aquest enfocament de dos passos detecta errors de tecleig immediatament mentre s'assegura que el número sigui real.

Proves de Casos Límit: Sempre proveu amb dígits de verificació 0 i 9 - aquests resulten dels casos especials de l'algorisme. Proveu també DNIs que comencen amb zeros per assegurar que la vostra lògica d'emplenament funcioni correctament.

Casos d'Ús i Aplicacions Pràctiques

Desenvolupament i Proves

Desenvolupament de Programari: En construir aplicacions per al mercat argentí, necessitareu dades de proves que passin la validació sense usar informació d'usuaris reals. Aquí és on això es torna crític:

  • Plataformes de comerç electrònic: Els processadors de pagament i sistemes de facturació requereixen números CUIT/CUIL vàlids. Durant proves de càrrega, podríeu necessitar milers de números vàlids per simular registres d'usuaris realistes.
  • Programari de comptabilitat: Els mòduls d'informes fiscals verifiquen el format CUIT/CUIL abans de l'enviament a l'AFIP. Les proves d'aquestes regles de validació requereixen números que passin l'algoritme de dígit de verificació.
  • Sistemes de gestió de recursos humans: El processament de nòmines i contribucions a la seguretat social depenen de números CUIL vàlids. Un escenari comú: esteu provant fluxos d'incorporació d'empleats i necessiteu verificar que els CUIL invàlids activin missatges d'error apropiats.
  • Aplicacions bancàries: Els processos KYC (Coneix el teu Client) validen CUIT/CUIL com a part de l'obertura de comptes. En la meva experiència, casos límit com desajustos de codis de tipus sovint apareixen durant proves d'integració.

Poblament de Bases de Dades: En sembrar bases de dades de proves, l'ús de números CUIT/CUIL vàlids algorítmicament assegura que les restriccions i disparadors de la base de dades funcionin com s'espera. Això importa especialment quan es proven scripts de migració de dades o processos ETL que validen números d'identificació.

Proves de Validació de Formularis: Proveu tant el camí feliç com les condicions d'error. Genereu números vàlids per confirmar l'enviament reeixit, després modifiqueu el dígit de verificació per assegurar que la validació del frontend i backend capturi l'error abans que arribi a la base de dades.

Proves d'API: Les proves d'integració haurien d'usar números CUIT/CUIL vàlids en càrregues de sol·licituds. Això evita falsos negatius on les proves fallen degut a dades de proves invàlides en lloc de errors reals en la lògica de l'API.

Automatització de QA: Les proves parametritzades es beneficien de la generació dinàmica de CUIT/CUIL. En lloc de codificar valors de proves que podrien entrar en conflicte entre execucions de proves, genereu números vàlids nous per a cada execució de prova.

Propòsits Educatius

Aprenentatge d'Algoritmes de Validació: L'algoritme de verificació CUIT/CUIL demostra l'aplicació pràctica de l'aritmètica modular i dígits de verificació ponderats. Aquest patró apareix en altres sistemes d'identificació mundial—números de targetes de crèdit (algoritme de Luhn), codis ISBN i números d'IVA europeus tots usen aproximacions similars de suma de verificació ponderada. Entendre com funciona la validació CUIT/CUIL proporciona perspectiva sobre per què existeixen aquests algoritmes: capturen errors de transcripció com dígits intercanviats o errors d'un sol dígit.

Ensenyament de Validació de Dades: En entrenar desenvolupadors júnior sobre validació d'entrada, el sistema CUIT/CUIL ofereix un exemple del món real més complex que la validació d'email però més simple que la verificació criptogràfica. Demostra el principi de defensa en profunditat: validació de format (11 dígits), validació de regles de negoci (codis de tipus vàlids) i validació algorítmica (dígit de verificació).

Desenvolupament de Negocis Internacionals: Si esteu construint sistemes per a mercats llatinoamericans, entendre CUIT/CUIL us ajuda a comprendre sistemes similars en països veïns. Brasil té CPF/CNPJ, Xile té RUT, i Uruguai té RUT—tots usen algoritmes de dígit de verificació. Els patrons que apreneu aquí es transfereixen a aquests sistemes.

Alternatives i Consideracions de Producció

Mentre aquesta eina funciona bé per a desenvolupament i proves, els entorns de producció requereixen requisits diferents:

Validació Oficial del Govern: Per a aplicacions en viu, la validació algorítmica sola no és suficient—necessiteu verificar que el CUIT/CUIL estigui realment registrat amb AFIP (Administración Federal de Ingresos Públicos). AFIP proporciona serveis web per a validació en temps real, encara que haureu de registrar-vos i autenticar-vos per accedir-hi. La trampa: un número pot ser matemàticament vàlid però no assignat oficialment, així que sempre implementeu ambdues capes de validació en producció.

Biblioteques i Paquets: Si esteu integrant validació CUIT/CUIL al vostre codi, considereu aquestes biblioteques establertes en lloc de crear-ne una de pròpia:

  • JavaScript: validar-cuit a npm gestiona validació i formatació
  • PHP: Biblioteca afip-php proporciona validació i integració de serveis web AFIP
  • Python: py-cuit a PyPI implementa l'algoritme complet

Usar biblioteques mantingudes redueix el risc d'errors d'implementació i sovint inclou casos límit que podríeu perdre en codi personalitzat.

Càlcul Manual: Per a propòsits d'aprenentatge o depuració, treballar amb l'algoritme a mà ajuda a solidificar la comprensió. Agafeu una calculadora i un CUIT/CUIL de mostra, després seguiu el procés de multiplicació ponderada pas a pas.

Serveis de Validació Empresarial: Aplicacions a gran escala podrien beneficiar-se d'API de validació de tercers que no només comproven el format sinó que també creuen referència amb bases de dades comercials. Aquests serveis poden marcar empreses inactives, identificar entitats sancionades o proporcionar metadades addicionals sobre el titular del CUIT/CUIL.

Història del Sistema CUIT/CUIL

El sistema d'identificació CUIT/CUIL a l'Argentina ha evolucionat significativament des dels seus inicis:

Orígens i Implementació

El CUIT (Clau Única d'Identificació Tributària) es va introduir per primera vegada a l'Argentina als anys 1970 com a part dels esforços per modernitzar el sistema de recaptació fiscal. L'Administració Federal d'Ingressos Públics (AFIP) va implementar aquest identificador únic per fer un seguiment més eficient dels contribuents i reduir l'evasió fiscal.

El CUIL (Clau Única d'Identificació Laboral) es va introduir posteriorment per identificar específicament els treballadors al sistema de seguretat social, creant una distinció entre la identificació fiscal i la identificació laboral, mantenint un format consistent.

Evolució i Digitalització

Als anys 1990, quan l'Argentina va sotmetre a importants reformes econòmiques, el sistema CUIT/CUIL va guanyar una importància creixent per fer el seguiment de l'activitat econòmica. El sistema es va digitalitzar més encara, i es van implementar sistemes de verificació en línia.

Els primers anys 2000 van veure la integració del sistema CUIT/CUIL amb diversos serveis digitals governamentals, convertint-lo en un component essencial de les iniciatives de govern electrònic de l'Argentina. Durant aquest període també es va produir l'estandardització de l'algoritme de verificació i el format que segueix vigent avui dia.

Desenvolupaments Recents

En els darrers anys, l'AFIP ha millorat els processos de seguretat i verificació dels números CUIT/CUIL, implementant sistemes de validació més sofisticats i integrant-los amb altres bases de dades governamentals. El sistema ara juga un paper crucial en els esforços de l'Argentina per combatre l'evasió fiscal i formalitzar l'economia.

Avui dia, el CUIT/CUIL s'utilitza no només per a propòsits fiscals i laborals, sinó també per a una àmplia gamma d'activitats com serveis bancaris, transaccions immobiliàries, serveis públics i compres en línia, convertint-se en un identificador essencial tant per a persones com per a empreses que operen a l'Argentina.

Consideracions d'Implementació

En implementar la validació de CUIT/CUIL als vostres propis sistemes, considereu aquests aspectes tècnics:

Estabilitat de l'Algorisme: L'actual algorisme de verificació de CUIT/CUIL ha romàs sense canvis des de la seva estandardització als anys 90. Segons la documentació tècnica d'AFIP, l'enfocament de dígit de verificació de mòdul-11 amb pesos està codificat a la Resolución General 2854/2010 i regulacions posteriors. Aquesta estabilitat significa que les implementacions rarament necessiten actualitzacions, però hauríeu de monitorar els anuncis d'AFIP per qualsevol canvi regulatori.

Optimització de Rendiment: L'algorisme de verificació és computacionalment econòmic—just 10 multiplicacions, una addició i una operació de mòdul. Per a sistemes d'alt rendiment que processen milers de validacions per segon, el coll d'ampolla és típicament la latència de xarxa en verificar contra la base de dades d'AFIP, no l'algorisme en si. Considereu emmagatzemar en memòria cau els resultats de verificació d'AFIP amb TTLs apropiats (típicament 24 hores) per equilibrar la frescor amb el rendiment.

Codificació de Caràcters: En processar dades CUIT/CUIL de fonts externes (PDFs, documents escanejats, web scraping), vigileu els problemes de codificació de caràcters. El guió pot aparèixer com un guió llarg (U+2014), guió curt (U+2013) o signe menys (U+2212) en lloc del guió estàndard (U+002D). Normalitzeu-los abans de la validació per prevenir falsos negatius.

Internacionalització: Si la vostra aplicació serveix múltiples mercats llatinoamericans, noteu que el CUIT/CUIL argentí usa mòdul-11 amb pesos específics, mentre que el RUT xilè usa mòdul-11 amb pesos diferents, i el CPF/CNPJ brasiler usa mòdul-11 amb un altre patró. No assumiu que els algorismes siguin idèntics—cada sistema de país té regles distintives. Per una comprensió més àmplia dels algorismes de dígits de verificació, consulteu l'estàndard ISO/IEC 7064 que formalitza diversos esquemes de verificació basats en mòdul.

Emmagatzematge de Base de Dades: Emmagatzemeu números CUIT/CUIL sense guions com CHAR(11) de longitud fixa o com BIGINT si la vostra base de dades admet enters d'11 dígits sense pèrdua de precisió. Afegiu una restricció de verificació que validi el dígit de verificació al nivell de base de dades com a xarxa de seguretat contra dades corruptes. Creeu índexs en aquest camp per a cerques eficients quan els usuaris busquin per CUIT/CUIL.

Exemples de Codi

Python

1def calculate_verification_digit(type_code, dni):
2    # Convertir a cadena i assegurar que el DNI tingui 8 dígits amb zeros inicials
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Combinar codi de tipus i DNI
7    digits = type_code_str + dni_str
8    
9    # Pesos per a cada posició
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Calcular suma de productes
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Calcular dígit de verificació
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Casos especials
19    if verification_digit == 11:
20        verification_digit = 0
21    elif verification_digit == 10:
22        verification_digit = 9
23    
24    return verification_digit
25
26def generate_cuit_cuil(type_code, dni=None):
27    import random
28    
29    # Codis de tipus vàlids
30    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
31    
32    if type_code not in valid_type_codes:
33        raise ValueError(f"Codi de tipus no vàlid. Ha de ser un de: {valid_type_codes}")
34    
35    # Generar DNI aleatori si no es proporciona
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Calcular dígit de verificació
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # Formatar CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Eliminar guions si estan presents
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Comprovar format bàsic
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Format no vàlid"
52    
53    # Extreure parts
54    type_code = int(cuit_cuil_clean[0:2])
55    dni = int(cuit_cuil_clean[2:10])
56    verification_digit = int(cuit_cuil_clean[10])
57    
58    # Validar codi de tipus
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Codi de tipus no vàlid"
62    
63    # Calcular i comparar dígit de verificació
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Dígit de verificació no vàlid"
67    
68    return True, "CUIT/CUIL vàlid"
69
70# Exemple d'ús
71print(generate_cuit_cuil(20, 12345678))  # Generar per a DNI específic
72print(generate_cuit_cuil(27))  # Generar amb DNI aleatori
73print(validate_cuit_cuil("20-12345678-9"))  # Validar un CUIT/CUIL
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Convertir a cadena i assegurar que el DNI tingui 8 dígits amb zeros inicials
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Combinar codi de tipus i DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // Pesos per a cada posició
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Calcular suma de productes
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Calcular dígit de verificació
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Casos especials
22  if (verificationDigit === 11) {
23    verificationDigit = 0;
24  } else if (verificationDigit === 10) {
25    verificationDigit = 9;
26  }
27  
28  return verificationDigit;
29}
30
31function generateCuitCuil(typeCode, dni) {
32  // Codis de tipus vàlids
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Codi de tipus no vàlid. Ha de ser un de: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Generar DNI aleatori si no es proporciona
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Calcular dígit de verificació
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // Formatar CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Eliminar guions si estan presents
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Comprovar format bàsic
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Format no vàlid' };
58  }
59  
60  // Extreure parts
61  const typeCode = parseInt(cuitCuilClean.substring(0, 2));
62  const dni = parseInt(cuitCuilClean.substring(2, 10));
63  const verificationDigit = parseInt(cuitCuilClean.substring(10, 11));
64  
65  // Validar codi de tipus
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Codi de tipus no vàlid' };
69  }
70  
71  // Calcular i comparar dígit de verificació
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Dígit de verificació no vàlid' };
75  }
76  
77  return { isValid: true };
78}
79
80// Exemple d'ús
81console.log(generateCuitCuil(20, 12345678)); // Generar per a DNI específic
82console.log(generateCuitCuil(27)); // Generar amb DNI aleatori
83console.log(validateCuitCuil("20-12345678-9")); // Validar un CUIT/CUIL
84

Java

1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6    private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7    private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8    
9    public static int calculateVerificationDigit(int typeCode, int dni) {
10        // Convertir a cadena i assegurar que el DNI tingui 8 dígits amb zeros inicials
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Combinar codi de tipus i DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // Calcular suma de productes
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Calcular dígit de verificació
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Casos especials
27        if (verificationDigit == 11) {
28            verificationDigit = 0;
29        } else if (verificationDigit == 10) {
30            verificationDigit = 9;
31        }
32        
33        return verificationDigit;
34    }
35    
36    public static String generateCuitCuil(int typeCode, Integer dni) {
37        if (!VALID_TYPE_CODES.contains(typeCode)) {
38            throw new IllegalArgumentException("Codi de tipus no vàlid. Ha de ser un de: " + VALID_TYPE_CODES);
39        }
40        
41        // Generar DNI aleatori si no es proporciona
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Calcular dígit de verificació
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // Formatar CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Eliminar guions si estan presents
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Comprovar format bàsic
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Format no vàlid");
61        }
62        
63        // Extreure parts
64        int typeCode = Integer.parseInt(cuitCuilClean.substring(0, 2));
65        int dni = Integer.parseInt(cuitCuilClean.substring(2, 10));
66        int verificationDigit = Integer.parseInt(cuitCuilClean.substring(10, 11));
67        
68        // Validar codi de tipus
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Codi de tipus no vàlid");
71        }
72        
73        // Calcular i comparar dígit de verificació
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Dígit de verificació no vàlid");
77        }
78        
79        return new ValidationResult(true, null);
80    }
81    
82    public static class ValidationResult {
83        private final boolean isValid;
84        private final String errorMessage;
85        
86        public ValidationResult(boolean isValid, String errorMessage) {
87            this.isValid = isValid;
88            this.errorMessage = errorMessage;
89        }
90        
91        public boolean isValid() {
92            return isValid;
93        }
94        
95        public String getErrorMessage() {
96            return errorMessage;
97        }
98    }
99    
100    public static void main(String[] args) {
101        // Exemple d'ús
102        System.out.println(generateCuitCuil(20, 12345678)); // Generar per a DNI específic
103        System.out.println(generateCuitCuil(27, null)); // Generar amb DNI aleatori
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Validar un CUIT/CUIL
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Convertir a cadena i assegurar que el DNI tingui 8 dígits amb zeros inicials $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Combinar codi de tipus i DNI $digits = $typeCodeStr . $dniStr; // Pesos per a cada posició $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Calcular suma de productes $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Calcular dígit de verificació $verificationDigit = 11 - ($sumProducts % 11); // Casos especials if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Codis de tipus vàlids $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Codi de tipus no vàlid. Ha de ser un de: " . implode(', ', $validTypeCodes)); } // Generar DNI aleatori si no es proporciona if ($dni === null) { $dni = rand(10000000, 99999999); } // Calcular dígit de verificació $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatar CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Eliminar guions si estan presents $cuitCuilClean = str_replace('-', '', $cuitCuil); // Comprovar format bàsic if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Format no vàlid']; } // Extreure parts $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Validar codi de tipus $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Codi de tipus no vàlid']; } // Calcular i comparar dígit de verificació $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { return ['isValid' => false, ' ## Preguntes Freqüents ### Quina és la diferència entre CUIT i CUIL? Aquí hi ha la distinció pràctica: **CUIT** (Clave Única de Identificación Tributaria) identifica contribuents, tant individus com empreses que presenten impostos a l'AFIP. **CUIL** (Clave Única de Identificación Laboral) identifica treballadors en el sistema de seguretat social per a ocupació i jubilació. A la pràctica, molts individus tenen tant un CUIL (del seu primer treball) i després potser obtenen un CUIT (si es converteixen en autònoms o inicien un negoci). Els números utilitzen un format i regles de càlcul idèntiques, per la qual cosa des d'un punt de vista de validació, els tractes de la mateixa manera. La distinció importa per a propòsits administratius: els sistemes de nòmina normalment treballen amb CUIL, mentre que els sistemes de facturació i impostos utilitzen CUIT. ### Quins codis de tipus s'utilitzen per a individus i quins per a empreses? Per a individus: - 20, 23, 24: Individus masculins (CUIL) - 27: Individus femenins (CUIL) Per a empreses i organitzacions: - 30: Corporacions (CUIT) - 33: Associacions Civils (CUIT) - 34: Fundacions (CUIT) ### Com es calcula el dígit de verificació? L'algoritme utilitza multiplicació ponderada: agafa cadascun dels primers 10 dígits, multiplica pels pesos **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, suma els productes, després calcula 11 menys (suma mòdul 11). Dos casos límit confonen la gent: quan el càlcul dona 11, utilitza 0 com a dígit de verificació; quan dona 10, utilitza 9. Aquests casos especials existeixen perquè el dígit de verificació ha de ser un sol dígit (0-9). Es tracta d'un algoritme de dígit de verificació mòdul-11, similar al que s'utilitza en codis ISBN-10 i altres sistemes d'identificació a tot el món. ### Puc usar aquesta eina per generar números CUIT/CUIL reals i oficials? No—aquesta eina genera dades de prova matemàticament vàlides, però els números no estan registrats oficalment a l'AFIP. Penseu-ho com generar un número de targeta de crèdit vàlid usant l'algoritme de Luhn: passa la validació de format, però no està connectat a un compte real. Per al registre oficial de CUIT/CUIL, els individus necessiten visitar l'AFIP amb el seu DNI, mentre que les empreses han de completar els procediments de registre corporatiu. L'eina és estrictament per a desenvolupament, proves i ús educatiu on es necessitin dades amb aspecte vàlid que no entrin en conflicte amb números d'identificació reals. ### Per què la meva validació de CUIT/CUIL falla encara que el format sembli correcte? Quan la validació falla malgrat un format correcte, comprova aquests culpables habituals: 1. **Codi de tipus invàlid**: Només 20, 23, 24, 27, 30, 33, 34 són vàlids. Usar 21, 25 o altres números provocarà un error. 2. **Dígit de verificació incorrecte**: L'últim dígit ha de coincidir amb el càlcul de l'algoritme. Fins i tot canviar un dígit a la part del DNI requereix recalcular el dígit de verificació. 3. **Problemes de format**: Ha de tenir exactament 11 dígits (XX-XXXXXXXX-X). Vigileu amb espais extres o zeros inicials perduts. 4. **Caràcters ocults**: Copiar i enganxar de PDF o llocs web a vegades introdueix caràcters Unicode invisibles que trenquen la validació. Un consell ràpid de depuració: elimina l'últim dígit i recalcula-ho manualment. Si no coincideix, aquest és el teu culpable. ### Els guions són necessaris en els números CUIT/CUIL? Els guions són només per al format de visualització, no formen part del número per a càlculs. Quan veus **20-12345678-9**, l'algoritme només es preocupa pels 11 dígits: **20123456789**. La majoria de les implementacions de validació treuen els guions abans de processar, per la qual cosa la nostra eina accepta tant **20-12345678-9** com **20123456789**. En API i bases de dades, normalment emmagatzemareu la versió sense guions i afegiu guions només quan es mostra als usuaris. Aquest enfocament evita que les inconsistències de format causin errors de validació. ### Un número CUIT/CUIL pot tenir menys de 8 dígits a la part del DNI? La part del DNI sempre ha de tenir exactament 8 dígits, sense excepcions. Si el DNI real d'algú té menys dígits (cosa que passa amb DNIs antics de números més baixos), s'omple amb zeros inicials. Per exemple, DNI **1234567** es converteix en **01234567** a l'estructura CUIT/CUIL. Aquesta és una font freqüent d'errors en convertir entre formats DNI i CUIT/CUIL. He vist sistemes que fallen la validació perquè van oblidar emplenar, tractant **1234567** com un número de 7 dígits en lloc de **01234567**. Sempre useu funcions d'emplenat amb zeros en el vostre codi en lloc de simple concatenació de cadenes. ### Com puc verificar si un CUIT/CUIL està registrat oficalment a l'Argentina? La nostra eina valida la correcció matemàtica: format, codi de tipus i dígit de verificació. Però no pot dir-te si el número està realment registrat a l'AFIP o pertany a una persona o empresa real. Per a la verificació oficial, useu els [serveis web de l'AFIP](https://www.afip.gob.ar/) o la seva eina de cerca "Constancia de Inscripción". L'AFIP ofereix API per a verificació automatitzada, encara que haureu de registrar-vos com a desenvolupador i autenticar-vos. En entorns de producció, implementeu ambdues capes: primer executeu la validació algorítmica (ràpida, detecta errors de mecanografia i de format), després verifiqueu contra la base de dades de l'AFIP (més lenta, però confirma que el número és real i actiu). ### Puc usar aquesta eina a la meva aplicació comercial? Sí—l'algoritme de validació de CUIT/CUIL és un estàndard públic definit per l'AFIP, per la qual cosa podeu implementar-lo lliurement en programari comercial. Els exemples de codi proporcionats aquí estan pensats com a implementacions de referència. Per a ús en producció, considereu aquestes millors pràctiques: implementeu un maneig d'errors adequat per a casos límit, afegiu registre per a depurar errors de validació, valideu contra la base de dades oficial de l'AFIP (no només validació algorítmica), i mantingueu la vostra implementació actualitzada si l'AFIP canvia les regles (encara que l'algoritme actual ha estat estable durant dècades). ### L'eina emmagatzema algun dels números CUIT/CUIL generats o validats? No—tot el processament es realitza al vostre navegador (client-side). Quan genereu o valideu un CUIT/CUIL, el càlcul s'executa localment usant JavaScript. No s'envia res als nostres servidors, i no registrem, emmagatzemem ni rastrejem cap número que introduïu o genereu. Aquest enfocament del costat del client garanteix la privadesa i significa que l'eina funciona sense connexió un cop es carrega la pàgina. Podeu verificar-ho obrint les eines de desenvolupador del vostre navegador i observant la pestanya de xarxa: no veureu cap sol·licitud enviada quan genereu o valideu números. ## Referències 1. AFIP (Administración Federal de Ingressos Públics). "CUIT/CUIL/CDI." Lloc web oficial. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministeri de Treball, Ocupació i Seguretat Social. "CUIL - Clau Única d'Identificació Laboral." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Administración Nacional de la Seguretat Social). "Obtenir el meu CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Butlletí Oficial de la República Argentina. "Resolució General AFIP 2854/2010: Procediment. Clau Única d'Identificació Tributària (C.U.I.T.)." 5. Codi Fiscal de la República Argentina. "Identificació i Registre de Contribuents." --- Tant si estàs construint un sistema de facturació, provant fluxos d'incorporació d'empleats o aprenent sobre algorismes de validació, aquesta eina proporciona la generació i validació de CUIT/CUIL que necessites. Genera dades de prova que passin la validació algorísmica, verifica números abans que arribin a la teva base de dades o explora com funciona a la pràctica l'algorisme del dígit de verificació.