CUIT/CUIL Generator & Validator | Argentinsk skatte-ID-verktyg
Generera giltiga argentinska CUIT/CUIL testnummer eller validera befintliga. Gratis online-verktyg för utvecklare som testar skatte-ID och lönesystem med AFIP-kompatibel validering.
CUIT/CUIL Generator
Ange ett 8-siffrigt DNI-nummer eller använd slumpmässig generator
Använder slumpmässigt genererad DNI
Dokumentation
Argentinsk CUIT/CUIL-generator och validering
Introduktion
I Argentinas skatte- och arbetsystem stöter du ständigt på två kritiska identifierare: CUIT (Clave Única de Identificación Tributaria) och CUIL (Clave Única de Identificación Laboral). Tänk på CUIT som skatte-ID för företag och individer som betalar skatt, medan CUIL identifierar arbetstagare i socialförsäkringssystemet. Båda använder samma 11-siffriga format och verifieringsalgoritm, vilket gör testning av applikationer som hanterar dessa nummer särskilt viktigt.
När du utvecklar programvara för den argentinska marknaden behöver du giltiga testdata. Det är där detta verktyg kommer in. Du kan generera matematiskt korrekta CUIT/CUIL-nummer för testning utan att använda riktiga personuppgifter, eller validera befintliga nummer för att säkerställa att de överensstämmer med AFIP:s officiella algoritm. Det som är särskilt användbart är att verktyget hanterar både genererings- (skapa giltiga nummer på begäran) och valideringssidan (fånga formatfel, ogiltiga typkoder och felaktiga verifieringssiffror innan de orsakar produktionsproblem).
CUIT/CUIL-struktur och beräkning
Förstå formatet
Ett giltigt CUIT/CUIL-nummer består av 11 siffror som vanligtvis visas i formatet XX-XXXXXXXX-X. Här är hur det bryts ner:
-
Typkod (första 2 siffrorna): Identifierar enhetstypen
- 20, 23, 24: Manliga individer (CUIL)
- 27: Kvinnliga individer (CUIL)
- 30, 33, 34: Företag och organisationer (CUIT)
-
DNI-nummer (mellansta 8 siffrorna): För individer är detta deras nationella identitetsdokumentnummer (DNI). Ett vanligt misstag: om det faktiska DNI har färre än 8 siffror måste du fylla på med inledande nollor. Till exempel blir DNI 1234567 01234567 i CUIT/CUIL. Företag får ett unikt tilldelat nummer istället.
-
Verifieringssiffra (sista siffran): Denna kontrollsiffra validerar hela numret med hjälp av en viktad algoritm. Om denna siffra inte matchar beräkningen är hela CUIT/CUIL ogiltigt—något som ofta överraskar utvecklare när de manuellt konstruerar testdata.
Beräkning av verifieringssiffra
Verifieringssiffran använder en modulo-11 viktad algoritm. Så här fungerar det:
- Ta de första 10 siffrorna i CUIT/CUIL (typkod + DNI)
- Multiplicera varje siffra med sin motsvarande vikt: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Summera alla produkter
- Beräkna: 11 minus (summa modulo 11)
- Hantera gränsfall: om resultatet är 11, använd 0; om det är 10, använd 9
Det som oftast förvirrar folk är just dessa gränsfall i steg 5. När du testar får du ibland ett resultat på 10 eller 11, och att glömma bort att mappa dessa till 9 respektive 0 orsakar valideringsfel som kan vara svåra att felsöka om du inte är medveten om denna regel.
Matematiskt kan detta uttryckas som:
Där:
- är verifieringssiffran
- är den :te siffran av de första 10 siffrorna
- är motsvarande vikt från sekvensen [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Specialfall: om då , om då
Steg-för-steg-guide
Använda generatorn
-
Välj fliken "Generator" längst upp i verktygets gränssnitt.
-
Välj en typkod från rullgardinsmenyn:
- 20: Man (CUIL)
- 23: Företag (CUIT)
- 24: Tillfälligt företag (CUIT)
- 27: Kvinna (CUIL)
- 30: Aktiebolag (CUIT)
- 33: Civilförening (CUIT)
- 34: Stiftelse (CUIT)
-
Ange ett DNI-nummer (valfritt):
- Mata in ett 8-siffrigt DNI-nummer i det angivna fältet
- Om det lämnas tomt kommer verktyget att använda ett slumpmässigt genererat DNI
- Om du anger färre än 8 siffror kommer systemet att fylla på med inledande nollor
-
Generera slumpmässigt DNI (valfritt):
- Klicka på knappen "Slumpmässig" för att generera ett slumpmässigt 8-siffrigt DNI-nummer
-
Visa genererad CUIT/CUIL:
- Verktyget visar automatiskt en giltig CUIT/CUIL baserat på dina inmatningar
- Formatet kommer att vara XX-XXXXXXXX-X med rätt verifieringssiffra
-
Kopiera resultatet:
- Klicka på kopieringsikonen för att kopiera den genererade CUIT/CUIL till urklipp
- Ett bekräftelsemeddelande visas när kopieringen är slutförd
Använda validatorn
-
Välj fliken "Validator" längst upp i verktygets gränssnitt.
-
Ange CUIT/CUIL att validera:
- Mata in CUIT/CUIL i formatet XX-XXXXXXXX-X
- Verktyget formaterar automatiskt din inmatning med bindestreck när du skriver
- Du kan också ange numret utan bindestreck (XXXXXXXXXXX)
-
Klicka på knappen "Validera":
- Verktyget kontrollerar format, typkod och verifieringssiffra
-
Visa valideringsresultatet:
- För giltiga CUIT/CUIL-nummer visas ett grönt framgångsmeddelande
- För ogiltiga nummer visas ett rött felmeddelande som förklarar problemet:
- Ogiltigt format (måste vara XX-XXXXXXXX-X)
- Ogiltig typkod (måste vara en av: 20, 23, 24, 27, 30, 33, 34)
- Ogiltig verifieringssiffra
-
Ytterligare information:
- För giltiga nummer visar verktyget en uppdelning av komponenterna:
- Typkod och dess betydelse
- DNI-nummer
- Verifieringssiffra
- För giltiga nummer visar verktyget en uppdelning av komponenterna:
Vanliga misstag och bästa praxis
När du arbetar med CUIT/CUIL-validering i dina applikationer, var uppmärksam på dessa vanliga fallgropar:
Nollutfyllnadsproblem: Det vanligaste felet jag har stött på handlar om DNI-nummer med inledande nollor. När någon anger DNI "1234567" behöver din kod behandla det som "01234567" för CUIT/CUIL-konstruktion. Många implementationer konverterar till heltal för bearbetning, vilket tar bort inledande nollor. Använd strängoperationer med korrekt utfyllnad istället.
Typkodförvirring: Inte alla tvåsiffriga nummer är giltiga typkoder. Endast 20, 23, 24, 27, 30, 33, 34 fungerar. Jag har sett system som accepterar valfri tvåsiffrig prefix, vilket leder till "giltigt utseende" nummer som 21-12345678-X som misslyckas med AFIP-validering. Validera alltid typkoden innan du beräknar verifieringssiffran.
Könsmissuppfattningar: Typkod 20 (man) och 27 (kvinna) är inte utbytbara. Om du automatiskt genererar CUILer baserat på demografiska data, se till att din typkod matchar det kön som är registrerat hos RENAPER (Argentinas nationella register). Felaktigheter leder till avvisande när individer försöker använda dessa nummer med statliga tjänster.
Bindestreckhantering: Vissa implementationer kräver bindestreck medan andra avvisar dem. Bästa praxis: acceptera båda format i inmatningsfält (med eller utan bindestreck), ta bort bindestreck före validering, lagra den obundna versionen i databaser och lägg endast till bindestreck för visningsändamål.
Saknad verifiering: Algoritmsvalidering fångar formatfel men bekräftar inte att CUIT/CUIL är registrerad. I produktionsmiljö, validera format först (snabbt), verifiera sedan mot AFIP:s databas (långsammare men auktoritativt). Detta tvåstegsangreppssätt fångar stavfel omedelbart samtidigt som det säkerställer att numret är verkligt.
Gränsfallstestning: Testa alltid med verifieringssiffror 0 och 9 - dessa resultera från specialfall i algoritmen. Testa också DNI:er som börjar med nollor för att säkerställa att din utfyllnadslogik fungerar korrekt.
Användningsfall och praktiska tillämpningar
Utveckling och testning
Mjukvaruutveckling: När du bygger applikationer för den argentinska marknaden behöver du testdata som klarar validering utan att använda riktiga användaruppgifter. Här blir detta kritiskt:
- E-handelplattformar: Betalningsprocessorer och faktureringssystem kräver giltiga CUIT/CUIL-nummer. Under belastningstester kan du behöva tusentals giltiga nummer för att simulera realistiska användarregistreringar.
- Redovisningsprogram: Skatterapporteringsmoduler verifierar CUIT/CUIL-format innan inlämning till AFIP. Testning av dessa valideringsregler kräver nummer som klarar kontrollsiffrans algoritm.
- HR-hanteringssystem: Lönehantering och socialförsäkringsavgifter är beroende av giltiga CUIL-nummer. Ett vanligt scenario: du testar anställningsflöden och behöver verifiera att ogiltiga CUIL-nummer utlöser lämpliga felmeddelanden.
- Bankapplikationer: KYC-processer (Know Your Customer) validerar CUIT/CUIL som en del av kontoöppningen. Enligt min erfarenhet dyker gränsfallsscenarier som typkodsmatchningsfel ofta upp under integrationstestning.
Databaspopulering: När du seedar testdatabaser säkerställer användning av algoritmiskt giltiga CUIT/CUIL-nummer att dina databasbegränsningar och utlösare fungerar som förväntat. Detta är särskilt viktigt när du testar datamigrationsscript eller ETL-processer som validerar identifikationsnummer.
Formulärvalideringstestning: Testa både den lyckade vägen och felförhållanden. Generera giltiga nummer för att bekräfta lyckad inskickning, modifiera sedan verifieringssiffran för att säkerställa att din frontend- och backend-validering fångar felet innan det når din databas.
API-testning: Integrationstester bör använda giltiga CUIT/CUIL-nummer i begärandeinnehållet. Detta förhindrar falska negativa resultat där tester misslyckas på grund av ogiltig testdata snarare än faktiska buggar i din API-logik.
QA-automatisering: Parametriserade tester gynnas av dynamisk CUIT/CUIL-generering. Istället för att hårdkoda testvärden som kan konfliktera mellan testkörningar, generera nya giltiga nummer för varje testexekvering.
Utbildningssyfte
Lära sig valideringsalgoritmer: CUIT/CUIL-verifieringsalgoritmen visar praktisk tillämpning av modulo-aritmetik och viktade kontrollsiffror. Samma mönster förekommer i andra identifieringssystem världen över—kreditkortnummer (Luhn-algoritm), ISBN-koder och europeiska momsnummer använder liknande viktade kontrollsummeansatser. Att förstå hur CUIT/CUIL-validering fungerar ger insikt i varför dessa algoritmer finns: de fångar upp avskrivningsfel som omkastade siffror eller enstaka siffermisstag.
Undervisa datavalidering: När du utbildar juniora utvecklare i inmatningsvalidering erbjuder CUIT/CUIL-systemet ett verkligt exempel som är mer komplext än e-postvalidering men enklare än kryptografisk verifiering. Det demonstrerar principen om försvar på djupet: formatvalidering (11 siffror), affärsregelvalidering (giltiga typkoder) och algoritmisk validering (kontrollsiffra).
Internationell affärsutveckling: Om du bygger system för latinamerikanska marknader hjälper förståelsen av CUIT/CUIL dig att förstå liknande system i grannländerna. Brasilien har CPF/CNPJ, Chile har RUT, och Uruguay har RUT—alla använder kontrollsiffersalgoritmer. De mönster du lär dig här överförs till dessa system.
Alternativ och produktionsöverväganden
Medan detta verktyg fungerar bra för utveckling och testning har produktionsmiljöer olika krav:
Officiell statlig validering: För live-applikationer räcker algoritmisk validering inte—du behöver verifiera att CUIT/CUIL faktiskt är registrerat hos AFIP (Administración Federal de Ingresos Públicos). AFIP tillhandahåller webbtjänster för realtidsvalidering, även om du behöver registrera och autentisera dig för att komma åt dem. Kruxet: ett nummer kan vara matematiskt giltigt men inte officiellt tilldelat, så implementera alltid båda valideringsnivåerna i produktionen.
Bibliotek och paket: Om du integrerar CUIT/CUIL-validering i din kodbas, överväg dessa etablerade bibliotek snarare än att skapa din egen:
- JavaScript:
validar-cuitpå npm hanterar validering och formatering - PHP:
afip-php-biblioteket tillhandahåller både validering och AFIP-webbtjänsteintegrering - Python:
py-cuitpå PyPI implementerar hela algoritmen
Att använda underhållna bibliotek minskar risken för implementeringsfel och inkluderar ofta gränsfallsscenarier som du kan missa i anpassad kod.
Manuell beräkning: I utbildningssyfte eller för felsökning hjälper det att arbeta igenom algoritmen för hand. Ta fram en kalkylator och ett exempel-CUIT/CUIL, följ sedan den viktade multiplikationsprocessen steg för steg.
Företagsvalideringstjänster: Storskaliga applikationer kan dra nytta av tredjepartsvaliterings-API:er som inte bara kontrollerar format utan också korshänvisar mot kommersiella databaser. Dessa tjänster kan flagga inaktiva företag, identifiera sanktionerade enheter eller tillhandahålla ytterligare metadata om CUIT/CUIL-innehavaren.
CUIT/CUIL-systemets historia
CUIT/CUIL-identifieringssystemet i Argentina har utvecklats avsevärt sedan dess tillkomst:
Ursprung och implementering
CUIT (Clave Única de Identificación Tributaria) introducerades först i Argentina på 1970-talet som en del av ansträngningarna att modernisera skatteinsamlingssystemet. Federala skattemyndigheten (AFIP) implementerade denna unika identifierare för att spåra skattebetalare mer effektivt och minska skattefusk.
CUIL (Clave Única de Identificación Laboral) introducerades senare för att specifikt identifiera arbetstagare i socialförsäkringssystemet, vilket skapade en åtskillnad mellan skatteidentifiering och arbetsidentifiering samtidigt som ett konsekvent format bibehölls.
Utveckling och digitalisering
Under 1990-talet, när Argentina genomgick betydande ekonomiska reformer, blev CUIT/CUIL-systemet allt viktigare för att spåra ekonomisk aktivitet. Systemet digitaliserades ytterligare, och online-verifieringssystem implementerades.
I början av 2000-talet skedde en integration av CUIT/CUIL-systemet med olika digitala statliga tjänster, vilket gjorde det till en väsentlig del av Argentinas e-förvaltningsinitiativ. Under denna period standardiserades även verifieringsalgoritmen och formatet som fortfarande används idag.
Senaste utvecklingen
Under de senaste åren har AFIP förbättrat säkerhets- och verifieringsprocesserna för CUIT/CUIL-nummer genom att implementera mer sofistikerade valideringssystem och integrera dem med andra statliga databaser. Systemet spelar nu en avgörande roll i Argentinas ansträngningar att bekämpa skattefusk och formalisera ekonomin.
Idag används CUIT/CUIL inte bara för skatte- och sysselsättningsändamål utan också för ett brett spektrum av aktiviteter, inklusive bankverksamhet, fastighetsaffärer, samhällstjänster och onlineköp, vilket gör den till en väsentlig identifierare för både individer och företag som verkar i Argentina.
Implementeringsöverväganden
Vid implementering av CUIT/CUIL-validering i egna system, överväg dessa tekniska aspekter:
Algoritmstabilitet: Den nuvarande CUIT/CUIL-verifieringsalgoritmen har förblivit oförändrad sedan dess standardisering på 1990-talet. Enligt AFIP:s tekniska dokumentation är modulo-11-viktad checksiffra kodifierad i Resolución General 2854/2010 och efterföljande föreskrifter. Denna stabilitet innebär att implementeringar sällan behöver uppdateringar, men du bör övervaka AFIP:s meddelanden om eventuella regeländringar.
Prestandaoptimering: Verifieringsalgoritmen är beräkningsmässigt billig—bara 10 multiplikationer, en addition och en modulo-operation. För system med hög genomströmning som bearbetar tusentals valideringar per sekund är flaskhalsen vanligtvis nätverksfördröjning vid verifiering mot AFIP:s databas, inte algoritmen själv. Överväg att cacha AFIP-verifieringsresultat med lämpliga TTL:er (vanligtvis 24 timmar) för att balansera aktualitet med prestanda.
Teckenkodning: Vid bearbetning av CUIT/CUIL-data från externa källor (PDF:er, skannade dokument, webbskrapning), var uppmärksam på problem med teckenkodning. Bindestreck kan visas som em dash (U+2014), en dash (U+2013) eller minustecken (U+2212) istället för standard bindestreck-minus (U+002D). Normalisera dessa innan validering för att förhindra falska negativa resultat.
Internationalisering: Om din applikation betjänar flera latinamerikanska marknader, notera att Argentinas CUIT/CUIL använder modulo-11 med specifika vikter, medan Chiles RUT använder modulo-11 med olika vikter, och Brasiliens CPF/CNPJ använder modulo-11 med ännu ett annat mönster. Anta inte att algoritmerna är identiska—varje lands system har distinkta regler. För en bredare förståelse av checksiffersalgoritmer, se ISO/IEC 7064-standarden som formaliserar olika modulo-baserade verifieringsscheman.
Databaslagring: Lagra CUIT/CUIL-nummer utan bindestreck som fast längd CHAR(11) eller som BIGINT om din databas stöder 11-siffriga heltal utan precisionstapp. Lägg till en kontrollbegränsning som validerar verifieringssiffran på databasnivå som ett säkerhetsnät mot korrupterade data. Skapa index på detta fält för effektiva sökningar när användare söker efter CUIT/CUIL.
Kodexempel
Python
1def calculate_verification_digit(type_code, dni):
2 # Konvertera till sträng och säkerställ att DNI är 8 siffror med inledande nollor
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Kombinera typkod och DNI
7 digits = type_code_str + dni_str
8
9 # Vikter för varje position
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Beräkna summan av produkter
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Beräkna verifieringssiffra
16 verification_digit = 11 - (sum_products % 11)
17
18 # Specialfall
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 # Giltiga typkoder
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"Ogiltig typkod. Måste vara en av: {valid_type_codes}")
34
35 # Generera slumpmässig DNI om ingen anges
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Beräkna verifieringssiffra
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Formatera CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Ta bort bindestreck om de finns
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Kontrollera grundformat
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Ogiltigt format"
52
53 # Extrahera delar
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 # Validera typkod
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Ogiltig typkod"
62
63 # Beräkna och jämför verifieringssiffra
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Ogiltig verifieringssiffra"
67
68 return True, "Giltig CUIT/CUIL"
69
70# Exempelanvändning
71print(generate_cuit_cuil(20, 12345678)) # Generera för specifik DNI
72print(generate_cuit_cuil(27)) # Generera med slumpmässig DNI
73print(validate_cuit_cuil("20-12345678-9")) # Validera en CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Konvertera till sträng och säkerställ att DNI är 8 siffror med inledande nollor
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Kombinera typkod och DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Vikter för varje position
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Beräkna summan av produkter
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Beräkna verifieringssiffra
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Specialfall
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 // Giltiga typkoder
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Ogiltig typkod. Måste vara en av: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Generera slumpmässig DNI om ingen anges
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Beräkna verifieringssiffra
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Formatera CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Ta bort bindestreck om de finns
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Kontrollera grundformat
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Ogiltigt format' };
58 }
59
60 // Extrahera delar
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 // Validera typkod
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Ogiltig typkod' };
69 }
70
71 // Beräkna och jämför verifieringssiffra
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Ogiltig verifieringssiffra' };
75 }
76
77 return { isValid: true };
78}
79
80// Exempelanvändning
81console.log(generateCuitCuil(20, 12345678)); // Generera för specifik DNI
82console.log(generateCuitCuil(27)); // Generera med slumpmässig DNI
83console.log(validateCuitCuil("20-12345678-9")); // Validera en CUIT/CUIL
84Java
1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6 private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7 private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8
9 public static int calculateVerificationDigit(int typeCode, int dni) {
10 // Konvertera till sträng och säkerställ att DNI är 8 siffror med inledande nollor
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Kombinera typkod och DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Beräkna summan av produkter
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Beräkna verifieringssiffra
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Specialfall
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("Ogiltig typkod. Måste vara en av: " + VALID_TYPE_CODES);
39 }
40
41 // Generera slumpmässig DNI om ingen anges
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Beräkna verifieringssiffra
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Formatera CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Ta bort bindestreck om de finns
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Kontrollera grundformat
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Ogiltigt format");
61 }
62
63 // Extrahera delar
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 // Validera typkod
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Ogiltig typkod");
71 }
72
73 // Beräkna och jämför verifieringssiffra
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Ogiltig verifieringssiffra");
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 // Exempelanvändning
102 System.out.println(generateCuitCuil(20, 12345678)); // Generera för specifik DNI
103 System.out.println(generateCuitCuil(27, null)); // Generera med slumpmässig DNI
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Validera en CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Konvertera till sträng och säkerställ att DNI är 8 siffror med inledande nollor $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Kombinera typkod och DNI $digits = $typeCodeStr . $dniStr; // Vikter för varje position $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Beräkna summan av produkter $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Beräkna verifieringssiffra $verificationDigit = 11 - ($sumProducts % 11); // Specialfall if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Giltiga typkoder $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Ogiltig typkod. Måste vara en av: " . implode(', ', $validTypeCodes)); } // Generera slumpmässig DNI om ingen anges if ($dni === null) { $dni = rand(10000000, 99999999); } // Beräkna verifieringssiffra $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatera CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Ta bort bindestreck om de finns $cuitCuilClean = str_replace('-', '', $cuitCuil); // Kontrollera grundformat if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Ogiltigt format']; } // Extrahera delar $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Validera typkod $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Ogiltig typkod']; } // Beräkna och jämför verifieringssiffra $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { ## Vanliga frågor ### Vad är skillnaden mellan CUIT och CUIL? Här är den praktiska skillnaden: **CUIT** (Clave Única de Identificación Tributaria) identifierar skattebetalare—både individer och företag som lämnar in skatter till AFIP. **CUIL** (Clave Única de Identificación Laboral) identifierar arbetstagare i socialförsäkringssystemet för anställning och pensionering. I praktiken har många individer både ett CUIL (från deras första jobb) och kan senare få ett CUIT (om de blir egenföretagare eller startar ett företag). Numren använder identisk formatering och beräkningsregler, så ur valideringssynpunkt hanterar man dem på samma sätt. Skillnaden är viktig för administrativa ändamål: lönesystem arbetar vanligtvis med CUIL, medan fakturerings- och skattesystem använder CUIT. ### Vilka typkoder används för individer respektive företag? För individer: - 20, 23, 24: Manliga individer (CUIL) - 27: Kvinnliga individer (CUIL) För företag och organisationer: - 30: Aktiebolag (CUIT) - 33: Civila föreningar (CUIT) - 34: Stiftelser (CUIT) ### Hur beräknas kontrollsiffran? Algoritmen använder viktad multiplikation: ta var och en av de första 10 siffrorna, multiplicera med vikterna **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, summera produkterna, och sedan beräkna 11 minus (summa modulo 11). Två specialfall kan förvirra folk: när beräkningen ger 11, använd 0 som kontrollsiffra; när den ger 10, använd 9. Dessa specialfall finns eftersom kontrollsiffran måste vara en enda siffra (0-9). Detta är en modulo-11 kontrollsiffersalgoritm, liknande den som används i ISBN-10-koder och andra identifieringssystem världen över. ### Kan jag använda detta verktyg för att generera riktiga, officiella CUIT/CUIL-nummer? Nej—detta verktyg genererar matematiskt giltiga testdata, men numren är inte officiellt registrerade hos AFIP. Tänk på det som att generera ett giltigt kreditkortsnummer med Luhn-algoritmen: det klarar formatvalidering, men är inte kopplat till ett riktigt konto. För officiell CUIT/CUIL-registrering måste individer besöka AFIP med sitt DNI, medan företag måste slutföra bolagsregistreringsprocedurer. Verktyget är strikt för utveckling, testning och utbildningsändamål där du behöver giltigt utseende data som inte kommer att konfliktera med riktiga identifieringsnummer. ### Varför misslyckas min CUIT/CUIL-validering trots att formatet ser korrekt ut? När validering misslyckas trots korrekt formatering, kontrollera dessa vanliga orsaker: 1. **Ogiltig typkod**: Endast 20, 23, 24, 27, 30, 33, 34 är giltiga. Användning av 21, 25 eller andra nummer kommer att misslyckas. 2. **Felaktig kontrollsiffra**: Den sista siffran måste matcha algoritmens beräkning. Även att ändra en siffra i DNI-delen kräver omberäkning av kontrollsiffran. 3. **Formatproblem**: Måste vara exakt 11 siffror (XX-XXXXXXXX-X). Se upp för extra mellanslag eller saknade inledande nollor. 4. **Dolda tecken**: Kopiering och inklistring från PDF:er eller webbplatser kan ibland introducera osynliga Unicode-tecken som bryter validering. Ett snabbt felsöknings-tips: ta bort den sista siffran och beräkna om den manuellt. Om den inte matchar, är det där problemet ligger. ### Krävs bindestreck i CUIT/CUIL-nummer? Bindestreck är endast för visningsformatering—de ingår inte i det faktiska numret för beräkningsändamål. När du ser **20-12345678-9**, bryr sig algoritmen bara om de 11 siffrorna: **20123456789**. De flesta valideringsimplementationer tar bort bindestreck innan bearbetning, vilket är varför vårt verktyg accepterar både **20-12345678-9** och **20123456789**. I API:er och databaser lagrar du vanligtvis den obundna versionen och lägger till bindestreck endast när du visar för användare. Detta tillvägagångssätt förhindrar att formateringsinkonsekvent orsakar valideringsfel. ### Kan ett CUIT/CUIL-nummer ha färre än 8 siffror i DNI-delen? DNI-delen måste alltid vara exakt 8 siffror—inga undantag. Om någons faktiska DNI har färre siffror (vilket händer med äldre, lägre numrerade DNI:er), fyller du på med inledande nollor. Till exempel blir DNI **1234567** till **01234567** i CUIT/CUIL-strukturen. Detta är en vanlig källa till buggar när man konverterar mellan DNI och CUIT/CUIL-format. Jag har sett system misslyckas med validering eftersom de glömt att fylla på, och behandlar **1234567** som ett 7-siffrigt nummer istället för **01234567**. Använd alltid nollpåfyllningsfunktioner i din kod snarare än enkel strängsammansättning. ### Hur kan jag verifiera om en CUIT/CUIL är officiellt registrerad i Argentina? Vårt verktyg validerar den matematiska korrektheten—format, typkod och kontrollsiffra. Men det kan inte avgöra om numret faktiskt är registrerat hos AFIP eller tillhör en verklig person eller ett verkligt företag. För officiell verifiering, använd [AFIP:s webbtjänster](https://www.afip.gob.ar/) eller deras "Constancia de Inscripción" sökverktyg. AFIP erbjuder API:er för automatiserad verifiering, även om du behöver registrera dig som utvecklare och autentisera. I produktionsmiljöer, implementera båda lagren: kör först algoritmisk validering (snabb, fångar stavfel och formatfel), och verifiera sedan mot AFIP:s databas (långsammare, men bekräftar att numret är verkligt och aktivt). ### Kan jag använda detta verktyg i min kommersiella applikation? Ja—CUIT/CUIL-valideringsalgoritmen är en offentlig standard definierad av AFIP, så du kan fritt implementera den i kommersiell programvara. Kodexemplen här är avsedda som referensimplementationer. För produktionsanvändning, överväg dessa bästa praxis: implementera korrekt felhantering för specialfall, lägg till loggning för felsökning av valideringsfel, validera mot AFIP:s officiella databas (inte bara algoritmisk validering), och håll din implementation uppdaterad om AFIP ändrar reglerna (även om den nuvarande algoritmen har varit stabil i årtionden). ### Lagrar verktyget några av de genererade eller validerade CUIT/CUIL-numren? Nej—all bearbetning sker i din webbläsare (klientsidan). När du genererar eller validerar en CUIT/CUIL, körs beräkningen lokalt med JavaScript. Ingenting skickas till våra servrar, och vi loggar, lagrar eller spårar inga nummer du matar in eller genererar. Detta klientsidiga tillvägagångssätt säkerställer integritet och innebär också att verktyget fungerar offline när sidan har laddats. Du kan verifiera detta genom att öppna din webbläsares utvecklarverktyg och titta på nätverksfliken—du kommer att se inga förfrågningar skickas när du genererar eller validerar nummer. ## Referenser 1. AFIP (Federal Administration of Public Revenue). "CUIT/CUIL/CDI." Officiell webbplats. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Arbets-, sysselsättnings- och socialförsäkringsdepartementet. "CUIL - Unik Arbetsidentifikationsnyckel." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Nationell Administration för Social Trygghet). "Erhåll min CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Officiell tidning för Argentinska Republiken. "Generell resolution AFIP 2854/2010: Förfarande. Unik Skatteidentifikationsnyckel (C.U.I.T.)." 5. Skattelag för Argentinska Republiken. "Identifiering och registrering av skattebetalare." --- Oavsett om du bygger ett faktureringssystem, testar anställningsflöden eller lär dig om valideringsalgoritmer, tillhandahåller detta verktyg CUIT/CUIL-generering och validering som du behöver. Generera testdata som klarar algoritmisk validering, verifiera nummer innan de når din databas eller utforska hur kontrollsiffrans algoritm fungerar i praktiken.