Generátor a validátor CUIT/CUIL | Nástroj pro argentinské daňové ID
Generujte platné testovací čísla argentinského CUIT/CUIL nebo ověřte existující. Bezplatný online nástroj pro vývojáře testující daňová ID a mzdové systémy s validací kompatibilní s AFIP.
Generátor CUIT/CUIL
Zadejte 8-místné číslo DNI nebo použijte náhodný generátor
Použití náhodně vygenerovaného DNI
Dokumentace
Generátor a validátor argentinského CUIT/CUIL
Úvod
V argentinských daňových a pracovních systémech se neustále setkáváte se dvěma kritickými identifikátory: CUIT (Clave Única de Identificación Tributaria) a CUIL (Clave Única de Identificación Laboral). Můžete si představit CUIT jako daňové ID pro podniky a jednotlivce, kteří platí daně, zatímco CUIL identifikuje pracovníky v systému sociálního zabezpečení. Oba používají stejný 11-místný formát a ověřovací algoritmus, což činí testování aplikací, které s těmito čísly pracují, obzvláště důležitým.
Při vývoji softwaru pro argentinský trh potřebujete platná testovací data. Přesně k tomu slouží tento nástroj. Můžete generovat matematicky správná čísla CUIT/CUIL pro testování bez použití skutečných osobních údajů nebo ověřovat existující čísla, abyste zajistili, že odpovídají oficiálnímu algoritmu AFIP. Obzvláště užitečné je, že nástroj pokrývá jak generační stránku (vytváření platných čísel na vyžádání), tak i validační stránku (zachycení chyb formátu, neplatných typových kódů a nesprávných ověřovacích číslic ještě před tím, než způsobí problémy v produkčním prostředí).
Struktura a výpočet CUIT/CUIL
Pochopení formátu
Platné číslo CUIT/CUIL sestává z 11 číslic, které jsou typicky zobrazeny ve formátu XX-XXXXXXXX-X. Zde je jeho rozklad:
-
Kód typu (první 2 číslice): Identifikuje typ entity
- 20, 23, 24: Muži (CUIL)
- 27: Ženy (CUIL)
- 30, 33, 34: Společnosti a organizace (CUIT)
-
Číslo DNI (prostřední 8 číslic): Pro fyzické osoby je to jejich číslo národního identifikačního dokladu (DNI). Běžná past: pokud má skutečné DNI méně než 8 číslic, musíte jej doplnit úvodními nulami. Například DNI 1234567 se stane 01234567 v CUIT/CUIL. Společnosti obdrží místo toho jedinečné přidělené číslo.
-
Ověřovací číslice (poslední číslice): Tato kontrolní číslice ověřuje celé číslo pomocí váhového algoritmu. Pokud tato číslice neodpovídá výpočtu, celý CUIT/CUIL je neplatný - něco, co často zaskočí vývojáře při ručním vytváření testovacích dat.
Výpočet ověřovací číslice
Ověřovací číslice používá modulo-11 váhový algoritmus. Zde je postup:
- Vezměte prvních 10 číslic CUIT/CUIL (kód typu + DNI)
- Vynásobte každou číslici její odpovídající váhou: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Sečtěte všechny součiny
- Vypočítejte: 11 minus (součet modulo 11)
- Řešte hraniční případy: pokud je výsledek 11, použijte 0; pokud je 10, použijte 9
Nejčastěji lidi mate právě tyto hraniční případy v kroku 5. Při testování občas dostanete výsledek 10 nebo 11, a zapomenutí mapování těchto hodnot na 9 a 0 způsobuje chyby ověřování, které mohou být obtížně laditelné, pokud si nejste tohoto pravidla vědomi.
Matematicky lze toto vyjádřit jako:
Kde:
- je ověřovací číslice
- je -tá číslice prvních 10 číslic
- je odpovídající váha z posloupnosti [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Speciální případy: pokud pak , pokud pak
Průvodce krok za krokem
Použití Generátoru
-
Vyberte kartu "Generátor" v horní části rozhraní nástroje.
-
Zvolte Kód Typu z rozbalovací nabídky:
- 20: Muž (CUIL)
- 23: Podnikání (CUIT)
- 24: Dočasné Podnikání (CUIT)
- 27: Žena (CUIL)
- 30: Korporace (CUIT)
- 33: Občanské Sdružení (CUIT)
- 34: Nadace (CUIT)
-
Zadejte DNI Číslo (volitelné):
- Zadejte 8-místné DNI číslo do poskytnutého pole
- Pokud zůstane prázdné, nástroj použije náhodně generované DNI
- Pokud zadáte méně než 8 číslic, systém doplní úvodními nulami
-
Generování Náhodného DNI (volitelné):
- Klikněte na tlačítko "Náhodné" pro vygenerování náhodného 8-místného DNI čísla
-
Zobrazení Generovaného CUIT/CUIL:
- Nástroj automaticky zobrazí platný CUIT/CUIL na základě vašich vstupů
- Formát bude XX-XXXXXXXX-X se správným ověřovacím číslem
-
Kopírování Výsledku:
- Klikněte na ikonu kopírování pro zkopírování generovaného CUIT/CUIL do schránky
- Při úspěšném kopírování se zobrazí potvrzující zpráva
Použití Validátoru
-
Vyberte kartu "Validátor" v horní části rozhraní nástroje.
-
Zadejte CUIT/CUIL k Ověření:
- Zadejte CUIT/CUIL ve formátu XX-XXXXXXXX-X
- Nástroj automaticky naformátuje váš vstup pomlčkami při psaní
- Můžete také zadat číslo bez pomlček (XXXXXXXXXXX)
-
Klikněte na tlačítko "Ověřit":
- Nástroj zkontroluje formát, kód typu a ověřovací číslo
-
Zobrazení Výsledku Ověření:
- Pro platná CUIT/CUIL čísla se zobrazí zelená zpráva o úspěchu
- Pro neplatná čísla se zobrazí červená chybová zpráva s vysvětlením:
- Neplatný formát (musí být XX-XXXXXXXX-X)
- Neplatný kód typu (musí být jeden z: 20, 23, 24, 27, 30, 33, 34)
- Neplatné ověřovací číslo
-
Další Informace:
- Pro platná čísla nástroj zobrazí rozklad komponent:
- Kód typu a jeho význam
- DNI číslo
- Ověřovací číslo
- Pro platná čísla nástroj zobrazí rozklad komponent:
Běžné chyby a osvědčené postupy
Při práci s validací CUIT/CUIL ve vašich aplikacích si dejte pozor na tyto časté úskalí:
Problémy s nulovým doplňováním: Nejčastější chyba, kterou jsem zaznamenal, se týká čísel DNI s úvodními nulami. Když někdo zadá DNI "1234567", váš kód potřebuje jej zpracovat jako "01234567" pro konstrukci CUIT/CUIL. Mnoho implementací jej převede na celé číslo, čímž odstraní úvodní nuly. Místo toho používejte řetězcové operace se správným doplňováním.
Záměna kódů typů: Ne všechna dvojmístná čísla jsou platné kódy typů. Fungují pouze 20, 23, 24, 27, 30, 33, 34. Viděl jsem systémy, které přijímají jakoukoliv dvojmístnou předponu, což vede k "validně vypadajícím" číslům jako 21-12345678-X, která selžou při validaci AFIP. Vždy ověřte kód typu před výpočtem ověřovací číslice.
Předpoklady pohlaví: Kódy typů 20 (muž) a 27 (žena) nejsou zaměnitelné. Pokud automaticky generujete CUIL na základě demografických údajů, ujistěte se, že váš kód typu odpovídá pohlaví registrovanému v RENAPER (argentinský národní registr). Neshody způsobují zamítnutí při pokusu jednotlivců použít tato čísla ve vládních službách.
Zacházení s pomlčkami: Některé implementace vyžadují pomlčky, jiné je odmítají. Osvědčený postup: přijímejte oba formáty ve vstupních polích (s pomlčkami i bez nich), před validací pomlčky odstraňte, ukládejte verzi bez pomlček do databází a přidávejte pomlčky pouze pro zobrazení.
Chybějící ověření: Algoritmická validace zachytí chyby formátu, ale nepotvrdí, zda je CUIT/CUIL registrován. V produkčním prostředí nejprve ověřte formát (rychle), poté ověřte proti databázi AFIP (pomaleji, ale autoritativně). Tento dvoustupňový přístup okamžitě zachytí překlepy a zároveň zajistí, že číslo je skutečné.
Testování hraničních případů: Vždy testujte s ověřovacími číslicemi 0 a 9 - ty vyplývají ze speciálních případů v algoritmu. Také testujte DNI začínající nulami, abyste zajistili správnou funkci logiky doplňování.
Případy použití a praktické aplikace
Vývoj a testování
Vývoj softwaru: Při budování aplikací pro argentinský trh budete potřebovat testovací data, která projdou validací bez použití skutečných uživatelských informací. Zde je to kritické:
- E-commerce platformy: Platební procesory a fakturační systémy vyžadují platné CUIT/CUIL čísla. Během zátěžového testování můžete potřebovat tisíce platných čísel pro simulaci realistických uživatelských registrací.
- Účetní software: Moduly daňového výkaznictví ověřují formát CUIT/CUIL před odesláním na AFIP. Testování těchto validačních pravidel vyžaduje čísla, která projdou kontrolním algoritmem.
- Systémy řízení lidských zdrojů: Zpracování mezd a sociálního zabezpečení závisí na platných CUIL číslech. Běžný scénář: testujete průběh přijímání zaměstnanců a potřebujete ověřit, že neplatné CUIL čísla spouštějí příslušné chybové zprávy.
- Bankovní aplikace: Procesy KYC (Know Your Customer) validují CUIT/CUIL jako součást otevírání účtu. Podle mých zkušeností často vycházejí najevo hraniční případy, jako jsou neshody typových kódů, během integračního testování.
Naplnění databáze: Při osazování testovacích databází zajišťuje použití algoritmicky platných CUIT/CUIL čísel, že vaše databázové omezení a triggery fungují podle očekávání. To je obzvláště důležité při testování skriptů migrace dat nebo ETL procesů, které ověřují identifikační čísla.
Testování validace formulářů: Otestujte jak šťastnou cestu, tak chybové stavy. Generujte platná čísla pro potvrzení úspěšného odeslání, poté upravte ověřovací číslici, abyste zajistili, že vaše frontend a backend validace zachytí chybu ještě před tím, než se dostane do databáze.
Testování API: Integrační testy by měly používat platná CUIT/CUIL čísla v datových nákladech požadavku. Tím zabráníte falešně negativním výsledkům, kde testy selhávají kvůli neplatným testovacím datům namísto skutečných chyb v logice API.
QA Automatizace: Parametrizované testy těží z dynamické generace CUIT/CUIL. Místo hardkódování testovacích hodnot, které by mohly konfliktovat mezi testovacími běhy, generujte pro každé spuštění testu čerstvá platná čísla.
Vzdělávací účely
Učení validačních algoritmů: Ověřovací algoritmus CUIT/CUIL ukazuje praktickou aplikaci modulární aritmetiky a vážených kontrolních číslic. Stejný vzor se vyskytuje i v jiných identifikačních systémech po celém světě — čísla kreditních karet (Luhnův algoritmus), ISBN kódy a evropská DIČ všechny používají podobné vážené kontrolní součty. Pochopení toho, jak funguje validace CUIT/CUIL, poskytuje náhled do toho, proč tyto algoritmy existují: zachycují chyby při přepisu, jako jsou prohozené číslice nebo chyby v jednotlivých číslicích.
Výuka validace dat: Při školení juniorních vývojářů v ověřování vstupu nabízí systém CUIT/CUIL reálný příklad, který je složitější než validace emailu, ale jednodušší než kryptografické ověřování. Demonstruje princip hloubkové obrany: validace formátu (11 číslic), validace obchodních pravidel (platné typové kódy) a algoritmická validace (kontrolní číslice).
Mezinárodní obchodní rozvoj: Pokud budujete systémy pro latinskoamerické trhy, pochopení CUIT/CUIL vám pomůže pochopit podobné systémy v sousedních zemích. Brazílie má CPF/CNPJ, Chile RUT a Uruguay RUT — všechny používají algoritmy kontrolních číslic. Vzory, které se zde naučíte, se přenáší do těchto systémů.
Alternativy a provozní úvahy
Zatímco tento nástroj funguje dobře pro vývoj a testování, produkční prostředí má odlišné požadavky:
Oficiální vládní validace: Pro živé aplikace nestačí samotná algoritmická validace — musíte ověřit, zda je CUIT/CUIL skutečně registrován u AFIP (Administración Federal de Ingresos Públicos). AFIP poskytuje webové služby pro validaci v reálném čase, i když budete muset zaregistrovat a autentizovat přístup. Háček je v tom, že číslo může být matematicky platné, ale není oficálně přiřazeno, takže vždy implementujte obě vrstvy validace v produkci.
Knihovny a balíčky: Pokud integrujete validaci CUIT/CUIL do své základny kódu, zvažte tyto zavedené knihovny místo vlastní implementace:
- JavaScript:
validar-cuitna npm zpracovává validaci a formátování - PHP: knihovna
afip-phpposkytuje validaci i integraci webových služeb AFIP - Python:
py-cuitna PyPI implementuje kompletní algoritmus
Použití udržovaných knihoven snižuje riziko implementačních chyb a často zahrnuje hraniční případy, které byste mohli v custom kódu přehlédnout.
Ruční výpočet: Pro účely učení nebo ladění pomáhá ruční procházení algoritmu upevnit pochopení. Chyťte kalkulačku a vzorový CUIT/CUIL a poté krok za krokem sledujte proces vážené multiplikace.
Podnikové validační služby: Rozsáhlé aplikace mohou těžit z validačních API třetích stran, které nejen kontrolují formát, ale také křížově odkazují na komerční databáze. Tyto služby mohou označit neaktivní podniky, identifikovat sankcionované subjekty nebo poskytnout další metadata o držiteli CUIT/CUIL.
Historie systému CUIT/CUIL
Systém identifikace CUIT/CUIL v Argentině se od svého vzniku významně vyvinul:
Počátky a implementace
CUIT (Clave Única de Identificación Tributaria) byl poprvé zaveden v Argentině v 70. letech jako součást snah o modernizaci systému výběru daní. Federální správa veřejných příjmů (AFIP) zavedla tento jedinečný identifikátor, aby efektivněji sledovala daňové poplatníky a snížila daňové úniky.
CUIL (Clave Única de Identificación Laboral) byl později zaveden specificky k identifikaci pracovníků v systému sociálního zabezpečení, čímž vytvořil rozdíl mezi daňovou a pracovní identifikací při zachování konzistentního formátu.
Vývoj a digitalizace
V 90. letech, kdy Argentina procházela významnými ekonomickými reformami, se systém CUIT/CUIL stal stále důležitějším pro sledování ekonomické aktivity. Systém byl dále digitalizován a byly implementovány online ověřovací systémy.
Na počátku 2000. let došlo k integraci systému CUIT/CUIL s různými digitálními vládními službami, čímž se stal podstatnou součástí argentinských iniciativ elektronické veřejné správy. V tomto období také došlo ke standardizaci ověřovacího algoritmu a formátu, který je používán dodnes.
Nedávné události
V posledních letech AFIP vylepšila bezpečnostní a ověřovací procesy pro čísla CUIT/CUIL, zavedla sofistikovanější ověřovací systémy a integrovala je s dalšími vládními databázemi. Systém nyní hraje klíčovou roli v argentinských snahách bojovat proti daňovým únikům a formalizovat ekonomiku.
V současnosti je CUIT/CUIL používán nejen pro daňové a zaměstnanecké účely, ale také pro širokou škálu aktivit včetně bankovnictví, majetkových transakcí, utility služeb a online nákupů, což z něj činí nezbytný identifikátor pro fyzické i právnické osoby působící v Argentině.
Aspekty implementace
Při implementaci validace CUIT/CUIL ve vlastních systémech zvažte tyto technické aspekty:
Stabilita algoritmu: Stávající ověřovací algoritmus CUIT/CUIL zůstal nezměněn od své standardizace v 90. letech. Podle technické dokumentace AFIP je algoritmus váženého kontrolního čísla modulo-11 kodifikován v Resolución General 2854/2010 a následných předpisech. Tato stabilita znamená, že implementace zřídka vyžadují aktualizace, ale měli byste sledovat oznámení AFIP ohledně případných regulatorních změn.
Optimalizace výkonu: Ověřovací algoritmus je výpočetně nenáročný - pouhých 10 násobení, jedna suma a jedna modulová operace. Pro systémy s vysokou propustností zpracovávající tisíce ověření za sekundu je kritickým bodem typicky síťová latence při ověřování v databázi AFIP, nikoli samotný algoritmus. Zvažte ukládání výsledků ověření AFIP do mezipaměti s příslušnými TTL (obvykle 24 hodin) pro vyvážení aktuálnosti a výkonu.
Kódování znaků: Při zpracování dat CUIT/CUIL z externích zdrojů (PDF, skenované dokumenty, webový scraping) dávejte pozor na problémy s kódováním znaků. Pomlčka se může zobrazovat jako dlouhá pomlčka (U+2014), krátká pomlčka (U+2013) nebo znaménko mínus (U+2212) místo standardní pomlčky (U+002D). Před validací je normalizujte, abyste předešli falešným negativům.
Internacionalizace: Pokud vaše aplikace obsluhuje více latinskoamerických trhů, všimněte si, že argentinský CUIT/CUIL používá modulo-11 se specifickými váhami, chilský RUT používá modulo-11 s jinými váhami a brazilský CPF/CNPJ používá modulo-11 s dalším odlišným vzorem. Nepředpokládejte, že algoritmy jsou identické - každý systém má odlišná pravidla. Pro širší pochopení algoritmů kontrolních číslic viz standard ISO/IEC 7064, který formalizuje různé modulo-based ověřovací schémata.
Ukládání databáze: Ukládejte čísla CUIT/CUIL bez pomlček jako fixed-length CHAR(11) nebo jako BIGINT, pokud vaše databáze podporuje 11-místné celé číslo bez ztráty přesnosti. Přidejte omezení kontroly, které ověří kontrolní číslici na úrovni databáze jako bezpečnostní síť proti poškozeným datům. Vytvořte indexy na tomto poli pro efektivní vyhledávání, když uživatelé vyhledávají podle CUIT/CUIL.
Příklady kódu
Python
1def calculate_verification_digit(type_code, dni):
2 # Převedení na řetězec a zajištění, že DNI má 8 číslic s úvodními nulami
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Kombinace kódu typu a DNI
7 digits = type_code_str + dni_str
8
9 # Váhy pro každou pozici
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Výpočet součtu součinů
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Výpočet ověřovací číslice
16 verification_digit = 11 - (sum_products % 11)
17
18 # Speciální případy
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 # Platné kódy typů
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"Neplatný kód typu. Musí být jeden z: {valid_type_codes}")
34
35 # Generování náhodného DNI, pokud není poskytnut
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Výpočet ověřovací číslice
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Formátování CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Odstranění pomlček, pokud jsou přítomny
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Kontrola základního formátu
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Neplatný formát"
52
53 # Extrakce částí
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 # Ověření kódu typu
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Neplatný kód typu"
62
63 # Výpočet a porovnání ověřovací číslice
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Neplatná ověřovací číslice"
67
68 return True, "Platný CUIT/CUIL"
69
70# Příklad použití
71print(generate_cuit_cuil(20, 12345678)) # Generování pro specifické DNI
72print(generate_cuit_cuil(27)) # Generování s náhodným DNI
73print(validate_cuit_cuil("20-12345678-9")) # Ověření CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Převedení na řetězec a zajištění, že DNI má 8 číslic s úvodními nulami
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Kombinace kódu typu a DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Váhy pro každou pozici
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Výpočet součtu součinů
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Výpočet ověřovací číslice
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Speciální případy
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 // Platné kódy typů
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Neplatný kód typu. Musí být jeden z: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Generování náhodného DNI, pokud není poskytnut
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Výpočet ověřovací číslice
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Formátování CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Odstranění pomlček, pokud jsou přítomny
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Kontrola základního formátu
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Neplatný formát' };
58 }
59
60 // Extrakce částí
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 // Ověření kódu typu
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Neplatný kód typu' };
69 }
70
71 // Výpočet a porovnání ověřovací číslice
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Neplatná ověřovací číslice' };
75 }
76
77 return { isValid: true };
78}
79
80// Příklad použití
81console.log(generateCuitCuil(20, 12345678)); // Generování pro specifické DNI
82console.log(generateCuitCuil(27)); // Generování s náhodným DNI
83console.log(validateCuitCuil("20-12345678-9")); // Ověření 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 // Převedení na řetězec a zajištění, že DNI má 8 číslic s úvodními nulami
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Kombinace kódu typu a DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Výpočet součtu součinů
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Výpočet ověřovací číslice
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Speciální případy
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("Neplatný kód typu. Musí být jeden z: " + VALID_TYPE_CODES);
39 }
40
41 // Generování náhodného DNI, pokud není poskytnut
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Výpočet ověřovací číslice
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Formátování CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Odstranění pomlček, pokud jsou přítomny
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Kontrola základního formátu
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Neplatný formát");
61 }
62
63 // Extrakce částí
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 // Ověření kódu typu
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Neplatný kód typu");
71 }
72
73 // Výpočet a porovnání ověřovací číslice
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Neplatná ověřovací číslice");
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 // Příklad použití
102 System.out.println(generateCuitCuil(20, 12345678)); // Generování pro specifické DNI
103 System.out.println(generateCuitCuil(27, null)); // Generování s náhodným DNI
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Ověření CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Převedení na řetězec a zajištění, že DNI má 8 číslic s úvodními nulami $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Kombinace kódu typu a DNI $digits = $typeCodeStr . $dniStr; // Váhy pro každou pozici $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Výpočet součtu součinů $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Výpočet ověřovací číslice $verificationDigit = 11 - ($sumProducts % 11); // Speciální případy if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Platné kódy typů $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Neplatný kód typu. Musí být jeden z: " . implode(', ', $validTypeCodes)); } // Generování náhodného DNI, pokud není poskytnut if ($dni === null) { $dni = rand(10000000, 99999999); } // Výpočet ověřovací číslice $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formátování CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Odstranění pomlček, pokud jsou přítomny $cuitCuilClean = str_replace('-', '', $cuitCuil); // Kontrola základního formátu if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Neplatný formát']; } // Extrakce částí $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Ověření kódu typu $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($type ## Často kladené dotazy ### Jaký je rozdíl mezi CUIT a CUIL? Zde je praktický rozdíl: **CUIT** (Clave Única de Identificación Tributaria) identifikuje poplatníky - fyzické osoby i podniky, které podávají daně na AFIP. **CUIL** (Clave Única de Identificación Laboral) identifikuje pracovníky v systému sociálního zabezpečení pro zaměstnání a důchodové účely. V praxi má mnoho jednotlivců jak CUIL (z jejich první práce), tak případně později CUIT (pokud se stanou osobami samostatně výdělečně činnými nebo založí podnik). Čísla používají identické formátování a pravidla výpočtu, takže z hlediska validace je zpracováváte stejně. Rozdíl je důležitý pro administrativní účely: mzdové systémy typicky pracují s CUIL, zatímco fakturační a daňové systémy používají CUIT. ### Které typové kódy se používají pro fyzické osoby a které pro společnosti? Pro fyzické osoby: - 20, 23, 24: Muži (CUIL) - 27: Ženy (CUIL) Pro společnosti a organizace: - 30: Korporace (CUIT) - 33: Občanská sdružení (CUIT) - 34: Nadace (CUIT) ### Jak se počítá ověřovací číslice? Algoritmus používá vážené násobení: vezměte prvních 10 číslic, vynásobte váhami **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, sečtěte součiny, poté vypočítejte 11 minus (součet modulo 11). Dva hraniční případy lidi mate: když výpočet vrátí 11, použijte 0 jako ověřovací číslici; když vrátí 10, použijte 9. Tyto speciální případy existují, protože ověřovací číslice musí být jednociferná (0-9). Jedná se o algoritmus kontrolního součtu modulo-11, podobný tomu, který se používá v kódech ISBN-10 a dalších identifikačních systémech po celém světě. ### Mohu použít tento nástroj ke generování skutečných, oficálních čísel CUIT/CUIL? Ne - tento nástroj generuje matematicky platná testovací data, ale čísla nejsou oficálně registrována u AFIP. Představte si to jako generování platného čísla kreditní karty pomocí Luhnova algoritmu: projde formátovou validací, ale není připojeno k reálnému účtu. Pro oficální registraci CUIT/CUIL musí fyzické osoby navštívit AFIP se svým DNI, zatímco podniky musí dokončit postupy registrace společnosti. Nástroj je určen výhradně pro vývoj, testování a vzdělávací použití, kde potřebujete validně vypadající data, která nebudou konfliktovat se skutečnými identifikačními čísly. ### Proč moje ověření CUIT/CUIL selže, i když formát vypadá správně? Když ověření selže navzdory správně vypadajícímu formátování, zkontrolujte tyto běžné viníky: 1. **Neplatný typový kód**: Platné jsou pouze 20, 23, 24, 27, 30, 33, 34. Použití 21, 25 nebo jiných čísel selže. 2. **Špatná ověřovací číslice**: Poslední číslice musí odpovídat výpočtu algoritmu. I změna jedné číslice v části DNI vyžaduje přepočítání kontrolní číslice. 3. **Problémy s formátem**: Musí být přesně 11 číslic (XX-XXXXXXXX-X). Dávejte pozor na nadbytečné mezery nebo chybějící úvodní nuly. 4. **Skryté znaky**: Kopírování z PDF nebo webových stránek někdy zavádí neviditelné znaky Unicode, které ruší validaci. Rychlý tip pro ladění: odstraňte poslední číslici a ručně ji přepočítejte. Pokud se neshoduje, to je váš problém. ### Jsou pomlčky v číslech CUIT/CUIL povinné? Pomlčky jsou pouze pro zobrazovací formátování - nejsou součástí skutečného čísla pro výpočetní účely. Když vidíte **20-12345678-9**, algoritmus se stará pouze o 11 číslic: **20123456789**. Většina implementací validace odstraňuje pomlčky před zpracováním, proto náš nástroj přijímá jak **20-12345678-9**, tak **20123456789**. V API a databázích budete typicky ukládat verzi bez pomlček a přidávat pomlčky pouze při zobrazení uživatelům. Tento přístup zabraňuje tomu, aby rozdíly ve formátování způsobovaly selhání validace. ### Může mít číslo CUIT/CUIL méně než 8 číslic v části DNI? Část DNI musí být vždy přesně 8 číslic - bez výjimek. Pokud má něčí skutečné DNI méně číslic (což se stává u starších, níže číslovaných DNI), doplňte úvodními nulami. Například DNI **1234567** se stane **01234567** ve struktuře CUIT/CUIL. Toto je častý zdroj chyb při převodu mezi formáty DNI a CUIT/CUIL. Viděl jsem systémy selhávající při validaci, protože zapomněly doplnit, a zacházely s **1234567** jako s 7místným číslem místo **01234567**. Vždy používejte funkce pro doplňování nulami namísto jednoduchého řetězcového zřetězení. ### Jak mohu ověřit, zda je CUIT/CUIL oficálně registrován v Argentině? Náš nástroj ověřuje matematickou správnost - formát, typový kód a kontrolní číslici. Ale nemůže říct, zda je číslo skutečně registrováno u AFIP nebo zda patří reálné osobě nebo podniku. Pro oficální ověření použijte [webové služby AFIP](https://www.afip.gob.ar/) nebo jejich nástroj pro vyhledávání "Constancia de Inscripción". AFIP nabízí API pro automatizované ověřování, i když budete muset zaregistrovat jako vývojář a autentizovat se. V produkčních prostředích implementujte obě vrstvy: nejprve proveďte algoritmickou validaci (rychlá, zachytí překlepy a chyby formátu), poté ověřte proti databázi AFIP (pomalejší, ale potvrdí, že číslo je reálné a aktivní). ### Mohu tento nástroj použít ve své komerční aplikaci? Ano - algoritmus validace CUIT/CUIL je veřejný standard definovaný AFIP, takže jej můžete volně implementovat do komerčního softwaru. Zde poskytnuté příklady kódu jsou určeny jako referenční implementace. Pro produkční použití zvažte tyto osvědčené postupy: implementujte správné zpracování chyb pro hraniční případy, přidejte protokolování pro ladění selhání validace, ověřujte proti oficální databázi AFIP (ne jen algoritmická validace) a udržujte svou implementaci aktuální, pokud AFIP změní pravidla (i když je současný algoritmus stabilní již desítky let). ### Ukládá nástroj nějaká generovaná nebo validovaná čísla CUIT/CUIL? Ne - veškeré zpracování probíhá ve vašem prohlížeči (na straně klienta). Když generujete nebo ověřujete CUIT/CUIL, výpočet běží lokálně pomocí JavaScriptu. Nic se neodesílá na naše servery a my nelogujeme, neukládáme ani nesledujeme žádná čísla, která zadáte nebo vygenerujete. Tento přístup na straně klienta zajišťuje soukromí a také znamená, že nástroj funguje offline po načtení stránky. Můžete to ověřit otevřením vývojářských nástrojů vašeho prohlížeče a sledováním síťové karty - neuvidíte žádné požadavky při generování nebo ověřování čísel. ## Reference 1. AFIP (Federální správa veřejných příjmů). "CUIT/CUIL/CDI." Oficiální webové stránky. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministerstvo práce, zaměstnanosti a sociálního zabezpečení. "CUIL - Jedinečný identifikátor pracovní identifikace." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Národní správa sociálního zabezpečení). "Získat můj CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Úřední věstník Argentinské republiky. "Všeobecné rozhodnutí AFIP 2854/2010: Postup. Jedinečný daňový identifikátor (C.U.I.T.)." 5. Daňový zákoník Argentinské republiky. "Identifikace a registrace daňových poplatníků." --- Ať už budujete systém fakturace, testujete procesy přijímání zaměstnanců nebo se učíte o validačních algoritmech, tento nástroj poskytuje generování a ověřování CUIT/CUIL, které potřebujete. Generujte testovací data, která projdou algoritmickou validací, ověřujte čísla před jejich zadáním do databáze nebo prozkoumejte, jak algoritmus kontrolního čísla funguje v praxi.