Vai al contenuto

Generatore e Validatore CUIT/CUIL | Strumento per Identificazione Fiscale Argentino

Genera numeri di test CUIT/CUIL validi o convalida quelli esistenti. Strumento online gratuito per sviluppatori che testano sistemi di identificazione fiscale e buste paga con validazione conforme ad AFIP.

Generatore CUIT/CUIL

Inserisci un numero DNI di 8 cifre o usa il generatore casuale

CUIT/CUIL Generato
20-76389910-2

Utilizzo DNI generato casualmente

Calcolatore di caricamento...
📚

Documentazione

Generatore e Validatore di CUIT/CUIL Argentino

Introduzione

Nel sistema fiscale e lavorativo argentino, si incontrano costantemente due identificatori critici: CUIT (Clave Única de Identificación Tributaria) e CUIL (Clave Única de Identificación Laboral). Pensa al CUIT come all'identificativo fiscale per aziende e individui che pagano le tasse, mentre CUIL identifica i lavoratori nel sistema di sicurezza sociale. Entrambi utilizzano lo stesso formato di 11 cifre e lo stesso algoritmo di verifica, il che rende particolarmente importante testare le applicazioni che gestiscono questi numeri.

Quando si sviluppa software per il mercato argentino, è necessario disporre di dati di test validi. Qui entra in gioco questo strumento. Puoi generare numeri CUIT/CUIL matematicamente corretti per i test senza utilizzare informazioni personali reali, o convalidare numeri esistenti per assicurarti che siano conformi all'algoritmo ufficiale dell'AFIP. Particolarmente utile è che lo strumento gestisce sia il lato della generazione (creazione di numeri validi su richiesta) che il lato della convalida (rilevamento di errori di formato, codici di tipo non validi e cifre di verifica errate prima che causino problemi in produzione).

Struttura e Calcolo del CUIT/CUIL

Comprensione del Formato

Un numero CUIT/CUIL valido consiste in 11 cifre solitamente visualizzate nel formato XX-XXXXXXXX-X. Ecco come si suddivide:

  1. Codice Tipo (prime 2 cifre): Identifica il tipo di entità

    • 20, 23, 24: Individui maschi (CUIL)
    • 27: Individui femmine (CUIL)
    • 30, 33, 34: Aziende e organizzazioni (CUIT)
  2. Numero DNI (8 cifre centrali): Per gli individui, questo è il loro numero di documento di identità nazionale (DNI). Un errore comune: se il DNI effettivo ha meno di 8 cifre, è necessario aggiungervi degli zeri iniziali. Ad esempio, DNI 1234567 diventa 01234567 nel CUIT/CUIL. Le aziende ricevono invece un numero univoco assegnato.

  3. Cifra di Verifica (ultima cifra): Questa cifra di controllo convalida l'intero numero utilizzando un algoritmo ponderato. Se questa cifra non corrisponde al calcolo, l'intero CUIT/CUIL è invalido—un aspetto che spesso coglie impreparati gli sviluppatori quando costruiscono manualmente dati di test.

Calcolo della Cifra di Verifica

La cifra di verifica utilizza un algoritmo ponderato modulo-11. Ecco come funziona:

  1. Prendi le prime 10 cifre del CUIT/CUIL (codice tipo + DNI)
  2. Moltiplica ogni cifra per il suo peso corrispondente: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Somma tutti i prodotti
  4. Calcola: 11 meno (somma modulo 11)
  5. Gestisci i casi limite: se il risultato è 11, usa 0; se è 10, usa 9

Ciò che confonde più spesso sono quei casi limite nei passaggi 5. Durante i test, occasionalmente si ottiene un risultato di 10 o 11, e dimenticare di mappare questi a 9 e 0 rispettivamente causa fallimenti di convalida che possono essere difficili da debuggare se non si è a conoscenza di questa regola.

Matematicamente, questo può essere espresso come:

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

