Hoppa till innehåll

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

Genererad CUIT/CUIL
20-98824958-1

Använder slumpmässigt genererad DNI

Laddningsberäknare...
📚

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:

  1. 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)
  2. 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.

  3. 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:

  1. Ta de första 10 siffrorna i CUIT/CUIL (typkod + DNI)
  2. Multiplicera varje siffra med sin motsvarande vikt: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Summera alla produkter
  4. Beräkna: 11 minus (summa modulo 11)
  5. 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:

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

Där:

  • VDVD är verifieringssiffran
  • did_i är den ii:te siffran av de första 10 siffrorna
  • wiw_i är motsvarande vikt från sekvensen [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Specialfall: om VD=11VD = 11VD=0VD = 0, om VD=10VD = 10VD=9VD = 9

Steg-för-steg-guide

Använda generatorn

  1. Välj fliken "Generator" längst upp i verktygets gränssnitt.

  2. 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)
  3. 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
  4. Generera slumpmässigt DNI (valfritt):

    • Klicka på knappen "Slumpmässig" för att generera ett slumpmässigt 8-siffrigt DNI-nummer
  5. 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
  6. 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

  1. Välj fliken "Validator" längst upp i verktygets gränssnitt.

  2. 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)
  3. Klicka på knappen "Validera":

    • Verktyget kontrollerar format, typkod och verifieringssiffra
  4. 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
  5. Ytterligare information:

    • För giltiga nummer visar verktyget en uppdelning av komponenterna:
      • Typkod och dess betydelse
      • DNI-nummer
      • Verifieringssiffra

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-cuit på npm hanterar validering och formatering
  • PHP: afip-php-biblioteket tillhandahåller både validering och AFIP-webbtjänsteintegrering
  • Python: py-cuit på 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
74

JavaScript

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
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        // 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}
107

PHP

<?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.