Pāriet uz saturu

CUIT/CUIL ģenerators un validators | Argentīnas nodokļu ID rīks

Ģenerējiet derīgus Argentīnas CUIT/CUIL testa numurus vai pārbaudiet esošos. Bezmaksas tiešsaistes rīks izstrādātājiem, lai testētu nodokļu ID un algu sistēmas ar AFIP atbilstošu validāciju.

CUIT/CUIL ģenerators

Ievadiet 8 ciparu DNI numuru vai izmantojiet nejaušo ģeneratoru

Ģenerētais CUIT/CUIL
20-26984696-9

Izmanto nejaušu ģenerētu DNI

Ielādes kalkulators...
📚

Dokumentācija

Argentīnas CUIT/CUIL ģenerators un validātors

Ievads

Argentīnas nodokļu un darba sistēmās jūs pastāvīgi saskarsieties ar diviem kritiskiem identifikatoriem: CUIT (Clave Única de Identificación Tributaria) un CUIL (Clave Única de Identificación Laboral). Uztveriet CUIT kā nodokļu ID uzņēmumiem un personām, kas maksā nodokļus, savukārt CUIL identificē darbiniekus sociālās drošības sistēmā. Abiem ir vienāds 11 ciparu formāts un pārbaudes algoritms, kas padara īpaši svarīgu testu lietojumprogrammu izstrādi, kas apstrādā šos numurus.

Izstrādājot programmatūru Argentīnas tirgum, jums ir nepieciešami derīgi testa dati. Tieši šeit noderēs šis rīks. Jūs varat ģenerēt matemātiski pareizus CUIT/CUIL numurus testēšanai, neizmantojot īstas personas informāciju, vai pārbaudīt esošos numurus, lai nodrošinātu to atbilstību AFIP oficiālajam algoritmam. Īpaši noderīgi ir tas, ka rīks nodarbojas gan ar ģenerēšanas pusi (pēc pieprasījuma izveidojot derīgus numurus), gan ar pārbaudes pusi (konstatot formāta kļūdas, nederīgus tips kodus un nepareizus pārbaudes ciparus pirms to izraisītajām problēmām ražošanā).

CUIT/CUIL struktūra un aprēķins

Formāta izpratne

Derīgs CUIT/CUIL numurs sastāv no 11 cipariem, kas parasti tiek attēlots formātā XX-XXXXXXXX-X. Tā tas sadalās:

  1. Tipa kods (pirmie 2 cipari): Identificē subjekta tipu

    • 20, 23, 24: Vīriešu personas (CUIL)
    • 27: Sieviešu personas (CUIL)
    • 30, 33, 34: Uzņēmumi un organizācijas (CUIT)
  2. DNI numurs (vidējie 8 cipari): Personām tas ir viņu valsts identifikācijas dokumenta numurs (DNI). Izplatīta kļūda: ja faktiskais DNI ir ar mazāk nekā 8 cipariem, tas jāaizpilda ar nullēm priekšā. Piemēram, DNI 1234567 kļūst par 01234567 CUIT/CUIL. Uzņēmumi saņem īpašu piešķirtu numuru.

  3. Pārbaudes cipars (pēdējais cipars): Šis pārbaudes cipars validē visu numuru, izmantojot svērto algoritmu. Ja šis cipars nesaskan ar aprēķinu, viss CUIT/CUIL ir nederīgs - kas bieži pārsteidz izstrādātājus, kad viņi manuāli veido testa datus.

Pārbaudes cipara aprēķins

Pārbaudes cipars izmanto modulo-11 svērto algoritmu. Tā tas darbojas:

  1. Ņemiet pirmos 10 CUIT/CUIL ciparus (tipa kods + DNI)
  2. Reiziniet katru ciparu ar tā atbilstošo svaru: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Summējiet visus reizinājumus
  4. Aprēķiniet: 11 mīnus (summa modulo 11)
  5. Apstrādājiet īpašos gadījumus: ja rezultāts ir 11, izmantojiet 0; ja tas ir 10, izmantojiet 9

Visbiežāk cilvēkus apjūk 5. soļa īpašie gadījumi. Testējot, jūs reizēm iegūsiet rezultātu 10 vai 11, un aizmirstot kartēt šos uz 9 un 0 attiecīgi, izraisa validācijas kļūmes, kas var būt grūti atrodamas, ja neesat informēts par šo noteikumu.

Matemātiski tas var tikt izteikts kā:

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

