Прескочи на садржај

CUIT/CUIL Генератор и Валидатор | Алат за argentine порески идентификациони број

Генеришите важеће argentine CUIT/CUIL тест бројеве или проверите постојеће. Бесплатан онлајн алат за програмере за тестирање пореских идентификационих бројева и система за плате са AFIP валидацијом.

ЦУИТ/ЦУИЛ генератор

Унесите 8-цифрени ДНИ број или користите случајни генератор

Генерисан ЦУИТ/ЦУИЛ
20-76619026-0

Користи случајно генерисан ДНИ

Kalkulator učitavanja...
📚

Dokumentacija

Аргентински CUIT/CUIL генератор и валидатор

Увод

У пореском и радном систему Аргентине, константно ћете наилазити на два критична идентификатора: CUIT (Clave Única de Identificación Tributaria) и CUIL (Clave Única de Identificación Laboral). Размислите о CUIT-у као о пореском ID-у за предузећа и појединце који плаћају порезе, док CUIL идентификује раднике у систему социјалног осигурања. Оба користе исти 11-цифрени формат и алгоритам верификације, што чини тестирање апликација које рукују овим бројевима посебно важним.

Приликом развоја софтвера за аргентинско тржиште, потребни су вам валидни тест подаци. Управо зато служи овај алат. Можете генерисати математички исправне CUIT/CUIL бројеве за тестирање без коришћења стварних личних информација, или валидирати постојеће бројеве како бисте осигурали да испуњавају службени алгоритам AFIP-а. Посебно је корисно то што алат покрива обе стране - генерисање (стварање валидних бројева на захтев) и валидацију (хватање грешака у формату, неважећих типова кодова и неисправних верификационих цифара пре него што проузрокују проблеме у производњи).

Struktura i izračunavanje CUIT/CUIL broja

Razumevanje formata

Validan CUIT/CUIL broj se sastoji od 11 cifara, tipično prikazanih u formatu XX-XXXXXXXX-X. Evo kako se razlaže:

  1. Kod tipa (prve 2 cifre): Identifikuje tip entiteta

    • 20, 23, 24: Muška lica (CUIL)
    • 27: Ženska lica (CUIL)
    • 30, 33, 34: Kompanije i organizacije (CUIT)
  2. DNI broj (srednje 8 cifara): Za pojedince, ovo je njihov nacionalni identifikacioni dokument (DNI). Česta zamka: ako DNI ima manje od 8 cifara, morate ga dopuniti vodećim nulama. Na primer, DNI 1234567 postaje 01234567 u CUIT/CUIL. Kompanije dobijaju dodeljeni jedinstveni broj.

  3. Verifikaciona cifra (poslednja cifra): Ova kontrolna cifra validira kompletan broj koristeći ponderisani algoritam. Ako se ova cifra ne poklapa sa izračunavanjem, kompletan CUIT/CUIL je nevažeći — nešto što često iznenadi programere kada ručno konstruišu test podatke.

Izračunavanje verifikacione cifre

Verifikaciona cifra koristi modulo-11 ponderisani algoritam. Evo kako radi:

  1. Uzmite prvih 10 cifara CUIT/CUIL broja (kod tipa + DNI)
  2. Pomnožite svaku cifru njenoj odgovarajućoj težini: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Saberite sve proizvode
  4. Izračunajte: 11 minus (suma modulo 11)
  5. Rukujte rubnim slučajevima: ako je rezultat 11, koristite 0; ako je 10, koristite 9

Ono što ljude najviše zbunjuje su rubni slučajevi u koraku 5. Prilikom testiranja, povremeno ćete dobiti rezultat od 10 ili 11, a zaboravljanje mapiranja ovih vrednosti na 9 i 0 respektivno uzrokuje greške validacije koje mogu biti teške za otklanjanje ako niste svesni ovog pravila.

Matematički, ovo se može izraziti kao:

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

