Công cụ Tạo và Xác thực CUIT/CUIL Argentina
Tạo các số CUIT/CUIL hợp lệ của Argentina để kiểm tra hoặc xác thực các số hiện có. Công cụ đơn giản cho các nhà phát triển làm việc với các số nhận dạng thuế và lao động của Argentina.
Trình tạo CUIT/CUIL
Nhập số DNI 8 chữ số hoặc sử dụng trình tạo ngẫu nhiên
CUIT/CUIL đã tạo
Tài liệu
Trình tạo và xác thực CUIT/CUIL Argentina
Giới thiệu
CUIT (Clave Única de Identificación Tributaria) và CUIL (Clave Única de Identificación Laboral) của Argentina là các số nhận dạng duy nhất được sử dụng tại Argentina cho mục đích thuế và việc làm, tương ứng. Các mã 11 chữ số này rất cần thiết cho cá nhân và doanh nghiệp để hoạt động hợp pháp trong hệ thống kinh tế Argentina. Công cụ Trình tạo và Xác thực CUIT/CUIL của chúng tôi cung cấp một cách đơn giản, hiệu quả để tạo ra các số CUIT/CUIL hợp lệ cho mục đích thử nghiệm và xác thực các số hiện có để đảm bảo chúng tuân thủ định dạng chính thức và thuật toán xác minh.
Cho dù bạn là một nhà phát triển đang thử nghiệm các ứng dụng xử lý ID thuế Argentina, một chuyên gia QA xác minh chức năng hệ thống, hay đơn giản là cần hiểu cách thức hoạt động của các số nhận dạng này, công cụ này cung cấp một giải pháp đơn giản mà không có sự phức tạp không cần thiết. Công cụ có hai chức năng chính: một trình tạo tạo ra các số CUIT/CUIL hợp lệ một cách ngẫu nhiên hoặc dựa trên các tham số cụ thể, và một trình xác thực xác minh xem một số CUIT/CUIL đã cho có tuân theo định dạng và quy tắc tính toán đúng hay không.
Cấu trúc và Tính toán CUIT/CUIL
Hiểu định dạng
Một số CUIT/CUIL hợp lệ bao gồm 11 chữ số thường được hiển thị theo định dạng XX-XXXXXXXX-X:
-
Mã loại (2 chữ số đầu tiên): Chỉ ra loại thực thể
- 20, 23, 24: Cá nhân nam (CUIL)
- 27: Cá nhân nữ (CUIL)
- 30, 33, 34: Doanh nghiệp và tổ chức (CUIT)
-
Số DNI (8 chữ số giữa): Đối với cá nhân, đây là số chứng minh nhân dân quốc gia (DNI) của họ, được thêm số 0 ở đầu nếu cần để đạt 8 chữ số. Đối với các công ty, đây là một số duy nhất được chỉ định.
-
Chữ số xác minh (chữ số cuối): Một chữ số kiểm tra được tính toán bằng một thuật toán cụ thể để xác minh toàn bộ số.
Tính toán Chữ số xác minh
Chữ số xác minh được tính toán bằng thuật toán sau:
- Lấy 10 chữ số đầu tiên của CUIT/CUIL (mã loại + DNI)
- Nhân mỗi chữ số với một trọng số tương ứng từ chuỗi này: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Cộng tất cả các sản phẩm thu được
- Tính 11 trừ đi phần dư của tổng chia cho 11
- Nếu kết quả là 11, chữ số xác minh là 0
- Nếu kết quả là 10, chữ số xác minh là 9
- Nếu không, kết quả là chữ số xác minh
Về mặt toán học, điều này có thể được diễn đạt như sau:
Trong đó:
- là chữ số xác minh
- là chữ số thứ của 10 chữ số đầu tiên
- là trọng số tương ứng từ chuỗi [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Các trường hợp đặc biệt: nếu thì , nếu thì
Hướng dẫn từng bước
Sử dụng Trình tạo
-
Chọn tab "Trình tạo" ở đầu giao diện công cụ.
-
Chọn Mã loại từ menu thả xuống:
- 20: Nam (CUIL)
- 23: Doanh nghiệp (CUIT)
- 24: Doanh nghiệp tạm thời (CUIT)
- 27: Nữ (CUIL)
- 30: Tập đoàn (CUIT)
- 33: Hiệp hội dân sự (CUIT)
- 34: Quỹ (CUIT)
-
Nhập Số DNI (tùy chọn):
- Nhập một số DNI 8 chữ số trong trường được cung cấp
- Nếu để trống, công cụ sẽ sử dụng một số DNI được tạo ngẫu nhiên
- Nếu bạn nhập ít hơn 8 chữ số, hệ thống sẽ thêm số 0 ở đầu
-
Tạo DNI ngẫu nhiên (tùy chọn):
- Nhấn nút "Ngẫu nhiên" để tạo một số DNI 8 chữ số ngẫu nhiên
-
Xem CUIT/CUIL đã tạo:
- Công cụ tự động hiển thị một CUIT/CUIL hợp lệ dựa trên các đầu vào của bạn
- Định dạng sẽ là XX-XXXXXXXX-X với chữ số xác minh đúng
-
Sao chép Kết quả:
- Nhấn biểu tượng sao chép để sao chép CUIT/CUIL đã tạo vào clipboard của bạn
- Một thông báo xác nhận sẽ xuất hiện khi sao chép thành công
Sử dụng Trình xác thực
-
Chọn tab "Trình xác thực" ở đầu giao diện công cụ.
-
Nhập CUIT/CUIL để xác thực:
- Nhập CUIT/CUIL theo định dạng XX-XXXXXXXX-X
- Công cụ sẽ tự động định dạng đầu vào của bạn với dấu gạch nối khi bạn nhập
- Bạn cũng có thể nhập số mà không có dấu gạch nối (XXXXXXXXXXX)
-
Nhấn nút "Xác thực":
- Công cụ sẽ kiểm tra định dạng, mã loại và chữ số xác minh
-
Xem Kết quả xác thực:
- Đối với các số CUIT/CUIL hợp lệ, một thông báo thành công màu xanh sẽ xuất hiện
- Đối với các số không hợp lệ, một thông báo lỗi màu đỏ sẽ giải thích vấn đề:
- Định dạng không hợp lệ (phải là XX-XXXXXXXX-X)
- Mã loại không hợp lệ (phải là một trong: 20, 23, 24, 27, 30, 33, 34)
- Chữ số xác minh không hợp lệ
-
Thông tin bổ sung:
- Đối với các số hợp lệ, công cụ hiển thị phân tích các thành phần:
- Mã loại và ý nghĩa của nó
- Số DNI
- Chữ số xác minh
- Đối với các số hợp lệ, công cụ hiển thị phân tích các thành phần:
Các trường hợp sử dụng
Phát triển và Thử nghiệm
-
Phát triển phần mềm: Tạo ra các số CUIT/CUIL hợp lệ để thử nghiệm các ứng dụng xử lý ID thuế Argentina, chẳng hạn như:
- Nền tảng thương mại điện tử
- Phần mềm kế toán
- Hệ thống quản lý nhân sự
- Cổng dịch vụ chính phủ
- Ứng dụng ngân hàng
-
Điền dữ liệu cơ sở dữ liệu: Tạo dữ liệu thử nghiệm thực tế cho các hệ thống lưu trữ thông tin người dùng Argentina, đảm bảo rằng các ràng buộc và quy tắc xác thực của cơ sở dữ liệu hoạt động chính xác.
-
Thử nghiệm xác thực biểu mẫu: Thử nghiệm xác thực đầu vào cho các biểu mẫu web thu thập thông tin CUIT/CUIL, xác minh rằng các thông báo lỗi đúng xuất hiện cho các mục nhập không hợp lệ.
-
Thử nghiệm API: Tạo ra các payload hợp lệ cho các điểm cuối API yêu cầu số CUIT/CUIL, đảm bảo rằng các bài kiểm tra tích hợp của bạn sử dụng dữ liệu hợp lệ.
-
Tự động hóa QA: Kết hợp việc tạo CUIT/CUIL vào các kịch bản thử nghiệm tự động để tạo ra các trường hợp thử nghiệm động thay vì sử dụng dữ liệu thử nghiệm tĩnh.
Mục đích giáo dục
-
Học thuật về các thuật toán xác thực: Hiểu cách hoạt động của các thuật toán chữ số kiểm tra trong thực tế bằng cách xem quy trình xác minh CUIT/CUIL diễn ra.
-
Giảng dạy về xác thực dữ liệu: Sử dụng như một ví dụ giáo dục khi giảng dạy các kỹ thuật xác thực biểu mẫu cho các nhà phát triển mới.
-
Hiểu yêu cầu kinh doanh Argentina: Tìm hiểu về hệ thống nhận dạng được sử dụng ở Argentina cho phát triển kinh doanh quốc tế.
Các lựa chọn thay thế
Trong khi công cụ của chúng tôi cung cấp một cách đơn giản để tạo và xác thực các số CUIT/CUIL, có một số cách tiếp cận thay thế mà bạn có thể xem xét:
-
Xác thực chính thức của chính phủ: Đối với các môi trường sản xuất, luôn xác thực các số CUIT/CUIL chống lại cơ sở dữ liệu chính thức của AFIP (Administración Federal de Ingresos Públicos) khi có thể.
-
Thư viện và gói: Một số ngôn ngữ lập trình có các thư viện được thiết kế riêng cho việc xác thực ID thuế Argentina:
- JavaScript: gói npm
validar-cuit
- PHP: thư viện
afip-php
- Python: gói
py-cuit
- JavaScript: gói npm
-
Tính toán thủ công: Cho mục đích giáo dục, bạn có thể tính toán chữ số xác minh thủ công bằng cách sử dụng thuật toán được mô tả trước đó.
-
Dịch vụ xác thực doanh nghiệp toàn diện: Đối với các ứng dụng doanh nghiệp, hãy xem xét sử dụng các dịch vụ xác thực toàn diện không chỉ kiểm tra định dạng mà còn xác minh sự tồn tại và trạng thái của thực thể liên quan đến CUIT/CUIL.
Lịch sử của Hệ thống CUIT/CUIL
Hệ thống nhận dạng CUIT/CUIL ở Argentina đã phát triển đáng kể kể từ khi ra đời:
Nguồn gốc và Triển khai
CUIT (Clave Única de Identificación Tributaria) lần đầu tiên được giới thiệu ở Argentina vào những năm 1970 như một phần của nỗ lực hiện đại hóa hệ thống thu thuế. Cơ quan Quản lý Thuế Liên bang (AFIP) đã triển khai mã nhận dạng duy nhất này để theo dõi người nộp thuế một cách hiệu quả hơn và giảm gian lận thuế.
CUIL (Clave Única de Identificación Laboral) sau đó được giới thiệu để xác định cụ thể người lao động trong hệ thống an sinh xã hội, tạo ra sự phân biệt giữa nhận dạng thuế và nhận dạng lao động trong khi vẫn duy trì định dạng nhất quán.
Sự phát triển và số hóa
Vào những năm 1990, khi Argentina trải qua những cải cách kinh tế đáng kể, hệ thống CUIT/CUIL trở nên ngày càng quan trọng để theo dõi hoạt động kinh tế. Hệ thống đã được số hóa thêm và các hệ thống xác minh trực tuyến đã được triển khai.
Đầu những năm 2000, CUIT/CUIL đã được tích hợp với nhiều dịch vụ chính phủ kỹ thuật số khác nhau, khiến nó trở thành một thành phần thiết yếu trong các sáng kiến chính phủ điện tử của Argentina. Thời kỳ này cũng chứng kiến sự chuẩn hóa của thuật toán và định dạng xác minh mà vẫn đang được sử dụng cho đến ngày nay.
Các phát triển gần đây
Trong những năm gần đây, AFIP đã nâng cao quy trình bảo mật và xác minh cho các số CUIT/CUIL, triển khai các hệ thống xác thực tinh vi hơn và tích hợp chúng với các cơ sở dữ liệu chính phủ khác. Hệ thống hiện đóng vai trò quan trọng trong nỗ lực của Argentina nhằm chống gian lận thuế và chính thức hóa nền kinh tế.
Ngày nay, CUIT/CUIL không chỉ được sử dụng cho mục đích thuế và việc làm mà còn cho một loạt các hoạt động bao gồm ngân hàng, giao dịch bất động sản, dịch vụ tiện ích và mua sắm trực tuyến, khiến nó trở thành một mã nhận dạng thiết yếu cho cả cá nhân và doanh nghiệp hoạt động tại Argentina.
Ví dụ mã
Python
1def calculate_verification_digit(type_code, dni):
2 # Chuyển đổi thành chuỗi và đảm bảo DNI là 8 chữ số với số 0 ở đầu
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Kết hợp mã loại và DNI
7 digits = type_code_str + dni_str
8
9 # Trọng số cho mỗi vị trí
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Tính tổng các sản phẩm
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Tính chữ số xác minh
16 verification_digit = 11 - (sum_products % 11)
17
18 # Các trường hợp đặc biệt
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 # Mã loại hợp lệ
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"Mã loại không hợp lệ. Phải là một trong: {valid_type_codes}")
34
35 # Tạo DNI ngẫu nhiên nếu không có
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Tính chữ số xác minh
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Định dạng CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Xóa dấu gạch nối nếu có
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Kiểm tra định dạng cơ bản
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Định dạng không hợp lệ"
52
53 # Trích xuất các phần
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 # Xác thực mã loại
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Mã loại không hợp lệ"
62
63 # Tính và so sánh chữ số xác minh
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Chữ số xác minh không hợp lệ"
67
68 return True, "CUIT/CUIL hợp lệ"
69
70# Ví dụ sử dụng
71print(generate_cuit_cuil(20, 12345678)) # Tạo cho DNI cụ thể
72print(generate_cuit_cuil(27)) # Tạo với DNI ngẫu nhiên
73print(validate_cuit_cuil("20-12345678-9")) # Xác thực một CUIT/CUIL
74
JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Chuyển đổi thành chuỗi và đảm bảo DNI là 8 chữ số với số 0 ở đầu
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Kết hợp mã loại và DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Trọng số cho mỗi vị trí
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Tính tổng các sản phẩm
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Tính chữ số xác minh
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Các trường hợp đặc biệt
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 // Mã loại hợp lệ
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Mã loại không hợp lệ. Phải là một trong: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Tạo DNI ngẫu nhiên nếu không có
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Tính chữ số xác minh
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Định dạng CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Xóa dấu gạch nối nếu có
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Kiểm tra định dạng cơ bản
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Định dạng không hợp lệ' };
58 }
59
60 // Trích xuất các phần
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 // Xác thực mã loại
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Mã loại không hợp lệ' };
69 }
70
71 // Tính và so sánh chữ số xác minh
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Chữ số xác minh không hợp lệ' };
75 }
76
77 return { isValid: true };
78}
79
80// Ví dụ sử dụng
81console.log(generateCuitCuil(20, 12345678)); // Tạo cho DNI cụ thể
82console.log(generateCuitCuil(27)); // Tạo với DNI ngẫu nhiên
83console.log(validateCuitCuil("20-12345678-9")); // Xác thực một CUIT/CUIL
84
Java
1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6 private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7 private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8
9 public static int calculateVerificationDigit(int typeCode, int dni) {
10 // Chuyển đổi thành chuỗi và đảm bảo DNI là 8 chữ số với số 0 ở đầu
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Kết hợp mã loại và DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Tính tổng các sản phẩm
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Tính chữ số xác minh
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Các trường hợp đặc biệt
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("Mã loại không hợp lệ. Phải là một trong: " + VALID_TYPE_CODES);
39 }
40
41 // Tạo DNI ngẫu nhiên nếu không có
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Tính chữ số xác minh
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Định dạng CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Xóa dấu gạch nối nếu có
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Kiểm tra định dạng cơ bản
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Định dạng không hợp lệ");
61 }
62
63 // Trích xuất các phần
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 // Xác thực mã loại
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Mã loại không hợp lệ");
71 }
72
73 // Tính và so sánh chữ số xác minh
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Chữ số xác minh không hợp lệ");
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 // Ví dụ sử dụng
102 System.out.println(generateCuitCuil(20, 12345678)); // Tạo cho DNI cụ thể
103 System.out.println(generateCuitCuil(27, null)); // Tạo với DNI ngẫu nhiên
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Xác thực một CUIT/CUIL
105 }
106}
107
PHP
1<?php
2
3function calculateVerificationDigit($typeCode, $dni) {
4 // Chuyển đổi thành chuỗi và đảm bảo DNI là 8 chữ số với số 0 ở đầu
5 $typeCodeStr = (string)$typeCode;
6 $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT);
7
8 // Kết hợp mã loại và DNI
9 $digits = $typeCodeStr . $dniStr;
10
11 // Trọng số cho mỗi vị trí
12 $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
13
14 // Tính tổng các sản phẩm
15 $sumProducts = 0;
16 for ($i = 0; $i < 10; $i++) {
17 $sumProducts += (int)$digits[$i] * $weights[$i];
18 }
19
20 // Tính chữ số xác minh
21 $verificationDigit = 11 - ($sumProducts % 11);
22
23 // Các trường hợp đặc biệt
24 if ($verificationDigit == 11) {
25 $verificationDigit = 0;
26 } else if ($verificationDigit == 10) {
27 $verificationDigit = 9;
28 }
29
30 return $verificationDigit;
31}
32
33function generateCuitCuil($typeCode, $dni = null) {
34 // Mã loại hợp lệ
35 $validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
36
37 if (!in_array($typeCode, $validTypeCodes)) {
38 throw new Exception("Mã loại không hợp lệ. Phải là một trong: " . implode(', ', $validTypeCodes));
39 }
40
41 // Tạo DNI ngẫu nhiên nếu không có
42 if ($dni === null) {
43 $dni = rand(10000000, 99999999);
44 }
45
46 // Tính chữ số xác minh
47 $verificationDigit = calculateVerificationDigit($typeCode, $dni);
48
49 // Định dạng CUIT/CUIL
50 return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit);
51}
52
53function validateCuitCuil($cuitCuil) {
54 // Xóa dấu gạch nối nếu có
55 $cuitCuilClean = str_replace('-', '', $cuitCuil);
56
57 // Kiểm tra định dạng cơ bản
58 if (!preg_match('/^\d{11}$/', $cuitCuilClean)) {
59 return ['isValid' => false, 'errorMessage' => 'Định dạng không hợp lệ'];
60 }
61
62 // Trích xuất các phần
63 $typeCode = (int)substr($cuitCuilClean, 0, 2);
64 $dni = (int)substr($cuitCuilClean, 2, 8);
65 $verificationDigit = (int)substr($cuitCuilClean, 10, 1);
66
67 // Xác thực mã loại
68 $validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
69 if (!in_array($typeCode, $validTypeCodes)) {
70 return ['isValid' => false, 'errorMessage' => 'Mã loại không hợp lệ'];
71 }
72
73 // Tính và so sánh chữ số xác minh
74 $calculatedDigit = calculateVerificationDigit($typeCode, $dni);
75 if ($calculatedDigit !== $verificationDigit) {
76 return ['isValid' => false, 'errorMessage' => 'Chữ số xác minh không hợp lệ'];
77 }
78
79 return ['isValid' => true];
80}
81
82// Ví dụ sử dụng
83echo generateCuitCuil(20, 12345678) . "\n"; // Tạo cho DNI cụ thể
84echo generateCuitCuil(27) . "\n"; // Tạo với DNI ngẫu nhiên
85var_dump(validateCuitCuil("20-12345678-9")); // Xác thực một CUIT/CUIL
86?>
87
Các câu hỏi thường gặp
Sự khác biệt giữa CUIT và CUIL là gì?
CUIT (Clave Única de Identificación Tributaria) được sử dụng cho mục đích nhận dạng thuế và được cấp cho cả cá nhân và pháp nhân cần phải nộp thuế ở Argentina. CUIL (Clave Única de Identificación Laboral) là dành riêng cho người lao động và được sử dụng cho các mục đích lao động và an sinh xã hội. Mặc dù chúng chia sẻ cùng một định dạng và thuật toán tính toán, nhưng chúng phục vụ các mục đích hành chính khác nhau.
Các mã loại nào được sử dụng cho cá nhân và mã nào cho công ty?
Đối với cá nhân:
- 20, 23, 24: Cá nhân nam (CUIL)
- 27: Cá nhân nữ (CUIL)
Đối với doanh nghiệp và tổ chức:
- 30: Tập đoàn (CUIT)
- 33: Hiệp hội dân sự (CUIT)
- 34: Quỹ (CUIT)
Chữ số xác minh được tính toán như thế nào?
Chữ số xác minh được tính toán bằng một thuật toán tổng hợp trọng số. Mỗi chữ số trong 10 chữ số đầu tiên được nhân với một trọng số tương ứng (5, 4, 3, 2, 7, 6, 5, 4, 3, 2), và các kết quả được cộng lại. Chữ số xác minh là 11 trừ đi phần dư khi tổng này chia cho 11. Các trường hợp đặc biệt: nếu kết quả là 11, chữ số xác minh là 0; nếu kết quả là 10, chữ số xác minh là 9.
Tôi có thể sử dụng công cụ này để tạo ra các số CUIT/CUIL chính thức không?
Không, công cụ này được thiết kế cho mục đích thử nghiệm và giáo dục. Các số được tạo ra là hợp lệ về mặt toán học theo thuật toán CUIT/CUIL nhưng không được đăng ký chính thức với cơ quan thuế Argentina (AFIP). Để đăng ký CUIT/CUIL chính thức, cá nhân và công ty phải thực hiện các thủ tục pháp lý đúng theo quy định của AFIP.
Tại sao việc xác thực CUIT/CUIL của tôi lại thất bại mặc dù định dạng có vẻ đúng?
Việc xác thực có thể thất bại vì một số lý do:
- Mã loại không phải là một trong các mã hợp lệ (20, 23, 24, 27, 30, 33, 34)
- Chữ số xác minh không khớp với giá trị đã tính toán dựa trên thuật toán
- Định dạng không đúng (phải là XX-XXXXXXXX-X)
- Có các ký tự không phải số trong đầu vào (ngoại trừ dấu gạch nối)
Có cần thiết phải có dấu gạch nối trong các số CUIT/CUIL không?
Mặc dù các số CUIT/CUIL thường được viết và hiển thị với dấu gạch nối (XX-XXXXXXXX-X), nhưng dấu gạch nối không phải là một phần của số thực tế cho các mục đích tính toán. Trình xác thực của chúng tôi chấp nhận cả hai định dạng (có hoặc không có dấu gạch nối) và sẽ xác thực đúng cả hai định dạng.
Có thể một số CUIT/CUIL có ít hơn 8 chữ số trong phần DNI không?
Không, phần DNI phải luôn có đúng 8 chữ số. Nếu DNI thực tế có ít chữ số hơn, nó phải được thêm số 0 ở đầu để đạt 8 chữ số. Ví dụ, nếu số DNI của ai đó là 1234567, trong CUIT/CUIL nó sẽ được biểu diễn là 01234567.
Làm thế nào tôi có thể xác minh xem một CUIT/CUIL có được đăng ký chính thức ở Argentina không?
Để xác minh xem một CUIT/CUIL có được đăng ký chính thức và còn hoạt động hay không, bạn nên sử dụng trang web hoặc dịch vụ chính thức của AFIP (Administración Federal de Ingresos Públicos). Công cụ của chúng tôi chỉ xác thực tính hợp lệ toán học của số, không xác minh trạng thái đăng ký chính thức của nó.
Tôi có thể sử dụng công cụ này trong ứng dụng thương mại của mình không?
Có, bạn có thể tích hợp thuật toán và logic được thể hiện trong công cụ này vào các ứng dụng thương mại của mình. Thuật toán xác thực CUIT/CUIL là một tiêu chuẩn công khai. Tuy nhiên, đối với các môi trường sản xuất, chúng tôi khuyên bạn nên triển khai các xử lý lỗi hợp lý và xem xét xác thực bổ sung chống lại các nguồn chính thức khi cần thiết.
Công cụ có lưu trữ bất kỳ số CUIT/CUIL nào đã tạo hoặc xác thực không?
Không, công cụ này không lưu trữ bất kỳ thông tin nào được nhập hoặc tạo ra. Tất cả các xử lý đều diễn ra ở phía khách hàng trong trình duyệt của bạn và không có dữ liệu nào được gửi đến hoặc lưu trữ trên máy chủ của chúng tôi. Điều này đảm bảo quyền riêng tư và bảo mật của bất kỳ thông tin nào bạn nhập.
Tài liệu tham khảo
-
AFIP (Administración Federal de Ingresos Públicos). "CUIT/CUIL/CDI." Trang web chính thức. https://www.afip.gob.ar/
-
Bộ Lao động, Việc làm và An sinh xã hội. "CUIL - Clave Única de Identificación Laboral." https://www.argentina.gob.ar/trabajo
-
ANSES (Administración Nacional de la Seguridad Social). "Lấy CUIL của tôi." https://www.anses.gob.ar/
-
Công báo Chính thức của Cộng hòa Argentina. "Nghị quyết chung AFIP 2854/2010: Thủ tục. Clave Única de Identificación Tributaria (C.U.I.T.)."
-
Bộ luật Tài chính của Cộng hòa Argentina. "Nhận dạng và Đăng ký Người nộp thuế."
Sẵn sàng để tạo hoặc xác thực các số CUIT/CUIL Argentina? Hãy thử công cụ của chúng tôi ngay bây giờ và đơn giản hóa quy trình thử nghiệm của bạn!
Phản hồi
Nhấp vào thông báo phản hồi để bắt đầu gửi phản hồi về công cụ này
Công cụ liên quan
Khám phá thêm các công cụ có thể hữu ích cho quy trình làm việc của bạn