Kur:

  • VDVD ir pārbaudes cipars
  • did_i ir ii-tais cipars no pirmajiem 10 cipariem
  • wiw_i ir atbilstošais svars no virknes [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Īpašie gadījumi: ja VD=11VD = 11 tad VD=0VD = 0, ja VD=10VD = 10 tad VD=9VD = 9

Pakāpenisks Ceļvedis

Ģeneratora Izmantošana

  1. Atlasiet "Ģeneratora" cilni rīka saskarnē augšpusē.

  2. Izvēlieties Tipa Kodu no nolaižamās izvēlnes:

    • 20: Vīrietis (CUIL)
    • 23: Uzņēmums (CUIT)
    • 24: Pagaidu Uzņēmums (CUIT)
    • 27: Sieviete (CUIL)
    • 30: Korporācija (CUIT)
    • 33: Pilsoniska Asociācija (CUIT)
    • 34: Fonds (CUIT)
  3. Ievadiet DNI Numuru (nav obligāti):

    • Ievadiet 8 ciparu DNI numuru norādītajā laukā
    • Ja atstāts tukšs, rīks izmantos nejauši ģenerētu DNI
    • Ja ievadāt mazāk par 8 cipariem, sistēma papildinās ar vadošajiem nulles cipariem
  4. Ģenerēt Nejaušu DNI (nav obligāti):

    • Noklikšķiniet uz pogas "Nejaušs", lai ģenerētu nejaušu 8 ciparu DNI numuru
  5. Skatīt Ģenerēto CUIT/CUIL:

    • Rīks automātiski parāda derīgu CUIT/CUIL, pamatojoties uz jūsu ievadi
    • Formāts būs XX-XXXXXXXX-X ar pareizo pārbaudes ciparu
  6. Kopēt Rezultātu:

    • Noklikšķiniet uz kopēšanas ikonas, lai kopētu ģenerēto CUIT/CUIL starpliktuvē
    • Parādīsies apstiprinājuma ziņojums pēc veiksmīgas kopēšanas

Validatora Izmantošana

  1. Atlasiet "Validatora" cilni rīka saskarnē augšpusē.

  2. Ievadiet Validējamo CUIT/CUIL:

    • Ievadiet CUIT/CUIL formātā XX-XXXXXXXX-X
    • Rīks automātiski formatēs jūsu ievadi ar defisēm, rakstot
    • Varat arī ievadīt numuru bez defisēm (XXXXXXXXXXX)
  3. Noklikšķiniet uz pogas "Validēt":

    • Rīks pārbaudīs formātu, tipa kodu un pārbaudes ciparu
  4. Skatīt Validācijas Rezultātu:

    • Derīgiem CUIT/CUIL numuriem parādīsies zaļš veiksmes ziņojums
    • Nederīgiem numuriem parādīsies sarkans kļūdas ziņojums ar skaidrojumu:
      • Nederīgs formāts (jābūt XX-XXXXXXXX-X)
      • Nederīgs tipa kods (jābūt vienam no: 20, 23, 24, 27, 30, 33, 34)
      • Nederīgs pārbaudes cipars
  5. Papildu Informācija:

    • Derīgiem numuriem rīks parāda komponentu sadalījumu:
      • Tipa kods un tā nozīme
      • DNI numurs
      • Pārbaudes cipars

Izplatītākās kļūdas un labākās prakses

Strādājot ar CUIT/CUIL validāciju savās lietojumprogrammās, uzmanieties no šīm bieži sastopamajām lamatām:

Nulles pildīšanas problēmas: Visizplatītākā kļūda, ko esmu sastapis, ir DNI numuri ar vadošajām nullēm. Kad kāds ievada DNI "1234567", jūsu kodam tas jāapstrādā kā "01234567" CUIT/CUIL konstruēšanai. Daudzas realizācijas konvertē uz veseliem skaitļiem apstrādei, kas noņem vadošās nulles. Tā vietā izmantojiet virkņu operācijas ar pareizu pildīšanu.

Tipa koda sajaukšana: Ne visi divciparu skaitļi ir derīgi tipa kodi. Darbojas tikai 20, 23, 24, 27, 30, 33, 34. Esmu redzējis sistēmas, kas pieņem jebkuru divciparu prefiksu, izraisot "derīgi izskatāmus" numurus kā 21-12345678-X, kas neizdodas AFIP validācijā. Vienmēr validējiet tipa kodu pirms verificēšanas cipara aprēķināšanas.

Dzimuma pieņēmumi: Tipa kodi 20 (vīrietis) un 27 (sieviete) nav savstarpēji aizstājami. Ja automātiski ģenerējat CUIL, pamatojoties uz demogrāfiskajiem datiem, nodrošiniet, ka jūsu tipa kods atbilst faktiskajai dzimumei, kas reģistrēta RENAPER (Argentīnas valsts reģistrā). Neatbilstības izraisa noraidīšanu, kad indivīdi mēģina izmantot šos numurus valdības pakalpojumos.

Defišu apstrāde: Dažas realizācijas prasa defises, kamēr citas tās noraida. Labākā prakse: pieņemiet abas formāta versijas ievades laukos (ar vai bez defisēm), noņemiet defises pirms validācijas, saglabājiet bez defisēm datubāzēs un pievienojiet defises tikai attēlošanas nolūkos.

Trūkstošā verifikācija: Algoritma validācija uztver formāta kļūdas, bet neapstiprina, ka CUIT/CUIL ir reģistrēts. Ražošanā vispirms validējiet formātu (ātri), tad pārbaudiet pret AFIP datubāzi (lēnāk, bet autoritatīvi). Šis divu posmu pieeja uzreiz noķer drukas kļūdas, vienlaikus nodrošinot, ka numurs ir īsts.

Robežgadījumu testēšana: Vienmēr testējiet ar verificēšanas cipariem 0 un 9 - tie rodas no īpašajiem gadījumiem algoritmā. Testējiet arī DNI, kas sākas ar nullēm, lai nodrošinātu, ka jūsu pildīšanas loģika darbojas pareizi.

Lietojuma gadījumi un praktiskie pielietojumi

Izstrāde un testēšana

Programmatūras izstrāde: Veidojot lietojumprogrammas Argentīnas tirgum, jums būs nepieciešami testa dati, kas iztur validāciju bez reālu lietotāju informācijas izmantošanas. Šeit ir kritiskas situācijas:

  • E-komercijas platformas: Maksājumu apstrādātāji un rēķinu sistēmas prasa derīgus CUIT/CUIL numurus. Slodzes testēšanas laikā jums var būt nepieciešami tūkstošiem derīgu numuru, lai simulētu reālistiskas lietotāju reģistrācijas.
  • Grāmatvedības programmatūra: Nodokļu pārskatu moduļi pārbauda CUIT/CUIL formātu pirms iesniegšanas AFIP. Šo validācijas noteikumu testēšanai ir nepieciešami numuri, kas iztur kontrolskaitļa algoritmu.
  • Cilvēkresursu pārvaldības sistēmas: Algu aprēķins un sociālās apdrošināšanas iemaksas ir atkarīgas no derīgiem CUIL numuriem. Tipiska situācija: jūs testējat darbinieku reģistrācijas plūsmu un nepieciešams pārbaudīt, vai nederīgi CUIL numuri izraisa atbilstošus kļūdu paziņojumus.
  • Banku lietojumprogrammas: KYC (Klienta pazīšanas) procesi validē CUIT/CUIL kā daļu no konta atvēršanas. Manā pieredzē, malas gadījumi, piemēram, tipa koda neatbilstības, bieži parādās integrācijas testēšanas laikā.

Datu bāzes piepildīšana: Aizpildot testa datu bāzes, izmantojot algoritmiski derīgus CUIT/CUIL numurus, tiek nodrošināts, ka jūsu datu bāzes ierobežojumi un trigeri darbojas kā paredzēts. Tas ir īpaši svarīgi, testējot datu migrācijas skriptus vai ETL procesus, kas validē identifikācijas numurus.

Formu validācijas testēšana: Testējiet gan veiksmīgo scenāriju, gan kļūdu nosacījumus. Ģenerējiet derīgus numurus, lai apstiprinātu veiksmīgu iesniegšanu, pēc tam modificējiet verificēšanas ciparu, lai nodrošinātu, ka jūsu priekšpuses un aizmugures validācija uztver kļūdu pirms tā sasniedz jūsu datu bāzi.

API testēšana: Integrācijas testiem jāizmanto derīgi CUIT/CUIL numuri pieprasījumu datos. Tas novērš nepatiesus negatīvus rezultātus, kur testi neizdodas nevis API loģikas kļūdu dēļ, bet gan nederīgu testa datu dēļ.

QA automatizācija: Parametrizētie testi gūst labumu no dinamiskās CUIT/CUIL ģenerēšanas. Tā vietā, lai cieti kodētu testa vērtības, kas var konfliktēt starp testa palaišanām, katrā testa izpildē ģenerējiet jaunus derīgus numurus.

Izglītojošie mērķi

Validācijas algoritmu apgūšana: CUIT/CUIL verificēšanas algoritms demonstrē praktisko modulo aritmētikas un svērto kontrolskaitļu pielietojumu. Šis pats modelis parādās citos identifikācijas sistēmās visā pasaulē — kredītkaršu numuri (Luhn algoritms), ISBN kodi un Eiropas PVN numuri visi izmanto līdzīgus svērtos kontrolsummas paņēmienus. Izprotot, kā darbojas CUIT/CUIL validācija, sniedz ieskatu, kāpēc šie algoritmi pastāv: tie uztver pārrakstīšanas kļūdas, piemēram, samainītus ciparus vai viencipara kļūdas.

Datu validācijas mācīšana: Apmācot jaunos izstrādātājus par ievades validāciju, CUIT/CUIL sistēma piedāvā reālu piemēru, kas ir sarežģītāks par e-pasta validāciju, bet vienkāršāks par kriptografisko verificēšanu. Tas demonstrē dziļās aizsardzības principu: formāta validācija (11 cipari), biznesa noteikumu validācija (derīgi tipa kodi) un algoritmiska validācija (kontrolskaitlis).

Starptautiskā biznesa attīstība: Ja veidojat sistēmas Latīņamerikas tirgiem, CUIT/CUIL izpratne palīdz saprast līdzīgas sistēmas kaimiņvalstīs. Brazīlijai ir CPF/CNPJ, Čīlei — RUT, Urugvajai — RUT — visi izmanto kontrolskaitļa algoritmus. Šeit apgūtās likumsakarības ir pārvietojamas uz šīm sistēmām.

Alternatīvas un ražošanas apsvērumi

Lai gan šis rīks labi darbojas izstrādes un testēšanas laikā, ražošanas vidēm ir atšķirīgas prasības:

Oficiāla valdības validācija: Dzīvās lietojumprogrammās algoritmiskā validācija vien nav pietiekama — jums jāpārbauda, vai CUIT/CUIL ir reāli reģistrēts AFIP (Administración Federal de Ingresos Públicos). AFIP nodrošina tīmekļa pakalpojumus reāllaika validācijai, lai gan jums būs jāreģistrējas un jāautentificējas, lai piekļūtu tiem. Īpatnība: numurs var būt matemātiski derīgs, bet nav oficiāli piešķirts, tāpēc ražošanā vienmēr īstenojiet abas validācijas pakāpes.

Bibliotēkas un pakotnes: Ja integrējat CUIT/CUIL validāciju savā kodā, apsveriet šīs izveidotās bibliotēkas, nevis veidojiet savu:

  • JavaScript: validar-cuit npm validē un formatē
  • PHP: afip-php bibliotēka nodrošina gan validāciju, gan AFIP tīmekļa pakalpojumu integrāciju
  • Python: py-cuit PyPI realizē pilnu algoritmu

Izmantojot uzturētas bibliotēkas, tiek samazināts ieviešanas kļūdu risks un bieži ietvertas malas situācijas, kuras varētu palaist garām pielāgotā kodā.

Manuāla aprēķināšana: Mācīšanās nolūkos vai atkļūdošanai, algoritma izstrāde ar roku palīdz nostiprināt izpratni. Paņemiet kalkulatoru un paraugu CUIT/CUIL, tad soli pa solim sekojiet svērtās reizināšanas procesam.

Uzņēmumu validācijas pakalpojumi: Lielizmēra lietojumprogrammām var būt noderīgi trešās puses validācijas API, kas ne tikai pārbauda formātu, bet arī šķērso atsauces ar komerciālām datubāzēm. Šie pakalpojumi var atzīmēt neaktīvus uzņēmumus, identificēt sankcionētās vienības vai sniegt papildu metadatus par CUIT/CUIL īpašnieku.

CUIT/CUIL sistēmas vēsture

CUIT/CUIL identifikācijas sistēma Argentīnā ir būtiski attīstījusies kopš tās izveides:

Izcelsme un ieviešana

CUIT (Clave Única de Identificación Tributaria) pirmo reizi tika ieviests Argentīnā 1970-tajos gados kā daļa no centieniem modernizēt nodokļu iekasēšanas sistēmu. Valsts ieņēmumu dienests (AFIP) ieviesa šo unikālo identifikatoru, lai efektīvāk izsekotu nodokļu maksātājiem un samazinātu nodokļu apiešanu.

CUIL (Clave Única de Identificación Laboral) vēlāk tika ieviests, lai īpaši identificētu darbiniekus sociālās drošības sistēmā, radot atšķirību starp nodokļu identifikāciju un darba identifikāciju, vienlaikus saglabājot konsekventu formātu.

Attīstība un digitalizācija

1990-tajos gados, kad Argentīna piedzīvoja nozīmīgas ekonomiskās reformas, CUIT/CUIL sistēma kļuva arvien svarīgāka ekonomiskās aktivitātes izsekošanā. Sistēma tika vairāk digitalizēta, un tika ieviesti tiešsaistes pārbaudes mehānismi.

Agrīnie 2000-tie gadi raksturojās ar CUIT/CUIL sistēmas integrāciju dažādos digitālajos valdības pakalpojumos, padarot to par būtisku Argentīnas e-pārvaldes iniciatīvu sastāvdaļu. Šajā periodā arī tika standartizēts pārbaudes algoritms un formāts, kas tiek izmantots vēl šodien.

Jaunākās attīstības tendences

Pēdējos gados AFIP ir uzlabojusi CUIT/CUIL numuru drošības un pārbaudes procesus, ieviešot vairāk izstrādātās validācijas sistēmas un integrējot tās ar citām valdības datu bāzēm. Sistēmai tagad ir izšķiroša nozīme Argentīnas centienos apkarot nodokļu apiešanu un formalizēt ekonomiku.

Šodien CUIT/CUIL tiek izmantots ne tikai nodokļu un nodarbinātības mērķiem, bet arī plašā darbību spektrā, tostarp banku pakalpojumos, īpašumu darījumos, komunālajos pakalpojumos un tiešsaistes pirkumos, padarot to par būtisku identifikatoru gan fiziskām, gan juridiskām personām, kas darbojas Argentīnā.

Ieviešanas apsvērumi

Ieviešot CUIT/CUIL validāciju savās sistēmās, ņemiet vērā šos tehniskos aspektus:

Algoritma stabilitāte: Pašreizējais CUIT/CUIL verificēšanas algoritms kopš tā standartizācijas 1990. gados nav mainījies. Saskaņā ar AFIP tehnisko dokumentāciju, modulo-11 svērtā kontrolcipara pieeja ir kodificēta Rezolūcijā General 2854/2010 un turpmākos noteikumos. Šī stabilitāte nozīmē, ka ieviešanām reti vajadzīgi atjauninājumi, tomēr jums vajadzētu sekot līdzi AFIP paziņojumiem par jebkādām regulatīvām izmaiņām.

Veiktspējas optimizācija: Verificēšanas algoritms ir skaitļošanas ziņā lēts — tikai 10 reizinājumi, viena saskaitīšana un viena modulo operācija. Augstas caurlaidspējas sistēmās, kas apstrādā tūkstošiem validāciju sekundē, šaurā vieta parasti ir tīkla latentums, veicot pārbaudi pret AFIP datubāzi, nevis pats algoritms. Apsveriet AFIP verificēšanas rezultātu kešošanu ar atbilstošiem TTL (parasti 24 stundas), lai līdzsvarotu svaigumu ar veiktspēju.

Rakstzīmju kodējums: Apstrādājot CUIT/CUIL datus no ārējiem avotiem (PDF, skenētiem dokumentiem, tīmekļa skrāpēšanas), uzmaniet rakstzīmju kodējuma problēmas. Defise var parādīties kā em dash (U+2014), en dash (U+2013) vai mīnus zīme (U+2212) nevis standarta defise-mīnus (U+002D). Normalizējiet šos pirms validācijas, lai novērstu nepamatotus noraidījumus.

Internacionalizācija: Ja jūsu lietojumprogramma apkalpo vairākus Latīņamerikas tirgus, ņemiet vērā, ka Argentīnas CUIT/CUIL izmanto modulo-11 ar specifiskiem svariem, kamēr Čīles RUT izmanto modulo-11 ar citādiem svariem, un Brazīlijas CPF/CNPJ izmanto modulo-11 ar vēl citu modeli. Nepieņemiet, ka algoritmi ir identiski — katras valsts sistēmai ir atšķirīgi noteikumi. Plašākai izpratnei par kontrolciparu algoritmiem skatiet ISO/IEC 7064 standartu, kas formalizē dažādas modulo-bāzētas verificēšanas shēmas.

Datubāzes glabāšana: Glabājiet CUIT/CUIL numurus bez defisēm kā fiksēta garuma CHAR(11) vai kā BIGINT, ja jūsu datubāze atbalsta 11 ciparu veselus skaitļus bez precizitātes zuduma. Pievienojiet pārbaudes ierobežojumu, kas validē verificēšanas ciparu datubāzes līmenī kā drošības tīklu pret bojātiem datiem. Izveidojiet indeksus šajā laukā efektīvai meklēšanai, kad lietotāji meklē pēc CUIT/CUIL.

Kodu piemēri

Python

1def calculate_verification_digit(type_code, dni):
2    # Pārvērst par virkni un nodrošināt, ka DNI ir 8 cipari ar vadošiem nullēm
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Apvienot tips kodu un DNI
7    digits = type_code_str + dni_str
8    
9    # Svari katrai pozīcijai
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Aprēķināt produktu summu
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Aprēķināt pārbaudes ciparu
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Īpašie gadījumi
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    # Derīgie tips kodi
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"Nederīgs tips kods. Jābūt vienam no: {valid_type_codes}")
34    
35    # Ģenerēt nejaušu DNI, ja nav norādīts
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Aprēķināt pārbaudes ciparu
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # Formatēt CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Noņemt defises, ja ir
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Pārbaudīt pamatformātu
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Nederīgs formāts"
52    
53    # Izvilkt daļas
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    # Apstiprināt tips kodu
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Nederīgs tips kods"
62    
63    # Aprēķināt un salīdzināt pārbaudes ciparu
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Nederīgs pārbaudes cipars"
67    
68    return True, "Derīgs CUIT/CUIL"
69
70# Lietošanas piemērs
71print(generate_cuit_cuil(20, 12345678))  # Ģenerēt konkrētam DNI
72print(generate_cuit_cuil(27))  # Ģenerēt ar nejaušu DNI
73print(validate_cuit_cuil("20-12345678-9"))  # Apstiprināt CUIT/CUIL
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Pārvērst par virkni un nodrošināt, ka DNI ir 8 cipari ar vadošām nullēm
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Apvienot tips kodu un DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // Svari katrai pozīcijai
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Aprēķināt produktu summu
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Aprēķināt pārbaudes ciparu
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Īpašie gadījumi
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  // Derīgie tips kodi
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Nederīgs tips kods. Jābūt vienam no: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Ģenerēt nejaušu DNI, ja nav norādīts
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Aprēķināt pārbaudes ciparu
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // Formatēt CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Noņemt defises, ja ir
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Pārbaudīt pamatformātu
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Nederīgs formāts' };
58  }
59  
60  // Izvilkt daļas
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  // Apstiprināt tips kodu
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Nederīgs tips kods' };
69  }
70  
71  // Aprēķināt un salīdzināt pārbaudes ciparu
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Nederīgs pārbaudes cipars' };
75  }
76  
77  return { isValid: true };
78}
79
80// Lietošanas piemērs
81console.log(generateCuitCuil(20, 12345678)); // Ģenerēt konkrētam DNI
82console.log(generateCuitCuil(27)); // Ģenerēt ar nejaušu DNI
83console.log(validateCuitCuil("20-12345678-9")); // Apstiprināt 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        // Pārvērst par virkni un nodrošināt, ka DNI ir 8 cipari ar vadošām nullēm
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Apvienot tips kodu un DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // Aprēķināt produktu summu
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Aprēķināt pārbaudes ciparu
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Īpašie gadījumi
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("Nederīgs tips kods. Jābūt vienam no: " + VALID_TYPE_CODES);
39        }
40        
41        // Ģenerēt nejaušu DNI, ja nav norādīts
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Aprēķināt pārbaudes ciparu
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // Formatēt CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Noņemt defises, ja ir
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Pārbaudīt pamatformātu
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Nederīgs formāts");
61        }
62        
63        // Izvilkt daļas
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        // Apstiprināt tips kodu
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Nederīgs tips kods");
71        }
72        
73        // Aprēķināt un salīdzināt pārbaudes ciparu
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Nederīgs pārbaudes cipars");
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        // Lietošanas piemērs
102        System.out.println(generateCuitCuil(20, 12345678)); // Ģenerēt konkrētam DNI
103        System.out.println(generateCuitCuil(27, null)); // Ģenerēt ar nejaušu DNI
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Apstiprināt CUIT/CUIL
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Pārvērst par virkni un nodrošināt, ka DNI ir 8 cipari ar vadošām nullēm $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Apvienot tips kodu un DNI $digits = $typeCodeStr . $dniStr; // Svari katrai pozīcijai $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Aprēķināt produktu summu $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Aprēķināt pārbaudes ciparu $verificationDigit = 11 - ($sumProducts % 11); // Īpašie gadījumi if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Derīgie tips kodi $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Nederīgs tips kods. Jābūt vienam no: " . implode(', ', $validTypeCodes)); } // Ģenerēt nejaušu DNI, ja nav norādīts if ($dni === null) { $dni = rand(10000000, 99999999); } // Aprēķināt pārbaudes ciparu $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatēt CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Noņemt defises, ja ir $cuitCuilClean = str_replace('-', '', $cuitCuil); // Pārbaudīt pamatformātu if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Nederīgs formāts']; } // Izvilkt daļas $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, ## Bieži uzdotie jautājumi ### Kāda ir atšķirība starp CUIT un CUIL? Šeit ir praktiskā atšķirība: **CUIT** (Clave Única de Identificación Tributaria) identificē nodokļu maksātājus — gan fiziskas personas, gan uzņēmumus, kas iesniedz nodokļus AFIP. **CUIL** (Clave Única de Identificación Laboral) identificē darbiniekus sociālās drošības sistēmā nodarbinātības un pensionēšanās nolūkos. Praksē daudzām personām ir gan CUIL (no viņu pirmās darbavietas), un vēlāk viņas var iegūt CUIT (ja kļūst par pašnodarbinātām vai sāk uzņēmumu). Numuri izmanto identiskus formatēšanas un aprēķinu noteikumus, tāpēc no validācijas viedokļa tos apstrādā vienādi. Atšķirība ir svarīga administratīvos nolūkos: algu sistēmas parasti strādā ar CUIL, savukārt rēķinu un nodokļu sistēmas izmanto CUIT. ### Kādus veida kodus izmanto fiziskām personām un kādus uzņēmumiem? Fiziskām personām: - 20, 23, 24: Vīriešu personas (CUIL) - 27: Sieviešu personas (CUIL) Uzņēmumiem un organizācijām: - 30: Korporācijas (CUIT) - 33: Pilsoniskās asociācijas (CUIT) - 34: Fondi (CUIT) ### Kā tiek aprēķināts pārbaudes cipars? Algoritms izmanto svērto reizināšanu: ņem katru no pirmajiem 10 cipariem, reizina ar svariem **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, summē reizinājumus, tad aprēķina 11nus (summa modulo 11). Divas īpašās situācijas var mulsināt: ja aprēķins dod 11, izmanto 0 kā pārbaudes ciparu; ja tas dod 10, izmanto 9. Šīs īpašās situācijas pastāv tāpēc, ka pārbaudes ciparam jābūt viencipara skaitlim (0-9). Šis ir modulo-11 pārbaudes cipara algoritms, līdzīgs tam, ko izmanto ISBN-10 kodos un citās identifikācijas sistēmās pasaulē. ### Vai varu izmantot šo rīku, lai ģenerētu īstus, oficālus CUIT/CUIL numurus? Nē — šis rīks ģenerē matemātiski derīgus testēšanas datus, bet numuri nav oficiāli reģistrēti AFIP. Domājiet par to kā par derīga kredītkartes numura ģenerēšanu, izmantojot Luhn algoritmu: tas iztur formāta validāciju, bet nav saistīts ar īstu kontu. Oficiālai CUIT/CUIL reģistrācijai fiziskām personām jāapmeklē AFIP ar savu DNI, savukārt uzņēmumiem jāveic korporatīvās reģistrācijas procedūras. Rīks ir paredzēts tikai izstrādei, testēšanai un izglītojošiem nolūkiem, kur nepieciešami derīgi izskatāmies dati, kas nekonfliktēs ar īstiem identifikācijas numuriem. ### Kāpēc mana CUIT/CUIL validācija neizdodas, lai gan formāts izskatās pareizs? Kad validācija neizdodas, neskatoties uz pareizi izskatošos formatējumu, pārbaudiet šos izplatītos iemeslus: 1. **Nederīgs veida kods**: Derīgi ir tikai 20, 23, 24, 27, 30, 33, 34. Izmantojot 21, 25 vai citus skaitļus, validācija neizdosies. 2. **Nepareizs pārbaudes cipars**: Pēdējam ciparam jāatbilst algoritma aprēķinam. Pat mainot vienu ciparu DNI daļā, jāpārrēķina pārbaudes cipars. 3. **Formāta problēmas**: Jābūt tieši 11 cipariem (XX-XXXXXXXX-X). Uzmanieties pēc liekām atstarpēm vai trūkstošiem vadošiem nulles cipariem. 4. **Slēpti rakstzīmes**: Kopējot no PDF vai tīmekļa vietnēm, dažreiz tiek ieviestas neredzamas Unicode rakstzīmes, kas bojā validāciju. Ātra atkļūdošanas padoms: noņemiet pēdējo ciparu un manuāli pārrēķiniet to. Ja tas neatbilst, tad tas ir jūsu problēmas cēlonis. ### Vai defises ir obligātas CUIT/CUIL numuros? Defises ir tikai displeja formatēšanai — tās nav daļa no faktiskā numura aprēķina. Kad redzat **20-12345678-9**, algoritms rūpējas tikai par 11 cipariem: **20123456789**. Lielākā daļa validācijas ieviešanu noņem defises pirms apstrādes, tāpēc mūsu rīks pieņem gan **20-12345678-9**, gan **20123456789**. API un datubāzēs jūs parasti saglabāsiet nedefizēto versiju un pievienosiet defises tikai, kad rādāt lietotājiem. Šī pieeja novērš formatēšanas nekonsekvences, kas varētu izraisīt validācijas kļūmes. ### Vai CUIT/CUIL numurā var būt mazāk par 8 cipariem DNI daļā? DNI daļai vienmēr jābūt tieši 8 cipariem — bez izņēmumiem. Ja kāda personas faktiskais DNI satur mazāk ciparu (kas notiek ar vecākiem, zemāk numurētiem DNI), jāaizpilda ar vadošām nullēm. Piemēram, DNI **1234567** kļūst par **01234567** CUIT/CUIL struktūrā. Šis ir bieža kļūdu avots, konvertējot starp DNI un CUIT/CUIL formātiem. Esmu redzējis sistēmas, kas neiztur validāciju, jo aizmirsa pievienot nulles, apstrādājot **1234567**7 ciparu skaitli, nevis **01234567**. Vienmēr izmantojiet nulles pievienošanas funkcijas savā kodā, nevis vienkāršu virkņu konkatenāciju. ### Kā es varu pārbaudīt, vai CUIT/CUIL ir oficiāli reģistrēts Argentīnā? Mūsu rīks validē matemātisko pareizību — formātu, veida kodu un pārbaudes ciparu. Bet tas nevar pateikt, vai numurs ir faktiski reģistrēts AFIP vai pieder īstai personai vai uzņēmumam. Oficiālai pārbaudei izmantojiet [AFIP tīmekļa pakalpojumus](https://www.afip.gob.ar/) vai viņu "Constancia de Inscripción" meklēšanas rīku. AFIP piedāvā API automatizētai pārbaudei, lai gan jums būs jāreģistrējas kā izstrādātājam un jāautentificējas. Ražošanas vidēs īstenojiet abas pakāpes: vispirms veiciet algoritmisko validāciju (ātri, uztver drukas kļūdas un formāta kļūdas), tad pārbaudiet pret AFIP datubāzi (lēnāk, bet apstiprina, ka numurs ir īsts un aktīvs). ### Vai varu izmantot šo rīku savā komerciālajā lietojumprogrammā? Jā — CUIT/CUIL validācijas algoritms ir publisks standarts, ko definējis AFIP, tāpēc jūs varat brīvi to īstenot komerciālā programmnodrošinājumā. Šeit sniegtie koda piemēri ir paredzēti kā atsauces īstenošanas. Ražošanas lietojumam ņemiet vērā šos labākos praktiskos paņēmienus: īstenojiet pareizu kļūdu apstrādi īpašām situācijām, pievienojiet žurnalizāciju validācijas kļūmju atkļūdošanai, validējiet pret AFIP oficiālo datubāzi (ne tikai algoritmiski), un saglabājiet savu īstenošanu atjauninātu, ja AFIP maina noteikumus (lai gan pašreizējais algoritms ir bijis stabils gadu desmitiem). ### Vai rīks saglabā kādu no ģenerētajiem vai validētajiem CUIT/CUIL numuriem? Nē — visa apstrāde notiek jūsu pārlūkprogrammā (klienta pusē). Kad ģenerējat vai validējat CUIT/CUIL, aprēķins notiek lokāli, izmantojot JavaScript. Nekas netiek nosūtīts uz mūsu serveriem, un mēs nereģistrējam, nesaglabājam un nekontrolējam nevienu skaitli, ko jūs ievadāt vai ģenerējat. Šī klienta puses pieeja nodrošina privātumu un arī nozīmē, ka rīks darbojas bezsaistē pēc lapas ielādes. Jūs varat to pārbaudīt, atverot savas pārlūkprogrammas izstrādātāju rīkus un novērojot tīkla cilni — jūs neredzēsiet nevienu pieprasījumu, ģenerējot vai validējot skaitļus. ## Atsauces 1. AFIP (Federālā publisko ieņēmumu administrācija). "CUIT/CUIL/CDI." Oficiālā vietne. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Darba, nodarbinātības un sociālās drošības ministrija. "CUIL - Unikālā darba identifikācijas atslēga." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Valsts sociālās drošības administrācija). "Iegūt manu CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Argentīnas Republikas Oficiālais biļetens. "AFIP Vispārīgā rezolūcija 2854/2010: Procedūra. Unikālā nodokļu identifikācijas atslēga (C.U.I.T.)." 5. Argentīnas Republikas Fiskālais kodekss. "Nodokļu maksātāju identifikācija un reģistrācija." --- Neatkarīgi no tā, vai jūs veidojat rēķinu sistēmu, pārbaudāt darbinieku reģistrācijas plūsmas vai mācāties par validācijas algoritmiem, šis rīks nodrošina CUIT/CUIL ģenerēšanu un validāciju, kāda jums nepieciešama. Ģenerējiet pārbaudes datus, kas iztur algoritmisko validāciju, pārbaudiet numurus pirms to ievietošanas datubāzē vai izpētiet, kā kontrolcipara algoritms darbojas praksē.