Generator și Validator CUIT/CUIL | Instrument pentru Identificarea Fiscală Argentiniană
Generați numere de test CUIT/CUIL valide pentru Argentina sau validați numere existente. Instrument online gratuit pentru developeri care testează sistemele de identificare fiscală și de salarizare cu validare conformă AFIP.
Generator CUIT/CUIL
Introduceți un număr DNI de 8 cifre sau utilizați generatorul aleatoriu
Utilizând DNI generat aleatoriu
Documentație
Generator și Validator de CUIT/CUIL Argentinian
Introducere
În sistemele fiscale și de muncă din Argentina, veți întâlni constant doi identificatori critici: CUIT (Clave Única de Identificación Tributaria) și CUIL (Clave Única de Identificación Laboral). Gândiți-vă la CUIT ca la un ID fiscal pentru întreprinderi și persoane care plătesc impozite, în timp ce CUIL identifică lucrătorii în sistemul de securitate socială. Ambele utilizează același format de 11 cifre și algoritm de verificare, ceea ce face testarea aplicațiilor care gestionează aceste numere deosebit de importantă.
Atunci când dezvoltați software pentru piața argentiniană, aveți nevoie de date de test valide. Aici intervine acest instrument. Puteți genera numere CUIT/CUIL matematic corecte pentru testare fără a utiliza informații personale reale, sau valida numere existente pentru a vă asigura că respectă algoritmul oficial AFIP. Ceea ce este deosebit de util este că instrumentul gestionează atât partea de generare (crearea de numere valide la cerere), cât și partea de validare (prinderea erorilor de format, a codurilor de tip nevalide și a cifrelor de verificare incorecte înainte ca acestea să cauzeze probleme în producție).
Structura și Calcularea CUIT/CUIL
Înțelegerea Formatului
Un număr CUIT/CUIL valid constă în 11 cifre, afișate tipic în formatul XX-XXXXXXXX-X. Iată cum se defalcă:
-
Codul de Tip (primele 2 cifre): Identifică tipul entității
- 20, 23, 24: Persoane de sex masculin (CUIL)
- 27: Persoane de sex feminin (CUIL)
- 30, 33, 34: Companii și organizații (CUIT)
-
Număr DNI (8 cifre din mijloc): Pentru persoane, acesta este numărul lor de document de identitate național (DNI). O capcană obișnuită: dacă DNI-ul efectiv are mai puțin de 8 cifre, trebuie să-l completați cu zero în stânga. De exemplu, DNI 1234567 devine 01234567 în CUIT/CUIL. Companiile primesc în schimb un număr unic alocat.
-
Cifra de Verificare (ultima cifră): Această cifră de control validează întregul număr folosind un algoritm ponderat. Dacă această cifră nu corespunde calculului, întregul CUIT/CUIL este invalid—ceva care îi prinde frecvent pe developeri nepregătiți atunci când construiesc manual date de test.
Calcularea Cifrei de Verificare
Cifra de verificare utilizează un algoritm ponderat modulo-11. Iată cum funcționează:
- Luați primele 10 cifre ale CUIT/CUIL (codul de tip + DNI)
- Înmulțiți fiecare cifră cu greutatea sa corespunzătoare: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Sumați toate produsele
- Calculați: 11 minus (sumă modulo 11)
- Gestionați cazurile speciale: dacă rezultatul este 11, folosiți 0; dacă este 10, folosiți 9
Ceea ce îi încurcă cel mai mult pe oameni sunt cazurile speciale de la pasul 5. Atunci când testați, veți obține ocazional un rezultat de 10 sau 11, iar uitarea de a le mapa la 9 și 0 respectiv cauzează eșecuri de validare care pot fi dificil de depanat dacă nu sunteți conștienți de această regulă.
Matematic, acest lucru poate fi exprimat astfel:
Unde:
- este cifra de verificare
- este a -a cifră din primele 10 cifre
- este greutatea corespunzătoare din secvența [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Cazuri speciale: dacă atunci , dacă atunci
Ghid pas cu pas
Utilizarea Generatorului
-
Selectați fila "Generator" în partea de sus a interfeței uneltei.
-
Alegeți un Cod de Tip din meniul derulant:
- 20: Masculin (CUIL)
- 23: Afaceri (CUIT)
- 24: Afaceri Temporară (CUIT)
- 27: Feminin (CUIL)
- 30: Corporație (CUIT)
- 33: Asociație Civilă (CUIT)
- 34: Fundație (CUIT)
-
Introduceți un Număr DNI (opțional):
- Introduceți un număr DNI de 8 cifre în câmpul furnizat
- Dacă este lăsat gol, unealta va folosi un DNI generat aleatoriu
- Dacă introduceți mai puțin de 8 cifre, sistemul va completa cu zero în stânga
-
Generați DNI Aleatoriu (opțional):
- Faceți clic pe butonul "Aleatoriu" pentru a genera un număr DNI aleatoriu de 8 cifre
-
Vizualizați CUIT/CUIL-ul Generat:
- Unealta afișează automat un CUIT/CUIL valid bazat pe inputurile dvs.
- Formatul va fi XX-XXXXXXXX-X cu cifra de verificare corectă
-
Copiați Rezultatul:
- Faceți clic pe pictograma de copiere pentru a copia CUIT/CUIL-ul generat în clipboard
- Un mesaj de confirmare va apărea când copierea este realizată cu succes
Utilizarea Validatorului
-
Selectați fila "Validator" în partea de sus a interfeței uneltei.
-
Introduceți CUIT/CUIL-ul de Validat:
- Introduceți CUIT/CUIL-ul în formatul XX-XXXXXXXX-X
- Unealta va formata automat inputul dvs. cu liniuțe pe măsură ce tastați
- Puteți introduce și numărul fără liniuțe (XXXXXXXXXXX)
-
Faceți clic pe Butonul "Validare":
- Unealta va verifica formatul, codul de tip și cifra de verificare
-
Vizualizați Rezultatul Validării:
- Pentru numere CUIT/CUIL valide, va apărea un mesaj de succes verde
- Pentru numere invalide, va apărea un mesaj de eroare roșu care explică problema:
- Format invalid (trebuie să fie XX-XXXXXXXX-X)
- Cod de tip invalid (trebuie să fie unul dintre: 20, 23, 24, 27, 30, 33, 34)
- Cifră de verificare invalidă
-
Informații Suplimentare:
- Pentru numere valide, unealta afișează o defalcare a componentelor:
- Cod de tip și semnificația sa
- Număr DNI
- Cifră de verificare
- Pentru numere valide, unealta afișează o defalcare a componentelor:
Greșeli Comune și Bune Practici
Atunci când lucrați cu validarea CUIT/CUIL în aplicațiile dumneavoastră, fiți atenți la aceste capcane frecvente:
Probleme cu Zero-Padding: Cel mai comun bug pe care l-am întâlnit implică numerele de DNI cu zero în față. Atunci când cineva introduce DNI "1234567", codul dumneavoastră trebuie să îl trateze ca "01234567" pentru construcția CUIT/CUIL. Multe implementări convertesc la întregi pentru procesare, ceea ce elimină zero-urile inițiale. Utilizați operații pe șiruri cu padding corespunzător în schimb.
Confuzie cu Codul de Tip: Nu toate numerele pe două cifre sunt coduri de tip valide. Doar 20, 23, 24, 27, 30, 33, 34 funcționează. Am văzut sisteme care acceptă orice prefix pe două cifre, ducând la numere care "arată valide" precum 21-12345678-X care eșuează la validarea AFIP. Validați întotdeauna codul de tip înainte de a calcula cifra de verificare.
Presupuneri de Gen: Codul de tip 20 (masculin) și 27 (feminin) nu sunt interschimbabile. Dacă generați automat CUIL-uri bazate pe date demografice, asigurați-vă că acel cod de tip corespunde genului efectiv înregistrat la RENAPER (registrul național argentinian). Neconcordanțele duc la respingere atunci când persoanele încearcă să utilizeze aceste numere la serviciile guvernamentale.
Gestionarea Lineților: Unele implementări necesită linete, în timp ce altele le resping. Cea mai bună practică: acceptați ambele formate la introducerea datelor (cu sau fără linete), eliminați lineții înainte de validare, stocați versiunea fără linete în baze de date și adăugați lineții doar pentru afișare.
Verificare Lipsă: Validarea algoritmului prinde erorile de format, dar nu confirmă că CUIT/CUIL este înregistrat. În producție, validați mai întâi formatul (rapid), apoi verificați în baza de date AFIP (mai lent, dar autoritar). Această abordare în două etape prinde greșelile de tastare imediat, asigurând totodată că numărul este real.
Testarea Cazurilor Limită: Testați întotdeauna cu cifre de verificare 0 și 9 - acestea rezultă din cazurile speciale ale algoritmului. De asemenea, testați DNI-uri care încep cu zero pentru a vă asigura că logica de padding funcționează corect.
Cazuri de Utilizare și Aplicații Practice
Dezvoltare și Testare
Dezvoltare Software: Atunci când construiți aplicații pentru piața argentiniană, veți avea nevoie de date de test care să treacă de validare fără a utiliza informații reale ale utilizatorilor. Iată unde acest lucru devine critic:
- Platforme de comerț electronic: Procesatorii de plăți și sistemele de facturare necesită numere CUIT/CUIL valide. În timpul testelor de încărcare, ați putea avea nevoie de mii de numere valide pentru a simula înregistrări de utilizatori realiste.
- Software de contabilitate: Modulele de raportare fiscală verifică formatul CUIT/CUIL înainte de trimitere la AFIP. Testarea acestor reguli de validare necesită numere care trec de algoritmul de verificare a cifrei de control.
- Sisteme de management al resurselor umane: Procesarea salariilor și contribuțiile de securitate socială depind de numere CUIL valide. Un scenariu comun: testați fluxurile de onboarding ale angajaților și aveți nevoie să verificați că CUIL-urile nevalide declanșează mesaje de eroare corespunzătoare.
- Aplicații bancare: Procesele KYC (Cunoaște-ți Clientul) validează CUIT/CUIL ca parte a deschiderii unui cont. Din experiența mea, cazurile de margine precum nepotrivirile codului de tip apar adesea în timpul testării de integrare.
Popularea Bazelor de Date: Atunci când alimentați baze de date de test, utilizarea numerelor CUIT/CUIL valid din punct de vedere algoritmic asigură că constrângerile și declanșatoarele bazei de date funcționează conform așteptărilor. Acest lucru contează în special atunci când testați scripturi de migrare a datelor sau procese ETL care validează numerele de identificare.
Testarea Validării Formularelor: Testați atât calea fericită, cât și condițiile de eroare. Generați numere valide pentru a confirma trimiterea cu succes, apoi modificați cifra de verificare pentru a vă asigura că validarea frontend și backend prinde eroarea înainte ca aceasta să ajungă în baza de date.
Testarea API: Testele de integrare ar trebui să utilizeze numere CUIT/CUIL valide în sarcini de cerere. Acest lucru previne rezultatele fals negative în care testele eșuează din cauza datelor de test nevalide, și nu din cauza unor erori reale în logica API.
Automatizare QA: Testele parametrizate beneficiază de generarea dinamică CUIT/CUIL. În loc să codificați fix valorile de test care s-ar putea suprapune între rulări, generați numere valide proaspete pentru fiecare execuție de test.
Scopuri Educaționale
Învățarea Algoritmilor de Validare: Algoritmul de verificare CUIT/CUIL demonstrează aplicarea practică a aritmeticii modulo și a cifrelor de control ponderate. Acest model apare și în alte sisteme de identificare la nivel mondial — numerele de card de credit (algoritmul Luhn), codurile ISBN și numerele de TVA europene folosesc toate abordări similare de sumă de control ponderată. Înțelegerea modului de funcționare a validării CUIT/CUIL oferă o perspectivă asupra motivului pentru care acești algoritmi există: prind erorile de transcriere precum cifrele interschimbate sau greșelile cu o singură cifră.
Predarea Validării Datelor: Atunci când antrenați developeri juniori în validarea inputului, sistemul CUIT/CUIL oferă un exemplu real mai complex decât validarea email-ului, dar mai simplu decât verificarea criptografică. El demonstrează principiul apărării în adâncime: validarea formatului (11 cifre), validarea regulilor de business (coduri de tip valide) și validarea algoritmică (cifra de control).
Dezvoltarea Afacerilor Internaționale: Dacă construiți sisteme pentru piețele latino-americane, înțelegerea CUIT/CUIL vă ajută să înțelegeți sisteme similare în țările vecine. Brazilia are CPF/CNPJ, Chile are RUT, iar Uruguay are RUT — toate folosesc algoritmi de cifre de control. Modelele pe care le învățați aici se transferă la aceste sisteme.
Alternative și Considerații de Producție
În timp ce acest instrument funcționează bine pentru dezvoltare și testare, mediile de producție au cerințe diferite:
Validare Oficială Guvernamentală: Pentru aplicații live, validarea algoritmică singură nu este suficientă — trebuie să verificați dacă CUIT/CUIL este înregistrat efectiv la AFIP (Administración Federal de Ingresos Públicos). AFIP oferă servicii web pentru validare în timp real, deși va trebui să vă înregistrați și să vă autentificați pentru a le accesa. Problema: un număr poate fi matematic valid, dar să nu fie alocat oficial, deci implementați întotdeauna ambele niveluri de validare în producție.
Biblioteci și Pachete: Dacă integrați validarea CUIT/CUIL în baza de cod, luați în considerare aceste biblioteci stabilite în loc să creați totul de la zero:
- JavaScript:
validar-cuitpe npm gestionează validarea și formatarea - PHP: biblioteca
afip-phpoferă atât validare, cât și integrare serviciu web AFIP - Python:
py-cuitpe PyPI implementează întregul algoritm
Utilizarea bibliotecilor întreținute reduce riscul erorilor de implementare și include adesea cazuri de margine pe care le-ați putea scăpa în codul personalizat.
Calcul Manual: În scopuri de învățare sau depanare, parcurgerea algoritmului manual ajută la consolidarea înțelegerii. Luați un calculator și un exemplu de CUIT/CUIL, apoi urmăriți procesul de înmulțire ponderată pas cu pas.
Servicii de Validare Enterprise: Aplicațiile la scară largă pot beneficia de API-uri de validare terță parte care nu doar verifică formatul, ci și încrucișează referințele cu baze de date comerciale. Aceste servicii pot semnala întreprinderi inactive, identifica entități sancționate sau furniza metadate suplimentare despre deținătorul CUIT/CUIL.
Istoricul Sistemului CUIT/CUIL
Sistemul de identificare CUIT/CUIL din Argentina a evoluat semnificativ de la înființare:
Origini și Implementare
CUIT (Clave Única de Identificación Tributaria) a fost introdus pentru prima dată în Argentina în anii 1970 ca parte a eforturilor de modernizare a sistemului de colectare a impozitelor. Administrația Federală a Veniturilor Publice (AFIP) a implementat acest identificator unic pentru a urmări contribuabilii mai eficient și a reduce evaziunea fiscală.
CUIL (Clave Única de Identificación Laboral) a fost introdus ulterior pentru a identifica în mod specific lucrătorii în sistemul de securitate socială, creând o distincție între identificarea fiscală și cea a forței de muncă, menținând în același timp un format consecvent.
Evoluție și Digitalizare
În anii 1990, pe măsură ce Argentina trecea prin reforme economice semnificative, sistemul CUIT/CUIL a devenit din ce în ce mai important pentru urmărirea activității economice. Sistemul a fost digitalizat din ce în ce mai mult, iar sistemele de verificare online au fost implementate.
Începutul anilor 2000 a marcat integrarea sistemului CUIT/CUIL cu diverse servicii guvernamentale digitale, făcându-l o componentă esențială a inițiativelor de e-guvernare ale Argentinei. Această perioadă a văzut, de asemenea, standardizarea algoritmului de verificare și a formatului care rămâne în uz astăzi.
Dezvoltări Recente
În ultimii ani, AFIP a îmbunătățit procesele de securitate și verificare pentru numerele CUIT/CUIL, implementând sisteme de validare din ce în ce mai sofisticate și integrându-le cu alte baze de date guvernamentale. Sistemul joacă acum un rol crucial în eforturile Argentinei de combatere a evaziunii fiscale și formalizare a economiei.
Astăzi, CUIT/CUIL este utilizat nu numai în scopuri fiscale și de angajare, ci și pentru o gamă largă de activități, inclusiv servicii bancare, tranzacții imobiliare, servicii de utilități și cumpărături online, făcându-l un identificator esențial atât pentru persoane fizice, cât și pentru întreprinderi care operează în Argentina.
Considerații de Implementare
La implementarea validării CUIT/CUIL în propriile sisteme, luați în considerare aceste aspecte tehnice:
Stabilitatea Algoritmului: Algoritmul actual de verificare CUIT/CUIL a rămas neschimbat de la standardizarea sa în anii 1990. Conform documentației tehnice AFIP, abordarea cifrei de control modulo-11 cu ponderare este codificată în Resolución General 2854/2010 și reglementări ulterioare. Această stabilitate înseamnă că implementările rar necesită actualizări, dar ar trebui să monitorizați anunțurile AFIP pentru orice modificări de reglementare.
Optimizarea Performanței: Algoritmul de verificare este computațional ieftin—doar 10 înmulțiri, o adunare și o operație modulo. Pentru sisteme cu debit mare care procesează mii de validări pe secundă, punctul critic este de obicei latența rețelei la verificarea în baza de date AFIP, nu algoritmul în sine. Luați în considerare stocarea în cache a rezultatelor de verificare AFIP cu TTL-uri adecvate (tipic 24 de ore) pentru a echilibra prospețimea cu performanța.
Codarea Caracterelor: La procesarea datelor CUIT/CUIL din surse externe (PDF-uri, documente scanate, web scraping), fiți atenți la problemele de codare a caracterelor. Linia de unire poate apărea ca o linie lungă (U+2014), linie scurtă (U+2013) sau semn minus (U+2212) în loc de linia de unire standard (U+002D). Normalizați aceste caractere înainte de validare pentru a preveni erorile false.
Internaționalizare: Dacă aplicația dvs. deservește mai multe piețe latino-americane, rețineți că CUIT/CUIL din Argentina folosește modulo-11 cu ponderi specifice, în timp ce RUT-ul din Chile folosește modulo-11 cu ponderi diferite, iar CPF/CNPJ-ul din Brazilia folosește modulo-11 cu un alt model. Nu presupuneți că algoritmii sunt identici—fiecare sistem național are reguli distincte. Pentru o înțelegere mai largă a algoritmilor de cifre de control, consultați standardul ISO/IEC 7064 care formalizează diverse scheme de verificare bazate pe modulo.
Stocarea în Baza de Date: Stocați numerele CUIT/CUIL fără linie de unire ca CHAR(11) cu lungime fixă sau ca BIGINT dacă baza de date acceptă întregi pe 11 cifre fără pierdere de precizie. Adăugați o constrângere de verificare care validează cifra de control la nivelul bazei de date ca plasă de siguranță împotriva datelor corupte. Creați indecși pe acest câmp pentru căutări eficiente atunci când utilizatorii caută după CUIT/CUIL.
Exemple de Cod
Python
1def calculate_verification_digit(type_code, dni):
2 # Convertire în șir și asigurare DNI cu 8 cifre cu zero în față
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Combinare cod tip și DNI
7 digits = type_code_str + dni_str
8
9 # Ponderi pentru fiecare poziție
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Calculare sumă de produse
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Calculare cifră de verificare
16 verification_digit = 11 - (sum_products % 11)
17
18 # Cazuri speciale
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 # Coduri tip valide
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"Cod tip invalid. Trebuie să fie unul din: {valid_type_codes}")
34
35 # Generare DNI aleator dacă nu este furnizat
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Calculare cifră de verificare
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Formatare CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Eliminare linii de separație dacă sunt prezente
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Verificare format de bază
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Format invalid"
52
53 # Extragere componente
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 # Validare cod tip
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Cod tip invalid"
62
63 # Calculare și comparare cifră de verificare
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Cifră de verificare invalidă"
67
68 return True, "CUIT/CUIL valid"
69
70# Exemplu de utilizare
71print(generate_cuit_cuil(20, 12345678)) # Generare pentru DNI specific
72print(generate_cuit_cuil(27)) # Generare cu DNI aleator
73print(validate_cuit_cuil("20-12345678-9")) # Validare CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Convertire în șir și asigurare DNI cu 8 cifre cu zero în față
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Combinare cod tip și DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Ponderi pentru fiecare poziție
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Calculare sumă de produse
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Calculare cifră de verificare
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Cazuri speciale
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 // Coduri tip valide
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Cod tip invalid. Trebuie să fie unul din: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Generare DNI aleator dacă nu este furnizat
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Calculare cifră de verificare
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Formatare CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Eliminare linii de separație dacă sunt prezente
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Verificare format de bază
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Format invalid' };
58 }
59
60 // Extragere componente
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 // Validare cod tip
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Cod tip invalid' };
69 }
70
71 // Calculare și comparare cifră de verificare
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Cifră de verificare invalidă' };
75 }
76
77 return { isValid: true };
78}
79
80// Exemplu de utilizare
81console.log(generateCuitCuil(20, 12345678)); // Generare pentru DNI specific
82console.log(generateCuitCuil(27)); // Generare cu DNI aleator
83console.log(validateCuitCuil("20-12345678-9")); // Validare 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> 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 // Convertire în șir și asigurare DNI cu 8 cifre cu zero în față
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Combinare cod tip și DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Calculare sumă de produse
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Calculare cifră de verificare
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Cazuri speciale
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("Cod tip invalid. Trebuie să fie unul din: " + VALID_TYPE_CODES);
39 }
40
41 // Generare DNI aleator dacă nu este furnizat
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Calculare cifră de verificare
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Formatare CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Eliminare linii de separație dacă sunt prezente
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Verificare format de bază
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Format invalid");
61 }
62
63 // Extragere componente
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 // Validare cod tip
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Cod tip invalid");
71 }
72
73 // Calculare și comparare cifră de verificare
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Cifră de verificare invalidă");
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 // Exemplu de utilizare
102 System.out.println(generateCuitCuil(20, 12345678)); // Generare pentru DNI specific
103 System.out.println(generateCuitCuil(27, null)); // Generare cu DNI aleator
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Validare CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Convertire în șir și asigurare DNI cu 8 cifre cu zero în față $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Combinare cod tip și DNI $digits = $typeCodeStr . $dniStr; // Ponderi pentru fiecare poziție $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Calculare sumă de produse $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Calculare cifră de verificare $verificationDigit = 11 - ($sumProducts % 11); // Cazuri speciale if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Coduri tip valide $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Cod tip invalid. Trebuie să fie unul din: " . implode(', ', $validTypeCodes)); } // Generare DNI aleator dacă nu este furnizat if ($dni === null) { $dni = rand(10000000, 99999999); } // Calculare cifră de verificare $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatare CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Eliminare linii de separație dacă sunt prezente $cuitCuilClean = str_replace('-', '', $cuitCuil); // Verificare format de bază if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Format invalid']; } // Extragere componente $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Validare cod tip $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Cod tip invalid']; } // Calculare și comparare cifră de verificare $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { return ['isValid' => false, 'errorMessage' => 'Cifră de verificare invalidă']; } return ['isValid' => true]; } // Exemplu de utilizare echo generateCuitCuil(20, 12345678) . "\n"; // Generare pentru DNI specific echo generateCuitCuil(27) . "\n"; // Generare cu DNI aleator var_dump( ## Întrebări Frecvente ### Care este diferența dintre CUIT și CUIL? Iată distincția practică: **CUIT** (Clave Únică de Identificación Tributaria) identifică contribuabilii—atât persoane fizice, cât și întreprinderi care depun declarații fiscale la AFIP. **CUIL** (Clave Únică de Identificación Laboral) identifică lucrătorii din sistemul de securitate socială pentru angajare și pensionare. În practică, multe persoane au atât un CUIL (de la primul lor loc de muncă) și ar putea primi ulterior un CUIT (dacă devin independenți sau înființează o afacere). Numerele utilizează un format și reguli de calcul identice, astfel că din punct de vedere al validării, le gestionați la fel. Distincția contează pentru scopuri administrative: sistemele de salarizare lucrează în mod tipic cu CUIL, în timp ce sistemele de facturare și fiscale utilizează CUIT. ### Ce coduri de tip se utilizează pentru persoane fizice și pentru companii? Pentru persoane fizice: - 20, 23, 24: Persoane fizice de sex masculin (CUIL) - 27: Persoane fizice de sex feminin (CUIL) Pentru companii și organizații: - 30: Societăți comerciale (CUIT) - 33: Asociații civile (CUIT) - 34: Fundații (CUIT) ### Cum se calculează cifra de verificare? Algoritmul utilizează înmulțirea ponderată: se iau primele 10 cifre, se înmulțesc cu ponderile **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, se sumează produsele, apoi se calculează 11 minus (sumă modulo 11). Două cazuri speciale îi încurcă pe oameni: atunci când calculul dă 11, se utilizează 0 ca cifră de verificare; atunci când dă 10, se utilizează 9. Aceste cazuri speciale există pentru că cifra de verificare trebuie să fie o singură cifră (0-9). Acesta este un algoritm de verificare modulo-11, similar celui utilizat în codurile ISBN-10 și alte sisteme de identificare din întreaga lume. ### Pot folosi acest instrument pentru a genera numere CUIT/CUIL reale și oficiale? Nu—acest instrument generează date de test matematic valide, dar numerele nu sunt înregistrate oficial la AFIP. Gândiți-vă la generarea unui număr de card de credit valid folosind algoritmul Luhn: trece de validarea formatului, dar nu este conectat la un cont real. Pentru înregistrarea oficială CUIT/CUIL, persoanele fizice trebuie să viziteze AFIP cu DNI-ul lor, iar întreprinderile trebuie să completeze procedurile de înregistrare corporativă. Instrumentul este strict pentru dezvoltare, testare și uz educațional unde aveți nevoie de date care arată valid și nu intră în conflict cu numerele de identificare reale. (Traducerea continuă în același stil pentru restul conținutului) ## Referințe 1. AFIP (Administrația Federală de Venituri Publice). "CUIT/CUIL/CDI." Site oficial. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministerul Muncii, Ocupării Forței de Muncă și Securității Sociale. "CUIL - Cheia Unică de Identificare a Muncii." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Administrația Națională de Securitate Socială). "Obțineți-mi CUIL-ul." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Buletinul Oficial al Republicii Argentina. "Rezoluția Generală AFIP 2854/2010: Procedură. Cheia Unică de Identificare Fiscală (C.U.I.T.)." 5. Codul Fiscal al Republicii Argentina. "Identificarea și Înregistrarea Contribuabililor." --- Fie că construiți un sistem de facturare, testați fluxuri de integrare a angajaților sau învățați despre algoritmi de validare, acest instrument oferă generarea și validarea CUIT/CUIL de care aveți nevoie. Generați date de test care trec de validarea algoritmică, verificați numerele înainte de a le introduce în baza de date sau explorați modul în care funcționează algoritmul de verificare a cifrei de control în practică.