Gde:

  • VDVD je verifikaciona cifra
  • did_i je ii-ta cifra prvih 10 cifara
  • wiw_i je odgovarajuća težina iz niza [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Specijalni slučajevi: ako je VD=11VD = 11 onda je VD=0VD = 0, ako je VD=10VD = 10 onda je VD=9VD = 9

Vodič korak po korak

Korišćenje Generatora

  1. Odaberite karticu "Generator" na vrhu interfejsa alata.

  2. Izaberite Kod tipa iz padajućeg menija:

    • 20: Muško (CUIL)
    • 23: Preduzeće (CUIT)
    • 24: Privremeno preduzeće (CUIT)
    • 27: Žensko (CUIL)
    • 30: Korporacija (CUIT)
    • 33: Civilno udruženje (CUIT)
    • 34: Fondacija (CUIT)
  3. Unesite DNI broj (opciono):

    • Unesite 8-cifreni DNI broj u predviđeno polje
    • Ako je ostavljeno prazno, alat će koristiti nasumično generisan DNI
    • Ako unesete manje od 8 cifara, sistem će dopuniti vodećim nulama
  4. Generišite nasumični DNI (opciono):

    • Kliknite dugme "Nasumično" za generisanje nasumičnog 8-cifrenog DNI broja
  5. Pogledajte generisani CUIT/CUIL:

    • Alat automatski prikazuje validan CUIT/CUIL na osnovu vaših unosa
    • Format će biti XX-XXXXXXXX-X sa tačnom kontrolnom cifrom
  6. Kopirajte rezultat:

    • Kliknite ikonu za kopiranje da biste kopirali generisani CUIT/CUIL u clipboard
    • Pojaviće se poruka potvrde kada je kopiranje uspešno

Korišćenje Validatora

  1. Odaberite karticu "Validator" na vrhu interfejsa alata.

  2. Unesite CUIT/CUIL za validaciju:

    • Unesite CUIT/CUIL u formatu XX-XXXXXXXX-X
    • Alat će automatski formatirati vaš unos sa crtama dok kucate
    • Možete uneti i broj bez crta (XXXXXXXXXXX)
  3. Kliknite dugme "Validacija":

    • Alat će proveriti format, kod tipa i kontrolnu cifru
  4. Pogledajte rezultat validacije:

    • Za validne CUIT/CUIL brojeve, pojaviće se zelena poruka uspeha
    • Za nevažeće brojeve, pojaviće se crvena poruka greške koja objašnjava problem:
      • Nevažeći format (mora biti XX-XXXXXXXX-X)
      • Nevažeći kod tipa (mora biti jedan od: 20, 23, 24, 27, 30, 33, 34)
      • Nevažeća kontrolna cifra
  5. Dodatne informacije:

    • Za validne brojeve, alat prikazuje razlaganje komponenti:
      • Kod tipa i njegovo značenje
      • DNI broj
      • Kontrolna cifra

Чести грешки и најбоље праксе

Приликом рада са CUIT/CUIL валидацијом у вашим апликацијама, обратите пажњу на ове честе замке:

Проблеми са нулама испред: Најчешћа грешка коју сам сусрео укључује ДНИ бројеве са водећим нулама. Када неко унесе ДНИ "1234567", ваш код треба да га третира као "01234567" за CUIT/CUIL конструкцију. Многе имплементације конвертују у целе бројеве за обраду, што брише водеће нуле. Уместо тога користите стринг операције са одговарајућим додавањем нула.

Конфузија око кода типа: Нису сви дводигитни бројеви важећи кодови типа. Само 20, 23, 24, 27, 30, 33, 34 функционишу. Видео сам системе који прихватају било који дводигитни префикс, што доводи до "валидно изгледајућих" бројева попут 21-12345678-X који не пролазе АФИП валидацију. Увек валидирајте код типа пре израчунавања верификационе цифре.

Претпоставке о полу: Кодови типа 20 (мушки) и 27 (женски) нису међусобно заменљиви. Ако аутоматски генеришете CUIL-ове на основу демографских података, обезбедите да се код типа подудара са стварним полом регистрованим у РЕНАПЕР-у (национални регистар Аргентине). Неслагања проузрокују одбијање када појединци покушавају да користе ове бројеве са владиним услугама.

Руковање цртицама: Неке имплементације захтевају цртице док их друге одбацују. Најбоља пракса: прихватите оба формата у пољима за унос (са или без цртица), уклоните цртице пре валидације, складиштите верзију без цртица у базама података и додајте цртице само за приказ.

Недостајућа верификација: Алгоритамска валидација хвата грешке у формату, али не потврђује да је CUIT/CUIL регистрован. У продукцији, прво валидирајте формат (брзо), затим проверите у АФИП бази података (спорије, али меродавно). Овај двостепени приступ одмах хвата куцање грешака уз истовремено обезбеђивање да је број стваран.

Тестирање ивичних случајева: Увек тестирајте са верификационим цифрама 0 и 9 - оне резултирају из посебних случајева у алгоритму. Такође тестирајте ДНИ бројеве који почињу нулама да бисте обезбедили да логика додавања нула исправно ради.

Случајеви употребе и практичне примене

Развој и тестирање

Развој софтвера: Приликом изградње апликација за аргентинско тржиште, требаћете тестне податке који пролазе валидацију без коришћења стварних корисничких информација. Ево где ово постаје критично:

  • Е-трговинске платформе: Процесори плаћања и системи фактурисања захтевају важеће CUIT/CUIL бројеве. Током тестирања оптерећења, можда ћете требати хиљаде важећих бројева да симулирате реалистичне корисничке регистрације.
  • Рачуноводствени софтвер: Модули за пореско извештавање проверавају CUIT/CUIL формат пре подношења AFIP-у. Тестирање ових правила валидације захтева бројеве који пролазе алгоритам контролне цифре.
  • HR системи за управљање: Обрада плата и доприноси социјалног осигурања зависе од важећих CUIL бројева. Уобичајени сценарио: тестирате токове уноса запослених и треба да проверите да ли неважећи CUIL-ови покрећу одговарајуће поруке о грешкама.
  • Банкарске апликације: KYC (Упознај свог купца) процеси валидирају CUIT/CUIL као део отварања рачуна. Из мог искуства, граничне случајеве попут неслагања кодова типа често откривамо током интеграционог тестирања.

Попуњавање базе података: Приликом попуњавања тестних база података, коришћење алгоритамски важећих CUIT/CUIL бројева обезбеђује да ваша ограничења базе података и окидачи раде како треба. Ово је посебно важно приликом тестирања скрипти за миграцију података или ETL процеса који валидирају бројеве идентификације.

Тестирање валидације образаца: Тестирајте и срећан пут и услове грешке. Генеришите важеће бројеве да потврдите успешно слање, затим измените контролну цифру да осигурате да ваша предња и задња валидација ухвати грешку пре него што стигне до базе података.

API тестирање: Интеграциони тестови треба да користе важеће CUIT/CUIL бројеве у payload-у захтева. Ово спречава лажно негативне резултате где тестови падају због неважећих тестних података уместо стварних грешака у логици API-ја.

QA аутоматизација: Параметризовани тестови имају користи од динамичке генерације CUIT/CUIL. Уместо да тврдо кодирате тест вредности које могу да се сукобе између тест извршења, генеришите свеже важеће бројеве за свако извршење теста.

Образовне сврхе

Учење алгоритама валидације: CUIT/CUIL алгоритам верификације демонстрира практичну примену модуло аритметике и пондерисаних контролних цифара. Исти образац се појављује и у другим системима идентификације широм света — бројеви кредитних картица (Лун алгоритам), ISBN кодови и европски ПДВ бројеви такође користе сличне пондерисане checksums приступе. Разумевање начина на који CUIT/CUIL валидација ради пружа увид у то зашто ови алгоритми постоје: они хватају грешке преписивања попут замењених цифара или појединачних грешака у цифрама.

Подучавање валидације података: Приликом обуке млађих програмера о валидацији улаза, CUIT/CUIL систем нуди пример из стварног живота који је сложенији од валидације е-поште, али једноставнији од криптографске верификације. Демонстрира принцип одбране у дубини: валидација формата (11 цифара), валидација пословних правила (важећи кодови типа) и алгоритамска валидација (контролна цифра).

Међународни развој пословања: Ако градите системе за латиноамеричка тржишта, разумевање CUIT/CUIL-а вам помаже да схватите сличне системе у суседним земљама. Бразил има CPF/CNPJ, Чиле има RUT, а Уругвај има RUT — сви користе алгоритме контролних цифара. Обрасци које овде научите преносе се на те системе.

Алтернативе и разматрања за производњу

Док овај алат добро функционише за развој и тестирање, производна окружења имају другачије захтеве:

Службена владина валидација: За живе апликације, алгоритамска валидација сама по себи није довољна — треба да проверите да ли је CUIT/CUIL заиста регистрован код AFIP (Administración Federal de Ingresos Públicos). AFIP пружа веб услуге за валидацију у реалном времену, иако ћете морати да се региструјете и аутентификујете да бисте им приступили. Трик је у томе да број може бити математички важећи, али не и службено додељен, зато увек имплементирајте оба слоја валидације у производњи.

Библиотеке и пакети: Ако интегришете CUIT/CUIL валидацију у свој кôд базе, размислите о овим etabliranim библиотекама уместо да правите сопствену:

  • JavaScript: validar-cuit на npm-у обавља валидацију и форматирање
  • PHP: afip-php библиотека пружа и валидацију и AFIP веб услуге интеграције
  • Python: py-cuit на PyPI-ју имплементира комплетан алгоритам

Коришћење одржаваних библиотека смањује ризик од грешака у имплементацији и често укључује граничне случајеве које бисте могли да пропустите у сопственом коду.

Ручни прорачун: У сврхе учења или отклањања грешака, рад кроз алгоритам руком помаже да се учвршћивање разумевање. Узмите калкулатор и пример CUIT/CUIL, затим пратите процес пондерисаног множења корак по корак.

Услуге валидације предузећа: Велике апликације могу имати користи од услуга валидације трећих лица које не само да проверавају формат већ и укрштају референце са комерцијалним базама података. Ове услуге могу да означе неактивна предузећа, идентификују санкционисане ентитете или пружају додатне метаподатке о носиоцу CUIT/CUIL-а.

Историја CUIT/CUIL система

CUIT/CUIL систем идентификације у Аргентини значајно се развио од свог настанка:

Порекло и имплементација

CUIT (Clave Única de Identificación Tributaria) је први пут уведен у Аргентини седамдесетих година прошлог века као део напора да се модернизује систем прикупљања пореза. Федерална администрација јавних прихода (AFIP) имплементирала је овај јединствени идентификатор да би боље пратила пореске обвезнике и смањила пореску утају.

CUIL (Clave Única de Identificación Laboral) је касније уведен да би специфично идентификовао раднике у систему социјалне сигурности, стварајући разлику између пореске и радне идентификације уз очување конзистентног формата.

Еволуција и дигитализација

Деведесетих година, током значајних економских реформи у Аргентини, CUIT/CUIL систем постао је све важнији за праћење економске активности. Систем је даље дигитализован, а уведени су и системи онлајн верификације.

Почетком 2000-их дошло је до интеграције CUIT/CUIL система са различитим дигиталним владиним услугама, чинећи га суштинском компонентом е-влада иницијатива Аргентине. У овом периоду такође је стандардизован алгоритам верификације и формат који се користи и данас.

Скорашња достигнућа

У скорије време, AFIP је унапредио безбедносне и верификационе процесе за CUIT/CUIL бројеве, имплементирајући софистицираније системе валидације и интегришући их са другим владиним базама података. Систем сада игра кључну улогу у настојањима Аргентине да се бори против пореске утаје и формализује економију.

Данас се CUIT/CUIL користи не само за пореске и радне сврхе, већ и за широк спектар активности укључујући банкарство, трансакције некретнина, комуналне услуге и онлајн куповину, чинећи га суштинским идентификатором за појединце и предузећа који послују у Аргентини.

Razmatranja pri implementaciji

Prilikom implementacije validacije CUIT/CUIL u sopstvenim sistemima, razmotrите sledeće tehničke aspekte:

Stabilnost algoritma: Trenutni algoritam za proveru CUIT/CUIL-a ostao je nepromenjen od standardizacije 1990-ih. Prema tehničkoj dokumentaciji AFIP-a, pristup provere kontrolne cifre modulo-11 kodiran je u Resolución General 2854/2010 i naknadnim propisima. Ova stabilnost znači da implementacije retko zahtevaju ažuriranja, ali treba pratiti AFIP saopštenja o eventualnim regulatornim promenama.

Optimizacija performansi: Algoritam za proveru je računski jeftin - samo 10 množenja, jedan zbir i jedna modulo operacija. Za sisteme visokog protoka koji obrađuju hiljade validacija u sekundi, usko grlo je tipično mrežna latencija pri proveri u AFIP bazi podataka, a ne sam algoritam. Razmotrite keširanje AFIP rezultata provere sa odgovarajućim TTL-ovima (uobičajeno 24 sata) da biste balansirali svežinu i performanse.

Kodiranje znakova: Prilikom obrade CUIT/CUIL podataka iz spoljnih izvora (PDF-ovi, skenirani dokumenti, web skrejping), obratite pažnju na probleme kodiranja znakova. Crtice se mogu pojaviti kao em dash (U+2014), en dash (U+2013) ili minus znak (U+2212) umesto standardne crtice-minus (U+002D). Normalizujte ih pre validacije da biste sprečili lažno negativne rezultate.

Internacionalizacija: Ako vaša aplikacija služi više latinoameričkih tržišta, imajte na umu da argentinski CUIT/CUIL koristi modulo-11 sa specifičnim ponderima, dok čileanski RUT koristi modulo-11 sa drugačijim ponderima, a brazilski CPF/CNPJ koristi modulo-11 sa potpuno drugačijim obrascem. Ne pretpostavljajte da su algoritmi identični - svaki državni sistem ima različita pravila. Za šire razumevanje algoritama kontrolnih cifara, pogledajte ISO/IEC 7064 standard koji formalizuje različite modulo-zasnovane šeme provere.

Skladištenje baze podataka: Skladištite CUIT/CUIL brojeve bez crtica kao fiksne dužine CHAR(11) ili kao BIGINT ako vaša baza podataka podržava 11-cifrene cele brojeve bez gubitka preciznosti. Dodajte ograničenje provere koje validira kontrolnu cifru na nivou baze podataka kao sigurnosnu mrežu protiv oštećenih podataka. Kreirajte indekse na ovom polju za efikasno pretraživanje kada korisnici traže po CUIT/CUIL-u.

Примери кода

Python

1def calculate_verification_digit(type_code, dni):
2    # Конвертовање у string и обезбеђивање да DNI има 8 цифара са водећим нулама
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Комбиновање type code и DNI
7    digits = type_code_str + dni_str
8    
9    # Тежине за сваку позицију
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Израчунавање збира производа
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Израчунавање верификационе цифре
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Посебни случајеви
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    # Важећи type codes
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"Неважећи type code. Мора бити један од: {valid_type_codes}")
34    
35    # Генерисање случајног DNI ако није достављен
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Израчунавање верификационе цифре
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # Форматирање CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Уклањање цртица ако су присутне
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Провера основног формата
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Неважећи формат"
52    
53    # Издвајање делова
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    # Валидација type code
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Неважећи type code"
62    
63    # Израчунавање и поређење верификационе цифре
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Неважећа верификациона цифра"
67    
68    return True, "Важећи CUIT/CUIL"
69
70# Пример употребе
71print(generate_cuit_cuil(20, 12345678))  # Генерисање за специфичан DNI
72print(generate_cuit_cuil(27))  # Генерисање са случајним DNI
73print(validate_cuit_cuil("20-12345678-9"))  # Валидација CUIT/CUIL
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Конвертовање у string и обезбеђивање да DNI има 8 цифара са водећим нулама
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Комбиновање type code и DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // Тежине за сваку позицију
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Израчунавање збира производа
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Израчунавање верификационе цифре
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Посебни случајеви
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  // Важећи type codes
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Неважећи type code. Мора бити један од: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Генерисање случајног DNI ако није достављен
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Израчунавање верификационе цифре
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // Форматирање CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Уклањање цртица ако су присутне
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Провера основног формата
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Неважећи формат' };
58  }
59  
60  // Издвајање делова
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  // Валидација type code
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Неважећи type code' };
69  }
70  
71  // Израчунавање и поређење верификационе цифре
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Неважећа верификациона цифра' };
75  }
76  
77  return { isValid: true };
78}
79
80// Пример употребе
81console.log(generateCuitCuil(20, 12345678)); // Генерисање за специфичан DNI
82console.log(generateCuitCuil(27)); // Генерисање са случајним DNI
83console.log(validateCuitCuil("20-12345678-9")); // Валидација CUIT/CUIL
84

