Naar inhoud springen

CUIT/CUIL Generator & Validator | Argentijns Belasting-ID-hulpmiddel

Genereer geldige Argentijnse CUIT/CUIL testnummers of valideer bestaande nummers. Gratis online hulpmiddel voor ontwikkelaars die belasting-ID en salarisadministratiesystemen testen met AFIP-conforme validatie.

CUIT/CUIL Generator

Voer een 8-cijferig DNI-nummer in of gebruik de willekeurige generator

Gegenereerde CUIT/CUIL
20-72109294-2

Willekeurig gegenereerde DNI wordt gebruikt

Laadcalculator...
šŸ“š

Documentatie

Argentijnse CUIT/CUIL Generator en Validator

Introductie

In de Argentijnse belasting- en arbeidssystemen zul je voortdurend twee kritieke identificatoren tegenkomen: CUIT (Clave Única de Identificación Tributaria) en CUIL (Clave Única de Identificación Laboral). Beschouw CUIT als de belasting-ID voor bedrijven en individuen die belastingen betalen, terwijl CUIL werknemers identificeert in het sociale zekerheidssysteem. Beide gebruiken hetzelfde 11-cijferige formaat en verificatiealgoritme, wat het testen van applicaties die deze nummers verwerken bijzonder belangrijk maakt.

Bij het ontwikkelen van software voor de Argentijnse markt heb je geldige testgegevens nodig. Daar komt deze tool van pas. Je kunt wiskundig correcte CUIT/CUIL-nummers genereren voor testen zonder echte persoonlijke informatie te gebruiken, of bestaande nummers valideren om te verzekeren dat ze voldoen aan het officiƫle algoritme van AFIP. Wat bijzonder nuttig is, is dat de tool zowel de generatiekant (het op aanvraag maken van geldige nummers) als de validatiekant (het opsporen van formaatfouten, ongeldige typecodes en onjuiste verificatiecijfers voordat ze productie-problemen veroorzaken) behandelt.

CUIT/CUIL Structuur en Berekening

Het Formaat Begrijpen

Een geldig CUIT/CUIL-nummer bestaat uit 11 cijfers, doorgaans weergegeven in het formaat XX-XXXXXXXX-X. Zo ziet het eruit:

  1. Type Code (eerste 2 cijfers): Identificeert het entiteitstype

    • 20, 23, 24: Mannelijke individuen (CUIL)
    • 27: Vrouwelijke individuen (CUIL)
    • 30, 33, 34: Bedrijven en organisaties (CUIT)
  2. DNI Nummer (middelste 8 cijfers): Voor individuen is dit hun nationaal identiteitsdocumentnummer (DNI). Een veelvoorkomende valkuil: als de werkelijke DNI minder dan 8 cijfers heeft, moet u deze aanvullen met voorloopnullen. Bijvoorbeeld, DNI 1234567 wordt 01234567 in de CUIT/CUIL. Bedrijven ontvangen in plaats daarvan een uniek toegewezen nummer.

  3. Verificatiecijfer (laatste cijfer): Dit controlegetal valideert het gehele nummer met behulp van een gewogen algoritme. Als dit cijfer niet overeenkomt met de berekening, is de gehele CUIT/CUIL ongeldig—iets dat ontwikkelaars vaak verrast wanneer ze handmatig testgegevens construeren.

Verificatiecijfer Berekening

Het verificatiecijfer gebruikt een modulo-11 gewogen algoritme. Zo werkt het:

  1. Neem de eerste 10 cijfers van de CUIT/CUIL (type code + DNI)
  2. Vermenigvuldig elk cijfer met zijn bijbehorende gewicht: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Som alle producten
  4. Bereken: 11 min (som modulo 11)
  5. Behandel randgevallen: als het resultaat 11 is, gebruik 0; als het 10 is, gebruik 9

Wat mensen het meest in de war brengt, zijn die randgevallen in stap 5. Bij het testen krijg je af en toe een resultaat van 10 of 11, en het vergeten om deze toe te wijzen aan 9 en 0 veroorzaakt validatiefouten die moeilijk te debuggen zijn als je deze regel niet kent.

Wiskundig kan dit worden uitgedrukt als:

VD=11āˆ’((āˆ‘i=110diƗwi)ā€Šmodā€Š11)VD = 11 - ((\sum_{i=1}^{10} d_i \times w_i) \bmod 11)

