Generator in validator CUIT/CUIL | Argentinski davčni identifikacijski orodja
Ustvarjanje veljavnih testnih številk CUIT/CUIL za Argentino ali preverjanje obstoječih. Brezplačno spletno orodje za razvijalce, ki testirajo davčne identifikacijske številke in plačne sisteme z validacijo skladno z AFIP.
Generator CUIT/CUIL
Vnesite 8-mestno številko DNI ali uporabite naključni generator
Uporaba naključno ustvarjenega DNI
Dokumentacija
Generator in validator argentinskih CUIT/CUIL dokumentov
Uvod
V argentinskih davčnih in delovnih sistemih se boste nenehno srečevali z dvema ključnima identifikatorjema: CUIT (Clave Única de Identificación Tributaria) in CUIL (Clave Única de Identificación Laboral). Razmislite o CUIT kot davčni identifikaciji za podjetja in posameznike, ki plačujejo davke, medtem ko CUIL identificira delavce v sistemu socialne varnosti. Oba uporabljata enak 11-mestni format in algoritem za preverjanje, kar naredi testiranje aplikacij, ki upravljajo s temi številkami, še posebej pomembno.
Pri razvoju programske opreme za argentinski trg potrebujete veljavne testne podatke. Prav zato je tu to orodje. Lahko ustvarjate matematično pravilne CUIT/CUIL številke za testiranje brez uporabe resničnih osebnih podatkov ali preverjate obstoječe številke, da zagotovite njihovo skladnost z uradnim algoritmom AFIP. Še posebej koristno je, da orodje pokriva tako stran generiranja (ustvarjanje veljavnih številk na zahtevo) kot tudi stran validacije (preprečevanje formatnih napak, neveljavnih kod tipov in nepravilnih preveritvenih številk, preden povzročijo težave v produkciji).
Struktura in izračun CUIT/CUIL
Razumevanje formata
Veljavna CUIT/CUIL številka sestoji iz 11 številk, ki so običajno prikazane v formatu XX-XXXXXXXX-X. Tako se razčleni:
-
Koda tipa (prvi 2 digits): Identificira vrsto subjekta
- 20, 23, 24: Moški posamezniki (CUIL)
- 27: Ženske posameznice (CUIL)
- 30, 33, 34: Podjetja in organizacije (CUIT)
-
Številka DNI (srednji 8 digits): Za posameznike je to njihova nacionalna identifikacijska dokumentna številka (DNI). Pogosta past: če ima dejanski DNI manj kot 8 številk, ga je treba dopolniti z vodilnimi ničlami. Na primer, DNI 1234567 postane 01234567 v CUIT/CUIL. Podjetja prejmejo namesto tega edinstveno dodeljeno številko.
-
Preveritvena številka (zadnji digit): Ta kontrolni digit potrjuje celotno številko z uporabo ponderiranega algoritma. Če ta digit ne ustreza izračunu, je celoten CUIT/CUIL neveljaven - nekaj, kar pogosto preseneti razvijalce pri ročnem sestavljanju testnih podatkov.
Izračun preveritvene številke
Preveritvena številka uporablja modulo-11 ponderiran algoritem. Tako deluje:
- Vzemite prvih 10 digits CUIT/CUIL (koda tipa + DNI)
- Pomnožite vsak digit z ustrezno utežjo: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Seštejte vse produkte
- Izračunajte: 11 minus (vsota modulo 11)
- Obravnavajte mejne primere: če je rezultat 11, uporabite 0; če je 10, uporabite 9
Največ težav povzročajo mejni primeri v 5. koraku. Pri testiranju boste občasno dobili rezultat 10 ali 11, in pozabljanje na preslikavo teh v 9 in 0 povzroča napake pri validaciji, ki jih je težko razhroščevati, če niste seznanjeni s tem pravilom.
Matematično se to lahko izrazi kot:
Kjer:
- je preveritvena številka
- je -ti digit prvih 10 digits
- je ustrezna utež iz zaporedja [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Posebni primeri: če potem , če potem
Vodnik po korakih
Uporaba generatorja
-
Izberite zavihek "Generator" na vrhu vmesnika orodja.
-
Izberite kodo tipa iz spustnega menija:
- 20: Moški (CUIL)
- 23: Podjetje (CUIT)
- 24: Začasno podjetje (CUIT)
- 27: Ženska (CUIL)
- 30: Korporacija (CUIT)
- 33: Civilno združenje (CUIT)
- 34: Fundacija (CUIT)
-
Vnesite DNI številko (izbirno):
- Vnesite 8-mestno DNI številko v navedeno polje
- Če je prazno, bo orodje uporabilo naključno generirano DNI
- Če vnesete manj kot 8 mest, bo sistem dopolnil z vodilnimi ničlami
-
Generiraj naključno DNI (izbirno):
- Kliknite gumb "Naključno" za generiranje naključne 8-mestne DNI številke
-
Prikaz generiranega CUIT/CUIL:
- Orodje samodejno prikaže veljaven CUIT/CUIL glede na vaše vnose
- Format bo XX-XXXXXXXX-X z ustrezno preveritveno številko
-
Kopiraj rezultat:
- Kliknite ikono kopiranja za kopiranje generiranega CUIT/CUIL v odložišče
- Prikazano bo potrditveno sporočilo, ko je kopiranje uspešno
Uporaba validatorja
-
Izberite zavihek "Validator" na vrhu vmesnika orodja.
-
Vnesite CUIT/CUIL za potrditev:
- Vnesite CUIT/CUIL v formatu XX-XXXXXXXX-X
- Orodje bo samodejno oblikovalo vaš vnos s pomišljaji med vpisovanjem
- Lahko vnesete tudi številko brez pomišljajev (XXXXXXXXXXX)
-
Kliknite gumb "Potrdi":
- Orodje bo preverilo format, kodo tipa in preveritveno številko
-
Prikaz rezultata potrditve:
- Za veljavne CUIT/CUIL številke se bo prikazalo zeleno sporočilo o uspehu
- Za neveljavne številke se bo prikazalo rdeče sporočilo o napaki:
- Neveljaven format (mora biti XX-XXXXXXXX-X)
- Neveljavna koda tipa (mora biti ena izmed: 20, 23, 24, 27, 30, 33, 34)
- Neveljavna preveritvena številka
-
Dodatne informacije:
- Za veljavne številke orodje prikaže razčlenitev komponent:
- Koda tipa in njen pomen
- DNI številka
- Preveritvena številka
- Za veljavne številke orodje prikaže razčlenitev komponent:
Pogoste napake in najboljše prakse
Pri delu z validacijo CUIT/CUIL v vaših aplikacijah bodite pozorni na te pogoste pasti:
Težave z ničelnim polnjenjem: Najpogostejša napaka, s katero sem se srečal, vključuje DNI številke z vodilnimi ničlami. Ko nekdo vnese DNI "1234567", mora vaša koda obravnavati to kot "01234567" za izgradnjo CUIT/CUIL. Številne implementacije jih pretvorijo v celoštevilske vrednosti za obdelavo, kar odstrani vodilne ničle. Namesto tega uporabite nize z ustreznim polnjenjem.
Zmeda s kodami tipa: Niso vse dvooštevilčne kode veljavne. Delujejo samo 20, 23, 24, 27, 30, 33, 34. Videl sem sisteme, ki sprejemajo katerikoli dvooštevilčni prefix, kar vodi do "videti veljavnih" številk kot 21-12345678-X, ki ne prestanejo AFIP validacije. Vedno najprej preverite kodo tipa pred izračunom preveritvene številke.
Predpostavke o spolu: Kodi tipa 20 (moški) in 27 (ženska) nista zamenljivi. Če samodejno ustvarjate CUIL na podlagi demografskih podatkov, zagotovite, da vaša koda tipa ustreza dejanskemu spolu, registriranemu pri RENAPER (nacionalni register Argentine). Neskladja povzročajo zavrnitev pri uporabi teh številk z vladnimi storitvami.
Rokovanje s bindestri: Nekatere implementacije zahtevajo vezaje, druge jih zavračajo. Najboljša praksa: sprejmite obe obliki vnosa (z vezaji ali brez), pred validacijo odstranite vezaje, shranite različico brez vezajev v podatkovne baze in dodajte vezaje samo za prikaz.
Manjkajoča verifikacija: Algoritemska validacija zazna formatske napake, a ne potrdi, da je CUIT/CUIL registriran. V produkciji najprej preverite format (hitro), nato pa še pri AFIP-jevi podatkovni bazi (počasneje, a verodostojno). Ta dvostopenjski pristop takoj zazna tipkarske napake in hkrati zagotovi, da je številka resnična.
Testiranje robnih primerov: Vedno testirajte s preveritveno številko 0 in 9 - ti izhajata iz posebnih primerov v algoritmu. Prav tako testirajte DNI, ki se začnejo z ničlami, da zagotovite pravilno delovanje logike polnjenja.
Primeri uporabe in praktične aplikacije
Razvoj in testiranje
Razvoj programske opreme: Pri gradnji aplikacij za argentinski trg boste potrebovali testne podatke, ki prestanejo preverjanje brez uporabe resničnih uporabniških informacij. Tukaj postane to ključno:
- E-commerce platforme: Procesorji plačil in sistemi za izdajo računov zahtevajo veljavne CUIT/CUIL številke. Med obremenitvenim testiranjem boste morda potrebovali tisoče veljavnih številk za simulacijo realnih registracij uporabnikov.
- Računovodski programi: Moduli za poročanje davkov preverjajo format CUIT/CUIL pred oddajo na AFIP. Testiranje teh pravil preverjanja zahteva številke, ki prestanejo algoritem preverjalne številke.
- Sistemi za upravljanje s kadri: Obračun plač in prispevki za socialno varnost so odvisni od veljavnih CUIL številk. Pogost scenarij: testiranje tokov sprejemanja zaposlenih in preverjanje, ali neveljavne CUIL številke sprožijo ustrezna sporočila o napakah.
- Bančne aplikacije: Procesi KYC (Poznaj svojega stranko) preverjajo CUIT/CUIL kot del odpiranja računa. Iz mojih izkušenj se robni primeri, kot so neujemanja kod vrste, pogosto pojavijo med integracijskih testiranjem.
Polnjenje podatkovnih baz: Pri sejanju testnih podatkovnih baz zagotavlja uporaba algoritemsko veljavnih CUIT/CUIL številk, da omejitve in sprožilci podatkovne baze delujejo, kot je pričakovano. To je še posebej pomembno pri testiranju skript za migracijo podatkov ali procesov ETL, ki preverjajo identifikacijske številke.
Testiranje preverjanja obrazcev: Testirajte tako srečne scenarije kot pogoje napak. Ustvarite veljavne številke za potrditev uspešne oddaje, nato spremenite preverjalno številko, da zagotovite, da vaše frontend in backend preverjanje zazna napako, preden doseže podatkovno bazo.
Testiranje API: Integracijski testi naj uporabljajo veljavne CUIT/CUIL številke v koristnih obremenitvah zahtevkov. To preprečuje lažno negativne rezultate, kjer testi spodletijo zaradi neveljavnih testnih podatkov namesto dejanskih hroščev v logiki API.
Avtomatizacija QA: Parametrizirani testi imajo koristi od dinamičnega ustvarjanja CUIT/CUIL. Namesto trdega kodiranja testnih vrednosti, ki se lahko med testi konfliktirajo, ustvarite sveže veljavne številke za vsako izvedbo testa.
Izobraževalni nameni
Učenje validacijskih algoritmov: Algoritem preverjanja CUIT/CUIL prikazuje praktično uporabo modularnega aritmetičnega in ponderiranega preverjanja številk. Enak vzorec se pojavlja v drugih sistemih identifikacije po svetu — številke kreditnih kartic (Luhnov algoritem), ISBN kode in evropske DDV številke vse uporabljajo podobne ponderirana preverjanja. Razumevanje delovanja preverjanja CUIT/CUIL zagotavlja vpogled v razloge obstoja teh algoritmov: zaznavajo napake prepisovanja, kot so zamenjane številke ali napake posameznih številk.
Poučevanje preverjanja podatkov: Pri usposabljanju mladših razvijalcev o preverjanju vnosov sistem CUIT/CUIL ponuja resničen primer, ki je bolj zapleten od preverjanja e-pošte, a preprostejši od kriptografskega preverjanja. Prikazuje načelo globinske obrambe: preverjanje formata (11 številk), preverjanje poslovnih pravil (veljavne kode vrst) in algoritemsko preverjanje (preverjalna številka).
Mednarodni poslovni razvoj: Če gradite sisteme za latinskoameriške trge, razumevanje CUIT/CUIL pomaga razumeti podobne sisteme v sosednjih državah. Brazilija ima CPF/CNPJ, Čile ima RUT, Uruguay pa RUT — vse uporabljajo algoritme preverjanja številk. Vzorci, ki jih tukaj spoznate, se prenašajo na te sisteme.
Alternative in produktne premisleki
Medtem ko to orodje dobro deluje za razvoj in testiranje, imajo produktna okolja drugačne zahteve:
Uradno državno preverjanje: Za žive aplikacije algoritemsko preverjanje ni dovolj — potrebujete potrditev, da je CUIT/CUIL dejansko registriran pri AFIP (Administración Federal de Ingresos Públicos). AFIP zagotavlja spletne storitve za preverjanje v realnem času, čeprav boste morali registrirati in overiti dostop. Past: številka je lahko matematično veljavna, a uradno nedodeljena, zato vedno implementirajte obe ravni preverjanja v produkciji.
Knjižnice in paketi: Če integrirate preverjanje CUIT/CUIL v svojo kodno bazo, razmislite o teh uveljavljenih knjižnicah namesto lastne implementacije:
- JavaScript:
validar-cuitna npm-ju obvladuje preverjanje in formatiranje - PHP: Knjižnica
afip-phpzagotavlja preverjanje in integracijo spletnih storitev AFIP - Python:
py-cuitna PyPI implementira celoten algoritem
Uporaba vzdrževanih knjižnic zmanjšuje tveganje implementacijskih hroščev in pogosto vključuje robne primere, ki bi jih lahko spregledali v lastni kodi.
Ročni izračun: Za učne namene ali razhroščevanje pomaga ročno delo skozi algoritem, da utrdite razumevanje. Vzemite kalkulator in vzorčno CUIT/CUIL številko, nato sledite procesu ponderiranega množenja korak za korakom.
Podjetne storitve preverjanja: Aplikacije velikega obsega lahko koristijo API-je za preverjanje tretjih oseb, ki ne le preverjajo format, ampak tudi križno referenčirajo komercialne podatkovne baze. Te storitve lahko označijo neaktivna podjetja, identificirajo sankcionirane subjekte ali zagotovijo dodatne metapodatke o imetniku CUIT/CUIL.
Zgodovina sistema CUIT/CUIL
Sistem identifikacije CUIT/CUIL v Argentini se je od svoje uvedbe bistveno razvil:
Izvor in implementacija
CUIT (Clave Única de Identificación Tributaria) je bil v Argentini prvič uveden v 1970-ih kot del prizadevanj za modernizacijo sistema pobiranja davkov. Zvezna uprava javnih prihodkov (AFIP) je implementirala to edinstveno identifikacijsko številko za učinkovitejše sledenje davkoplačevalcem in zmanjšanje davčnih utaj.
CUIL (Clave Única de Identificación Laboral) je bil kasneje uveden za specifično identifikacijo delavcev v sistemu socialne varnosti, pri čemer je ustvaril razliko med davčno identifikacijo in delovno identifikacijo ob ohranjanju doslednega formata.
Razvoj in digitalizacija
V 1990-ih, ko je Argentina doživela pomembne ekonomske reforme, je postal sistem CUIT/CUIL vse pomembnejši za sledenje ekonomski aktivnosti. Sistem je bil dodatno digitaliziran in uvedeni so bili sistemi spletne verifikacije.
Zgodnja 2000-ta leta so prinesla integracijo sistema CUIT/CUIL z različnimi digitalnimi vladnimi storitvami, kar ga je naredilo bistveno komponento e-vladnih pobud Argentine. To obdobje je tudi standardiziralo algoritem in format preverjanja, ki se uporablja še danes.
Nedavni razvoji
V zadnjih letih je AFIP izboljšal varnostne in verificacijske postopke za številke CUIT/CUIL, implementiral bolj zapletene sisteme validacije in jih integriral z drugimi vladnimi bazami podatkov. Sistem sedaj igra ključno vlogo v argentinskih prizadevanjih za boj proti davčnim utajam in formalizaciji gospodarstva.
Danes se CUIT/CUIL uporablja ne le za davčne in zaposlitvene namene, temveč tudi za širok spekter aktivnosti, vključno z bančništvom, nepremičninskimi transakcijami, komunalnimi storitvami in spletnimi nakupi, kar ga dela bistveno identifikacijsko številko za posameznike in podjetja, ki delujejo v Argentini.
Vidiki implementacije
Pri implementaciji preverjanja CUIT/CUIL v lastnih sistemih upoštevajte naslednje tehnične vidike:
Stabilnost algoritma: Trenutni algoritem za preverjanje CUIT/CUIL je ostal nespremenjen od svoje standardizacije v 90. letih. Skladno z AFIP-jevo tehnično dokumentacijo, je pristop preverjanja kontrolne številke modulo-11 kodificiran v Resolución General 2854/2010 in naknadnih predpisih. Ta stabilnost pomeni, da implementacije redko potrebujejo posodobitve, vendar morate spremljati AFIP-jeva obvestila glede morebitnih regulatornih sprememb.
Optimizacija zmogljivosti: Algoritem preverjanja je računsko nezahteven - le 10 množenj, eno seštevanje in ena modulo operacija. Za sisteme z visoko prepustnostjo, ki obdelujejo tisoče preverjanj na sekundo, je ozko grlo običajno omrežna latenca pri preverjanju proti AFIP-jevi podatkovni bazi, ne sam algoritem. Razmislite o predpomnenju rezultatov preverjanja AFIP z ustreznimi TTL (običajno 24 ur), da uravnotežite svežino in zmogljivost.
Kodiranje znakov: Pri obdelavi CUIT/CUIL podatkov iz zunanjih virov (PDF-ji, skenirani dokumenti, spletno strganje) bodite pozorni na težave s kodiranjem znakov. Pomišljaj se lahko pojavi kot em dash (U+2014), en dash (U+2013) ali minus znak (U+2212) namesto standardnega pomišljaja-minus (U+002D). Pred preverjanjem jih normalizirajte, da preprečite lažne negativne rezultate.
Internacionalizacija: Če vaša aplikacija oskrbuje več latinsko-ameriških trgov, upoštevajte, da argentinski CUIT/CUIL uporablja modulo-11 s specifičnimi utežmi, medtem ko čilenski RUT uporablja modulo-11 z drugačnimi utežmi, brazilski CPF/CNPJ pa modulo-11 z drugačnim vzorcem. Ne predpostavljajte, da so algoritmi identični - vsak državni sistem ima svoje specifične pravila. Za širše razumevanje algoritmov kontrolnih številk glejte standard ISO/IEC 7064, ki formalizira različne modulo-based sheme preverjanja.
Shranjevanje v podatkovni bazi: Shranjujte CUIT/CUIL številke brez pomišljajev kot fiksno dolžino CHAR(11) ali kot BIGINT, če vaša podatkovna baza podpira 11-mestne celoštevilske vrednosti brez izgube natančnosti. Dodajte omejitev preverjanja, ki na ravni podatkovne baze validira kontrolno številko kot varnostno mrežo pred pokvarjenimi podatki. Ustvarite indekse na tem polju za učinkovito iskanje, ko uporabniki iščejo po CUIT/CUIL.
Primeri kode
Python
1def calculate_verification_digit(type_code, dni):
2 # Pretvori v niz in zagotovi, da je DNI 8 mest z vodilnimi ničlami
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Združi kodo tipa in DNI
7 digits = type_code_str + dni_str
8
9 # Uteži za vsako pozicijo
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Izračunaj vsoto produktov
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Izračunaj preveritveno številko
16 verification_digit = 11 - (sum_products % 11)
17
18 # Posebni primeri
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 # Veljavne kode tipa
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"Neveljavna koda tipa. Mora biti ena izmed: {valid_type_codes}")
34
35 # Generiraj naključni DNI, če ni podan
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Izračunaj preveritveno številko
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Oblikuj CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Odstrani vezaje, če so prisotni
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Preveri osnovno obliko
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Neveljavna oblika"
52
53 # Izvleci dele
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 # Preveri kodo tipa
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Neveljavna koda tipa"
62
63 # Izračunaj in primerjaj preveritveno številko
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Neveljavna preveritvena številka"
67
68 return True, "Veljaven CUIT/CUIL"
69
70# Primer uporabe
71print(generate_cuit_cuil(20, 12345678)) # Generiraj za specifični DNI
72print(generate_cuit_cuil(27)) # Generiraj z naključnim DNI
73print(validate_cuit_cuil("20-12345678-9")) # Preveri CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Pretvori v niz in zagotovi, da je DNI 8 mest z vodilnimi ničlami
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Združi kodo tipa in DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Uteži za vsako pozicijo
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Izračunaj vsoto produktov
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Izračunaj preveritveno številko
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Posebni primeri
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 // Veljavne kode tipa
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Neveljavna koda tipa. Mora biti ena izmed: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Generiraj naključni DNI, če ni podan
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Izračunaj preveritveno številko
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Oblikuj CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Odstrani vezaje, če so prisotni
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Preveri osnovno obliko
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Neveljavna oblika' };
58 }
59
60 // Izvleci dele
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 // Preveri kodo tipa
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Neveljavna koda tipa' };
69 }
70
71 // Izračunaj in primerjaj preveritveno številko
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Neveljavna preveritvena številka' };
75 }
76
77 return { isValid: true };
78}
79
80// Primer uporabe
81console.log(generateCuitCuil(20, 12345678)); // Generiraj za specifični DNI
82console.log(generateCuitCuil(27)); // Generiraj z naključnim DNI
83console.log(validateCuitCuil("20-12345678-9")); // Preveri 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 // Pretvori v niz in zagotovi, da je DNI 8 mest z vodilnimi ničlami
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Združi kodo tipa in DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Izračunaj vsoto produktov
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Izračunaj preveritveno številko
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Posebni primeri
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("Neveljavna koda tipa. Mora biti ena izmed: " + VALID_TYPE_CODES);
39 }
40
41 // Generiraj naključni DNI, če ni podan
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Izračunaj preveritveno številko
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Oblikuj CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Odstrani vezaje, če so prisotni
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Preveri osnovno obliko
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Neveljavna oblika");
61 }
62
63 // Izvleci dele
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 // Preveri kodo tipa
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Neveljavna koda tipa");
71 }
72
73 // Izračunaj in primerjaj preveritveno številko
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Neveljavna preveritvena številka");
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 // Primer uporabe
102 System.out.println(generateCuitCuil(20, 12345678)); // Generiraj za specifični DNI
103 System.out.println(generateCuitCuil(27, null)); // Generiraj z naključnim DNI
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Preveri CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Pretvori v niz in zagotovi, da je DNI 8 mest z vodilnimi ničlami $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Združi kodo tipa in DNI $digits = $typeCodeStr . $dniStr; // Uteži za vsako pozicijo $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Izračunaj vsoto produktov $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Izračunaj preveritveno številko $verificationDigit = 11 - ($sumProducts % 11); // Posebni primeri if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Veljavne kode tipa $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Neveljavna koda tipa. Mora biti ena izmed: " . implode(', ', $validTypeCodes)); } // Generiraj naključni DNI, če ni podan if ($dni === null) { $dni = rand(10000000, 99999999); } // Izračunaj preveritveno številko $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Oblikuj CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Odstrani vezaje, če so prisotni $cuitCuilClean = str_replace('-', '', $cuitCuil); // Preveri osnovno obliko if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Neveljavna oblika']; } // Izvleci dele $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Preveri kodo tipa $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Neveljavna koda tipa']; } // Izračunaj in primerjaj preveritveno ## Pogosto zastavljena vprašanja ### Kakšna je razlika med CUIT in CUIL? Praktična razlika je naslednja: **CUIT** (Clave Única de Identificación Tributaria) identificira davkoplačevalce - tako posameznike kot podjetja, ki oddajajo davke pri AFIP. **CUIL** (Clave Única de Identificación Laboral) identificira delavce v sistemu socialne varnosti za namene zaposlitve in upokojitve. V praksi imajo številni posamezniki tako CUIL (od svoje prve službe) in kasneje morda tudi CUIT (če postanejo samostojni podjetniki ali začnejo podjetje). Številke uporabljajo identično oblikovanje in pravila izračuna, zato jih z vidika validacije obravnavate enako. Razlika je pomembna za administrativne namene: plačni sistemi običajno delujejo s CUIL, medtem ko sistemi za izdajanje računov in davke uporabljajo CUIT. ### Katere vrste kod se uporabljajo za posameznike in katere za podjetja? Za posameznike: - 20, 23, 24: Moški posamezniki (CUIL) - 27: Ženske posameznice (CUIL) Za podjetja in organizacije: - 30: Korporacije (CUIT) - 33: Civilna združenja (CUIT) - 34: Fundacije (CUIT) ### Kako se izračuna preveritvena številka? Algoritem uporablja ponderirano množenje: vzemite prvih 10 številk, pomnožite z utežmi **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, seštejte produkte, nato izračunajte 11 minus (vsota modulo 11). Dva robna primera zmedeta ljudi: ko izračun da 11, uporabite 0 kot preveritveno številko; ko da 10, uporabite 9. Ti posebni primeri obstajajo, ker mora biti preveritvena številka enomestna (0-9). To je preveritveni algoritem modulo-11, podoben tistemu, ki se uporablja v kodah ISBN-10 in drugih identifikacijskih sistemih po svetu. ### Ali lahko s tem orodjem generiram prave, uradno registrirane CUIT/CUIL številke? Ne - to orodje generira matematično veljavne testne podatke, vendar številke niso uradno registrirane pri AFIP. Razmislite o tem kot generiranju veljavne številke kreditne kartice z Luhnovo algoritmom: prestane preverjanje formata, vendar ni povezana z resničnim računom. Za uradno registracijo CUIT/CUIL morajo posamezniki obiskati AFIP z DNI, podjetja pa morajo opraviti postopke registracije podjetja. Orodje je strogo namenjeno razvoju, testiranju in izobraževalni uporabi, kjer potrebujete veljavno videti podatke, ki ne bodo konfliktirali z resničnimi identifikacijskimi številkami. ### Zakaj moja CUIT/CUIL validacija ne uspe, čeprav format izgleda pravilno? Ko validacija ne uspe kljub pravilno izgledajočemu formatu, preverite te pogoste krivce: 1. **Neveljaven tip kode**: Samo 20, 23, 24, 27, 30, 33, 34 so veljavni. Uporaba 21, 25 ali drugih številk bo povzročila napako. 2. **Napačna preveritvena številka**: Zadnja številka se mora ujemati z algoritmovim izračunom. Že sprememba ene številke v delu DNI zahteva ponovni izračun preveritvene številke. 3. **Težave s formatom**: Mora biti natančno 11 številk (XX-XXXXXXXX-X). Pazite na dodatne presledke ali manjkajoče vodilne ničle. 4. **Skrite znake**: Kopiranje in lepljenje iz PDF-jev ali spletnih strani včasih uvede nevidne Unicode znake, ki pokvarijo validacijo. Namig za razhroščevanje: odstranite zadnjo številko in jo ročno ponovno izračunajte. Če se ne ujema, je to vaš krivec. ### Ali so vezaji zahtevani v CUIT/CUIL številkah? Vezaji so samo za formatiranje prikaza - niso del same številke za namene izračuna. Ko vidite **20-12345678-9**, algoritem skrbi samo za 11 številk: **20123456789**. Večina implementacij validacije pred obdelavo odstrani vezaje, zato naše orodje sprejema tako **20-12345678-9** kot **20123456789**. V API-jih in podatkovnih bazah boste običajno shranjevali različico brez vezajev in dodali vezaje samo pri prikazovanju uporabnikom. Ta pristop preprečuje, da bi neskladnosti formatiranja povzročile napake pri validaciji. ### Ali lahko CUIT/CUIL številka ima manj kot 8 številk v delu DNI? Del DNI mora biti vedno natančno 8 številk - brez izjem. Če ima nekdo dejansko DNI z manj številkami (kar se zgodi pri starejših, nižje številčnih DNI), jih dopolnite z vodilnimi ničlami. Na primer, DNI **1234567** postane **01234567** v strukturi CUIT/CUIL. To je pogost vir napak pri pretvarjanju med DNI in CUIT/CUIL formati. Videl sem sisteme, ki ne opravijo validacije, ker so pozabili dopolniti, tako da obravnavajo **1234567** kot 7-mestno številko namesto **01234567**. Vedno uporabljajte funkcije za dopolnjevanje z ničlami namesto preprostega concateniranja nizov. ### Kako lahko preverim, ali je CUIT/CUIL uradno registriran v Argentini? Naše orodje validira matematično pravilnost - format, tip kode in preveritveno številko. Vendar ne more povedati, ali je številka dejansko registrirana pri AFIP ali pripada resnični osebi ali podjetju. Za uradno preverjanje uporabite [spletne storitve AFIP](https://www.afip.gob.ar/) ali njihovo orodje za iskanje "Constancia de Inscripción". AFIP ponuja API-je za avtomatizirano preverjanje, čeprav boste morali registrirati kot razvijalec in se avtenticirati. V produkcijskih okoljih implementirajte obe plasti: najprej izvedite algoritemsko validacijo (hitro, ujame tipkarske napake in napake formata), nato preverite proti podatkovni bazi AFIP (počasneje, vendar potrdi, da je številka resnična in aktivna). ### Ali lahko to orodje uporabim v svoji komercialni aplikaciji? Da - algoritem validacije CUIT/CUIL je javni standard, ki ga je določil AFIP, zato ga lahko prosto implementirate v komercialno programsko opremo. Prikazani primeri kode so namenjeni kot referenčne implementacije. Za produkcijsko uporabo upoštevajte te dobre prakse: implementirajte ustrezno obravnavo napak za robne primere, dodajte beleženje za razhroščevanje napak validacije, preverjajte proti uradni podatkovni bazi AFIP (ne samo algoritemska validacija) in ohranite svojo implementacijo posodobljeno, če AFIP spremeni pravila (čeprav je trenutni algoritem stabilen že desetletja). ### Ali orodje shranjuje katerekoli generirane ali validirane CUIT/CUIL številke? Ne - vsa obdelava poteka v vašem brskalniku (na strani odjemalca). Ko generirate ali validirate CUIT/CUIL, izračun teče lokalno z uporabo JavaScripta. Nič se ne pošlje na naše strežnike in ne beležimo, shranjujemo ali sledimo nobenim številkam, ki jih vnesete ali generirate. Ta pristop na strani odjemalca zagotavlja zasebnost in pomeni tudi, da orodje deluje tudi brez povezave, ko se stran naloži. To lahko preverite z odprtjem razvijalskih orodij v vašem brskalniku in opazovanjem omrežne kartice - videli boste, da ni zahtev, ko generirate ali validirate številke. ## Reference 1. AFIP (Uprava zveznih javnih prihodkov). "CUIT/CUIL/CDI." Uradno spletno mesto. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministrstvo za delo, zaposlovanje in socialno varnost. "CUIL - Enotna identifikacijska delavska koda." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Nacionalna uprava socialne varnosti). "Pridobi mojo CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Uradni list Argentine republike. "Splošna resolucija AFIP 2854/2010: Postopek. Enotna davčna identifikacijska koda (C.U.I.T.)." 5. Davčni zakonik Argentine republike. "Identifikacija in registracija zavezancev." --- Ne glede na to, ali gradite sistem za izdajanje računov, testirate postopke sprejema zaposlenih ali se učite o algoritmih validacije, to orodje zagotavlja generiranje in preverjanje CUIT/CUIL, ki ga potrebujete. Ustvarjajte testne podatke, ki prestanejo algoritemsko validacijo, preverite številke pred vnosom v bazo podatkov ali raziščite delovanje algoritma za preverjanje številk v praksi.