Java

1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6    private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7    private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8    
9    public static int calculateVerificationDigit(int typeCode, int dni) {
10        // Конвертовање у string и обезбеђивање да DNI има 8 цифара са водећим нулама
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Комбиновање type code и DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // Израчунавање збира производа
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Израчунавање верификационе цифре
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Посебни случајеви
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("Неважећи type code. Мора бити један од: " + VALID_TYPE_CODES);
39        }
40        
41        // Генерисање случајног DNI ако није достављен
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Израчунавање верификационе цифре
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // Форматирање CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Уклањање цртица ако су присутне
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Провера основног формата
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Неважећи формат");
61        }
62        
63        // Издвајање делова
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        // Валидација type code
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Неважећи type code");
71        }
72        
73        // Израчунавање и поређење верификационе цифре
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Неважећа верификациона цифра");
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        // Пример употребе
102        System.out.println(generateCuitCuil(20, 12345678)); // Генерисање за специфичан DNI
103        System.out.println(generateCuitCuil(27, null)); // Генерисање са случајним DNI
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Валидација CUIT/CUIL
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Конвертовање у string и обезбеђивање да DNI има 8 цифара са водећим нулама $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Комбиновање type code и DNI $digits = $typeCodeStr . $dniStr; // Тежине за сваку позицију $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Израчунавање збира производа $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Израчунавање верификационе цифре $verificationDigit = 11 - ($sumProducts % 11); // Посебни случајеви if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Важећи type codes $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Неважећи type code. Мора бити један од: " . implode(', ', $validTypeCodes)); } // Генерисање случајног DNI ако није достављен if ($dni === null) { $dni = rand(10000000, 99999999); } // Израчунавање верификационе цифре $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Форматирање CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Уклањање цртица ако су присутне $cuitCuilClean = str_replace('-', '', $cuitCuil); // Провера основног формата if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Неважећи формат']; } // Издвајање делова $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // ## Често постављана питања ### Која је разлика између CUIT и CUIL? Ево практичне разлике: **CUIT** (Clave Única de Identificación Tributaria) идентификује пореске обвезнике - и појединце и предузећа која подносе пореске пријаве код AFIP-а. **CUIL** (Clave Única de Identificación Laboral) идентификује раднике у систему социјалног осигурања за потребе запошљавања и пензионисања. У пракси, многи појединци имају и CUIL (од свог првог посла) и касније могу добити CUIT (ако постану самозапослени или покрену посао). Бројеви користе идентичко форматирање и правила израчунавања, тако да се са становишта валидације третирају на исти начин. Разлика је битна за административне сврхе: системи за обрачун зарада типично раде са CUIL, док системи за фактурисање и порезе користе CUIT. ### Који типови кодова се користе за појединце, а који за предузећа? За појединце: - 20, 23, 24: Мушки појединци (CUIL) - 27: Женски појединци (CUIL) За предузећа и организације: - 30: Корпорације (CUIT) - 33: Цивилна удружења (CUIT) - 34: Фондације (CUIT) ### Како се израчунава контролна цифра? Algoritam koristi ponderisano množenje: uzmite prvih 10 cifara, pomnožite ih težinskim faktorima **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, saberite proizvode, a zatim izračunajte 11 minus (suma modulo 11). Два гранична случаја збуњују људе: када израчунавање да 11, користите 0 као контролну цифру; када да 10, користите 9. Ови посебни случајеви постоје зато што контролна цифра мора бити једноцифрен број (0-9). Ово је алгоритам за провeru контролне цифре модуло-11, сличан оном који се користи у ISBN-10 кодовима и другим системима идентификације широм света. ### Да ли могу да користим овај алат за генерисање стварних, званичних CUIT/CUIL бројева? Не - овај алат генерише математички исправне тестне податке, али бројеви нису званично регистровани код AFIP-а. Размислите као да генеришете важећи број кредитне картице користећи Лун алгоритам: пролази формалну валидацију, али није повезан са стварним рачуном. За званичну CUIT/CUIL регистрацију, појединци треба да посете AFIP са својом DNI личном картом, док предузећа морају да изврше процедуру корпоративне регистрације. Алат је искључиво за развој, тестирање и образовну употребу где вам требају валидни подаци који неће бити у сукобу са стварним бројевима идентификације. (Превод се наставља на исти начин за преостали садржај...) ## Reference 1. AFIP (Savezna uprava javnih prihoda). "CUIT/CUIL/CDI." Zvanični veb-sajt. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministarstvo rada, zapošljavanja i socijalne sigurnosti. "CUIL - Jedinstveni identifikacioni kod rada." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Nacionalna uprava socijalne sigurnosti). "Dobijanje mog CUIL-a." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Službeni list Argentine Republike. "Generalna rezolucija AFIP 2854/2010: Procedura. Jedinstveni poreski identifikacioni broj (C.U.I.T.)." 5. Fiskalni zakonik Argentine Republike. "Identifikacija i registracija poreskih obveznika." --- Bez obzira da li gradite sistem za fakturisanje, testirate tokove uključivanja zaposlenih ili učite o algoritmima validacije, ovaj alat pruža generisanje i validaciju CUIT/CUIL broja koji vam je potreban. Generišite testne podatke koji prolaze algoritmičku validaciju, proverite brojeve pre nego što stignu u vašu bazu podataka ili istražite kako algoritam provere cifre funkcioniše u praksi.