Waarbij:

  • VDVD het verificatiecijfer is
  • did_i het ii-de cijfer van de eerste 10 cijfers
  • wiw_i het bijbehorende gewicht uit de reeks [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Speciale gevallen: als VD=11VD = 11 dan VD=0VD = 0, als VD=10VD = 10 dan VD=9VD = 9

Stapsgewijze Handleiding

De Generator Gebruiken

  1. Selecteer het tabblad "Generator" bovenaan de interface van het hulpmiddel.

  2. Kies een Typecode uit het dropdown-menu:

    • 20: Man (CUIL)
    • 23: Bedrijf (CUIT)
    • 24: Tijdelijk Bedrijf (CUIT)
    • 27: Vrouw (CUIL)
    • 30: Vennootschap (CUIT)
    • 33: Burgerlijke Vereniging (CUIT)
    • 34: Stichting (CUIT)
  3. Voer een DNI-nummer in (optioneel):

    • Voer een 8-cijferig DNI-nummer in het daarvoor bestemde veld in
    • Als dit leeg wordt gelaten, zal het hulpmiddel een willekeurig DNI gebruiken
    • Als u minder dan 8 cijfers invoert, zal het systeem aanvullen met voorloopnullen
  4. Genereer Willekeurig DNI (optioneel):

    • Klik op de knop "Willekeurig" om een willekeurig 8-cijferig DNI-nummer te genereren
  5. Bekijk de Gegenereerde CUIT/CUIL:

    • Het hulpmiddel toont automatisch een geldig CUIT/CUIL op basis van uw invoer
    • De indeling zal XX-XXXXXXXX-X zijn met het juiste verificatiecijfer
  6. Kopieer het Resultaat:

    • Klik op het kopieer-pictogram om de gegenereerde CUIT/CUIL naar het klembord te kopiĆ«ren
    • Er verschijnt een bevestigingsbericht wanneer het succesvol is gekopieerd

De Validator Gebruiken

  1. Selecteer het tabblad "Validator" bovenaan de interface van het hulpmiddel.

  2. Voer de te Valideren CUIT/CUIL in:

    • Voer de CUIT/CUIL in de indeling XX-XXXXXXXX-X in
    • Het hulpmiddel zal uw invoer automatisch opmaken met koppeltekens terwijl u typt
    • U kunt ook het nummer zonder koppeltekens invoeren (XXXXXXXXXXX)
  3. Klik op de Knop "Valideren":

    • Het hulpmiddel zal de indeling, typecode en het verificatiecijfer controleren
  4. Bekijk het Validatieresultaat:

    • Voor geldige CUIT/CUIL-nummers verschijnt een groen succesbericht
    • Voor ongeldige nummers verschijnt een rood foutbericht met uitleg:
      • Ongeldige indeling (moet XX-XXXXXXXX-X zijn)
      • Ongeldige typecode (moet een van de volgende zijn: 20, 23, 24, 27, 30, 33, 34)
      • Ongeldig verificatiecijfer
  5. Aanvullende Informatie:

    • Voor geldige nummers toont het hulpmiddel een uitsplitsing van de componenten:
      • Typecode en de betekenis ervan
      • DNI-nummer
      • Verificatiecijfer

Veelvoorkomende Fouten en Best Practices

Bij het werken met CUIT/CUIL-validatie in uw toepassingen, let op deze veel voorkomende valkuilen:

Nul-Opvulling Problemen: De meest voorkomende bug die ik ben tegengekomen betreft DNI-nummers met voorloopnullen. Wanneer iemand DNI "1234567" invoert, moet uw code dit behandelen als "01234567" voor CUIT/CUIL-constructie. Veel implementaties converteren naar integers voor verwerking, wat voorloopnullen verwijdert. Gebruik in plaats daarvan stringbewerkingen met correcte opvulling.

Type Code Verwarring: Niet alle tweecijferige nummers zijn geldige typecodes. Alleen 20, 23, 24, 27, 30, 33, 34 werken. Ik heb systemen gezien die elke tweecijferige prefix accepteren, wat leidt tot "geldig uitziende" nummers zoals 21-12345678-X die AFIP-validatie niet doorstaan. Valideer altijd de typecode voordat u de verificatiecode berekent.

Geslacht Aannames: Typecode 20 (man) en 27 (vrouw) zijn niet uitwisselbaar. Als u CUILs automatisch genereert op basis van demografische gegevens, zorg er dan voor dat uw typecode overeenkomt met het daadwerkelijke geslacht geregistreerd bij RENAPER (Argentijnse nationale register). Discrepanties leiden tot afwijzing wanneer personen deze nummers proberen te gebruiken bij overheidsservices.

Koppelteken Behandeling: Sommige implementaties vereisen koppeltekens terwijl andere ze afwijzen. Best practice: accepteer beide formaten in invoervelden (met of zonder koppeltekens), verwijder koppeltekens voor validatie, sla de ongekoppelde versie op in databases, en voeg koppeltekens alleen toe voor weergavedoeleinden.

Ontbrekende Verificatie: Algoritmevalidatie vangt formateringsfouten op maar bevestigt niet dat de CUIT/CUIL geregistreerd is. In productie, valideer eerst het formaat (snel), vervolgens verifieer tegen AFIP's database (langzamer maar gezaghebbend). Deze tweefasenaanpak vangt typefouten direct op terwijl nog steeds wordt gecontroleerd of het nummer echt is.

Randgevallen Testen: Test altijd met verificatiecijfers 0 en 9—deze resulteren uit de speciale gevallen in het algoritme. Test ook DNI's die beginnen met nullen om ervoor te zorgen dat uw opvullogica correct werkt.

Gebruiksgevallen en Praktische Toepassingen

Ontwikkeling en Testen

Softwareontwikkeling: Bij het bouwen van applicaties voor de Argentijnse markt, hebt u testgegevens nodig die validatie doorstaan zonder echte gebruikersinformatie te gebruiken. Hier wordt het kritiek:

  • E-commerce platforms: Betalingsverwerkers en factureringsystemen vereisen geldige CUIT/CUIL-nummers. Tijdens belastingtests hebt u mogelijk duizenden geldige nummers nodig om realistische gebruikersregistraties te simuleren.
  • Boekhoudkundige software: Belastingrapportagemodules verifiĆ«ren het CUIT/CUIL-formaat voordat ze worden ingediend bij AFIP. Het testen van deze validatieregels vereist nummers die de controlegetal-algoritme doorstaan.
  • HR-beheersystemen: Salarisverwerking en sociale zekerheidsbijdragen zijn afhankelijk van geldige CUIL-nummers. Een veelvoorkomend scenario: u test onboarding-flows van werknemers en moet ervoor zorgen dat ongeldige CUILs de juiste foutmeldingen activeren.
  • Bankapplicaties: KYC-processen (Know Your Customer) valideren CUIT/CUIL als onderdeel van het openen van een rekening. Uit mijn ervaring komen randgevallen zoals type-codemismatches vaak naar voren tijdens integratiетesten.

Databasepopulatie: Bij het vullen van testdatabases zorgt het gebruik van algoritmisch geldige CUIT/CUIL-nummers ervoor dat uw databasebeperkingen en triggers werken zoals verwacht. Dit is met name belangrijk bij het testen van gegevensmigratiescripts of ETL-processen die identificatienummers valideren.

Formuliervalidatietesten: Test zowel het gelukkige pad als foutomstandigheden. Genereer geldige nummers om succesvolle indiening te bevestigen, wijzig vervolgens het verificatiecijfer om ervoor te zorgen dat uw frontend- en backendvalidatie de fout onderschept voordat deze de database bereikt.

API-testen: Integratietests moeten geldige CUIT/CUIL-nummers gebruiken in aanvraagpayloads. Dit voorkomt valse negatieven waarbij tests mislukken vanwege ongeldige testgegevens in plaats van werkelijke bugs in uw API-logica.

QA-automatisering: Geparameteriseerde tests profiteren van dynamische CUIT/CUIL-generatie. In plaats van testwaarden vast te leggen die kunnen conflicteren tussen testuitvoeringen, genereert u bij elke testuitvoering nieuwe geldige nummers.

Educatieve Doeleinden

Leren van Validatie-algoritmen: De CUIT/CUIL-verificatie-algoritme toont de praktische toepassing van modulo-rekenkunde en gewogen controletekens. Hetzelfde patroon verschijnt in andere identificatiesystemen wereldwijd—creditcardnummers (Luhn-algoritme), ISBN-codes en Europese BTW-nummers gebruiken allemaal vergelijkbare gewogen controlesombenaderingen. Inzicht in de werking van CUIT/CUIL-validatie geeft uitleg waarom deze algoritmen bestaan: ze vangen overschrijvingsfouten op zoals verwisselde cijfers of enkelvoudige cijferfouten.

Onderwijzen van Gegevensvalidatie: Bij het trainen van junior-ontwikkelaars over invoervalidatie biedt het CUIT/CUIL-systeem een real-world voorbeeld dat complexer is dan e-mailvalidatie maar eenvoudiger dan cryptografische verificatie. Het demonstreert het principe van verdediging in de diepte: formaatvalidatie (11 cijfers), bedrijfsregelvalidatie (geldige typecodes) en algoritmische validatie (controlegetal).

Internationale Bedrijfsontwikkeling: Als u systemen bouwt voor Latijns-Amerikaanse markten, helpt het begrijpen van CUIT/CUIL u vergelijkbare systemen in buurlanden te begrijpen. BraziliĆ« heeft CPF/CNPJ, Chili heeft RUT, en Uruguay heeft RUT—allemaal gebruiken ze controlegetal-algoritmen. De patronen die u hier leert, zijn overdraagbaar naar die systemen.

Alternatieven en Productieoverwegingen

Hoewel deze tool goed werkt voor ontwikkeling en testen, hebben productieomgevingen andere vereisten:

OfficiĆ«le Overheidsvalidatie: Voor live-applicaties is algoritmische validatie alleen niet genoeg—u moet verifiĆ«ren dat de CUIT/CUIL daadwerkelijk is geregistreerd bij AFIP (Administración Federal de Ingresos PĆŗblicos). AFIP biedt webservices voor real-time validatie, hoewel u zich moet registreren en authenticeren om ze te kunnen gebruiken. De uitdaging: een nummer kan wiskundig geldig zijn maar niet officieel zijn toegewezen, dus implementeer altijd beide validatielagen in productie.

Bibliotheken en Pakketten: Als u CUIT/CUIL-validatie in uw codebase integreert, overweeg dan deze gevestigde bibliotheken in plaats van zelf te ontwikkelen:

  • JavaScript: validar-cuit op npm verzorgt validatie en opmaak
  • PHP: afip-php-bibliotheek biedt zowel validatie als AFIP-webserviceintegratie
  • Python: py-cuit op PyPI implementeert de volledige algoritme

Het gebruik van onderhouden bibliotheken vermindert het risico op implementatiefouten en bevat vaak randgevallen die u in aangepaste code zou kunnen missen.

Handmatige Berekening: Voor leerdoeleinden of debuggen helpt het handmatig doorlopen van de algoritme om het begrip te verdiepen. Pak een rekenmachine en een voorbeeld-CUIT/CUIL, en volg vervolgens stap voor stap het gewogen vermenigvuldigingsproces.

Enterprise-validatieservices: Grootschalige applicaties kunnen baat hebben bij validatie-API's van derden die niet alleen het formaat controleren, maar ook kruisverwijzen naar commerciƫle databases. Deze services kunnen inactieve bedrijven markeren, gesanctioneerde entiteiten identificeren of aanvullende metadata verstrekken over de CUIT/CUIL-houder.

Geschiedenis van het CUIT/CUIL-systeem

Het CUIT/CUIL-identificatiesysteem in Argentiniƫ is sinds zijn oprichting aanzienlijk geƫvolueerd:

Oorsprong en Implementatie

De CUIT (Clave Única de Identificación Tributaria) werd in de jaren zeventig voor het eerst geïntroduceerd in Argentinië als onderdeel van inspanningen om het belastinginningssysteem te moderniseren. De Federale Administratie van Openbare Inkomsten (AFIP) voerde deze unieke identificator in om belastingbetalers efficiënter te volgen en belastingontduiking te verminderen.

De CUIL (Clave Única de Identificación Laboral) werd later geïntroduceerd om specifiek werknemers in het sociale zekerheidssysteem te identificeren, waarbij een onderscheid werd gemaakt tussen belastingidentificatie en arbeidsidentificatie, terwijl een consistent formaat werd behouden.

Evolutie en Digitalisering

In de jaren negentig, toen Argentinië ingrijpende economische hervormingen onderging, werd het CUIT/CUIL-systeem steeds belangrijker voor het volgen van economische activiteit. Het systeem werd verder gedigitaliseerd en online verificatiesystemen werden geïmplementeerd.

Begin 2000 zag men de integratie van het CUIT/CUIL-systeem met verschillende digitale overheidsdiensten, waardoor het een essentieel onderdeel werd van Argentiniƫ's e-overheidsinitiatieven. In deze periode vond ook de standaardisatie plaats van het verificatiealgoritme en formaat dat vandaag de dag nog steeds wordt gebruikt.

Recente Ontwikkelingen

In de afgelopen jaren heeft de AFIP de beveiliging en verificatieprocessen voor CUIT/CUIL-nummers verbeterd door geavanceerdere validatiesystemen te implementeren en deze te integreren met andere overheidsgegevensbanken. Het systeem speelt nu een cruciale rol in Argentiniƫ's inspanningen om belastingontduiking te bestrijden en de economie te formaliseren.

Tegenwoordig wordt de CUIT/CUIL niet alleen gebruikt voor belasting- en werkgelegenheidsdoeleinden, maar ook voor een breed scala aan activiteiten, waaronder bankieren, onroerendgoedtransacties, nutsvoorzieningen en online aankopen, waardoor het een essentiƫle identificator is geworden voor zowel individuen als bedrijven die in Argentiniƫ opereren.

Implementatieoverwegingen

Bij het implementeren van CUIT/CUIL-validatie in uw eigen systemen, houd rekening met deze technische aspecten:

Algoritmestabiliteit: Het huidige CUIT/CUIL-verificatiealgoritme is ongewijzigd gebleven sinds de standaardisatie in de jaren 1990. Volgens AFIP's technische documentatie is de modulo-11 gewogen controlegetal-benadering gecodificeerd in Resolución General 2854/2010 en latere regelgevingen. Deze stabiliteit betekent dat implementaties zelden updates nodig hebben, maar u moet AFIP-aankondigingen in de gaten houden voor eventuele wetswijzigingen.

Prestatie-optimalisatie: Het verificatiealgoritme is computationeel goedkoop—slechts 10 vermenigvuldigingen, ƩƩn optelling en ƩƩn modulo-operatie. Voor high-throughput systemen die duizenden validaties per seconde verwerken, is de bottleneck meestal de netwerklatentie bij het verifiĆ«ren tegen AFIP's database, niet het algoritme zelf. Overweeg AFIP-verificatieresultaten te cachen met geschikte TTL's (doorgaans 24 uur) om versheid met prestaties in balans te brengen.

Tekencodering: Bij het verwerken van CUIT/CUIL-gegevens uit externe bronnen (PDF's, gescande documenten, web scraping), let op problemen met tekencodering. Het koppelteken kan verschijnen als een em dash (U+2014), en dash (U+2013) of minteken (U+2212) in plaats van het standaard koppelteken-min (U+002D). Normaliseer deze voor validatie om valse negatieven te voorkomen.

Internationalisatie: Als uw applicatie meerdere Latijns-Amerikaanse markten bedient, merk op dat Argentina's CUIT/CUIL modulo-11 met specifieke gewichten gebruikt, terwijl Chili's RUT modulo-11 met verschillende gewichten gebruikt, en BraziliĆ«'s CPF/CNPJ modulo-11 met weer een ander patroon. Neem niet aan dat de algoritmen identiek zijn—elk landensysteem heeft eigen regels. Voor een breder begrip van controlegetal-algoritmen, zie de ISO/IEC 7064-standaard die verschillende modulo-gebaseerde verificatieschema's formaliseert.

Databaseopslag: Sla CUIT/CUIL-nummers op zonder koppeltekens als vaste lengte CHAR(11) of als BIGINT als uw database 11-cijferige integers zonder precisieverlies ondersteunt. Voeg een controlebeperking toe die het verificatiecijfer op databaseniveau valideert als veiligheidsnet tegen beschadigde gegevens. Maak indexen op dit veld voor efficiƫnte zoekopdrachten wanneer gebruikers zoeken op CUIT/CUIL.

Codevoorbeelden

Python

1def calculate_verification_digit(type_code, dni):
2    # Converteren naar string en ervoor zorgen dat DNI 8 cijfers heeft met voorloopnullen
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Type code en DNI combineren
7    digits = type_code_str + dni_str
8    
9    # Gewichten voor elke positie
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Som van producten berekenen
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Verificatiecijfer berekenen
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Speciale gevallen
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    # Geldige type codes
30    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
31    
32    if type_code not in valid_type_codes:
33        raise ValueError(f"Ongeldige type code. Moet een van de volgende zijn: {valid_type_codes}")
34    
35    # Willekeurige DNI genereren indien niet opgegeven
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Verificatiecijfer berekenen
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # CUIT/CUIL formatteren
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Koppeltekens verwijderen indien aanwezig
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Basisformaat controleren
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Ongeldig formaat"
52    
53    # Onderdelen extraheren
54    type_code = int(cuit_cuil_clean[0:2])
55    dni = int(cuit_cuil_clean[2:10])
56    verification_digit = int(cuit_cuil_clean[10])
57    
58    # Type code valideren
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Ongeldige type code"
62    
63    # Verificatiecijfer berekenen en vergelijken
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Ongeldig verificatiecijfer"
67    
68    return True, "Geldige CUIT/CUIL"
69
70# Voorbeeldgebruik
71print(generate_cuit_cuil(20, 12345678))  # Genereren voor specifieke DNI
72print(generate_cuit_cuil(27))  # Genereren met willekeurige DNI
73print(validate_cuit_cuil("20-12345678-9"))  # Een CUIT/CUIL valideren
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Converteren naar string en ervoor zorgen dat DNI 8 cijfers heeft met voorloopnullen
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Type code en DNI combineren
7  const digits = typeCodeStr + dniStr;
8  
9  // Gewichten voor elke positie
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Som van producten berekenen
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Verificatiecijfer berekenen
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Speciale gevallen
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  // Geldige type codes
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Ongeldige type code. Moet een van de volgende zijn: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Willekeurige DNI genereren indien niet opgegeven
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Verificatiecijfer berekenen
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // CUIT/CUIL formatteren
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Koppeltekens verwijderen indien aanwezig
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Basisformaat controleren
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Ongeldig formaat' };
58  }
59  
60  // Onderdelen extraheren
61  const typeCode = parseInt(cuitCuilClean.substring(0, 2));
62  const dni = parseInt(cuitCuilClean.substring(2, 10));
63  const verificationDigit = parseInt(cuitCuilClean.substring(10, 11));
64  
65  // Type code valideren
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Ongeldige type code' };
69  }
70  
71  // Verificatiecijfer berekenen en vergelijken
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Ongeldig verificatiecijfer' };
75  }
76  
77  return { isValid: true };
78}
79
80// Voorbeeldgebruik
81console.log(generateCuitCuil(20, 12345678)); // Genereren voor specifieke DNI
82console.log(generateCuitCuil(27)); // Genereren met willekeurige DNI
83console.log(validateCuitCuil("20-12345678-9")); // Een CUIT/CUIL valideren
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        // Converteren naar string en ervoor zorgen dat DNI 8 cijfers heeft met voorloopnullen
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Type code en DNI combineren
15        String digits = typeCodeStr + dniStr;
16        
17        // Som van producten berekenen
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Verificatiecijfer berekenen
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Speciale gevallen
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("Ongeldige type code. Moet een van de volgende zijn: " + VALID_TYPE_CODES);
39        }
40        
41        // Willekeurige DNI genereren indien niet opgegeven
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Verificatiecijfer berekenen
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // CUIT/CUIL formatteren
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Koppeltekens verwijderen indien aanwezig
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Basisformaat controleren
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Ongeldig formaat");
61        }
62        
63        // Onderdelen extraheren
64        int typeCode = Integer.parseInt(cuitCuilClean.substring(0, 2));
65        int dni = Integer.parseInt(cuitCuilClean.substring(2, 10));
66        int verificationDigit = Integer.parseInt(cuitCuilClean.substring(10, 11));
67        
68        // Type code valideren
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Ongeldige type code");
71        }
72        
73        // Verificatiecijfer berekenen en vergelijken
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Ongeldig verificatiecijfer");
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        // Voorbeeldgebruik
102        System.out.println(generateCuitCuil(20, 12345678)); // Genereren voor specifieke DNI
103        System.out.println(generateCuitCuil(27, null)); // Genereren met willekeurige DNI
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Een CUIT/CUIL valideren
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Converteren naar string en ervoor zorgen dat DNI 8 cijfers heeft met voorloopnullen $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Type code en DNI combineren $digits = $typeCodeStr . $dniStr; // Gewichten voor elke positie $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Som van producten berekenen $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Verificatiecijfer berekenen $verificationDigit = 11 - ($sumProducts % 11); // Speciale gevallen if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Geldige type codes $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Ongeldige type code. Moet een van de volgende zijn: " . implode(', ', $validTypeCodes)); } // Willekeurige DNI genereren indien niet opgegeven if ($dni === null) { $dni = rand(10000000, 99999999); } // Verificatiecijfer berekenen $verificationDigit = calculateVerificationDigit($typeCode, $dni); // CUIT/CUIL formatteren return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Koppeltekens verwijderen indien aanwezig $cuitCuilClean = str_replace('-', '', $cuitCuil); // Basisformaat controleren if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Ongeldig formaat']; } // Onderdelen extraheren $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Type code valideren $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Ongeldige type code']; } // Verificatiecijfer berekenen en vergelijken $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { return ['isValid' => false, 'errorMessage' => 'Ongeldig verificatiecijfer']; } return ['isValid' ## Veelgestelde vragen ### Wat is het verschil tussen CUIT en CUIL? Hier is het praktische onderscheid: **CUIT** (Clave Única de Identificación Tributaria) identificeert belastingplichtigen—zowel individuen als bedrijven die aangifte doen bij AFIP. **CUIL** (Clave Única de Identificación Laboral) identificeert werknemers in het sociale zekerheidssysteem voor werkgelegenheid en pensioen. In de praktijk hebben veel individuen zowel een CUIL (van hun eerste baan) en kunnen later een CUIT krijgen (als ze zelfstandig worden of een bedrijf starten). De nummers gebruiken identieke opmaak en berekeningsregels, dus vanuit validatiestandpunt behandel je ze hetzelfde. Het onderscheid is belangrijk voor administratieve doeleinden: loonadministratiesystemen werken typisch met CUIL, terwijl facturerings- en belastingsystemen CUIT gebruiken. ### Welke typecodes worden gebruikt voor individuen en welke voor bedrijven? Voor individuen: - 20, 23, 24: Mannelijke individuen (CUIL) - 27: Vrouwelijke individuen (CUIL) Voor bedrijven en organisaties: - 30: Vennootschappen (CUIT) - 33: Burgerlijke verenigingen (CUIT) - 34: Stichtingen (CUIT) ### Hoe wordt de verificatiecode berekend? Het algoritme gebruikt gewogen vermenigvuldiging: neem elk van de eerste 10 cijfers, vermenigvuldig met de gewichten **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, som de producten, bereken vervolgens 11 min (som modulo 11). Twee randgevallen maken het mensen lastig: wanneer de berekening 11 oplevert, gebruik 0 als verificatiecode; wanneer het 10 oplevert, gebruik 9. Deze speciale gevallen bestaan omdat de verificatiecode een enkel cijfer (0-9) moet zijn. Dit is een modulo-11 controlegetal-algoritme, vergelijkbaar met wat wordt gebruikt in ISBN-10-codes en andere identificatiesystemen wereldwijd. ### Kan ik deze tool gebruiken om echte, officiĆ«le CUIT/CUIL-nummers te genereren? Nee—deze tool genereert wiskundig geldige testgegevens, maar de nummers zijn niet officieel geregistreerd bij AFIP. Beschouw het als het genereren van een geldig creditcardnummer met het Luhn-algoritme: het slaagt voor formaatvalidatie, maar is niet verbonden met een echt account. Voor officiĆ«le CUIT/CUIL-registratie moeten individuen AFIP bezoeken met hun DNI, terwijl bedrijven de bedrijfsregistratieprocedures moeten voltooien. De tool is uitsluitend bedoeld voor ontwikkeling, testen en educatief gebruik waarbij u geldige gegevens nodig hebt die niet conflicteren met echte identificatienummers. ### Waarom mislukt mijn CUIT/CUIL-validatie zelfs als de opmaak correct lijkt? Wanneer validatie mislukt ondanks een correct uitziende opmaak, controleer dan deze veelvoorkomende oorzaken: 1. **Ongeldige typecode**: Alleen 20, 23, 24, 27, 30, 33, 34 zijn geldig. Het gebruik van 21, 25 of andere nummers zal falen. 2. **Verkeerde verificatiecode**: Het laatste cijfer moet overeenkomen met de algoritmische berekening. Zelfs het wijzigen van ƩƩn cijfer in het DNI-gedeelte vereist herberekening van de controleletter. 3. **Opmaakproblemen**: Moet exact 11 cijfers zijn (XX-XXXXXXXX-X). Let op extra spaties of ontbrekende voorloopnullen. 4. **Verborgen tekens**: KopiĆ«ren en plakken uit PDF's of websites kan soms onzichtbare Unicode-tekens introduceren die validatie verstoren. Een snelle debugtip: verwijder het laatste cijfer en bereken het handmatig opnieuw. Als het niet overeenkomt, dan is dat je probleem. ### Zijn koppeltekens verplicht in CUIT/CUIL-nummers? Koppeltekens zijn alleen voor weergave-opmaak—ze maken geen deel uit van het daadwerkelijke nummer voor berekeningsdoeleinden. Wanneer u **20-12345678-9** ziet, houdt het algoritme alleen rekening met de 11 cijfers: **20123456789**. De meeste validatie-implementaties verwijderen koppeltekens voordat ze worden verwerkt, vandaar dat onze tool zowel **20-12345678-9** als **20123456789** accepteert. In API's en databases slaat u doorgaans de niet-gekoppelde versie op en voegt u koppeltekens alleen toe bij weergave aan gebruikers. Deze aanpak voorkomt dat opmaakinconsistenties validatiefouten veroorzaken. ### Kan een CUIT/CUIL-nummer minder dan 8 cijfers hebben in het DNI-gedeelte? Het DNI-gedeelte moet altijd exact 8 cijfers zijn—geen uitzonderingen. Als iemands werkelijke DNI minder cijfers heeft (wat voorkomt bij oudere, lager genummerde DNI's), vult u aan met voorloopnullen. Bijvoorbeeld, DNI **1234567** wordt **01234567** in de CUIT/CUIL-structuur. Dit is een veelvoorkomende bron van bugs bij het converteren tussen DNI- en CUIT/CUIL-formaten. Ik heb systemen zien falen bij validatie omdat ze vergaten aan te vullen, waarbij **1234567** als een 7-cijferig nummer werd behandeld in plaats van **01234567**. Gebruik altijd nul-aanvulfuncties in uw code in plaats van eenvoudige stringconcatenatie. ### Hoe kan ik verifiĆ«ren of een CUIT/CUIL officieel is geregistreerd in ArgentiniĆ«? Onze tool valideert de wiskundige correctheid—opmaak, typecode en controleletter. Maar hij kan niet vaststellen of het nummer daadwerkelijk is geregistreerd bij AFIP of toebehoort aan een echt persoon of bedrijf. Voor officiĆ«le verificatie gebruikt u [AFIP's webservices](https://www.afip.gob.ar/) of hun "Constancia de Inscripción" opzoekgereedschap. AFIP biedt API's voor geautomatiseerde verificatie, hoewel u zich als ontwikkelaar moet registreren en authenticeren. Implementeer in productieomgevingen beide lagen: voer eerst algoritmische validatie uit (snel, vangt typefouten en opmaakfouten), verifieer vervolgens tegen AFIP's database (langzamer, maar bevestigt dat het nummer echt en actief is). ### Kan ik deze tool gebruiken in mijn commerciĆ«le toepassing? Ja—het CUIT/CUIL-validatie-algoritme is een openbare standaard gedefinieerd door AFIP, dus u kunt het vrijelijk implementeren in commerciĆ«le software. De hier gegeven codevoorbeelden zijn bedoeld als referentie-implementaties. Houd voor productiegebruik rekening met deze best practices: implementeer juiste foutafhandeling voor randgevallen, voeg logging toe voor het debuggen van validatiefouten, valideer tegen AFIP's officiĆ«le database (niet alleen algoritmische validatie), en houd uw implementatie up-to-date als AFIP de regels wijzigt (hoewel het huidige algoritme al decennia stabiel is). ### Slaat de tool gegenereerde of gevalideerde CUIT/CUIL-nummers op? Nee—alle verwerking vindt plaats in uw browser (client-side). Wanneer u een CUIT/CUIL genereert of valideert, wordt de berekening lokaal uitgevoerd met behulp van JavaScript. Er wordt niets naar onze servers gestuurd, en we loggen, slaan of volgen geen nummers op die u invoert of genereert. Deze client-side aanpak waarborgt privacy en betekent ook dat de tool offline werkt zodra de pagina is geladen. U kunt dit verifiĆ«ren door de developer tools van uw browser te openen en de netwerktab in de gaten te houden—u zult zien dat er geen verzoeken worden verzonden bij het genereren of valideren van nummers. ## Referenties 1. AFIP (Federale Belastingadministratie). "CUIT/CUIL/CDI." OfficiĆ«le Website. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministerie van Arbeid, Werkgelegenheid en Sociale Zekerheid. "CUIL - Unieke Arbeidsidentificatiesleutel." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Nationale Sociale Zekerheidsbeheerder). "Mijn CUIL verkrijgen." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Officieel Bulletin van de Argentijnse Republiek. "Algemene Resolutie AFIP 2854/2010: Procedure. Unieke Belastingidentificatiecode (C.U.I.T.)." 5. Fiscale Wetboek van de Argentijnse Republiek. "Identificatie en Registratie van Belastingplichtigen." --- Of u nu een factureringsysteem ontwikkelt, werknemers-instapprocessen test, of algoritmen voor validatie bestudeert, deze tool biedt de CUIT/CUIL-generatie en -validatie die u nodig hebt. Genereer testgegevens die algoritmische validatie doorstaan, verifieer nummers voordat ze in uw database terechtkomen, of ontdek hoe het controlegetal-algoritme in de praktijk werkt.