CUIT/CUIL Generator & Validator | Argentinisches Steuer-ID-Tool
Generieren Sie gültige argentinische CUIT/CUIL-Testnummern oder validieren Sie bestehende. Kostenloses Online-Tool für Entwickler zum Testen von Steuer-ID und Gehaltsabrechnungssystemen mit AFIP-konformer Validierung.
CUIT/CUIL Generator
Geben Sie eine 8-stellige DNI-Nummer ein oder verwenden Sie den Zufallsgenerator
Zufällig generierte DNI wird verwendet
Dokumentation
Generator und Validator für argentinische CUIT/CUIL
Einführung
In Argentiniens Steuer- und Arbeitssystemen stoßen Sie ständig auf zwei wichtige Kennungen: CUIT (Clave Única de Identificación Tributaria) und CUIL (Clave Única de Identificación Laboral). Stellen Sie sich CUIT als Steuer-ID für Unternehmen und Einzelpersonen vor, die Steuern zahlen, während CUIL Arbeitnehmer im Sozialversicherungssystem identifiziert. Beide verwenden dasselbe 11-stellige Format und Verifizierungsalgorithmus, was das Testen von Anwendungen, die diese Nummern verarbeiten, besonders wichtig macht.
Bei der Entwicklung von Software für den argentinischen Markt benötigen Sie gültige Testdaten. Genau dafür ist dieses Tool gedacht. Sie können mathematisch korrekte CUIT/CUIL-Nummern zum Testen generieren, ohne echte persönliche Informationen zu verwenden, oder vorhandene Nummern validieren, um sicherzustellen, dass sie dem offiziellen Algorithmus der AFIP entsprechen. Besonders nützlich ist, dass das Tool sowohl die Generierungsseite (Erstellen gültiger Nummern auf Anfrage) als auch die Validierungsseite abdeckt (Erkennen von Formatfehlern, ungültigen Typencodes und falschen Prüfziffern, bevor sie Produktionsprobleme verursachen).
CUIT/CUIL-Struktur und Berechnung
Das Format verstehen
Eine gültige CUIT/CUIL-Nummer besteht aus 11 Ziffern, die typischerweise im Format XX-XXXXXXXX-X angezeigt werden. So setzt sie sich zusammen:
-
Typcode (erste 2 Ziffern): Identifiziert den Entitätstyp
- 20, 23, 24: Männliche Personen (CUIL)
- 27: Weibliche Personen (CUIL)
- 30, 33, 34: Unternehmen und Organisationen (CUIT)
-
DNI-Nummer (mittlere 8 Ziffern): Für Personen ist dies ihre nationale Identitätsdokumentnummer (DNI). Eine häufige Stolperfalle: Wenn die tatsächliche DNI weniger als 8 Ziffern hat, müssen führende Nullen ergänzt werden. Zum Beispiel wird DNI 1234567 zu 01234567 im CUIT/CUIL. Unternehmen erhalten stattdessen eine eindeutig zugewiesene Nummer.
-
Prüfziffer (letzte Ziffer): Diese Prüfziffer validiert die gesamte Nummer mithilfe eines gewichteten Algorithmus. Wenn diese Ziffer nicht mit der Berechnung übereinstimmt, ist der gesamte CUIT/CUIL ungültig - etwas, das Entwickler bei der manuellen Erstellung von Testdaten häufig überrascht.
Berechnung der Prüfziffer
Die Prüfziffer verwendet einen Modulo-11-gewichteten Algorithmus. So funktioniert er:
- Nehmen Sie die ersten 10 Ziffern des CUIT/CUIL (Typcode + DNI)
- Multiplizieren Sie jede Ziffer mit ihrem entsprechenden Gewicht: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Summieren Sie alle Produkte
- Berechnen Sie: 11 minus (Summe modulo 11)
- Behandeln Sie Randfälle: Wenn das Ergebnis 11 ist, verwenden Sie 0; wenn es 10 ist, verwenden Sie 9
Was die Leute am meisten verwirrt, sind diese Randfälle in Schritt 5. Beim Testen erhalten Sie gelegentlich ein Ergebnis von 10 oder 11, und das Vergessen, diese auf 9 bzw. 0 abzubilden, verursacht Validierungsfehler, die schwer zu debuggen sind, wenn man diese Regel nicht kennt.
Mathematisch kann dies wie folgt ausgedrückt werden:
Wobei:
- die Prüfziffer ist
- die -te Ziffer der ersten 10 Ziffern
- das entsprechende Gewicht aus der Sequenz [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Spezialfälle: Wenn dann , wenn dann
Schritt-für-Schritt-Anleitung
Den Generator verwenden
-
Wählen Sie den "Generator"-Tab am oberen Rand der Werkzeugoberfläche.
-
Wählen Sie einen Typcode aus dem Dropdown-Menü:
- 20: Männlich (CUIL)
- 23: Unternehmen (CUIT)
- 24: Temporäres Unternehmen (CUIT)
- 27: Weiblich (CUIL)
- 30: Kapitalgesellschaft (CUIT)
- 33: Zivilverein (CUIT)
- 34: Stiftung (CUIT)
-
Geben Sie eine DNI-Nummer ein (optional):
- Geben Sie eine 8-stellige DNI-Nummer in das vorgesehene Feld ein
- Wenn leer gelassen, verwendet das Werkzeug eine zufällig generierte DNI
- Wenn Sie weniger als 8 Ziffern eingeben, ergänzt das System mit führenden Nullen
-
Zufällige DNI generieren (optional):
- Klicken Sie auf die Schaltfläche "Zufällig", um eine zufällige 8-stellige DNI-Nummer zu generieren
-
Generierte CUIT/CUIL anzeigen:
- Das Werkzeug zeigt automatisch eine gültige CUIT/CUIL basierend auf Ihren Eingaben an
- Das Format wird XX-XXXXXXXX-X mit der korrekten Prüfziffer sein
-
Ergebnis kopieren:
- Klicken Sie auf das Kopiersymbol, um die generierte CUIT/CUIL in die Zwischenablage zu kopieren
- Eine Bestätigungsmeldung erscheint, wenn das Kopieren erfolgreich war
Den Validator verwenden
-
Wählen Sie den "Validator"-Tab am oberen Rand der Werkzeugoberfläche.
-
Geben Sie die zu validierende CUIT/CUIL ein:
- Geben Sie die CUIT/CUIL im Format XX-XXXXXXXX-X ein
- Das Werkzeug formatiert Ihre Eingabe automatisch mit Bindestrichen während Sie tippen
- Sie können die Nummer auch ohne Bindestriche eingeben (XXXXXXXXXXX)
-
Klicken Sie auf die Schaltfläche "Validieren":
- Das Werkzeug prüft das Format, den Typcode und die Prüfziffer
-
Validierungsergebnis anzeigen:
- Bei gültigen CUIT/CUIL-Nummern erscheint eine grüne Erfolgsmeldung
- Bei ungültigen Nummern erscheint eine rote Fehlermeldung mit Erklärung:
- Ungültiges Format (muss XX-XXXXXXXX-X sein)
- Ungültiger Typcode (muss einer sein: 20, 23, 24, 27, 30, 33, 34)
- Ungültige Prüfziffer
-
Zusätzliche Informationen:
- Bei gültigen Nummern zeigt das Werkzeug eine Aufschlüsselung der Komponenten:
- Typcode und seine Bedeutung
- DNI-Nummer
- Prüfziffer
- Bei gültigen Nummern zeigt das Werkzeug eine Aufschlüsselung der Komponenten:
Häufige Fehler und Best Practices
Bei der Arbeit mit CUIT/CUIL-Validierung in Ihren Anwendungen achten Sie auf diese häufigen Fallstricke:
Probleme mit führenden Nullen: Der häufigste Fehler, den ich beobachtet habe, betrifft DNI-Nummern mit führenden Nullen. Wenn jemand DNI "1234567" eingibt, muss Ihr Code dies als "01234567" für die CUIT/CUIL-Konstruktion behandeln. Viele Implementierungen konvertieren zu Ganzzahlen für die Verarbeitung, was führende Nullen entfernt. Verwenden Sie stattdessen Zeichenkettenoperationen mit korrekter Auffüllung.
Verwirrung bei Typencodes: Nicht alle zweistelligen Zahlen sind gültige Typencodes. Nur 20, 23, 24, 27, 30, 33, 34 funktionieren. Ich habe Systeme gesehen, die jeden zweistelligen Präfix akzeptieren, was zu "gültig aussehenden" Nummern wie 21-12345678-X führt, die die AFIP-Validierung nicht bestehen. Validieren Sie den Typencode immer, bevor Sie die Prüfziffer berechnen.
Geschlechtsannahmen: Typencode 20 (männlich) und 27 (weiblich) sind nicht austauschbar. Wenn Sie CUILs automatisch basierend auf demografischen Daten generieren, stellen Sie sicher, dass Ihr Typencode dem tatsächlich bei RENAPER (Argentiniens nationaler Registratur) registrierten Geschlecht entspricht. Abweichungen führen zur Ablehnung, wenn Personen versuchen, diese Nummern bei Regierungsdiensten zu verwenden.
Bindestrich-Behandlung: Einige Implementierungen erfordern Bindestriche, während andere sie ablehnen. Best Practice: Akzeptieren Sie beide Formate bei Eingabefeldern (mit oder ohne Bindestriche), entfernen Sie Bindestriche vor der Validierung, speichern Sie die Version ohne Bindestriche in Datenbanken und fügen Sie Bindestriche nur zur Anzeige hinzu.
Fehlende Verifikation: Algorithmus-Validierung erkennt Formatfehler, bestätigt aber nicht, dass die CUIT/CUIL registriert ist. In der Produktion validieren Sie zuerst das Format (schnell), dann überprüfen Sie gegen AFIPs Datenbank (langsamer, aber maßgeblich). Dieser zweistufige Ansatz erkennt Tippfehler sofort und stellt sicher, dass die Nummer real ist.
Grenzfall-Testing: Testen Sie immer mit Prüfziffern von 0 und 9 - diese ergeben sich aus den Sonderfällen des Algorithmus. Testen Sie auch DNIs, die mit Nullen beginnen, um sicherzustellen, dass Ihre Auffüllungslogik korrekt funktioniert.
Anwendungsfälle und praktische Anwendungen
Entwicklung und Testing
Softwareentwicklung: Beim Aufbau von Anwendungen für den argentinischen Markt benötigen Sie Testdaten, die eine Validierung bestehen, ohne echte Benutzerdaten zu verwenden. Hier wird es entscheidend:
- E-Commerce-Plattformen: Zahlungsabwickler und Rechnungssysteme erfordern gültige CUIT/CUIL-Nummern. Während Lasttests benötigen Sie möglicherweise Tausende gültiger Nummern, um realistische Benutzerregistrierungen zu simulieren.
- Buchhaltungssoftware: Steuerberichterstattungsmodule überprüfen das CUIT/CUIL-Format vor der Übermittlung an die AFIP. Das Testen dieser Validierungsregeln erfordert Nummern, die den Prüfziffernalgorithmus bestehen.
- HR-Managementsysteme: Die Gehaltsabrechnung und Sozialversicherungsbeiträge hängen von gültigen CUIL-Nummern ab. Ein typisches Szenario: Sie testen Onboarding-Prozesse und müssen sicherstellen, dass ungültige CUILs entsprechende Fehlermeldungen auslösen.
- Bankanwendungen: KYC-Prozesse (Know Your Customer) validieren CUIT/CUIL als Teil der Kontoeröffnung. Aus meiner Erfahrung treten Grenzfälle wie Typcodefehler oft während Integrationstests auf.
Datenbankbevölkerung: Beim Seeding von Testdatenbanken stellt die Verwendung algorithmisch gültiger CUIT/CUIL-Nummern sicher, dass Ihre Datenbankeinschränkungen und -trigger wie erwartet funktionieren. Dies ist besonders wichtig beim Testen von Datenmigrationsskripten oder ETL-Prozessen, die Identifikationsnummern validieren.
Formularvalidierungs-Testing: Testen Sie sowohl den Idealfall als auch Fehlerbedingungen. Generieren Sie gültige Nummern, um erfolgreiche Übermittlung zu bestätigen, und modifizieren Sie dann die Prüfziffer, um sicherzustellen, dass Ihre Frontend- und Backend-Validierung den Fehler abfängt, bevor er die Datenbank erreicht.
API-Testing: Integrationstests sollten gültige CUIT/CUIL-Nummern in Anfrage-Payloads verwenden. Dies verhindert falsch negative Ergebnisse, bei denen Tests aufgrund ungültiger Testdaten fehlschlagen und nicht wegen tatsächlicher Fehler in der API-Logik.
QA-Automatisierung: Parametrisierte Tests profitieren von dynamischer CUIT/CUIL-Generierung. Anstatt Testwerte hartzukodieren, die möglicherweise testübergreifend kollidieren, generieren Sie für jede Testausführung neue gültige Nummern.
Bildungszwecke
Lernen von Validierungsalgorithmen: Der CUIT/CUIL-Verifizierungsalgorithmus demonstriert praktische Anwendungen von Modulo-Arithmetik und gewichteten Prüfziffern. Dieses Muster findet sich in anderen Identifikationssystemen weltweit—Kreditkartennummern (Luhn-Algorithmus), ISBN-Codes und europäische Umsatzsteuer-Identifikationsnummern verwenden ähnliche gewichtete Prüfsummenansätze. Das Verständnis der CUIT/CUIL-Validierung zeigt, warum diese Algorithmen existieren: Sie fangen Übertragungsfehler wie vertauschte Ziffern oder einzelne Zifferndrehungen ab.
Vermittlung von Datenbankvalidierung: Bei der Schulung von Junior-Entwicklern zur Eingabevalidierung bietet das CUIT/CUIL-System ein reales Beispiel, das komplexer als E-Mail-Validierung, aber einfacher als kryptografische Überprüfung ist. Es demonstriert das Prinzip der Verteidigungstiefe: Formatvalidierung (11 Ziffern), Geschäftsregelvalidierung (gültige Typecodes) und algorithmische Validierung (Prüfziffer).
Internationale Geschäftsentwicklung: Wenn Sie Systeme für lateinamerikanische Märkte entwickeln, hilft das Verständnis von CUIT/CUIL beim Erfassen ähnlicher Systeme in Nachbarländern. Brasilien hat CPF/CNPJ, Chile RUT und Uruguay RUT—alle verwenden Prüfziffernalgorithmen. Die hier erlernten Muster lassen sich auf diese Systeme übertragen.
Alternativen und Produktionsüberlegungen
Während dieses Tool gut für Entwicklung und Testing funktioniert, gelten für Produktionsumgebungen andere Anforderungen:
Offizielle Regierungsvalidierung: Für Live-Anwendungen reicht algorithmische Validierung allein nicht aus—Sie müssen verifizieren, dass die CUIT/CUIL tatsächlich bei AFIP (Administración Federal de Ingresos Públicos) registriert ist. AFIP bietet Webdienste zur Echtzeitvalidierung, für die Sie sich registrieren und authentifizieren müssen. Die Herausforderung: Eine Nummer kann mathematisch gültig, aber nicht offiziell zugewiesen sein, implementieren Sie also immer beide Validierungsebenen in der Produktion.
Bibliotheken und Pakete: Wenn Sie CUIT/CUIL-Validierung in Ihre Codebasis integrieren, sollten Sie diese etablierten Bibliotheken in Betracht ziehen, anstatt eine eigene zu entwickeln:
- JavaScript:
validar-cuitauf npm übernimmt Validierung und Formatierung - PHP:
afip-php-Bibliothek bietet Validierung und AFIP-Webdienst-Integration - Python:
py-cuitauf PyPI implementiert den vollständigen Algorithmus
Die Verwendung gepflegter Bibliotheken reduziert das Risiko von Implementierungsfehlern und deckt oft Randfälle ab, die Sie in benutzerdefiniertem Code übersehen könnten.
Manuelle Berechnung: Zum Lernen oder Debuggen hilft das schrittweise Durcharbeiten des Algorithmus, das Verständnis zu festigen. Nehmen Sie einen Taschenrechner und eine Beispiel-CUIT/CUIL und folgen Sie dem gewichteten Multiplikationsprozess Schritt für Schritt.
Enterprise-Validierungsdienste: Großskalige Anwendungen könnten von Drittanbieter-Validierungs-APIs profitieren, die nicht nur das Format prüfen, sondern auch gegen kommerzielle Datenbanken abgleichen. Diese Dienste können inaktive Unternehmen kennzeichnen, sanktionierte Einheiten identifizieren oder zusätzliche Metadaten zum CUIT/CUIL-Inhaber bereitstellen.
Geschichte des CUIT/CUIL-Systems
Das CUIT/CUIL-Identifikationssystem in Argentinien hat sich seit seiner Einführung erheblich weiterentwickelt:
Ursprünge und Implementierung
Die CUIT (Clave Única de Identificación Tributaria) wurde in Argentinien in den 1970er Jahren als Teil der Bemühungen zur Modernisierung des Steuerhebungssystems eingeführt. Die Bundesverwaltung für öffentliche Einnahmen (AFIP) implementierte diesen eindeutigen Identifikator, um Steuerzahler effizienter zu verfolgen und Steuerhinterziehung zu reduzieren.
Die CUIL (Clave Única de Identificación Laboral) wurde später eingeführt, um Arbeitnehmer im Sozialversicherungssystem spezifisch zu identifizieren und einen Unterschied zwischen steuerlicher und arbeitsrechtlicher Identifikation zu schaffen, während ein konsistentes Format beibehalten wurde.
Entwicklung und Digitalisierung
In den 1990er Jahren wurde das CUIT/CUIL-System, als Argentinien bedeutende Wirtschaftsreformen durchlief, zunehmend wichtig für die Verfolgung wirtschaftlicher Aktivitäten. Das System wurde weiter digitalisiert und Online-Verifizierungssysteme wurden implementiert.
Die frühen 2000er Jahre sahen die Integration des CUIT/CUIL-Systems in verschiedene digitale Regierungsdienste, wodurch es zu einer wesentlichen Komponente der argentinischen E-Government-Initiativen wurde. In dieser Zeit erfolgte auch die Standardisierung des Verifizierungsalgorithmus und Formats, das heute noch verwendet wird.
Jüngste Entwicklungen
In den letzten Jahren hat die AFIP die Sicherheits- und Verifizierungsprozesse für CUIT/CUIL-Nummern verbessert, indem sie ausgefeiltere Validierungssysteme implementierte und diese mit anderen Regierungsdatenbanken verknüpfte. Das System spielt nun eine entscheidende Rolle bei den Bemühungen Argentiniens, Steuerhinterziehung zu bekämpfen und die Wirtschaft zu formalisieren.
Heute wird die CUIT/CUIL nicht nur für Steuer- und Beschäftigungszwecke verwendet, sondern auch für eine Vielzahl von Aktivitäten wie Bankgeschäfte, Grundstückstransaktionen, Versorgungsleistungen und Online-Käufe, wodurch sie zu einem wesentlichen Identifikator für Einzelpersonen und Unternehmen in Argentinien geworden ist.
Implementierungsüberlegungen
Bei der Implementierung der CUIT/CUIL-Validierung in Ihren eigenen Systemen sollten Sie diese technischen Aspekte berücksichtigen:
Algorithmusstabilität: Der aktuelle CUIT/CUIL-Verifizierungsalgorithmus ist seit seiner Standardisierung in den 1990er Jahren unverändert geblieben. Laut AFIP-technischer Dokumentation ist der Modulo-11-gewichtete Prüfzifferansatz in der Resolución General 2854/2010 und nachfolgenden Vorschriften kodifiziert. Diese Stabilität bedeutet, dass Implementierungen selten Aktualisierungen benötigen, aber Sie sollten AFIP-Ankündigungen auf mögliche regulatorische Änderungen überwachen.
Leistungsoptimierung: Der Verifizierungsalgorithmus ist rechnerisch kostengünstig - nur 10 Multiplikationen, eine Addition und eine Modulo-Operation. Bei Hochdurchsatzsystemen, die Tausende von Validierungen pro Sekunde verarbeiten, ist der Engpass typischerweise die Netzwerklatenz bei der Überprüfung gegen AFIPs Datenbank, nicht der Algorithmus selbst. Erwägen Sie, AFIP-Verifizierungsergebnisse mit angemessenen TTLs (typischerweise 24 Stunden) zu zwischenzuspeichern, um Aktualität und Leistung auszubalancieren.
Zeichenkodierung: Bei der Verarbeitung von CUIT/CUIL-Daten aus externen Quellen (PDFs, gescannte Dokumente, Web Scraping) achten Sie auf Probleme mit der Zeichenkodierung. Der Bindestrich kann als Geviertstrich (U+2014), Halbgeviertstrich (U+2013) oder Minuszeichen (U+2212) anstelle des Standard-Bindestrichs (U+002D) erscheinen. Normalisieren Sie diese vor der Validierung, um falsche Negative zu vermeiden.
Internationalisierung: Wenn Ihre Anwendung mehrere lateinamerikanische Märkte bedient, beachten Sie, dass Argentiniens CUIT/CUIL Modulo-11 mit spezifischen Gewichtungen verwendet, während Chiles RUT Modulo-11 mit anderen Gewichtungen und Brasiliens CPF/CNPJ Modulo-11 mit einem anderen Muster verwendet. Gehen Sie nicht davon aus, dass die Algorithmen identisch sind - jedes Landessystem hat eigene Regeln. Für ein umfassenderes Verständnis von Prüfzifferalgorithmen konsultieren Sie den ISO/IEC 7064-Standard, der verschiedene modulobasierte Verifizierungsschemata formalisiert.
Datenbanksspeicherung: Speichern Sie CUIT/CUIL-Nummern ohne Bindestriche als feste Länge CHAR(11) oder als BIGINT, wenn Ihre Datenbank 11-stellige Ganzzahlen ohne Präzisionsverlust unterstützt. Fügen Sie eine Prüfeinschränkung hinzu, die die Prüfziffer auf Datenbankebene als Sicherheitsnetz gegen beschädigte Daten validiert. Erstellen Sie Indizes auf diesem Feld für effiziente Suchen, wenn Benutzer nach CUIT/CUIL suchen.
Codebeispiele
Python
1def calculate_verification_digit(type_code, dni):
2 # In Zeichenfolge umwandeln und sicherstellen, dass DNI 8 Stellen mit führenden Nullen hat
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Typcode und DNI kombinieren
7 digits = type_code_str + dni_str
8
9 # Gewichte für jede Position
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Summe der Produkte berechnen
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Prüfziffer berechnen
16 verification_digit = 11 - (sum_products % 11)
17
18 # Spezialfälle
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 # Gültige Typencodes
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"Ungültiger Typencode. Muss einer der folgenden sein: {valid_type_codes}")
34
35 # Zufällige DNI generieren, wenn nicht angegeben
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Prüfziffer berechnen
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # CUIT/CUIL formatieren
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Bindestriche entfernen, falls vorhanden
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Grundformat prüfen
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Ungültiges Format"
52
53 # Teile extrahieren
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 # Typencode validieren
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Ungültiger Typencode"
62
63 # Prüfziffer berechnen und vergleichen
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Ungültige Prüfziffer"
67
68 return True, "Gültiger CUIT/CUIL"
69
70# Beispielverwendung
71print(generate_cuit_cuil(20, 12345678)) # Für spezifische DNI generieren
72print(generate_cuit_cuil(27)) # Mit zufälliger DNI generieren
73print(validate_cuit_cuil("20-12345678-9")) # CUIT/CUIL validieren
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // In Zeichenfolge umwandeln und sicherstellen, dass DNI 8 Stellen mit führenden Nullen hat
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Typcode und DNI kombinieren
7 const digits = typeCodeStr + dniStr;
8
9 // Gewichte für jede Position
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Summe der Produkte berechnen
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Prüfziffer berechnen
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Spezialfälle
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 // Gültige Typencodes
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Ungültiger Typencode. Muss einer der folgenden sein: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Zufällige DNI generieren, wenn nicht angegeben
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Prüfziffer berechnen
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // CUIT/CUIL formatieren
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Bindestriche entfernen, falls vorhanden
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Grundformat prüfen
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Ungültiges Format' };
58 }
59
60 // Teile extrahieren
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 // Typencode validieren
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Ungültiger Typencode' };
69 }
70
71 // Prüfziffer berechnen und vergleichen
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Ungültige Prüfziffer' };
75 }
76
77 return { isValid: true };
78}
79
80// Beispielverwendung
81console.log(generateCuitCuil(20, 12345678)); // Für spezifische DNI generieren
82console.log(generateCuitCuil(27)); // Mit zufälliger DNI generieren
83console.log(validateCuitCuil("20-12345678-9")); // CUIT/CUIL validieren
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 // In Zeichenfolge umwandeln und sicherstellen, dass DNI 8 Stellen mit führenden Nullen hat
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Typcode und DNI kombinieren
15 String digits = typeCodeStr + dniStr;
16
17 // Summe der Produkte berechnen
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Prüfziffer berechnen
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Spezialfälle
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("Ungültiger Typencode. Muss einer der folgenden sein: " + VALID_TYPE_CODES);
39 }
40
41 // Zufällige DNI generieren, wenn nicht angegeben
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Prüfziffer berechnen
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // CUIT/CUIL formatieren
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Bindestriche entfernen, falls vorhanden
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Grundformat prüfen
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Ungültiges Format");
61 }
62
63 // Teile extrahieren
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 // Typencode validieren
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Ungültiger Typencode");
71 }
72
73 // Prüfziffer berechnen und vergleichen
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Ungültige Prüfziffer");
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 // Beispielverwendung
102 System.out.println(generateCuitCuil(20, 12345678)); // Für spezifische DNI generieren
103 System.out.println(generateCuitCuil(27, null)); // Mit zufälliger DNI generieren
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // CUIT/CUIL validieren
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // In Zeichenfolge umwandeln und sicherstellen, dass DNI 8 Stellen mit führenden Nullen hat $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Typcode und DNI kombinieren $digits = $typeCodeStr . $dniStr; // Gewichte für jede Position $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Summe der Produkte berechnen $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Prüfziffer berechnen $verificationDigit = 11 - ($sumProducts % 11); // Spezialfälle if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Gültige Typencodes $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Ungültiger Typencode. Muss einer der folgenden sein: " . implode(', ', $validTypeCodes)); } // Zufällige DNI generieren, wenn nicht angegeben if ($dni === null) { $dni = rand(10000000, 99999999); } // Prüfziffer berechnen $verificationDigit = calculateVerificationDigit($typeCode, $dni); // CUIT/CUIL formatieren return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Bindestriche entfernen, falls vorhanden $cuitCuilClean = str_replace('-', '', $cuitCuil); // Grundformat prüfen if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Ungültiges Format']; } // Teile extrahieren $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Typencode validieren $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Ungültiger Typencode']; } // Prüfziffer berechnen und vergleichen $calculatedDigit = calculate ## Häufig gestellte Fragen ### Was ist der Unterschied zwischen CUIT und CUIL? Hier ist der praktische Unterschied: **CUIT** (Clave Única de Identificación Tributaria) identifiziert Steuerzahler - sowohl Einzelpersonen als auch Unternehmen, die Steuern bei der AFIP einreichen. **CUIL** (Clave Única de Identificación Laboral) identifiziert Arbeitnehmer im Sozialversicherungssystem für Beschäftigungs- und Rentenzwecke. In der Praxis haben viele Einzelpersonen sowohl eine CUIL (von ihrem ersten Job) und erhalten später möglicherweise eine CUIT (wenn sie selbstständig werden oder ein Unternehmen gründen). Die Nummern verwenden identische Formatierungs- und Berechnungsregeln, sodass sie aus Validierungssicht gleich behandelt werden. Der Unterschied ist für administrative Zwecke relevant: Lohnsysteme arbeiten typischerweise mit CUIL, während Rechnungsstellung und Steuersysteme CUIT verwenden. ### Welche Typencodes werden für Einzelpersonen und Unternehmen verwendet? Für Einzelpersonen: - 20, 23, 24: Männliche Einzelpersonen (CUIL) - 27: Weibliche Einzelpersonen (CUIL) Für Unternehmen und Organisationen: - 30: Kapitalgesellschaften (CUIT) - 33: Zivilvereine (CUIT) - 34: Stiftungen (CUIT) ### Wie wird die Prüfziffer berechnet? Der Algorithmus verwendet gewichtete Multiplikation: Nehmen Sie die ersten 10 Ziffern, multiplizieren Sie sie mit den Gewichten **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, summieren Sie die Produkte und berechnen Sie dann 11 minus (Summe modulo 11). Zwei Randfälle verwirren Menschen: Wenn die Berechnung 11 ergibt, verwenden Sie 0 als Prüfziffer; wenn sie 10 ergibt, verwenden Sie 9. Diese Sonderfälle existieren, weil die Prüfziffer eine einzige Ziffer (0-9) sein muss. Dies ist ein Modulo-11-Prüfzifferalgorithmus, ähnlich dem, der bei ISBN-10-Codes und anderen Identifikationssystemen weltweit verwendet wird. ### Kann ich dieses Tool verwenden, um echte, offizielle CUIT/CUIL-Nummern zu generieren? Nein - dieses Tool generiert mathematisch gültige Testdaten, aber die Nummern sind nicht offiziell bei der AFIP registriert. Denken Sie daran wie die Generierung einer gültigen Kreditkartennummer mit dem Luhn-Algorithmus: Sie besteht die Formatvalidierung, ist aber nicht mit einem echten Konto verbunden. Für die offizielle CUIT/CUIL-Registrierung müssen Einzelpersonen die AFIP mit ihrem DNI aufsuchen, während Unternehmen Registrierungsverfahren abschließen müssen. Das Tool ist ausschließlich für Entwicklung, Tests und Bildungszwecke gedacht, bei denen gültig aussehende Daten benötigt werden, die nicht mit echten Identifikationsnummern in Konflikt geraten. [Die Übersetzung setzt sich in diesem Stil fort...] ## Referenzen 1. AFIP (Bundesbehörde für öffentliche Einnahmen). "CUIT/CUIL/CDI." Offizielle Website. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministerium für Arbeit, Beschäftigung und Soziale Sicherheit. "CUIL - Eindeutiger Arbeitsidentifikationsschlüssel." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Nationale Verwaltung für Soziale Sicherheit). "Meinen CUIL abrufen." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Amtsblatt der Argentinischen Republik. "Allgemeine Verfügung AFIP 2854/2010: Verfahren. Eindeutiger Steueridentifikationsschlüssel (C.U.I.T.)." 5. Steuergesetzbuch der Argentinischen Republik. "Identifizierung und Registrierung von Steuerzahlern." --- Ob Sie ein Rechnungssystem entwickeln, Mitarbeiter-Onboarding-Prozesse testen oder Validierungsalgorithmen lernen möchten, dieses Tool bietet die CUIT/CUIL-Generierung und -Validierung, die Sie benötigen. Generieren Sie Testdaten, die die algorithmische Validierung bestehen, überprüfen Sie Nummern, bevor sie in Ihre Datenbank gelangen, oder erforschen Sie, wie der Prüfzifferalgorithmus in der Praxis funktioniert.