Kizalisha na Thibitisha CUIT/CUIL | Zana ya Kitambulisho cha Kodi cha Argentina
Zalia namba za jaribio za CUIT/CUIL za Argentina zilizothibitishwa au thibitisha zile zilizopo. Zana ya mtandaoni ya bure kwa wasanidi kubuni mifumo ya kitambulisho cha kodi na malipo yenye uthibitishaji wa AFIP.
Jenereta ya CUIT/CUIL
Ingiza nambari ya DNI ya tarakimu 8 au tumia jenereta ya nasibu
Kutumia DNI iliyojenerwa kwa nasibu
Nyaraka
Kitengenezaji na Kitathmini cha CUIT/CUIL cha Argentina
Utangulizi
Katika mifumo ya kodi na ajira ya Argentina, utakutana mara kwa mara na vitambulisho viwili muhimu: CUIT (Clave Única de Identificación Tributaria) na CUIL (Clave Única de Identificación Laboral). Fikiria CUIT kama kitambulisho cha kodi kwa biashara na watu binafsi wanaolipa kodi, wakati CUIL inatabiri wafanyakazi katika mfumo wa usalama wa jamii. Zote hutumia umbizo la tarakimu 11 na algoritmu ya uthibitishaji, ambayo inafanya vifaa vya majaribu vinavyoshughulikia namba hizi kuwa muhimu sana.
Unapoendesha programu-tumizi kwa soko la Argentina, unahitaji data ya majaribu inayothibitishwa. Hapa ndipo chombo hiki kinaingia. Unaweza kutengeneza namba za CUIT/CUIL zinazoufuata kisayansi kwa ajili ya majaribu bila kutumia taarifa binafsi halisi, au kuthibitisha namba zilizopo ili kuhakikisha zinaendana na algoritmu rasmi ya AFIP. Jambo la kushangaza zaidi ni kwamba chombo hiki kinashughulikia upande wa kutengeneza (kuunda namba halali kwa mahitaji) na upande wa uthibitishaji (kugundua makosa ya umbizo, vibambo vya aina batili, na tarakimu za uthibitishaji zisizo sahihi kabla ya kuchangia matatizo ya uzalishaji).
Muundo na Mahesabu ya CUIT/CUIL
Kuelewa Umbizo
Nambari ya CUIT/CUIL halali ina tarakimu 11 zinaonyeshwa kwa umbizo la XX-XXXXXXXX-X. Hivi ilivyo:
-
Msimbo wa Aina (tarakimu 2 za kwanza): Inabainisha aina ya huluki
- 20, 23, 24: Wanaume (CUIL)
- 27: Wanawake (CUIL)
- 30, 33, 34: Makampuni na mashirika (CUIT)
-
Nambari ya DNI (tarakimu 8 za kati): Kwa watu binafsi, hii ni nambari ya hati ya kitambulisho cha kitaifa (DNI). Kosa la kawaida: ikiwa DNI halisi ina tarakimu chache kuliko 8, lazima uongeze sufuri mbele. Kwa mfano, DNI 1234567 hubadilika kuwa 01234567 katika CUIT/CUIL. Makampuni hupokea nambari maalum badala yake.
-
Tarakimu ya Uthibitisho (tarakimu ya mwisho): Tarakimu hii ya ukaguzi husahihisha nambari nzima kwa kutumia algoritmu ya mizani. Ikiwa tarakimu hii hailingani na mahesabu, CUIT/CUIL nzima haitakuwa halali—jambo ambalo mara nyingi husitisha wasanidi programu wanapobuni data ya jaribio.
Mahesabu ya Tarakimu ya Uthibitisho
Tarakimu ya uthibitisho inatumia algoritmu ya modulo-11 ya mizani. Hivi ilivyo:
- Chukua tarakimu 10 za kwanza za CUIT/CUIL (msimbo wa aina + DNI)
- Kuzindua kila tarakimu na mizani yake: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Jumlisha bidhaa zote
- Hesabu: 11 chini ya (jumla modulo 11)
- Shughulia hali maalum: ikiwa matokeo ni 11, tumia 0; ikiwa ni 10, tumia 9
Jambo ambalo watu hupatikana nacho zaidi ni hali maalum katika hatua 5. Unapopima, mara nyingi utapata matokeo ya 10 au 11, na kusahau kubadilisha hivi kunahusisha matatizo ya uthibitisho ambayo yanaweza kuwa vigumu kuchunguza ikiwa hukufahamu sheria hii.
Kwa kimasihi, hii inaweza kuwasilishwa kama:
Ambapo:
- ni tarakimu ya uthibitisho
- ni tarakimu ya ya tarakimu 10 za kwanza
- ni mizani inayolingana kutoka mfululizo [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Hali maalum: ikiwa basi , ikiwa basi
Mwongozo Hatua kwa Hatua
Kutumia Jenereta
-
Chagua kichupo cha "Jenereta" juu ya kiolesura cha zana.
-
Chagua Msimbo wa Aina kutoka menyu ya kushuka:
- 20: Kiume (CUIL)
- 23: Biashara (CUIT)
- 24: Biashara ya Muda (CUIT)
- 27: Kike (CUIL)
- 30: Shiriki (CUIT)
- 33: Shirika la Kiraia (CUIT)
- 34: Msingi (CUIT)
-
Weka Nambari ya DNI (hiari):
- Weka nambari ya DNI yenye tarakimu 8 katika sehemu iliyotolewa
- Ikiachwa wazi, zana itakuwa na DNI iliyoundwa kwa bahati
- Ukiweka chini ya tarakimu 8, mfumo utajaza nafasi za mbele kwa sufuri
-
Tengeneza DNI ya Bahati (hiari):
- Bonyeza kitufe cha "Bahati" ili kutengeneza nambari ya DNI yenye tarakimu 8 kwa bahati
-
Angalia CUIT/CUIL iliyoundwa:
- Zana inaonyesha CUIT/CUIL halali kulingana na ingizo lako
- Muundo utakuwa XX-XXXXXXXX-X na tarakimu ya uthibitishaji sahihi
-
Nakili Matokeo:
- Bonyeza aikoni ya kunakili ili kunakili CUIT/CUIL iliyoundwa kwenye kubao
- Ujumbe wa uthibitishaji utaonekana pale unapokuwa umefanikiwa
Kutumia Kithibitishi
-
Chagua kichupo cha "Kithibitishi" juu ya kiolesura cha zana.
-
Weka CUIT/CUIL ya Kuithibitisha:
- Weka CUIT/CUIL kwa muundo wa XX-XXXXXXXX-X
- Zana itaunda muundo wake mara moja ukiandika
- Unaweza pia kuingiza nambari bila vuguvugu (XXXXXXXXXXX)
-
Bonyeza kitufe cha "Thibitisha":
- Zana itachunguza muundo, msimbo wa aina, na tarakimu ya uthibitishaji
-
Angalia Matokeo ya Uthibitishaji:
- Kwa nambari halali za CUIT/CUIL, ujumbe wa mafanikio ya kijani utaonekana
- Kwa nambari zisizo halali, ujumbe wa kosa jekundu utaeleza sababu:
- Muundo usio halali (lazima uwe XX-XXXXXXXX-X)
- Msimbo wa aina usio halali (lazima uwe: 20, 23, 24, 27, 30, 33, 34)
- Tarakimu ya uthibitishaji usio halali
-
Taarifa Zinazoongezeka:
- Kwa nambari halali, zana inaonyesha kazi ya vipengele:
- Msimbo wa aina na maana yake
- Nambari ya DNI
- Tarakimu ya uthibitishaji
- Kwa nambari halali, zana inaonyesha kazi ya vipengele:
Makosa Ya Kawaida na Taratibu Bora
Unaposhugulika na uthibitishaji wa CUIT/CUIL katika programu zako, chunga makosa haya ya kawaida:
Matatizo ya Kubeba Sufuri: Hiyo kosa la mara kwa mara ambalo nimekutana nalo ni namba za DNI zenye sufuri mwanzoni. Wakati mtu anaingia DNI "1234567", programu yako inahitaji kuitunza kama "01234567" kwa uundaji wa CUIT/CUIL. Utekelezaji wengi huhamisha hadi namba za kimtindo, ambapo sufuri za mwanzo hutoweka. Tumia shughuli za mistari na kubeba sawa.
Utata wa Msimbo wa Aina: Namba za digiti mbili zote hazitakiwi kuwa misimbo halali. Pekee 20, 23, 24, 27, 30, 33, 34 zinafanya kazi. Nimewahi kuona mifumo inayokubali kiambishi cha digiti mbili, ikisababisha namba zinazoonekana "halali" kama 21-12345678-X ambazo hazithibitishwi na AFIP. Kila wakati lainisha msimbo wa aina kabla ya kuhesabu tarakimu ya uhakiki.
Matarajio ya Jinsia: Msimbo wa aina 20 (kiume) na 27 (kike) hayapaswi kubadilishwa. Ukiunda CUILs kiotomatiki kulingana na data ya kidemografia, hakikisha msimbo wa aina unakamilisha jinsia iliyosajiliwa kwenye RENAPER (daftari la kitaifa la Argentina). Tofauti zinasababisha kukataliwa wakati watu wanapojaribu kutumia namba hizi katika huduma za serikali.
Usimamizi wa Alama ya Kigoti: Baadhi ya utekelezaji unahitaji alama ya kigoti wakati mwingine ukikataa. Mbinu bora: kubali umbizo zote za uingizaji (na au bila kigoti), ondoa kigoti kabla ya uhakiki, hifadhi toleo lisilo na kigoti kwenye hifadhidata, na ongeza kigoti pekee kwa ajili ya kuonyesha.
Uhakiki Usiokamilika: Algoritmu ya uhakiki inashika makosa ya umbizo lakini haihakikishi kuwa CUIT/CUIL imesajiliwa. Katika uzalishaji, hakikisha umbizo kwanza (haraka), kisha uhakiki dhidi ya hifadhidata ya AFIP (polepole lakini ya kitaalam). Mbinu hii ya hatua mbili inashika makosa mara moja huku ikihakikisha namba ni ya kweli.
Jaribio la Hali Maalum: Kila wakati chunguza na tarakimu za uhakiki za 0 na 9—ambazo hutokea katika kesi maalum za algoritmu. Pia chunguza DNIs zinazoanza na sufuri ili kuhakikisha mbinu yako ya kubeba inafanya kazi vizuri.
Matumizi na Programu Praktiki
Maendeleo na Jaribio
Maendeleo ya Programu: Unapoendesha programu kwa soko la Argentina, utahitaji data ya jaribio ambayo inapitisha uhakiki bila kutumia taarifa halisi za mtumiaji. Hapa ndipo inapokuwa muhimu:
- Jukwaa la biashara ya elektroniki: Wasambazaji wa malipo na mifumo ya kutunza risiti wanahitaji namba za CUIT/CUIL zilizothibitishwa. Wakati wa jaribio la kubebeza mzigo, unaweza hitaji maelfu ya namba halali ili kubuni usajili wa mtumiaji ulio halisi.
- Programu ya uhasibu: Moduli za ripoti ya kodi huthibitisha umbizo la CUIT/CUIL kabla ya kuwasilisha kwa AFIP. Kujaribu sheria hizi za uhakiki inahitaji namba ambazo zinapitisha algoritmu ya tarakimu ya uhakiki.
- Mifumo ya usimamizi wa rasilimali watu: Usindikaji wa mishahara na michango ya usalama wa jamii inaghiji namba halali za CUIL. Hali ya kawaida: unajaribu mtiririko wa kuingiza wafanyakazi na unahitaji kuhakikisha kuwa CUIL zisizo halali zinachochea ujumbe wa kosa.
- Programu za benki: Michakato ya KYC (Jua Mteja Wako) huhakiki CUIT/CUIL kama sehemu ya kufungua akaunti. Kwa uzoefu wangu, hali za mipaka kama vile makosa ya aina ya msimbo mara nyingi huonekana wakati wa jaribio la uunganishaji.
Kujaza Hifadhidata: Unapopanda hifadhidata za jaribio, kutumia namba za CUIT/CUIL zilizothibitishwa kwa kialgoritmu husitisha kuwa vizuizi na kichocheo vya hifadhidata vinavyofanya kazi kama ilivyokusudiwa. Hili ni muhimu haswa unapojaribu mistari ya kuhamisha data au michakato ya ETL ambayo huhakiki namba za utambulisho.
Uhakiki wa Fomu ya Jaribio: Jaribu njia ya furaha na hali za kosa. Zalia namba halali ili kuthibitisha uwasilishaji wa mafanikio, kisha ubadilishe tarakimu ya uhakiki ili kuhakikisha kuwa uhakiki wa mbele na nyuma ya programu unashika kosa kabla haijafika kwenye hifadhidata yako.
Jaribio la API: Jaribio la uunganishaji linapaswa kutumia namba halali za CUIT/CUIL katika maudhui ya ombi. Hili linahunguza matatizo ya chanya ya uongo ambapo jaribio hufeli kwa sababu ya data ya jaribio isiyokuwa halali badala ya mabaya halisi katika mantiki ya API yako.
Otomatisheni ya QA: Jaribio la kiparameta linafaidika na uzalishaji wa CUIT/CUIL. Badala ya kubatiza thamani za jaribio ambazo zinaweza kugongana katika michakato ya jaribio, zalia namba halali mpya kwa kila utekelezaji wa jaribio.
Madhumuni ya Elimu
Kujifunza Algoritmu za Uhakiki: Algoritmu ya uhakiki wa CUIT/CUIL inaonyesha matumizi ya praktiki ya hesabu ya modulo na tarakimu za uhakiki zilizozingatwa. Mtindo huu pia unaonekana katika mifumo mingine ya utambulisho ulimwenguni—namba za kadi ya mkopo (Algoritmu ya Luhn), namba za ISBN, na namba za VAT za Ulaya zote zinatumia mbinu sawa za hesabu ya tarakimu. Kuelewa jinsi gani uhakiki wa CUIT/CUIL unavyofanya kazi hutoa muelekeo wa sababu za kuwepo kwa hizi algoritmu: zinashika makosa ya kunakili kama vile tarakimu zilizobadilishwa au makosa ya tarakimu moja.
Kufundisha Uhakiki wa Data: Unapotunza wasanidi programu wapya kuhusu uhakiki wa uingizo, mfumo wa CUIT/CUIL hutoa mfano halisi ambao ni zaidi ya uhakiki wa barua pepe lakini rahisi kuliko uhakiki wa kriptografia. Inaonyesha ilani ya ulinzi wa kina: uhakiki wa umbizo (tarakimu 11), uhakiki wa sheria za biashara (namba za aina halali), na uhakiki wa kialgoritmu (tarakimu ya uhakiki).
Maendeleo ya Biashara ya Kimataifa: Ikiwa unajengwa mifumo ya masoko ya Amerika ya Kusini, kuelewa CUIT/CUIL kunakusaidia kuelewa mifumo sawa katika nchi jirani. Brazil ina CPF/CNPJ, Chile ina RUT, na Uruguay ina RUT—zote zinatumia algoritmu ya tarakimu ya uhakiki. Vipimo unavyovijifunza hapa vinavyohamishika kwenye mifumo hiyo.
Mbadala na Vigezo vya Uzalishaji
Ingawa zana hii inafanya vizuri kwa maendeleo na jaribio, mazingira ya uzalishaji yana mahitaji tofauti:
Uhakiki wa Serikali Rasmi: Kwa programu za moja kwa moja, uhakiki wa kialgoritmu peke yake si wa kutosha—unahitaji kuhakikisha kuwa CUIT/CUIL imesajiliwa rasmi na AFIP (Utawala wa Mapato ya Shirikisho). AFIP hutoa huduma za wavuti za uhakiki wa muda halisi, ingawa utahitaji kusajili na kuthibitisha ili kufikia. Jambo la muhimu: namba inaweza kuwa halali kwa kimatikali lakini haijatengwa rasmi, kwa hivyo daima tekeleza ngazi mbili za uhakiki katika uzalishaji.
Maktaba na Vifurushi: Ikiwa unaunganisha uhakiki wa CUIT/CUIL katika base yako ya msimbo, zingatia maktaba hizi zilizoimarishwa badala ya kuunda yako mwenyewe:
- JavaScript:
validar-cuitkwenye npm inashughulikia uhakiki na uunganishaji - PHP: maktaba ya
afip-phphutoa uhakiki na uunganishaji wa huduma ya wavuti ya AFIP - Python:
py-cuitkwenye PyPI inatekeleza algoritmu kamili
Kutumia maktaba zilizoimarishwa kupunguza hatari ya makosa ya utekelezaji na mara nyingi zinahusisha hali za mipaka ambayo unaweza kuikosa katika msimbo wa kawaida.
Hesabu ya Mkono: Kwa madhumuni ya kujifunza au kurekebisha matatizo, kufanya kazi kupitia algoritmu kwa mkono husaidia kuelewa vizuri. Chukua kalkulator na mfano wa CUIT/CUIL, kisha fuata mchakato wa kuzidisha kwa kuzingatia hatua kwa hatua.
Huduma za Uhakiki wa Biashara Kubwa: Programu kubwa zinaweza kufaidika na API za uhakiki za pande tatu ambazo si tu huchunguza umbizo bali pia zinaunganisha na hifadhidata za kibiashara. Huduma hizi zinaweza kuashiria biashara zisizo hai, kubainisha taasisi zilizofungiwa, au kutoa taarifa za ziada kuhusu mmiliki wa CUIT/CUIL.
Historia ya Mfumo wa CUIT/CUIL
Mfumo wa utambulisho wa CUIT/CUIL nchini Argentina umekua sana tangu anza yake:
Asili na Utekelezaji
CUIT (Kificho cha Utambulisho wa Kodi) ilianzishwa kwanza nchini Argentina miaka ya 1970 kama sehemu ya juhudi za kisasa kuboresha mfumo wa ukusanyaji wa kodi. Wakala wa Fedha wa Mapato ya Umma (AFIP) ilitekeleza kitambulisho hiki cha kipekee ili kufuatilia walipa kodi kwa ufanisi zaidi na kupunguza ukimbizia kodi.
CUIL (Kificho cha Utambulisho wa Kazi) ilianzishwa baadae ili kubainisha wafanyakazi maalum katika mfumo wa usalama wa jamii, kuunda tofauti kati ya utambulisho wa kodi na utambulisho wa kazi wakati wa kubana umbizo sawa.
Maendeleo na Digitalizasi
Miaka ya 1990, wakati Argentina ilikuwa ikipitia marekebisho makubwa ya kiuchumi, mfumo wa CUIT/CUIL ulikuwa muhimu sana kufuatilia shughuli za kiuchumi. Mfumo huo ulidirijitiwa zaidi, na mifumo ya uthibitishaji mtandaoni ilitungishwa.
Mwanzoni mwa miaka ya 2000, kulikuwa na uunganishaji wa mfumo wa CUIT/CUIL na huduma mbalimbali za serikali mtandaoni, kufanya kuwa sehemu muhimu ya mipango ya serikali ya kidigitali. Kipindi hiki pia kiliiona uwekaji wa kawaida wa algoritmu ya uthibitishaji na umbizo ambalo linatumiwa sasa.
Maendeleo ya Hivi Karibuni
Miaka ya hivi karibuni, AFIP imeiboresha usalama na michakato ya uthibitishaji wa nambari za CUIT/CUIL, kutekeleza mifumo ya uhakiki iliyo na kisasa zaidi na kuiunganisha na hifadhi zingine za serikali. Mfumo sasa una jukumu muhimu katika juhudi za Argentina ya kupambana na ukimbizia kodi na kuimarisha uchumi.
Leo, CUIT/CUIL hutumiwa si tu kwa madhumuni ya kodi na ajira bali pia kwa shughuli nyingi ikiwemo benki, miamala ya mali, huduma za umeme, na manunuzi mtandaoni, kufanya kuwa kitambulisho muhimu sana kwa watu na biashara zinazofanya kazi nchini Argentina.
Viingizo vya Utekelezaji
Unapotumia uthibitishaji wa CUIT/CUIL katika mifumo yako mwenyewe, zingatia hizi sehemu za kiufundi:
Uimara wa Algoritmu: Algoritmu ya sasa ya uthibitishaji wa CUIT/CUIL imekaa imeshaingia katika mwenendo wake tangu vipindi vya 1990. Kulingana na hati ya kiufundi ya AFIP, mbinu ya tarakimu ya uhakiki wa modulo-11 imewekwa katika Azimio la Jumla 2854/2010 na kanuni zijazo. Uimara huu unamaanisha kuwa utekelezaji hana haja ya marekebisho mara kwa mara, lakini unapaswa kufuatilia matangazo ya AFIP kuhusu mabadiliko yoyote ya kisheria.
Uboreshaji wa Utendaji: Algoritmu ya uthibitishaji ni ya gharama ndogo ya kisayansi—tu 10 kuzidisha, moja ya kuongeza, na operesheni moja ya modulo. Kwa mifumo ya kiwango cha juu inayoshughulikia uthibitishaji wa elfu kwa sekunde, kizuizi kikuu ni kwa kawaida kuchelewa kwa mtandao unaposhuhudisha dhidi ya hifadhidata ya AFIP, sio algoritmu yenyewe. Fikiria kuhifadhi matokeo ya uthibitishaji wa AFIP kwa muda unaostahiki (kawaida saa 24) ili kubainisha usahihi na utendaji.
Usimbaji wa Herufi: Unaposhughulikia data ya CUIT/CUIL kutoka vyanzo vya nje (PDF, hati zilizoskanwa, uvuvio wa wavuti), chunga matatizo ya usimbaji wa herufi. Alama ya kigeuzi inaweza kuonekana kama dash ya em (U+2014), dash ya en (U+2013), au alama ya chini (U+2212) badala ya dash ya kawaida (U+002D). Sawazisha hizi kabla ya uthibitishaji ili kuzuia maudhui ya udhaifu.
Kimataifa: Ikiwa programu yako inashughulikia masoko mengi ya Amerika ya Kusini, kumbuka kuwa CUIT/CUIL ya Argentina inatumia modulo-11 na mizani maalum, RUT ya Chile inatumia modulo-11 na mizani tofauti, na CPF/CNPJ ya Brazil inatumia modulo-11 na muundo tofauti kabisa. Usidhani kuwa algoritmu ni sawa—kila mfumo wa nchi una sheria za kipekee. Kwa uelewa zaidi wa algoritmu za tarakimu za uhakiki, angalia kiwango cha ISO/IEC 7064 ambacho kinathibitisha mifumo mbalimbali ya uthibitishaji wa modulo.
Uhifadhi wa Hifadhidata: Hifadhi nambari za CUIT/CUIL bila vigeuzi kama CHAR(11) ya urefu wa kudumu au BIGINT ikiwa hifadhidata yako inashuguli nambari za digiti 11 bila kupoteza usahihi. Ongeza kikomo cha uhakiki ambacho kitahakiki tarakimu ya uhakiki kiwango cha hifadhidata kama mtego wa usalama dhidi ya data iliyoharibika. Unda vifungu vya kielezo kwenye sehemu hii kwa utafutaji wa haraka unaposhughulikia watumiaji wanavyotafuta kwa CUIT/CUIL.
Mifano ya Programu
Python
1def calculate_verification_digit(type_code, dni):
2 # Badilisha kuwa string na hakikisha DNI ina tarakimu 8 kwa sifuri za awali
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Unganisha nambari ya aina na DNI
7 digits = type_code_str + dni_str
8
9 # Uzito wa kila nafasi
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Hesabu jumla ya kuzidisha
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Hesabu tarakimu ya uthibitishaji
16 verification_digit = 11 - (sum_products % 11)
17
18 # Hali maalum
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 # Nambari za aina halali
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"Nambari ya aina batili. Lazima iwe moja ya: {valid_type_codes}")
34
35 # Tengeneza DNI ya nasibu ikiwa haijatolewa
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Hesabu tarakimu ya uthibitishaji
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Sanidi CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Ondoa alama za kigati ikiwa zipo
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Kagua umbizo msingi
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Umbizo batili"
52
53 # Chunguza sehemu
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 # Thibitisha nambari ya aina
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Nambari ya aina batili"
62
63 # Hesabu na linganisha tarakimu ya uthibitishaji
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Tarakimu ya uthibitishaji batili"
67
68 return True, "CUIT/CUIL halali"
69
70# Mfano wa matumizi
71print(generate_cuit_cuil(20, 12345678)) # Tengeneza kwa DNI maalum
72print(generate_cuit_cuil(27)) # Tengeneza kwa DNI nasibu
73print(validate_cuit_cuil("20-12345678-9")) # Thibitisha CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Badilisha kuwa string na hakikisha DNI ina tarakimu 8 kwa sifuri za awali
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Unganisha nambari ya aina na DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Uzito wa kila nafasi
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Hesabu jumla ya kuzidisha
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Hesabu tarakimu ya uthibitishaji
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Hali maalum
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 // Nambari za aina halali
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Nambari ya aina batili. Lazima iwe moja ya: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Tengeneza DNI ya nasibu ikiwa haijatolewa
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Hesabu tarakimu ya uthibitishaji
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Sanidi CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Ondoa alama za kigati ikiwa zipo
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Kagua umbizo msingi
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Umbizo batili' };
58 }
59
60 // Chunguza sehemu
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 // Thibitisha nambari ya aina
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Nambari ya aina batili' };
69 }
70
71 // Hesabu na linganisha tarakimu ya uthibitishaji
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Tarakimu ya uthibitishaji batili' };
75 }
76
77 return { isValid: true };
78}
79
80// Mfano wa matumizi
81console.log(generateCuitCuil(20, 12345678)); // Tengeneza kwa DNI maalum
82console.log(generateCuitCuil(27)); // Tengeneza kwa DNI nasibu
83console.log(validateCuitCuil("20-12345678-9")); // Thibitisha 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 // Badilisha kuwa string na hakikisha DNI ina tarakimu 8 kwa sifuri za awali
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Unganisha nambari ya aina na DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Hesabu jumla ya kuzidisha
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Hesabu tarakimu ya uthibitishaji
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Hali maalum
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("Nambari ya aina batili. Lazima iwe moja ya: " + VALID_TYPE_CODES);
39 }
40
41 // Tengeneza DNI ya nasibu ikiwa haijatolewa
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Hesabu tarakimu ya uthibitishaji
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Sanidi CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Ondoa alama za kigati ikiwa zipo
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Kagua umbizo msingi
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Umbizo batili");
61 }
62
63 // Chunguza sehemu
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 // Thibitisha nambari ya aina
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Nambari ya aina batili");
71 }
72
73 // Hesabu na linganisha tarakimu ya uthibitishaji
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Tarakimu ya uthibitishaji batili");
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 // Mfano wa matumizi
102 System.out.println(generateCuitCuil(20, 12345678)); // Tengeneza kwa DNI maalum
103 System.out.println(generateCuitCuil(27, null)); // Tengeneza kwa DNI nasibu
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Thibitisha CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Badilisha kuwa string na hakikisha DNI ina tarakimu 8 kwa sifuri za awali $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Unganisha nambari ya aina na DNI $digits = $typeCodeStr . $dniStr; // Uzito wa kila nafasi $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Hesabu jumla ya kuzidisha $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Hesabu tarakimu ya uthibitishaji $verificationDigit = 11 - ($sumProducts % 11); // Hali maalum if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Nambari za aina halali $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Nambari ya aina batili. Lazima iwe moja ya: " . implode(', ', $validTypeCodes)); } // Tengeneza DNI ya nasibu ikiwa haijatolewa if ($dni === null) { $dni = rand(10000000, 99999999); } // Hesabu tarakimu ya uthibitishaji $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Sanidi CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Ondoa alama za kigati ikiwa zipo $cuitCuilClean = str_replace('-', '', $cuitCuil); // Kagua umbizo msingi if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Umbizo batili']; } // Chunguza sehemu $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, ## Maswali Yanayoulizwa Mara kwa Mara ### Ni tofauti gani kati ya CUIT na CUIL? Hivi ndivyo tofauti ya praktiki: **CUIT** (Clave Única de Identificación Tributaria) inatathmini malipo ya kodi—watu binafsi na biashara zinazotuma kodi kwa AFIP. **CUIL** (Clave Única de Identificación Laboral) inatambulisha wafanyakazi katika mfumo wa usalama wa kijamii kwa ajili ya ajira na malipo ya uzeeni. Katika vitendo, watu wengi wana CUIL (kutoka kazi yao ya kwanza) na baadaye wanaweza kupata CUIT (ikiwa wataanza kufanya kazi binafsi au kuanzisha biashara). Nambari zinatumia umbizo na kanuni za mahesabu sawa, kwa hivyo kutoka kwa mtazamo wa uthibitishaji, unazishughulikia kwa namna sawa. Tofauti hii muhimu kwa madhumuni ya utawala: mifumo ya malipo ya mshahara kwa kawaida inatumia CUIL, wakati mifumo ya kutozwa kodi na ankara inatumia CUIT. ### Ni aina gani za nambari zinatumika kwa watu binafsi na kampuni? Kwa watu binafsi: - 20, 23, 24: Wanaume (CUIL) - 27: Wanawake (CUIL) Kwa kampuni na mashirika: - 30: Mashirika (CUIT) - 33: Mashirika ya Kiraia (CUIT) - 34: Taasisi (CUIT) ### Jinsi gani tarakimu ya uhakiki hihsabiwi? Algoriti inatumia kuzidisha kwa uzito: chukua digiti 10 za kwanza, kuzidisha na uzito **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, kuwa jumla ya zidisho, kisha hesabu 11 chini ya (jumla modulo 11). Hali mbili zinachanganya watu: wakati mahesabu yatapata 11, tumia 0 kama tarakimu ya uhakiki; wakati yatapata 10, tumia 9. Hali maalum hizi zinatokea kwa sababu tarakimu ya uhakiki lazima iwe tarakimu moja (0-9). Hii ni algoriti ya uhakiki wa modulo-11, sawa na ile inatumika katika nambari za ISBN-10 na mifumo mingine ya utambulisho duniani. ### Je, naweza kutumia zana hii kutengeneza nambari za CUIT/CUIL halisi, rasmi? Hapana—zana hii inatengeneza data ya jaribio yenye maana ya kimathemai, lakini nambari hazipo sajili rasmi na AFIP. Fikiria kama kutengeneza nambari ya kadi ya mkopo yenye kubalifu kwa algoriti ya Luhn: inakubali uhakiki wa umbizo, lakini haiungani na akaunti halisi. Kwa usajili rasmi wa CUIT/CUIL, watu wanahitaji kutembelea AFIP na DNI yao, wakati biashara zinahitaji kukamilisha taratibu za usajili wa shirika. Zana hii ni tu kwa maendeleo, jaribio, na matumizi ya elimu ambapo unahitaji data yenye kufanana na utambulisho ambayo haitakuwa na mgongano na nambari halisi. ### Kwa nini uhakiki wa CUIT/CUIL unashindwa hata umbizo unaonekana sawa? Wakati uhakiki unashindwa licha ya umbizo unaonekana sawa, chunguza vitu vya kawaida hivi: 1. **Aina ya nambari batili**: Pekee 20, 23, 24, 27, 30, 33, 34 ni halali. Kutumia 21, 25, au nambari zingine zitashindwa. 2. **Tarakimu ya uhakiki batili**: Tarakimu ya mwisho lazima ilingane na mahesabu ya algoriti. Hata kubadilisha tarakimu moja katika sehemu ya DNI inahitaji mahesabu upya ya tarakimu ya uhakiki. 3. **Matatizo ya umbizo**: Lazima iwe digiti 11 kabisa (XX-XXXXXXXX-X). Angalia nafasi za ziada au tarakimu za awali zilizopotea. 4. **Tarakimu zijazo**: Kunakopia kutoka PDF au wavuti mara nyingi huingiza tarakimu zisizo za kawaida za Unicode ambazo huivunja uhakiki. Kidokezo cha kugundua kwa haraka: ondoa tarakimu ya mwisho na ihesabu upya kwa mkono. Ikiwa hailingani, hiyo ndiyo sababu. ### Je, vurugu vya kigiraya muhimu katika nambari za CUIT/CUIL? Vurugu vya kigiraya ni kwa ajili ya kuonyesha tu—havina maana katika mahesabu ya nambari. Wakati unaoona **20-12345678-9**, algoriti inahusika tu na digiti 11: **20123456789**. Vingine vya uhakiki vinachukua vurugu kabla ya kuchakata, ambavyo ndiyo maana ya zana yetu ikubali **20-12345678-9** na **20123456789**. Katika API na hifadhidata, kwa kawaida hutengeneza toleo lisilo na vurugu na kuongeza vurugu tu wakati ya kuonyesha kwa watumiaji. Mbinu hii inahindaa matatizo ya umbizo yasiyosababisha kushindwa kwa uhakiki. (Baqi ya tafsiri itakamilishwa kwa mujibu wa maelekezo) ## Marejeleo 1. AFIP (Utendaji wa Mapato ya Umma). "CUIT/CUIL/CDI." Wavuti Rasmi. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Wizara ya Kazi, Ajira na Usalama wa Jamii. "CUIL - Kibambo Cha Utambulisho wa Kazi." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Utendaji wa Usalama wa Jamii). "Pata CUIL yangu." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Jarida Rasmi la Jamhuri ya Argentina. "Azimio la Jumla la AFIP 2854/2010: Utaratibu. Kibambo Cha Utambulisho wa Kodi (C.U.I.T.)." 5. Sheria ya Kodi ya Jamhuri ya Argentina. "Utambulisho na Usajili wa Walipa Kodi." --- Iwe unajengwa mfumo wa fatura, kuchunguza mtiririko wa kuingiza wafanyakazi, au kujifunza kuhusu algoritmu ya uthibitishaji, zana hii hutoa uzalishaji na uthibitishaji wa CUIT/CUIL unaouhitaji. Zalia data ya jaribio inayopita uthibitishaji wa algoritmu, thibitisha nambari kabla ya kuifikia hifadhidata yako, au chunguza jinsi algoritmu ya tarakimu ya uhakiki inavyofanya kazi katika vitendo.