Dove:

  • VDVD è la cifra di verifica
  • did_i è la ii-esima cifra delle prime 10 cifre
  • wiw_i è il peso corrispondente dalla sequenza [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Casi speciali: se VD=11VD = 11 allora VD=0VD = 0, se VD=10VD = 10 allora VD=9VD = 9

Guida Passo-Passo

Utilizzo del Generatore

  1. Selezionare la scheda "Generatore" nella parte superiore dell'interfaccia dello strumento.

  2. Scegliere un Codice Tipo dal menu a discesa:

    • 20: Maschio (CUIL)
    • 23: Azienda (CUIT)
    • 24: Azienda Temporanea (CUIT)
    • 27: Femmina (CUIL)
    • 30: Società (CUIT)
    • 33: Associazione Civile (CUIT)
    • 34: Fondazione (CUIT)
  3. Inserire un Numero di DNI (facoltativo):

    • Inserire un numero DNI di 8 cifre nel campo apposito
    • Se lasciato vuoto, lo strumento utilizzerà un DNI generato casualmente
    • Se si inseriscono meno di 8 cifre, il sistema aggiungerà degli zeri iniziali
  4. Generare DNI Casuale (facoltativo):

    • Fare clic sul pulsante "Casuale" per generare un numero DNI casuale di 8 cifre
  5. Visualizzare il CUIT/CUIL Generato:

    • Lo strumento visualizza automaticamente un CUIT/CUIL valido in base ai tuoi input
    • Il formato sarà XX-XXXXXXXX-X con la cifra di verifica corretta
  6. Copiare il Risultato:

    • Fare clic sull'icona di copia per copiare il CUIT/CUIL generato negli appunti
    • Apparirà un messaggio di conferma quando la copia è avvenuta con successo

Utilizzo del Validatore

  1. Selezionare la scheda "Validatore" nella parte superiore dell'interfaccia dello strumento.

  2. Inserire il CUIT/CUIL da Validare:

    • Inserire il CUIT/CUIL nel formato XX-XXXXXXXX-X
    • Lo strumento formatterà automaticamente l'input con trattini durante la digitazione
    • È possibile inserire anche il numero senza trattini (XXXXXXXXXXX)
  3. Fare clic sul Pulsante "Convalida":

    • Lo strumento verificherà il formato, il codice tipo e la cifra di verifica
  4. Visualizzare il Risultato della Convalida:

    • Per i numeri CUIT/CUIL validi, apparirà un messaggio di successo verde
    • Per i numeri non validi, apparirà un messaggio di errore rosso che spiega il problema:
      • Formato non valido (deve essere XX-XXXXXXXX-X)
      • Codice tipo non valido (deve essere uno tra: 20, 23, 24, 27, 30, 33, 34)
      • Cifra di verifica non valida
  5. Informazioni Aggiuntive:

    • Per i numeri validi, lo strumento visualizza una suddivisione dei componenti:
      • Codice tipo e relativo significato
      • Numero DNI
      • Cifra di verifica

Errori Comuni e Migliori Pratiche

Quando si lavora con la convalida di CUIT/CUIL nelle proprie applicazioni, fare attenzione a questi errori frequenti:

Problemi di Zero-Padding: Il bug più comune che ho incontrato riguarda i numeri di DNI con zeri iniziali. Quando qualcuno inserisce DNI "1234567", il codice deve trattarlo come "01234567" per la costruzione di CUIT/CUIL. Molte implementazioni convertono in interi per l'elaborazione, il che rimuove gli zeri iniziali. Utilizzare invece operazioni di stringa con padding appropriato.

Confusione del Codice Tipo: Non tutti i numeri a due cifre sono codici tipo validi. Solo 20, 23, 24, 27, 30, 33, 34 funzionano. Ho visto sistemi che accettano qualsiasi prefisso a due cifre, portando a numeri "dall'aspetto valido" come 21-12345678-X che non superano la convalida AFIP. Convalidare sempre il codice tipo prima di calcolare la cifra di verifica.

Ipotesi di Genere: I codici tipo 20 (maschio) e 27 (femmina) non sono intercambiabili. Se si generano automaticamente CUIL basati su dati demografici, assicurarsi che il codice tipo corrisponda al genere effettivamente registrato con RENAPER (registro nazionale argentino). Le discrepanze causano il rifiuto quando gli individui cercano di utilizzare questi numeri con servizi governativi.

Gestione dei Trattini: Alcune implementazioni richiedono trattini mentre altre li rifiutano. Migliore pratica: accettare entrambi i formati nei campi di input (con o senza trattini), rimuovere i trattini prima della convalida, memorizzare la versione senza trattini nei database e aggiungere trattini solo per scopi di visualizzazione.

Verifica Mancante: La convalida dell'algoritmo rileva gli errori di formato ma non conferma che il CUIT/CUIL sia registrato. In produzione, convalidare prima il formato (veloce), poi verificare con il database AFIP (più lento ma autorevole). Questo approccio a due fasi individua immediatamente gli errori di battitura assicurando comunque che il numero sia reale.

Test di Casi Limite: Testare sempre con cifre di verifica 0 e 9—questi risultano dai casi speciali nell'algoritmo. Testare inoltre DNI che iniziano con zeri per garantire che la logica di padding funzioni correttamente.

Casi d'Uso e Applicazioni Pratiche

Sviluppo e Test

Sviluppo Software: Quando si costruiscono applicazioni per il mercato argentino, sarà necessario disporre di dati di test che superino la convalida senza utilizzare informazioni personali reali. Ecco dove questo diventa cruciale:

  • Piattaforme di e-commerce: I processori di pagamento e i sistemi di fatturazione richiedono numeri CUIT/CUIL validi. Durante i test di carico, potrebbe essere necessario migliaia di numeri validi per simulare registrazioni utente realistiche.
  • Software contabile: I moduli di reportistica fiscale verificano il formato CUIT/CUIL prima dell'invio all'AFIP. Il test di queste regole di convalida richiede numeri che superino l'algoritmo di verifica delle cifre.
  • Sistemi di gestione delle risorse umane: L'elaborazione delle buste paga e i contributi di sicurezza sociale dipendono da numeri CUIL validi. Uno scenario comune: si stanno testando i flussi di onboarding dei dipendenti e si deve verificare che i CUIL non validi attivino messaggi di errore appropriati.
  • Applicazioni bancarie: I processi KYC (Know Your Customer) convalidano CUIT/CUIL come parte dell'apertura di un conto. Dalla mia esperienza, casi limite come discrepanze nel codice tipo emergono spesso durante i test di integrazione.

Popolazione Database: Quando si esegue il seeding di database di test, l'utilizzo di numeri CUIT/CUIL algoritmicamente validi garantisce che i vincoli e i trigger del database funzionino come previsto. Questo è particolarmente importante quando si testano script di migrazione dei dati o processi ETL che convalidano i numeri di identificazione.

Test di Convalida Form: Testare sia il percorso felice che le condizioni di errore. Generare numeri validi per confermare l'invio riuscito, quindi modificare la cifra di verifica per assicurarsi che la convalida frontend e backend catturi l'errore prima che raggiunga il database.

Test API: I test di integrazione dovrebbero utilizzare numeri CUIT/CUIL validi nei payload delle richieste. Questo previene falsi negativi in cui i test falliscono a causa di dati di test non validi piuttosto che bug effettivi nella logica API.

Automazione QA: I test parametrizzati beneficiano della generazione dinamica di CUIT/CUIL. Invece di codificare valori di test che potrebbero entrare in conflitto tra le esecuzioni dei test, generare nuovi numeri validi per ogni esecuzione di test.

Scopi Educativi

Apprendimento di Algoritmi di Convalida: L'algoritmo di verifica CUIT/CUIL dimostra l'applicazione pratica dell'aritmetica modulare e delle cifre di controllo ponderate. Questo stesso modello appare in altri sistemi di identificazione in tutto il mondo—numeri di carte di credito (algoritmo di Luhn), codici ISBN e numeri di partita IVA europei utilizzano tutti approcci simili di checksum ponderati. Comprendere come funziona la convalida CUIT/CUIL fornisce una visione del perché esistono questi algoritmi: catturano errori di trascrizione come cifre invertite o errori su singole cifre.

Insegnamento della Convalida dei Dati: Quando si formano sviluppatori junior sulla convalida degli input, il sistema CUIT/CUIL offre un esempio reale più complesso della convalida dell'email ma più semplice della verifica crittografica. Dimostra il principio della difesa in profondità: convalida del formato (11 cifre), convalida delle regole di business (codici tipo validi) e convalida algoritmica (cifra di controllo).

Sviluppo Aziendale Internazionale: Se si costruiscono sistemi per mercati latino-americani, comprendere CUIT/CUIL aiuta a capire sistemi simili nei paesi vicini. Il Brasile ha CPF/CNPJ, il Cile ha RUT e l'Uruguay ha RUT—tutti utilizzano algoritmi di cifre di controllo. I modelli che si imparano qui si trasferiscono a questi sistemi.

Alternative e Considerazioni di Produzione

Mentre questo strumento funziona bene per sviluppo e test, gli ambienti di produzione hanno requisiti diversi:

Convalida Ufficiale del Governo: Per applicazioni live, la convalida algoritmica da sola non è sufficiente—è necessario verificare che il CUIT/CUIL sia effettivamente registrato con AFIP (Administración Federal de Ingresos Públicos). AFIP fornisce servizi web per la convalida in tempo reale, anche se sarà necessario registrarsi e autenticarsi per accedervi. Il punto critico: un numero può essere matematicamente valido ma non assegnato ufficialmente, quindi implementare sempre entrambi i livelli di convalida in produzione.

Librerie e Pacchetti: Se si integra la convalida CUIT/CUIL nel proprio codice, considerare queste librerie consolidate invece di sviluppare tutto da zero:

  • JavaScript: validar-cuit su npm gestisce convalida e formattazione
  • PHP: libreria afip-php fornisce convalida e integrazione con servizi web AFIP
  • Python: py-cuit su PyPI implementa l'intero algoritmo

L'utilizzo di librerie mantenute riduce il rischio di bug di implementazione e spesso include casi limite che potresti perdere nel codice personalizzato.

Calcolo Manuale: A scopo di apprendimento o debug, lavorare sull'algoritmo manualmente aiuta a consolidare la comprensione. Prendi una calcolatrice e un esempio di CUIT/CUIL, quindi segui il processo di moltiplicazione ponderata passo dopo passo.

Servizi di Convalida Aziendali: Applicazioni su larga scala potrebbero beneficiare di API di convalida di terze parti che non solo controllano il formato ma anche incrociano database commerciali. Questi servizi possono segnalare aziende inattive, identificare entità sanzionate o fornire metadati aggiuntivi sul titolare del CUIT/CUIL.

Storia del Sistema CUIT/CUIL

Il sistema di identificazione CUIT/CUIL in Argentina si è evoluto significativamente dalla sua nascita:

Origini e Implementazione

Il CUIT (Clave Única de Identificación Tributaria) è stato introdotto per la prima volta in Argentina negli anni '70 come parte degli sforzi per modernizzare il sistema di riscossione fiscale. L'Amministrazione Federale delle Entrate Pubbliche (AFIP) ha implementato questo identificatore unico per tracciare i contribuenti in modo più efficiente e ridurre l'evasione fiscale.

Il CUIL (Clave Única de Identificación Laboral) è stato successivamente introdotto per identificare specificamente i lavoratori nel sistema di sicurezza sociale, creando una distinzione tra identificazione fiscale e identificazione lavorativa pur mantenendo un formato coerente.

Evoluzione e Digitalizzazione

Negli anni '90, mentre l'Argentina attraversava significative riforme economiche, il sistema CUIT/CUIL è diventato sempre più importante per tracciare l'attività economica. Il sistema è stato ulteriormente digitalizzato e sono stati implementati sistemi di verifica online.

I primi anni 2000 hanno visto l'integrazione del sistema CUIT/CUIL con vari servizi governativi digitali, rendendolo un componente essenziale delle iniziative di e-government dell'Argentina. Questo periodo ha anche visto la standardizzazione dell'algoritmo di verifica e del formato che rimane in uso oggi.

Sviluppi Recenti

Negli ultimi anni, l'AFIP ha migliorato i processi di sicurezza e verifica per i numeri CUIT/CUIL, implementando sistemi di convalida più sofisticati e integrandoli con altri database governativi. Il sistema ora svolge un ruolo cruciale negli sforzi dell'Argentina per combattere l'evasione fiscale e formalizzare l'economia.

Oggi, il CUIT/CUIL viene utilizzato non solo per scopi fiscali e occupazionali, ma anche per una vasta gamma di attività tra cui servizi bancari, transazioni immobiliari, servizi di pubblica utilità e acquisti online, rendendolo un identificatore essenziale per individui e aziende che operano in Argentina.

Considerazioni sull'implementazione

Quando si implementa la convalida di CUIT/CUIL nei propri sistemi, considerare questi aspetti tecnici:

Stabilità dell'Algoritmo: L'attuale algoritmo di verifica CUIT/CUIL è rimasto invariato dalla sua standardizzazione negli anni '90. Secondo la documentazione tecnica di AFIP, l'approccio del codice di controllo con modulo-11 ponderato è codificato nella Risoluzione Generale 2854/2010 e successive normative. Questa stabilità significa che le implementazioni raramente necessitano di aggiornamenti, ma è consigliabile monitorare gli annunci di AFIP per eventuali modifiche normative.

Ottimizzazione delle Prestazioni: L'algoritmo di verifica è computazionalmente economico—solo 10 moltiplicazioni, un'addizione e un'operazione modulo. Per sistemi ad alto throughput che elaborano migliaia di validazioni al secondo, il collo di bottiglia è tipicamente la latenza di rete durante la verifica nel database AFIP, non l'algoritmo stesso. Considerare di memorizzare in cache i risultati di verifica AFIP con TTL appropriati (tipicamente 24 ore) per bilanciare l'aggiornamento con le prestazioni.

Codifica dei Caratteri: Durante l'elaborazione di dati CUIT/CUIL da fonti esterne (PDF, documenti scansionati, web scraping), fare attenzione ai problemi di codifica dei caratteri. Il trattino potrebbe apparire come un trattino em (U+2014), trattino en (U+2013) o segno meno (U+2212) invece del trattino standard (U+002D). Normalizzare questi caratteri prima della convalida per prevenire falsi negativi.

Internazionalizzazione: Se l'applicazione serve più mercati latino-americani, notare che il CUIT/CUIL argentino utilizza modulo-11 con pesi specifici, mentre il RUT cileno usa modulo-11 con pesi diversi, e il CPF/CNPJ brasiliano usa modulo-11 con un altro schema. Non assumere che gli algoritmi siano identici—ogni sistema nazionale ha regole distinte. Per una comprensione più ampia degli algoritmi di cifre di controllo, consultare lo standard ISO/IEC 7064 che formalizza vari schemi di verifica basati su modulo.

Archiviazione Database: Memorizzare i numeri CUIT/CUIL senza trattini come CHAR(11) a lunghezza fissa o come BIGINT se il database supporta interi a 11 cifre senza perdita di precisione. Aggiungere un vincolo di controllo che convalidi la cifra di verifica a livello di database come rete di sicurezza contro dati corrotti. Creare indici su questo campo per ricerche efficienti quando gli utenti cercano per CUIT/CUIL.

Esempi di Codice

Python

1def calculate_verification_digit(type_code, dni):
2    # Converti in stringa e assicurati che il DNI sia 8 cifre con zeri iniziali
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Combina il codice tipo e il DNI
7    digits = type_code_str + dni_str
8    
9    # Pesi per ogni posizione
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Calcola la somma dei prodotti
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Calcola la cifra di verifica
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Casi speciali
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    # Codici tipo validi
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"Codice tipo non valido. Deve essere uno di: {valid_type_codes}")
34    
35    # Genera DNI casuale se non fornito
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Calcola la cifra di verifica
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # Formatta CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Rimuovi i trattini se presenti
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Controlla il formato di base
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Formato non valido"
52    
53    # Estrai le parti
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    # Convalida il codice tipo
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Codice tipo non valido"
62    
63    # Calcola e confronta la cifra di verifica
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Cifra di verifica non valida"
67    
68    return True, "CUIT/CUIL valido"
69
70# Esempio di utilizzo
71print(generate_cuit_cuil(20, 12345678))  # Genera per DNI specifico
72print(generate_cuit_cuil(27))  # Genera con DNI casuale
73print(validate_cuit_cuil("20-12345678-9"))  # Convalida un CUIT/CUIL
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Converti in stringa e assicurati che il DNI sia 8 cifre con zeri iniziali
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Combina il codice tipo e il DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // Pesi per ogni posizione
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Calcola la somma dei prodotti
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Calcola la cifra di verifica
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Casi speciali
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  // Codici tipo validi
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Codice tipo non valido. Deve essere uno di: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Genera DNI casuale se non fornito
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Calcola la cifra di verifica
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // Formatta CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Rimuovi i trattini se presenti
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Controlla il formato di base
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Formato non valido' };
58  }
59  
60  // Estrai le parti
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  // Convalida il codice tipo
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Codice tipo non valido' };
69  }
70  
71  // Calcola e confronta la cifra di verifica
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Cifra di verifica non valida' };
75  }
76  
77  return { isValid: true };
78}
79
80// Esempio di utilizzo
81console.log(generateCuitCuil(20, 12345678)); // Genera per DNI specifico
82console.log(generateCuitCuil(27)); // Genera con DNI casuale
83console.log(validateCuitCuil("20-12345678-9")); // Convalida 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        // Converti in stringa e assicurati che il DNI sia 8 cifre con zeri iniziali
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Combina il codice tipo e il DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // Calcola la somma dei prodotti
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Calcola la cifra di verifica
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Casi speciali
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("Codice tipo non valido. Deve essere uno di: " + VALID_TYPE_CODES);
39        }
40        
41        // Genera DNI casuale se non fornito
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Calcola la cifra di verifica
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // Formatta CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Rimuovi i trattini se presenti
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Controlla il formato di base
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Formato non valido");
61        }
62        
63        // Estrai le parti
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        // Convalida il codice tipo
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Codice tipo non valido");
71        }
72        
73        // Calcola e confronta la cifra di verifica
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Cifra di verifica non valida");
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        // Esempio di utilizzo
102        System.out.println(generateCuitCuil(20, 12345678)); // Genera per DNI specifico
103        System.out.println(generateCuitCuil(27, null)); // Genera con DNI casuale
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Convalida un CUIT/CUIL
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Converti in stringa e assicurati che il DNI sia 8 cifre con zeri iniziali $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Combina il codice tipo e il DNI $digits = $typeCodeStr . $dniStr; // Pesi per ogni posizione $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Calcola la somma dei prodotti $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Calcola la cifra di verifica $verificationDigit = 11 - ($sumProducts % 11); // Casi speciali if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Codici tipo validi $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Codice tipo non valido. Deve essere uno di: " . implode(', ', $validTypeCodes)); } // Genera DNI casuale se non fornito if ($dni === null) { $dni = rand(10000000, 99999999); } // Calcola la cifra di verifica $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatta CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Rimuovi i trattini se presenti $cuitCuilClean = str_replace('-', '', $cuitCuil); // Controlla il formato di base if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Formato non valido']; } // Estrai le parti $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Convalida il codice tipo $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Codice tipo non valido']; } // Calcola e confronta la cifra di verifica $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { return ['isValid' => false, 'errorMessage' => 'Cifra di verifica non valida']; } return ['isValid' => true]; } // Esempio di utilizzo echo generateCuitCuil(20, 12345678) ## Domande Frequenti ### Qual è la differenza tra CUIT e CUIL? Ecco la distinzione pratica: **CUIT** (Clave Única de Identificación Tributaria) identifica i contribuenti—sia individui che aziende che presentano le tasse all'AFIP. **CUIL** (Clave Única de Identificación Laboral) identifica i lavoratori nel sistema di sicurezza sociale per impiego e pensione. Nella pratica, molti individui hanno sia un CUIL (dal loro primo lavoro) e potrebbero successivamente ottenere un CUIT (se diventano lavoratori autonomi o avviano un'attività). I numeri utilizzano formattazione e regole di calcolo identiche, quindi da un punto di vista della convalida, li si gestisce allo stesso modo. La distinzione è importante per scopi amministrativi: i sistemi di gestione del personale generalmente lavorano con CUIL, mentre i sistemi di fatturazione e tassazione utilizzano CUIT. ### Quali codici tipo sono utilizzati per individui e quali per aziende? Per individui: - 20, 23, 24: Individui maschi (CUIL) - 27: Individui femmine (CUIL) Per aziende e organizzazioni: - 30: Società (CUIT) - 33: Associazioni Civili (CUIT) - 34: Fondazioni (CUIT) ### Come viene calcolato il cifra di verifica? L'algoritmo utilizza moltiplicazione ponderata: prendi ciascuna delle prime 10 cifre, moltiplica per i pesi **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, somma i prodotti, poi calcola 11 meno (somma modulo 11). Due casi limite confondono le persone: quando il calcolo produce 11, usa 0 come cifra di verifica; quando produce 10, usa 9. Questi casi speciali esistono perché la cifra di verifica deve essere una singola cifra (0-9). Questo è un algoritmo di cifra di controllo modulo-11, simile a quello utilizzato nei codici ISBN-10 e in altri sistemi di identificazione in tutto il mondo. ### Posso usare questo strumento per generare numeri CUIT/CUIL reali e ufficiali? No—questo strumento genera dati di test matematicamente validi, ma i numeri non sono ufficialmente registrati con AFIP. Pensalo come generare un numero di carta di credito valido utilizzando l'algoritmo di Luhn: supera la convalida del formato, ma non è collegato a un account reale. Per la registrazione ufficiale di CUIT/CUIL, gli individui devono visitare AFIP con il loro DNI, mentre le aziende devono completare le procedure di registrazione aziendale. Lo strumento è strettamente per sviluppo, test e uso educativo in cui sono necessari dati dall'aspetto valido che non entrino in conflitto con numeri di identificazione reali. ### Perché la mia convalida CUIT/CUIL fallisce anche se il formato sembra corretto? Quando la convalida fallisce nonostante un formato corretto, controlla questi colpevoli comuni: 1. **Codice tipo non valido**: Solo 20, 23, 24, 27, 30, 33, 34 sono validi. Utilizzare 21, 25 o altri numeri causerà un errore. 2. **Cifra di verifica errata**: L'ultima cifra deve corrispondere al calcolo dell'algoritmo. Anche cambiando una cifra nella parte DNI è necessario ricalcolare la cifra di controllo. 3. **Problemi di formato**: Deve essere esattamente 11 cifre (XX-XXXXXXXX-X). Fare attenzione a spazi extra o zeri iniziali mancanti. 4. **Caratteri nascosti**: Copiare e incollare da PDF o siti web a volte introduce caratteri Unicode invisibili che interrompono la convalida. Un rapido suggerimento per il debug: rimuovi l'ultima cifra e ricalcolala manualmente. Se non corrisponde, quello è il tuo colpevole. ### I trattini sono obbligatori nei numeri CUIT/CUIL? I trattini sono solo per la formattazione visiva—non fanno parte del numero per i calcoli. Quando vedi **20-12345678-9**, l'algoritmo si preoccupa solo delle 11 cifre: **20123456789**. La maggior parte delle implementazioni di convalida rimuove i trattini prima dell'elaborazione, per questo il nostro strumento accetta sia **20-12345678-9** che **20123456789**. Nelle API e nei database, in genere si memorizza la versione senza trattini e li si aggiunge solo quando si visualizza agli utenti. Questo approccio previene che le incoerenze di formattazione causino errori di convalida. ### Un numero CUIT/CUIL può avere meno di 8 cifre nella parte DNI? La parte DNI deve essere sempre esattamente 8 cifre—senza eccezioni. Se il DNI effettivo di qualcuno ha meno cifre (cosa che accade con DNI più vecchi e a basso numero), si riempie con zeri iniziali. Ad esempio, DNI **1234567** diventa **01234567** nella struttura CUIT/CUIL. Questa è una frequente fonte di bug quando si converte tra formati DNI e CUIT/CUIL. Ho visto sistemi fallire la convalida perché hanno dimenticato di riempire, trattando **1234567** come un numero di 7 cifre invece di **01234567**. Utilizzare sempre funzioni di riempimento con zero nel codice invece della semplice concatenazione di stringhe. ### Come posso verificare se un CUIT/CUIL è ufficialmente registrato in Argentina? Il nostro strumento convalida la correttezza matematica—formato, codice tipo e cifra di controllo. Ma non può dire se il numero è effettivamente registrato con AFIP o appartiene a una persona o azienda reale. Per una verifica ufficiale, utilizzare i [servizi web di AFIP](https://www.afip.gob.ar/) o il loro strumento di ricerca "Constancia de Inscripción". AFIP offre API per la verifica automatizzata, anche se sarà necessario registrarsi come sviluppatori e autenticarsi. In ambienti di produzione, implementare entrambi gli strati: eseguire prima la convalida algoritmica (veloce, cattura errori di battitura e di formato), quindi verificare nel database AFIP (più lento, ma conferma che il numero è reale e attivo). ### Posso utilizzare questo strumento nella mia applicazione commerciale? Sì—l'algoritmo di convalida CUIT/CUIL è uno standard pubblico definito da AFIP, quindi puoi implementarlo liberamente in software commerciale. Gli esempi di codice qui forniti sono intesi come implementazioni di riferimento. Per l'uso in produzione, considera queste best practice: implementare una gestione degli errori appropriata per i casi limite, aggiungere registrazione per il debug degli errori di convalida, convalidare rispetto al database ufficiale AFIP (non solo convalida algoritmica), e mantenere la tua implementazione aggiornata se AFIP modifica le regole (anche se l'algoritmo attuale è stabile da decenni). ### Lo strumento memorizza i numeri CUIT/CUIL generati o convalidati? No—tutti i calcoli avvengono nel tuo browser (lato client). Quando generi o convalidi un CUIT/CUIL, il calcolo viene eseguito localmente utilizzando JavaScript. Nulla viene inviato ai nostri server e non registriamo, memorizziamo o tracciamo alcun numero che inserisci o generi. Questo approccio lato client garantisce la privacy e significa anche che lo strumento funziona offline una volta caricata la pagina. Puoi verificarlo aprendo gli strumenti per sviluppatori del tuo browser e osservando la scheda di rete—non vedrai richieste inviate durante la generazione o convalida dei numeri. ## Riferimenti 1. AFIP (Amministrazione Federale delle Entrate Pubbliche). "CUIT/CUIL/CDI." Sito web ufficiale. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministero del Lavoro, Impiego e Sicurezza Sociale. "CUIL - Chiave Unica di Identificazione Lavorativa." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Amministrazione Nazionale della Sicurezza Sociale). "Ottenere il mio CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Bollettino Ufficiale della Repubblica Argentina. "Risoluzione Generale AFIP 2854/2010: Procedura. Chiave Unica di Identificazione Tributaria (C.U.I.T.)." 5. Codice Fiscale della Repubblica Argentina. "Identificazione e Registrazione dei Contribuenti." --- Che tu stia costruendo un sistema di fatturazione, testando flussi di onboarding dei dipendenti o imparando gli algoritmi di convalida, questo strumento fornisce la generazione e la convalida di CUIT/CUIL di cui hai bisogno. Genera dati di test che superano la convalida algoritmica, verifica i numeri prima che raggiungano il tuo database o esplora come funziona in pratica l'algoritmo del cifra di controllo.