Generator i Walidator CUIT/CUIL | Narzędzie do identyfikacji podatkowej w Argentynie
Generuj ważne testowe numery CUIT/CUIL dla Argentyny lub weryfikuj istniejące. Darmowe narzędzie online dla programistów testujących systemy podatkowe i płacowe z walidacją zgodną z AFIP.
Generator CUIT/CUIL
Wprowadź 8-cyfrowy numer DNI lub użyj generatora losowego
Używanie losowo wygenerowanego DNI
Dokumentacja
Generator i Walidator Argentyńskiego CUIT/CUIL
Wprowadzenie
W argentyńskich systemach podatkowych i pracowniczych stale napotyka się dwa kluczowe identyfikatory: CUIT (Clave Única de Identificación Tributaria) i CUIL (Clave Única de Identificación Laboral). Można pomyśleć o CUIT jako numerze identyfikacyjnym podatkowym dla firm i osób płacących podatki, podczas gdy CUIL identyfikuje pracowników w systemie zabezpieczenia społecznego. Oba używają tego samego 11-cyfrowego formatu i algorytmu weryfikacyjnego, co czyni testowanie aplikacji obsługujących te numery szczególnie ważnym zadaniem.
Podczas tworzenia oprogramowania dla argentyńskiego rynku potrzebujesz ważnych danych testowych. Właśnie w tym pomaga to narzędzie. Możesz generować matematycznie poprawne numery CUIT/CUIL do testowania bez używania prawdziwych danych osobowych lub weryfikować istniejące numery, aby upewnić się, że są zgodne z oficjalnym algorytmem AFIP. Szczególnie przydatne jest to, że narzędzie obsługuje zarówno stronę generowania (tworzenie ważnych numerów na żądanie), jak i walidacji (wychwytywanie błędów formatu, nieprawidłowych kodów typów i nieprawidłowych cyfr weryfikacyjnych przed wywołaniem problemów w produkcji).
Struktura i Obliczanie CUIT/CUIL
Zrozumienie Formatu
Prawidłowy numer CUIT/CUIL składa się z 11 cyfr, zazwyczaj wyświetlanych w formacie XX-XXXXXXXX-X. Oto jak to wygląda:
-
Kod Typu (pierwsze 2 cyfry): Identyfikuje rodzaj podmiotu
- 20, 23, 24: Osoby płci męskiej (CUIL)
- 27: Osoby płci żeńskiej (CUIL)
- 30, 33, 34: Firmy i organizacje (CUIT)
-
Numer DNI (środkowe 8 cyfr): Dla osób fizycznych jest to ich narodowy numer dokumentu tożsamości (DNI). Częstym błędem jest to, że jeśli rzeczywisty numer DNI ma mniej niż 8 cyfr, należy go uzupełnić wiodącymi zerami. Na przykład DNI 1234567 staje się 01234567 w CUIT/CUIL. Firmy otrzymują zamiast tego unikalny przypisany numer.
-
Cyfra Weryfikacyjna (ostatnia cyfra): Ta cyfra kontrolna sprawdza poprawność całego numeru za pomocą algorytmu ważonego. Jeśli ta cyfra nie zgadza się z obliczeniem, cały CUIT/CUIL jest nieprawidłowy — coś, co często zaskakuje programistów podczas ręcznego konstruowania danych testowych.
Obliczanie Cyfry Weryfikacyjnej
Cyfra weryfikacyjna używa algorytmu ważonego modulo-11. Oto jak to działa:
- Weź pierwsze 10 cyfr CUIT/CUIL (kod typu + DNI)
- Pomnóż każdą cyfrę przez jej odpowiednią wagę: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Zsumuj wszystkie ilorazy
- Oblicz: 11 minus (suma modulo 11)
- Obsłuż przypadki graniczne: jeśli wynik to 11, użyj 0; jeśli to 10, użyj 9
Najbardziej mylące są przypadki graniczne w kroku 5. Podczas testowania czasami otrzymasz wynik 10 lub 11, a zapomnienie o mapowaniu tych wartości na 9 i 0 powoduje błędy walidacji, które mogą być trudne do debugowania, jeśli nie jest się świadomym tej reguły.
Matematycznie można to wyrazić jako:
Gdzie:
- jest cyfrą weryfikacyjną
- jest -tą cyfrą pierwszych 10 cyfr
- jest odpowiednią wagą z sekwencji [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Przypadki specjalne: jeśli to , jeśli to
Przewodnik krok po kroku
Korzystanie z Generatora
-
Wybierz zakładkę "Generator" w górnej części interfejsu narzędzia.
-
Wybierz Kod Typu z menu rozwijanego:
- 20: Mężczyzna (CUIL)
- 23: Firma (CUIT)
- 24: Tymczasowa Firma (CUIT)
- 27: Kobieta (CUIL)
- 30: Korporacja (CUIT)
- 33: Stowarzyszenie Cywilne (CUIT)
- 34: Fundacja (CUIT)
-
Wprowadź numer DNI (opcjonalnie):
- Wprowadź 8-cyfrowy numer DNI w podanym polu
- Jeśli pozostawione puste, narzędzie użyje losowo wygenerowanego DNI
- Jeśli wprowadzisz mniej niż 8 cyfr, system uzupełni wiodącymi zerami
-
Generowanie losowego DNI (opcjonalnie):
- Kliknij przycisk "Losowy", aby wygenerować losowy 8-cyfrowy numer DNI
-
Wyświetl wygenerowany CUIT/CUIL:
- Narzędzie automatycznie wyświetla ważny CUIT/CUIL na podstawie Twoich danych wejściowych
- Format będzie XX-XXXXXXXX-X z poprawną cyfrą weryfikacyjną
-
Skopiuj wynik:
- Kliknij ikonę kopiowania, aby skopiować wygenerowany CUIT/CUIL do schowka
- Pojawi się komunikat potwierdzający pomyślne skopiowanie
Korzystanie z Walidatora
-
Wybierz zakładkę "Walidator" w górnej części interfejsu narzędzia.
-
Wprowadź CUIT/CUIL do walidacji:
- Wprowadź CUIT/CUIL w formacie XX-XXXXXXXX-X
- Narzędzie automatycznie sformatuje Twoje dane wejściowe z myślnikami podczas wpisywania
- Możesz również wprowadzić numer bez myślników (XXXXXXXXXXX)
-
Kliknij przycisk "Waliduj":
- Narzędzie sprawdzi format, kod typu i cyfrę weryfikacyjną
-
Wyświetl wynik walidacji:
- Dla ważnych numerów CUIT/CUIL pojawi się zielony komunikat sukcesu
- Dla nieprawidłowych numerów pojawi się czerwony komunikat błędu wyjaśniający problem:
- Nieprawidłowy format (musi być XX-XXXXXXXX-X)
- Nieprawidłowy kod typu (musi być jednym z: 20, 23, 24, 27, 30, 33, 34)
- Nieprawidłowa cyfra weryfikacyjna
-
Dodatkowe informacje:
- Dla ważnych numerów narzędzie wyświetla rozbicie składników:
- Kod typu i jego znaczenie
- Numer DNI
- Cyfra weryfikacyjna
- Dla ważnych numerów narzędzie wyświetla rozbicie składników:
Typowe Błędy i Najlepsze Praktyki
Podczas pracy z walidacją CUIT/CUIL w swoich aplikacjach, uważaj na te częste pułapki:
Problemy z Zerowaniem: Najczęstszym błędem, jaki napotkałem, są numery DNI z wiodącymi zerami. Gdy ktoś wprowadzi DNI "1234567", Twój kod musi go traktować jako "01234567" podczas konstruowania CUIT/CUIL. Wiele implementacji konwertuje do liczb całkowitych podczas przetwarzania, co usuwa wiodące zera. Zamiast tego używaj operacji na ciągach znaków z odpowiednim uzupełnianiem.
Pomyłki z Kodem Typu: Nie wszystkie dwucyfrowe numery są prawidłowymi kodami typu. Działają tylko 20, 23, 24, 27, 30, 33, 34. Widziałem systemy, które akceptują dowolny dwucyfrowy prefiks, prowadzące do "wyglądających na ważne" numerów jak 21-12345678-X, które nie przechodzą walidacji AFIP. Zawsze sprawdzaj kod typu przed obliczeniem cyfry weryfikacyjnej.
Założenia Dotyczące Płci: Kody typu 20 (mężczyzna) i 27 (kobieta) nie są zamienne. Jeśli automatycznie generujesz CUIL w oparciu o dane demograficzne, upewnij się, że Twój kod typu odpowiada faktycznej płci zarejestrowanej w RENAPER (krajowy rejestr Argentyny). Niezgodności powodują odrzucenie podczas próby użycia tych numerów w usługach rządowych.
Obsługa Łączników: Niektóre implementacje wymagają łączników, podczas gdy inne je odrzucają. Najlepsza praktyka: akceptuj oba formaty w polach wprowadzania (z łącznikami lub bez), usuń łączniki przed walidacją, przechowuj wersję bez łączników w bazach danych i dodawaj łączniki tylko do celów wyświetlania.
Brak Weryfikacji: Algorytm walidacji wykrywa błędy formatu, ale nie potwierdza, czy CUIT/CUIL jest zarejestrowany. W środowisku produkcyjnym najpierw zweryfikuj format (szybko), a następnie sprawdź w bazie danych AFIP (wolniej, ale autorytatywnie). To dwuetapowe podejście natychmiast wyłapuje literówki, jednocześnie zapewniając, że numer jest prawdziwy.
Testowanie Przypadków Skrajnych: Zawsze testuj z cyframi weryfikacyjnymi 0 i 9 — wynikają one ze specjalnych przypadków w algorytmie. Przetestuj również DNI zaczynające się od zer, aby upewnić się, że logika uzupełniania działa poprawnie.
Przypadki użycia i praktyczne zastosowania
Rozwój i testowanie
Tworzenie oprogramowania: Podczas budowy aplikacji dla rynku argentyńskiego, będziesz potrzebować danych testowych, które przechodzą walidację bez użycia prawdziwych informacji użytkownika. Oto, kiedy staje się to krytyczne:
- Platformy e-commerce: Procesory płatności i systemy fakturowania wymagają ważnych numerów CUIT/CUIL. Podczas testów obciążeniowych możesz potrzebować tysięcy ważnych numerów do symulacji realistycznych rejestracji użytkowników.
- Oprogramowanie księgowe: Moduły raportowania podatkowego weryfikują format CUIT/CUIL przed wysłaniem do AFIP. Testowanie tych reguł walidacji wymaga numerów, które przechodzą algorytm cyfry kontrolnej.
- Systemy zarządzania zasobami ludzkimi: Przetwarzanie listy płac i składek na ubezpieczenie społeczne zależy od ważnych numerów CUIL. Typowy scenariusz: testujesz przepływy onboardingu pracowników i musisz sprawdzić, czy nieprawidłowe CUIL-e wywołują odpowiednie komunikaty o błędach.
- Aplikacje bankowe: Procesy KYC (Poznaj Swojego Klienta) weryfikują CUIT/CUIL jako część otwierania konta. W moim doświadczeniu przypadki graniczne, takie jak niezgodności kodu typu, często ujawniają się podczas testów integracyjnych.
Populacja bazy danych: Podczas zasiewania testowych baz danych, używanie algorytmicznie ważnych numerów CUIT/CUIL zapewnia, że ograniczenia i wyzwalacze bazy danych działają zgodnie z oczekiwaniami. Ma to szczególne znaczenie podczas testowania skryptów migracji danych lub procesów ETL, które weryfikują numery identyfikacyjne.
Testowanie walidacji formularzy: Testuj zarówno ścieżkę szczęśliwą, jak i warunki błędów. Generuj ważne numery, aby potwierdzić pomyślne złożenie, a następnie zmodyfikuj cyfrę weryfikacyjną, aby upewnić się, że Twoja walidacja frontend i backend przechwytuje błąd przed dotarciem do bazy danych.
Testowanie API: Testy integracyjne powinny używać ważnych numerów CUIT/CUIL w ładunkach żądań. Zapobiega to fałszywym negatywom, gdzie testy zawodzą z powodu nieprawidłowych danych testowych, a nie rzeczywistych błędów w logice API.
Automatyzacja QA: Sparametryzowane testy korzystają z dynamicznego generowania CUIT/CUIL. Zamiast twardego kodowania wartości testowych, które mogą powodować konflikty między uruchomieniami testów, generuj świeże ważne numery dla każdego wykonania testu.
Cele edukacyjne
Nauka algorytmów walidacji: Algorytm weryfikacji CUIT/CUIL demonstruje praktyczne zastosowanie arytmetyki modulo i ważonych cyfr kontrolnych. Ten sam wzorzec pojawia się w innych systemach identyfikacji na świecie — numery kart kredytowych (algorytm Luhna), kody ISBN i europejskie numery VAT używają podobnych podejść z ważonymi sumami kontrolnymi. Zrozumienie, jak działa walidacja CUIT/CUIL, daje wgląd w to, dlaczego te algorytmy istnieją: wyłapują błędy przepisywania, takie jak przestawione cyfry lub błędy pojedynczej cyfry.
Nauczanie walidacji danych: Podczas szkolenia młodszych programistów w zakresie walidacji danych wejściowych, system CUIT/CUIL oferuje przykład z prawdziwego świata, który jest bardziej złożony niż walidacja adresu e-mail, ale prostszy niż weryfikacja kryptograficzna. Demonstruje zasadę głębi obrony: walidacja formatu (11 cyfr), walidacja reguł biznesowych (ważne kody typów) i walidacja algorytmiczna (cyfra kontrolna).
Rozwój biznesu międzynarodowego: Jeśli budujesz systemy dla rynków latynoamerykańskich, zrozumienie CUIT/CUIL pomaga zrozumieć podobne systemy w sąsiednich krajach. Brazylia ma CPF/CNPJ, Chile ma RUT, a Urugwaj ma RUT — wszystkie używają algorytmów cyfr kontrolnych. Wzorce, które tu poznasz, przenoszą się na te systemy.
Alternatywy i uwagi produkcyjne
Podczas gdy to narzędzie sprawdza się dobrze w rozwoju i testowaniu, środowiska produkcyjne mają inne wymagania:
Oficjalna walidacja rządowa: W przypadku aplikacji na żywo sama walidacja algorytmiczna nie wystarczy — musisz sprawdzić, czy CUIT/CUIL jest faktycznie zarejestrowany w AFIP (Administración Federal de Ingresos Públicos). AFIP udostępnia usługi sieciowe do walidacji w czasie rzeczywistym, choć będziesz musiał się zarejestrować i uwierzytelnić, aby uzyskać do nich dostęp. Haczyk: numer może być matematycznie poprawny, ale nie został oficjalnie przypisany, więc zawsze implementuj obie warstwy walidacji w produkcji.
Biblioteki i pakiety: Jeśli integrujesz walidację CUIT/CUIL z bazą kodu, rozważ te sprawdzone biblioteki zamiast pisać własne:
- JavaScript:
validar-cuitna npm obsługuje walidację i formatowanie - PHP: biblioteka
afip-phpzapewnia zarówno walidację, jak i integrację z usługą sieciową AFIP - Python:
py-cuitna PyPI implementuje pełny algorytm
Używanie utrzymywanych bibliotek zmniejsza ryzyko błędów implementacji i często obejmuje przypadki brzegowe, które możesz przegapić we własnym kodzie.
Ręczne obliczenie: W celach edukacyjnych lub debugowania, ręczne przejście przez algorytm pomaga utrwalić zrozumienie. Weź kalkulator i przykładowy CUIT/CUIL, a następnie postępuj krok po kroku zgodnie z procesem ważonego mnożenia.
Usługi walidacji dla przedsiębiorstw: Aplikacje na dużą skalę mogą skorzystać z interfejsów API walidacji stron trzecich, które nie tylko sprawdzają format, ale także krzyżowo odnoszą się do komercyjnych baz danych. Te usługi mogą oznaczać nieaktywne firmy, identyfikować podmioty objęte sankcjami lub dostarczać dodatkowych metadanych o posiadaczu CUIT/CUIL.
Historia systemu CUIT/CUIL
System identyfikacji CUIT/CUIL w Argentynie rozwijał się znacząco od momentu jego powstania:
Źródła i wdrożenie
CUIT (Clave Única de Identificación Tributaria) został po raz pierwszy wprowadzony w Argentynie w latach 70. jako część wysiłków mających na celu modernizację systemu poboru podatków. Federalna Administracja Dochodów Publicznych (AFIP) wdrożyła ten unikalny identyfikator, aby skuteczniej śledzić podatników i ograniczyć uchylanie się od opodatkowania.
CUIL (Clave Única de Identificación Laboral) został później wprowadzony, aby konkretnie identyfikować pracowników w systemie zabezpieczenia społecznego, tworząc rozróżnienie między identyfikacją podatkową a identyfikacją pracowniczą przy zachowaniu spójnego formatu.
Ewolucja i cyfryzacja
W latach 90., gdy Argentyna przechodziła znaczące reformy gospodarcze, system CUIT/CUIL stał się coraz ważniejszy dla śledzenia aktywności ekonomicznej. System został dalej usystematyzowany, a wdrożono systemy weryfikacji online.
Początek lat 2000 przyniósł integrację systemu CUIT/CUIL z różnymi cyfrowymi usługami rządowymi, czyniąc go istotnym elementem argentyńskich inicjatyw e-rządu. W tym okresie nastąpiła również standaryzacja algorytmu weryfikacji i formatu, które są używane do dziś.
Najnowsze osiągnięcia
W ostatnich latach AFIP zwiększyła bezpieczeństwo i procesy weryfikacji numerów CUIT/CUIL, wdrażając bardziej zaawansowane systemy walidacji i integrując je z innymi bazami danych rządowych. System odgrywa obecnie kluczową rolę w wysiłkach Argentyny zmierzających do zwalczania uchylania się od opodatkowania i formalizacji gospodarki.
Dzisiaj CUIT/CUIL jest używany nie tylko do celów podatkowych i zatrudnienia, ale także w szerokim zakresie działań, w tym w bankowości, transakcjach nieruchomościami, usługach komunalnych i zakupach online, stając się niezbędnym identyfikatorem zarówno dla osób fizycznych, jak i firm działających w Argentynie.
Zagadnienia Implementacyjne
Podczas implementacji walidacji CUIT/CUIL w swoich systemach rozważ następujące aspekty techniczne:
Stabilność Algorytmu: Aktualny algorytm weryfikacji CUIT/CUIL pozostaje niezmieniony od czasu standaryzacji w latach 90. Zgodnie z dokumentacją techniczną AFIP, podejście do cyfry kontrolnej opartej na module-11 jest usystematyzowane w Resolución General 2854/2010 i kolejnych regulacjach. Ta stabilność oznacza, że implementacje rzadko wymagają aktualizacji, ale powinieneś monitorować komunikaty AFIP pod kątem ewentualnych zmian regulacyjnych.
Optymalizacja Wydajności: Algorytm weryfikacji jest obliczeniowo niedrogi — zaledwie 10 mnożeń, jedno dodawanie i jedna operacja modulo. W systemach o wysokiej przepustowości przetwarzających tysiące weryfikacji na sekundę wąskim gardłem jest zazwyczaj opóźnienie sieciowe podczas weryfikacji w bazie danych AFIP, a nie sam algorytm. Rozważ buforowanie wyników weryfikacji AFIP z odpowiednimi czasami wygaśnięcia (zazwyczaj 24 godziny), aby zachować równowagę między aktualnością a wydajnością.
Kodowanie Znaków: Podczas przetwarzania danych CUIT/CUIL z zewnętrznych źródeł (PDF, dokumenty skanowane, web scraping) zwróć uwagę na problemy z kodowaniem znaków. Myślnik może pojawić się jako pauza długa (U+2014), pauza krótka (U+2013) lub znak minus (U+2212) zamiast standardowego myślnika (U+002D). Znormalizuj je przed walidacją, aby zapobiec fałszywym wynikom negatywnym.
Internacjonalizacja: Jeśli Twoja aplikacja obsługuje wiele rynków latynoamerykańskich, zauważ, że argentyński CUIT/CUIL używa modulo-11 z określonymi wagami, podczas gdy chilijskie RUT używa modulo-11 z innymi wagami, a brazylijski CPF/CNPJ używa modulo-11 z jeszcze innym wzorem. Nie zakładaj, że algorytmy są identyczne — każdy krajowy system ma odrębne zasady. Aby lepiej zrozumieć algorytmy cyfr kontrolnych, zapoznaj się z normą ISO/IEC 7064, która formalizuje różne schematy weryfikacji opartej na modulo.
Przechowywanie w Bazie Danych: Przechowuj numery CUIT/CUIL bez myślników jako stałej długości CHAR(11) lub jako BIGINT, jeśli Twoja baza danych obsługuje 11-cyfrowe liczby całkowite bez utraty precyzji. Dodaj ograniczenie sprawdzające, które weryfikuje cyfrę kontrolną na poziomie bazy danych jako dodatkowe zabezpieczenie przed uszkodzonymi danymi. Utwórz indeksy na tym polu dla wydajnych wyszukiwań, gdy użytkownicy szukają po CUIT/CUIL.
Przykłady kodu
Python
1def calculate_verification_digit(type_code, dni):
2 # Konwersja na ciąg znaków i zapewnienie, że DNI ma 8 cyfr z wiodącymi zerami
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Połączenie kodu typu i DNI
7 digits = type_code_str + dni_str
8
9 # Wagi dla każdej pozycji
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Obliczenie sumy iloczynów
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Obliczenie cyfry weryfikacyjnej
16 verification_digit = 11 - (sum_products % 11)
17
18 # Przypadki specjalne
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 # Prawidłowe kody typów
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"Nieprawidłowy kod typu. Musi być jednym z: {valid_type_codes}")
34
35 # Generowanie losowego DNI, jeśli nie podano
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Obliczenie cyfry weryfikacyjnej
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Formatowanie CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Usunięcie myślników, jeśli są obecne
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Sprawdzenie podstawowego formatu
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Nieprawidłowy format"
52
53 # Wyodrębnienie części
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 # Walidacja kodu typu
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Nieprawidłowy kod typu"
62
63 # Obliczenie i porównanie cyfry weryfikacyjnej
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Nieprawidłowa cyfra weryfikacyjna"
67
68 return True, "Prawidłowy CUIT/CUIL"
69
70# Przykładowe użycie
71print(generate_cuit_cuil(20, 12345678)) # Generowanie dla konkretnego DNI
72print(generate_cuit_cuil(27)) # Generowanie z losowym DNI
73print(validate_cuit_cuil("20-12345678-9")) # Walidacja CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Konwersja na ciąg znaków i zapewnienie, że DNI ma 8 cyfr z wiodącymi zerami
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Połączenie kodu typu i DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Wagi dla każdej pozycji
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Obliczenie sumy iloczynów
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Obliczenie cyfry weryfikacyjnej
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Przypadki specjalne
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 // Prawidłowe kody typów
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Nieprawidłowy kod typu. Musi być jednym z: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Generowanie losowego DNI, jeśli nie podano
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Obliczenie cyfry weryfikacyjnej
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Formatowanie CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Usunięcie myślników, jeśli są obecne
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Sprawdzenie podstawowego formatu
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Nieprawidłowy format' };
58 }
59
60 // Wyodrębnienie części
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 // Walidacja kodu typu
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Nieprawidłowy kod typu' };
69 }
70
71 // Obliczenie i porównanie cyfry weryfikacyjnej
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Nieprawidłowa cyfra weryfikacyjna' };
75 }
76
77 return { isValid: true };
78}
79
80// Przykładowe użycie
81console.log(generateCuitCuil(20, 12345678)); // Generowanie dla konkretnego DNI
82console.log(generateCuitCuil(27)); // Generowanie z losowym DNI
83console.log(validateCuitCuil("20-12345678-9")); // Walidacja CUIT/CUIL
84Java
1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6 private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7 private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8
9 public static int calculateVerificationDigit(int typeCode, int dni) {
10 // Konwersja na ciąg znaków i zapewnienie, że DNI ma 8 cyfr z wiodącymi zerami
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Połączenie kodu typu i DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Obliczenie sumy iloczynów
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Obliczenie cyfry weryfikacyjnej
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Przypadki specjalne
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("Nieprawidłowy kod typu. Musi być jednym z: " + VALID_TYPE_CODES);
39 }
40
41 // Generowanie losowego DNI, jeśli nie podano
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Obliczenie cyfry weryfikacyjnej
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Formatowanie CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Usunięcie myślników, jeśli są obecne
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Sprawdzenie podstawowego formatu
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Nieprawidłowy format");
61 }
62
63 // Wyodrębnienie części
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 // Walidacja kodu typu
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Nieprawidłowy kod typu");
71 }
72
73 // Obliczenie i porównanie cyfry weryfikacyjnej
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Nieprawidłowa cyfra weryfikacyjna");
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 // Przykładowe użycie
102 System.out.println(generateCuitCuil(20, 12345678)); // Generowanie dla konkretnego DNI
103 System.out.println(generateCuitCuil(27, null)); // Generowanie z losowym DNI
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Walidacja CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Konwersja na ciąg znaków i zapewnienie, że DNI ma 8 cyfr z wiodącymi zerami $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Połączenie kodu typu i DNI $digits = $typeCodeStr . $dniStr; // Wagi dla każdej pozycji $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Obliczenie sumy iloczynów $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Obliczenie cyfry weryfikacyjnej $verificationDigit = 11 - ($sumProducts % 11); // Przypadki specjalne if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Prawidłowe kody typów $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Nieprawidłowy kod typu. Musi być jednym z: " . implode(', ', $validTypeCodes)); } // Generowanie losowego DNI, jeśli nie podano if ($dni === null) { $dni = rand(10000000, 99999999); } // Obliczenie cyfry weryfikacyjnej $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Formatowanie CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Usunięcie myślników, jeśli są obecne $cuitCuilClean = str_replace('-', '', $cuitCuil); // Sprawdzenie podstawowego formatu if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Nieprawidłowy format']; } // Wyodrębnienie części $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Walidacja kodu typu $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTyp ## Często zadawane pytania ### Jaka jest różnica między CUIT a CUIL? Oto praktyczne rozróżnienie: **CUIT** (Clave Única de Identificación Tributaria) identyfikuje podatników — zarówno osoby fizyczne, jak i firmy składające zeznania podatkowe w AFIP. **CUIL** (Clave Única de Identificación Laboral) identyfikuje pracowników w systemie ubezpieczeń społecznych dla celów zatrudnienia i emerytury. W praktyce wielu osób posiada zarówno CUIL (z pierwszej pracy), a później może uzyskać CUIT (jeśli zostanie samozatrudniony lub założy firmę). Numery używają identycznego formatowania i zasad obliczania, więc pod względem walidacji obsługuje się je tak samo. Rozróżnienie ma znaczenie dla celów administracyjnych: systemy płacowe zazwyczaj pracują z CUIL, podczas gdy systemy fakturowania i podatkowe używają CUIT. ### Jakie kody typów są używane dla osób fizycznych, a jakie dla firm? Dla osób fizycznych: - 20, 23, 24: Mężczyźni (CUIL) - 27: Kobiety (CUIL) Dla firm i organizacji: - 30: Korporacje (CUIT) - 33: Stowarzyszenia cywilne (CUIT) - 34: Fundacje (CUIT) ### Jak oblicza się cyfrę weryfikacyjną? Algorytm używa mnożenia ważonego: weź każdą z pierwszych 10 cyfr, pomnóż przez wagi **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, zsumuj iloczyny, a następnie oblicz 11 minus (suma modulo 11). Dwa szczególne przypadki mogą wprowadzać w błąd: gdy obliczenie daje 11, użyj 0 jako cyfry weryfikacyjnej; gdy daje 10, użyj 9. Te specjalne przypadki istnieją, ponieważ cyfra weryfikacyjna musi być jednocyfrowa (0-9). Jest to algorytm sprawdzania cyfry modulo-11, podobny do używanego w kodach ISBN-10 i innych systemach identyfikacyjnych na świecie. ### Czy mogę użyć tego narzędzia do generowania prawdziwych, oficjalnych numerów CUIT/CUIL? Nie — to narzędzie generuje matematycznie poprawne dane testowe, ale numery nie są oficjalnie zarejestrowane w AFIP. Pomyśl o tym jak o generowaniu prawidłowego numeru karty kredytowej przy użyciu algorytmu Luhna: przechodzi walidację formatu, ale nie jest podłączony do prawdziwego konta. Do oficjalnej rejestracji CUIT/CUIL osoby fizyczne muszą odwiedzić AFIP z dowodem osobistym, podczas gdy firmy muszą ukończyć procedury rejestracji korporacyjnej. Narzędzie jest przeznaczone wyłącznie do rozwoju, testowania i celów edukacyjnych, gdzie potrzebne są wiarygodne dane, które nie będą kolidować z prawdziwymi numerami identyfikacyjnymi. ### Dlaczego moja walidacja CUIT/CUIL nie powiodła się, mimo że format wygląda poprawnie? Gdy walidacja zawodzi mimo poprawnie wyglądającego formatowania, sprawdź te typowe przyczyny: 1. **Nieprawidłowy kod typu**: Tylko 20, 23, 24, 27, 30, 33, 34 są prawidłowe. Użycie 21, 25 lub innych liczb spowoduje niepowodzenie. 2. **Nieprawidłowa cyfra weryfikacyjna**: Ostatnia cyfra musi zgadzać się z obliczeniami algorytmu. Nawet zmiana jednej cyfry w części DNI wymaga przeliczenia cyfry kontrolnej. 3. **Problemy z formatem**: Musi być dokładnie 11 cyfr (XX-XXXXXXXX-X). Uważaj na dodatkowe spacje lub brakujące wiodące zera. 4. **Ukryte znaki**: Kopiowanie i wklejanie z plików PDF lub stron internetowych czasami wprowadza niewidoczne znaki Unicode, które psują walidację. Szybka wskazówka debugowania: usuń ostatnią cyfrę i przelicz ją ręcznie. Jeśli nie zgadza się, to jest twój problem. ### Czy łączniki są wymagane w numerach CUIT/CUIL? Łączniki są tylko do formatowania wyświetlania — nie są częścią numeru do celów obliczeniowych. Gdy widzisz **20-12345678-9**, algorytm dba tylko o 11 cyfr: **20123456789**. Większość implementacji walidacji usuwa łączniki przed przetworzeniem, dlatego nasze narzędzie akceptuje zarówno **20-12345678-9**, jak i **20123456789**. W interfejsach API i bazach danych zazwyczaj przechowuje się wersję bez łączników i dodaje się je tylko podczas wyświetlania użytkownikom. To podejście zapobiega niepowodzeniom walidacji spowodowanym niespójnościami formatowania. ### Czy numer CUIT/CUIL może mieć mniej niż 8 cyfr w części DNI? Część DNI musi zawsze mieć dokładnie 8 cyfr — bez wyjątków. Jeśli czyjś rzeczywisty DNI ma mniej cyfr (co zdarza się w przypadku starszych, niższych numerów), należy uzupełnić go wiodącymi zerami. Na przykład DNI **1234567** staje się **01234567** w strukturze CUIT/CUIL. To częste źródło błędów podczas konwersji między formatami DNI a CUIT/CUIL. Widziałem systemy, które nie przechodzą walidacji, ponieważ zapomniały uzupełnić, traktując **1234567** jako 7-cyfrową liczbę zamiast **01234567**. Zawsze używaj funkcji uzupełniania zerami zamiast prostego łączenia ciągów znaków. ### Jak mogę sprawdzić, czy CUIT/CUIL jest oficjalnie zarejestrowany w Argentynie? Nasze narzędzie sprawdza matematyczną poprawność — format, kod typu i cyfrę kontrolną. Ale nie może stwierdzić, czy numer jest faktycznie zarejestrowany w AFIP lub należy do prawdziwej osoby lub firmy. Do oficjalnej weryfikacji użyj [usług internetowych AFIP](https://www.afip.gob.ar/) lub ich narzędzia do wyszukiwania "Constancia de Inscripción". AFIP oferuje interfejsy API do automatycznej weryfikacji, choć musisz zarejestrować się jako deweloper i uwierzytelnić. W środowiskach produkcyjnych zaimplementuj obie warstwy: najpierw przeprowadź walidację algorytmiczną (szybką, wyłapującą literówki i błędy formatu), a następnie zweryfikuj w bazie danych AFIP (wolniejszą, ale potwierdzającą, że numer jest prawdziwy i aktywny). ### Czy mogę użyć tego narzędzia w mojej aplikacji komercyjnej? Tak — algorytm walidacji CUIT/CUIL jest publicznym standardem zdefiniowanym przez AFIP, więc możesz swobodnie zaimplementować go w oprogramowaniu komercyjnym. Zamieszczone tutaj przykłady kodu są przeznaczone jako implementacje referencyjne. W użyciu produkcyjnym rozważ następujące najlepsze praktyki: zaimplementuj odpowiednią obsługę błędów dla przypadków skrajnych, dodaj rejestrowanie do debugowania niepowodzeń walidacji, sprawdzaj poprawność w oficjalnej bazie danych AFIP (nie tylko walidację algorytmiczną) i utrzymuj implementację na bieżąco, jeśli AFIP zmieni zasady (choć obecny algorytm jest stabilny od dziesięcioleci). ### Czy narzędzie przechowuje wygenerowane lub zwalidowane numery CUIT/CUIL? Nie — całe przetwarzanie odbywa się w przeglądarce (po stronie klienta). Podczas generowania lub walidacji CUIT/CUIL obliczenia są wykonywane lokalnie przy użyciu JavaScript. Nic nie jest wysyłane na nasze serwery, a my nie rejestrujemy, nie przechowujemy ani nie śledzimy żadnych wprowadzonych lub wygenerowanych numerów. To podejście po stronie klienta zapewnia prywatność i oznacza również, że narzędzie działa offline po załadowaniu strony. Możesz to sprawdzić, otwierając narzędzia dla programistów w przeglądarce i obserwując zakładkę sieciową — nie zobaczysz żadnych żądań podczas generowania lub walidacji numerów. ## Referencje 1. AFIP (Administracja Federalna Dochodów Publicznych). "CUIT/CUIL/CDI." Oficjalna strona internetowa. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Ministerstwo Pracy, Zatrudnienia i Zabezpieczenia Społecznego. "CUIL - Unikalny Klucz Identyfikacji Pracowniczej." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Krajowa Administracja Zabezpieczenia Społecznego). "Uzyskaj mój CUIL." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Dziennik Urzędowy Republiki Argentyny. "Rozporządzenie Generalne AFIP 2854/2010: Procedura. Unikalny Klucz Identyfikacji Podatkowej (C.U.I.T.)." 5. Kodeks Podatkowy Republiki Argentyny. "Identyfikacja i Rejestracja Podatników." --- Bez względu na to, czy budujesz system fakturowania, testujesz przepływy onboardingu pracowników lub uczysz się o algorytmach walidacji, to narzędzie zapewnia generowanie i walidację CUIT/CUIL, których potrzebujesz. Generuj dane testowe, które przechodzą walidację algorytmiczną, weryfikuj numery przed wprowadzeniem ich do bazy danych lub poznaj, jak w praktyce działa algorytm cyfry kontrolnej.