Chuyển đến nội dung

Công cụ Tạo và Xác Thực CUIT/CUIL | Công Cụ Mã Số Thuế Argentina

Tạo số CUIT/CUIL kiểm tra hợp lệ của Argentina hoặc xác thực các số hiện có. Công cụ trực tuyến miễn phí dành cho các nhà phát triển kiểm tra hệ thống mã số thuế và bảng lương với xác thực tuân thủ AFIP.

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 được tạo
20-92417805-2

Sử dụng DNI được tạo ngẫu nhiên

Máy tính tải...
📚

Tài liệu hướng dẫn

Trình tạo và xác thực CUIT/CUIL Argentina

Giới thiệu

Trong hệ thống thuế và lao động của Argentina, bạn sẽ liên tục gặp hai mã định danh quan trọng: CUIT (Clave Única de Identificación Tributaria) và CUIL (Clave Única de Identificación Laboral). Hãy nghĩ CUIT như là mã số thuế dành cho các doanh nghiệp và cá nhân nộp thuế, còn CUIL xác định các nhân viên trong hệ thống an sinh xã hội. Cả hai đều sử dụng định dạng 11 chữ số và thuật toán xác minh giống nhau, điều này khiến việc kiểm tra các ứng dụng xử lý những số này trở nên đặc biệt quan trọng.

Khi phát triển phần mềm cho thị trường Argentina, bạn cần dữ liệu kiểm tra hợp lệ. Đó là lý do tại sao công cụ này ra đời. Bạn có thể tạo ra các số CUIT/CUIL về mặt toán học chính xác để kiểm tra mà không sử dụng thông tin cá nhân thực, hoặc xác thực các số hiện có để đảm bảo chúng tuân thủ thuật toán chính thức của AFIP. Điều đặc biệt hữu ích là công cụ này xử lý cả hai phía: phía tạo (tạo số hợp lệ theo yêu cầu) và phía xác thực (bắt các lỗi định dạng, mã loại không hợp lệ, và các chữ số xác minh không chính xác trước khi gây ra các vấn đề trong sản xuất).

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. Dưới đây là cách nó được chia:

  1. Mã Loại (2 chữ số đầu tiên): Xác định loại thực thể

    • 20, 23, 24: Cá nhân nam (CUIL)
    • 27: Cá nhân nữ (CUIL)
    • 30, 33, 34: Công ty và tổ chức (CUIT)
  2. Số CMND (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). Một sai lầm thường gặp: nếu CMND thực tế có ít hơn 8 chữ số, bạn phải thêm các số 0 ở đầu. Ví dụ, CMND 1234567 sẽ trở thành 01234567 trong CUIT/CUIL. Các công ty sẽ nhận được một số được chỉ định duy nhất.

  3. Chữ Số Kiểm Tra (chữ số cuối cùng): Chữ số kiểm tra này xác thực toàn bộ số bằng thuật toán có trọng số. Nếu chữ số này không khớp với phép tính, toàn bộ CUIT/CUIL sẽ không hợp lệ—điều này thường khiến các nhà phát triển bị bất ngờ khi thủ công xây dựng dữ liệu thử nghiệm.

Tính Toán Chữ Số Kiểm Tra

Chữ số kiểm tra sử dụng thuật toán trọng số modulo-11. Dưới đây là cách thực hiện:

  1. Lấy 10 chữ số đầu tiên của CUIT/CUIL (mã loại + CMND)
  2. Nhân mỗi chữ số với trọng số tương ứng của nó: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Tổng tất cả các tích
  4. Tính: 11 trừ (tổng modulo 11)
  5. Xử lý các trường hợp đặc biệt: nếu kết quả là 11, sử dụng 0; nếu là 10, sử dụng 9

Điều khiến mọi người nhầm lẫn nhất thường là các trường hợp đặc biệt trong bước 5. Khi kiểm tra, đôi khi bạn sẽ nhận được kết quả là 10 hoặc 11, và việc quên ánh xạ chúng thành 9 và 0 tương ứng sẽ gây ra các lỗi xác thực khó gỡ nếu bạn không biết quy tắc này.

Về mặt toán học, điều này có thể được biểu diễn như sau:

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

Trong đó:

  • VDVD là chữ số kiểm tra
  • did_i là chữ số thứ ii của 10 chữ số đầu tiên
  • wiw_i là trọng số tương ứng từ dãy [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Các trường hợp đặc biệt: nếu VD=11VD = 11 thì VD=0VD = 0, nếu VD=10VD = 10 thì VD=9VD = 9

Hướng Dẫn Từng Bước

Sử Dụng Trình Tạo

  1. Chọn tab "Trình Tạo" ở đầu giao diện công cụ.

  2. 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: Công Ty (CUIT)
    • 33: Hiệp Hội Dân Sự (CUIT)
    • 34: Quỹ (CUIT)
  3. Nhập Số DNI (tùy chọn):

    • Nhập số DNI 8 chữ số vào ô được cung cấp
    • Nếu để trống, công cụ sẽ sử dụng 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 các số 0 ở đầu
  4. Tạo DNI Ngẫu Nhiên (tùy chọn):

    • Nhấp vào nút "Ngẫu Nhiên" để tạo số DNI 8 chữ số ngẫu nhiên
  5. Xem CUIT/CUIL Được Tạo:

    • Công cụ sẽ tự động hiển thị CUIT/CUIL hợp lệ dựa trên thông tin bạn nhập
    • Định dạng sẽ là XX-XXXXXXXX-X với chữ số kiểm tra chính xác
  6. Sao Chép Kết Quả:

    • Nhấp vào biểu tượng sao chép để sao chép CUIT/CUIL được tạo vào clipboard
    • 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 Kiểm Tra

  1. Chọn tab "Trình Kiểm Tra" ở đầu giao diện công cụ.

  2. Nhập CUIT/CUIL Để Kiểm Tra:

    • 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 bằng dấu gạch ngang khi bạn nhập
    • Bạn cũng có thể nhập số không có dấu gạch ngang (XXXXXXXXXXX)
  3. Nhấp Vào Nút "Kiểm Tra":

    • Công cụ sẽ kiểm tra định dạng, mã loại và chữ số kiểm tra
  4. Xem Kết Quả Kiểm Tra:

    • Đối với các số CUIT/CUIL hợp lệ, sẽ xuất hiện thông báo thành công màu xanh
    • Đối với các số không hợp lệ, sẽ xuất hiện thông báo lỗi màu đỏ 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ố kiểm tra không hợp lệ
  5. Thông Tin Bổ Sung:

    • Đối với các số hợp lệ, công cụ sẽ hiển thị chi tiết các thành phần:
      • Mã loại và ý nghĩa của nó
      • Số DNI
      • Chữ số kiểm tra

Lỗi Thường Gặp và Phương Pháp Tốt Nhất

Khi làm việc với việc xác thực CUIT/CUIL trong các ứng dụng của bạn, hãy chú ý đến những sai lầm thường gặp sau:

Vấn Đề Thêm Số 0 Đầu: Lỗi phổ biến nhất mà tôi đã gặp phải liên quan đến các số DNI có số 0 ở đầu. Khi ai đó nhập DNI "1234567", mã của bạn cần xử lý nó như "01234567" để xây dựng CUIT/CUIL. Nhiều cài đặt chuyển đổi sang số nguyên để xử lý, điều này sẽ loại bỏ các số 0 ở đầu. Thay vào đó, hãy sử dụng các thao tác trên chuỗi với việc thêm số 0 phù hợp.

Nhầm Lẫn Mã Loại: Không phải tất cả các số hai chữ số đều là mã loại hợp lệ. Chỉ có 20, 23, 24, 27, 30, 33, 34 là hợp lệ. Tôi đã thấy các hệ thống chấp nhận bất kỳ tiền tố hai chữ số nào, dẫn đến các số "trông như hợp lệ" như 21-12345678-X nhưng không vượt qua xác thực của AFIP. Luôn xác thực mã loại trước khi tính chữ số kiểm tra.

Giả Định Giới Tính: Mã loại 20 (nam) và 27 (nữ) không thể thay thế cho nhau. Nếu bạn tự động tạo CUIL dựa trên dữ liệu nhân khẩu học, hãy đảm bảo mã loại của bạn khớp với giới tính thực tế được đăng ký tại RENAPER (cơ quan đăng ký quốc gia của Argentina). Những sự không khớp này sẽ dẫn đến việc từ chối khi các cá nhân cố gắng sử dụng các số này với các dịch vụ chính phủ.

Xử Lý Dấu Gạch Ngang: Một số cài đặt yêu cầu dấu gạch ngang trong khi những cài đặt khác lại từ chối chúng. Phương pháp tốt nhất: chấp nhận cả hai định dạng trong các trường nhập liệu (có hoặc không có dấu gạch ngang), loại bỏ dấu gạch ngang trước khi xác thực, lưu trữ phiên bản không có dấu gạch ngang trong cơ sở dữ liệu, và chỉ thêm dấu gạch ngang khi hiển thị.

Thiếu Xác Minh: Thuật toán xác thực có thể bắt được các lỗi định dạng nhưng không xác nhận CUIT/CUIL đã được đăng ký. Trong môi trường sản xuất, hãy xác thực định dạng trước (nhanh), sau đó kiểm tra với cơ sở dữ liệu của AFIP (chậm hơn nhưng có thẩm quyền). Phương pháp hai giai đoạn này giúp phát hiện lỗi chính tả ngay lập tức đồng thời vẫn đảm bảo số là thực.

Kiểm Tra Trường Hợp BIÊN: Luôn kiểm tra với các chữ số kiểm tra là 0 và 9 - những kết quả này xuất phát từ các trường hợp đặc biệt trong thuật toán. Đồng thời kiểm tra các DNI bắt đầu bằng số 0 để đảm bảo logic thêm số 0 của bạn hoạt động chính xác.

Các Trường Hợp Sử Dụng và Ứng Dụng Thực Tế

Phát Triển và Kiểm Thử

Phát Triển Phần Mềm: Khi xây dựng các ứng dụng cho thị trường Argentina, bạn sẽ cần dữ liệu kiểm thử đạt được xác thực mà không sử dụng thông tin người dùng thực. Đây là lúc điều này trở nên quan trọng:

  • Nền tảng thương mại điện tử: Các bộ xử lý thanh toán và hệ thống xuất hóa đơn yêu cầu các số CUIT/CUIL hợp lệ. Trong quá trình kiểm tra tải, bạn có thể cần hàng nghìn số hợp lệ để mô phỏng việc đăng ký người dùng thực tế.
  • Phần mềm kế toán: Các mô-đun báo cáo thuế kiểm tra định dạng CUIT/CUIL trước khi gửi đến AFIP. Việc kiểm tra các quy tắc xác thực này yêu cầu các số vượt qua thuật toán chữ số kiểm tra.
  • Hệ thống quản lý nhân sự: Xử lý lương và đóng góp an sinh xã hội phụ thuộc vào các số CUIL hợp lệ. Một kịch bản phổ biến: bạn đang kiểm tra các luồng onboarding nhân viên và cần xác minh rằng các CUIL không hợp lệ sẽ kích hoạt các thông báo lỗi phù hợp.
  • Ứng dụng ngân hàng: Các quy trình KYC (Biết Khách Hàng Của Bạn) xác thực CUIT/CUIL như một phần của việc mở tài khoản. Theo kinh nghiệm của tôi, các trường hợp biên như sự không khớp mã loại thường xuất hiện trong quá trình kiểm tra tích hợp.

Điền Dữ Liệu Cơ Sở Dữ Liệu: Khi điền các cơ sở dữ liệu kiểm thử, việc sử dụng các số CUIT/CUIL hợp lệ về mặt thuật toán đảm bảo các ràng buộc và kích hoạt cơ sở dữ liệu của bạn hoạt động như mong đợi. Điều này đặc biệt quan trọng khi kiểm tra các tập lệnh di chuyển dữ liệu hoặc các quy trình ETL xác thực các số nhận dạng.

Kiểm Tra Xác Thực Biểu Mẫu: Kiểm tra cả đường đi thuận lợi và điều kiện lỗi. Tạo các số hợp lệ để xác nhận việc gửi thành công, sau đó sửa đổi chữ số xác minh để đảm bảo việc xác thực frontend và backend của bạn bắt được lỗi trước khi nó đến cơ sở dữ liệu.

Kiểm Tra API: Các bài kiểm tra tích hợp nên sử dụng các số CUIT/CUIL hợp lệ trong các payload yêu cầu. Điều này ngăn chặn các kết quả âm tính giả nơi các bài kiểm tra thất bại do dữ liệu kiểm thử không hợp lệ thay vì các lỗi thực tế trong logic API của bạn.

Tự Động Hóa Kiểm Tra Chất Lượng: Các bài kiểm tra tham số hóa được hưởng lợi từ việc tạo CUIT/CUIL động. Thay vì mã hóa cứng các giá trị kiểm thử có thể xung đột giữa các lần chạy kiểm thử, hãy tạo các số hợp lệ mới cho mỗi lần thực thi kiểm thử.

Mục Đích Giáo Dục

Học Thuật Toán Xác Thực: Thuật toán xác minh CUIT/CUIL thể hiện ứng dụng thực tế của số học mô-đun và các chữ số kiểm tra có trọng số. Mẫu tương tự này xuất hiện trong các hệ thống nhận dạng khác trên toàn thế giới—các số thẻ tín dụng (thuật toán Luhn), mã ISBN, và số VAT của Châu Âu đều sử dụng các phương pháp checksum có trọng số tương tự. Hiểu cách thức xác thực CUIT/CUIL hoạt động cung cấp cái nhìn sâu sắc về lý do tại sao các thuật toán này tồn tại: chúng bắt các lỗi chép lại như các chữ số đảo ngược hoặc sai một chữ số.

Giảng Dạy Xác Thực Dữ Liệu: Khi đào tạo các nhà phát triển junior về xác thực đầu vào, hệ thống CUIT/CUIL cung cấp một ví dụ thực tế phức tạp hơn so với xác thực email nhưng đơn giản hơn so với xác thực mật mã. Nó thể hiện nguyên tắc phòng thủ sâu: xác thực định dạng (11 chữ số), xác thực quy tắc kinh doanh (mã loại hợp lệ), và xác thực thuật toán (chữ số kiểm tra).

Phát Triển Kinh Doanh Quốc Tế: Nếu bạn đang xây dựng các hệ thống cho các thị trường Mỹ Latinh, việc hiểu CUIT/CUIL giúp bạn nắm bắt các hệ thống tương tự ở các nước láng giềng. Brazil có CPF/CNPJ, Chile có RUT, và Uruguay có RUT—tất cả đều sử dụng các thuật toán chữ số kiểm tra. Các mẫu bạn học ở đây sẽ chuyển sang các hệ thống đó.

Các Phương Án Thay Thế và Cân Nhắc Sản Xuất

Trong khi công cụ này hoạt động tốt cho việc phát triển và kiểm thử, môi trường sản xuất có các yêu cầu khác:

Xác Thực Chính Phủ Chính Thức: Đối với các ứng dụng trực tiếp, việc xác thực thuật toán một mình là không đủ—bạn cần xác minh rằng CUIT/CUIL thực sự được đăng ký với AFIP (Quản Lý Thuế Liên Bang). AFIP cung cấp các dịch vụ web để xác thực trực tiếp, mặc dù bạn sẽ cần đăng ký và xác thực để truy cập chúng. Điểm then chốt: một số có thể hợp lệ về mặt toán học nhưng không được gán chính thức, vì vậy luôn triển khai cả hai lớp xác thực trong sản xuất.

Thư Viện và Gói: Nếu bạn đang tích hợp xác thực CUIT/CUIL vào codebase của mình, hãy xem xét các thư viện đã thiết lập này thay vì tự viết:

  • JavaScript: validar-cuit trên npm xử lý xác thực và định dạng
  • PHP: Thư viện afip-php cung cấp cả xác thực và tích hợp dịch vụ web AFIP
  • Python: py-cuit trên PyPI triển khai toàn bộ thuật toán

Sử dụng các thư viện được duy trì giảm thiểu rủi ro các lỗi triển khai và thường bao gồm các trường hợp biên mà bạn có thể bỏ qua trong mã tùy chỉnh.

Tính Toán Thủ Công: Cho mục đích học tập hoặc gỡ lỗi, việc làm theo thuật toán bằng tay giúp hiểu sâu hơn. Lấy một máy tính và một CUIT/CUIL mẫu, sau đó thực hiện theo quy trình nhân có trọng số từng bước.

Dịch Vụ Xác Thực Doanh Nghiệp: Các ứng dụng quy mô lớn có thể được hưởng lợi từ các API xác thực của bên thứ ba không chỉ kiểm tra định dạng mà còn chéo với các cơ sở dữ liệu thương mại. Các dịch vụ này có thể đánh dấu các doanh nghiệp không hoạt động, xác định các thực thể bị trừng phạt, hoặc cung cấp siêu dữ liệu bổ sung về chủ sở hữu CUIT/CUIL.

Lịch Sử 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) đầ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 danh duy nhất này để theo dõi người nộp thuế hiệu quả hơn và giảm thiểu việc trố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ì một định dạng nhất quán.

Sự Phát Triển và Số Hóa

Trong những năm 1990, khi Argentina trải qua các cải cách kinh tế quan trọng, 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 chứng kiến sự tích hợp của hệ thống CUIT/CUIL với các dịch vụ chính phủ điện tử, làm cho nó trở thành một thành phần thiết yếu của các sáng kiến chính phủ điện tử Argentina. Giai đoạn này cũng chứng kiến việc chuẩn hóa thuật toán và định dạng xác minh vẫn được sử dụng cho đến ngày nay.

Những Phát Triển Gần Đây

Trong những năm gần đây, AFIP đã nâng cao các 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 trốn thuế và chính thức hóa nền kinh tế.

Ngày nay, CUIT/CUIL được sử dụng không chỉ cho mục đích thuế và việc làm mà còn cho nhiều hoạt động khác 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, làm cho nó trở thành một mã định danh thiết yếu cho cả cá nhân và doanh nghiệp hoạt động tại Argentina.

Các Cân Nhắc Khi Triển Khai

Khi triển khai việc xác thực CUIT/CUIL trong hệ thống của riêng bạn, hãy xem xét các khía cạnh kỹ thuật sau:

Tính Ổn Định của Thuật Toán: Thuật toán xác minh CUIT/CUIL hiện tại đã giữ nguyên không thay đổi kể từ khi được chuẩn hóa vào những năm 1990. Theo tài liệu kỹ thuật của AFIP, phương pháp chữ số kiểm tra modulo-11 được mã hóa trong Quyết Định Tổng Quát 2854/2010 và các quy định tiếp theo. Tính ổn định này có nghĩa là các triển khai hiếm khi cần cập nhật, nhưng bạn nên theo dõi các thông báo của AFIP về bất kỳ thay đổi quy định nào.

Tối Ưu Hóa Hiệu Năng: Thuật toán xác minh có chi phí tính toán rất thấp—chỉ 10 phép nhân, một phép cộng và một phép modulo. Đối với các hệ thống có lưu lượng cao xử lý hàng ngàn xác thực mỗi giây, nút bottleneck thường là độ trễ mạng khi xác minh với cơ sở dữ liệu của AFIP, chứ không phải thuật toán. Hãy cân nhắc lưu kết quả xác minh AFIP trong bộ nhớ đệm với các TTL phù hợp (thường là 24 giờ) để cân bằng giữa tính mới và hiệu suất.

Mã Hóa Ký Tự: Khi xử lý dữ liệu CUIT/CUIL từ các nguồn bên ngoài (PDF, tài liệu quét, web scraping), hãy chú ý đến các vấn đề về mã hóa ký tự. Dấu gạch ngang có thể xuất hiện dưới dạng em dash (U+2014), en dash (U+2013), hoặc dấu trừ (U+2212) thay vì dấu gạch ngang chuẩn (U+002D). Chuẩn hóa chúng trước khi xác thực để tránh các kết quả sai.

Quốc Tế Hóa: Nếu ứng dụng của bạn phục vụ nhiều thị trường Mỹ Latinh, hãy lưu ý rằng CUIT/CUIL của Argentina sử dụng modulo-11 với các trọng số cụ thể, trong khi RUT của Chile sử dụng modulo-11 với các trọng số khác, và CPF/CNPJ của Brazil sử dụng modulo-11 với một mẫu khác. Đừng giả định rằng các thuật toán giống nhau—mỗi hệ thống của quốc gia đều có các quy tắc riêng. Để hiểu rộng hơn về các thuật toán chữ số kiểm tra, hãy xem tiêu chuẩn ISO/IEC 7064 quy định các lược đồ xác minh dựa trên modulo.

Lưu Trữ Cơ Sở Dữ Liệu: Lưu trữ số CUIT/CUIL mà không có dấu gạch ngang dưới dạng CHAR(11) có độ dài cố định hoặc BIGINT nếu cơ sở dữ liệu của bạn hỗ trợ các số nguyên 11 chữ số mà không mất độ chính xác. Thêm một ràng buộc kiểm tra xác thực chữ số kiểm tra ở cấp độ cơ sở dữ liệu như một lớp an toàn chống dữ liệu bị hỏng. Tạo các chỉ mục trên trường này để tra cứu hiệu quả khi người dùng tìm kiếm theo CUIT/CUIL.

Ví dụ về Mã

Python

1def calculate_verification_digit(type_code, dni):
2    # Chuyển đổi sang chuỗi và đảm bảo DNI là 8 chữ số với các số 0 đứng đầ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 từng vị trí
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Tính tổng các tích
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    # Các 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 cung cấp
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    # Loại bỏ dấu gạch ngang 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 sang chuỗi và đảm bảo DNI là 8 chữ số với các số 0 đứng đầ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 từng vị trí
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Tính tổng các tích
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  // Các 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 cung cấp
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  // Loại bỏ dấu gạch ngang 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 sang chuỗi và đảm bảo DNI là 8 chữ số với các số 0 đứng đầ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 tích
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 cung cấp
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        // Loại bỏ dấu gạch ngang 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

<?php function calculateVerificationDigit($typeCode, $dni) { // Chuyển đổi sang chuỗi và đảm bảo DNI là 8 chữ số với các số 0 đứng đầu $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Kết hợp mã loại và DNI $digits = $typeCodeStr . $dniStr; // Trọng số cho từng vị trí $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Tính tổng các tích $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Tính chữ số xác minh $verificationDigit = 11 - ($sumProducts % 11); // Các trường hợp đặc biệt if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Các mã loại hợp lệ $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Mã loại không hợp lệ. Phải là một trong: " . implode(', ', $validTypeCodes)); } // Tạo DNI ngẫu nhiên nếu không được cung cấp if ($dni === null) { $dni = rand(10000000, 99999999); } // Tính chữ số xác minh $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Định dạng CUIT/CUIL return sprintf("%d-%08d-%d", $ ## Câu Hỏi Thường Gặp ### Đâu là sự khác biệt giữa CUIT và CUIL? Đây là sự phân biệt thực tế: **CUIT** (Clave Única de Identificación Tributaria) xác định các đối tượng nộp thuế—cả cá nhân và doanh nghiệp khai thuế với AFIP. **CUIL** (Clave Única de Identificación Laboral) xác định người lao động trong hệ thống an sinh xã hội cho việc làm và mục đích hưu trí. Trong thực tế, nhiều cá nhân có cả CUIL (từ công việc đầu tiên) và sau đó có thể có CUIT (nếu trở thành người tự kinh doanh hoặc bắt đầu một doanh nghiệp). Các số sử dụng quy tắc định dạng và tính toán giống hệt nhau, vì vậy từ góc độ xác thực, bạn xử lý chúng giống nhau. Sự khác biệt quan trọng cho mục đích hành chính: hệ thống lương thường làm việc với CUIL, trong khi hệ thống hóa đơn và thuế sử dụng CUIT. ### Những mã loại nào được sử dụng cho cá nhân và doanh nghiệp? Đối với cá nhân: - 20, 23, 24: Cá nhân nam (CUIL) - 27: Cá nhân nữ (CUIL) Đối với các công ty và tổ chức: - 30: Các công ty (CUIT) - 33: Hiệp hội dân sự (CUIT) - 34: Các tổ chức từ thiện (CUIT) ### Làm thế nào để tính chữ số kiểm tra? Thuật toán sử dụng phép nhân có trọng số: lấy từng 10 chữ số đầu tiên, nhân với các trọng số **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, tổng các tích, sau đó tính 11 trừ (tổng modulo 11). Hai trường hợp đặc biệt khiến mọi người bối rối: khi tính toán cho kết quả 11, sử dụng 0 làm chữ số kiểm tra; khi cho kết quả 10, sử dụng 9. Những trường hợp đặc biệt này tồn tại vì chữ số kiểm tra phải là một chữ số duy nhất (0-9). Đây là thuật toán kiểm tra chữ số modulo-11, tương tự như được sử dụng trong mã ISBN-10 và các hệ thống nhận dạng khác trên toàn thế giới. ### Tôi có thể sử dụng công cụ này để tạo số CUIT/CUIL thực tế, chính thức không? Không—công cụ này tạo ra dữ liệu kiểm tra về mặt toán học, nhưng các số không được đăng ký chính thức với AFIP. Hãy nghĩ như việc tạo số thẻ tín dụng hợp lệ bằng thuật toán Luhn: nó vượt qua xác thực định dạng, nhưng không kết nối với tài khoản thực. Để đăng ký CUIT/CUIL chính thức, cá nhân cần đến AFIP với DNI của họ, trong khi các doanh nghiệp phải hoàn tất các thủ tục đăng ký doanh nghiệp. Công cụ chỉ dành riêng cho phát triển, kiểm tra và mục đích giáo dục nơi bạn cần dữ liệu trông hợp lệ mà không xung đột với các số nhận dạng thực. ### Tại sao việc xác thực CUIT/CUIL của tôi thất bại ngay cả khi định dạng trông đúng? Khi xác thực thất bại mặc dù định dạng trông đúng, hãy kiểm tra những nguyên nhân phổ biến sau: 1. **Mã loại không hợp lệ**: Chỉ có 20, 23, 24, 27, 30, 33, 34 là hợp lệ. Sử dụng 21, 25 hoặc các số khác sẽ bị lỗi. 2. **Chữ số kiểm tra sai**: Chữ số cuối cùng phải khớp với phép tính của thuật toán. Thậm chí thay đổi một chữ số trong phần DNI cũng đòi hỏi tính lại chữ số kiểm tra. 3. **Vấn đề về định dạng**: Phải chính xác 11 chữ số (XX-XXXXXXXX-X). Chú ý các khoảng trắng thừa hoặc các số 0 đầu bị thiếu. 4. **Ký tự ẩn**: Sao chép và dán từ PDF hoặc trang web đôi khi đưa vào các ký tự Unicode vô hình làm hỏng việc xác thực. Một mẹo gỡ lỗi nhanh: xóa chữ số cuối cùng và tính lại theo cách thủ công. Nếu không khớp, đó chính là nguyên nhân. ### Các dấu gạch ngang có bắt buộc trong số CUIT/CUIL không? Dấu gạch ngang chỉ dành cho định dạng hiển thị—chúng không phải là một phần của số để tính toán. Khi bạn thấy **20-12345678-9**, thuật toán chỉ quan tâm đến 11 chữ số: **20123456789**. Hầu hết các triển khai xác thực loại bỏ dấu gạch ngang trước khi xử lý, đó là lý do tại sao công cụ của chúng tôi chấp nhận cả **20-12345678-9****20123456789**. Trong các API và cơ sở dữ liệu, bạn thường lưu trữ phiên bản không có dấu gạch ngang và chỉ thêm dấu gạch ngang khi hiển thị cho người dùng. Cách tiếp cận này ngăn các sự không nhất quán về định dạng gây ra lỗi xác thực. ### Số CUIT/CUIL có thể có ít hơn 8 chữ số trong phần DNI không? Phần DNI phải luôn chính xác 8 chữ số—không có ngoại lệ. Nếu DNI thực tế của ai đó có ít hơn chữ số (điều này xảy ra với các DNI cũ hơn, có số thấp hơn), bạn phải thêm các số 0 ở đầu. Ví dụ, DNI **1234567** trở thành **01234567** trong cấu trúc CUIT/CUIL. Đây là nguồn gốc phổ biến của các lỗi khi chuyển đổi giữa DNI và định dạng CUIT/CUIL. Tôi đã thấy các hệ thống thất bại trong việc xác thực vì họ quên thêm số 0, xử lý **1234567** như một số 7 chữ số thay vì **01234567**. Luôn sử dụng các hàm thêm số 0 trong mã của bạn thay vì việc nối chuỗi đơn giản. ### Làm thế nào để xác minh xem CUIT/CUIL có được đăng ký chính thức ở Argentina không? Công cụ của chúng tôi xác thực tính chính xác về mặt toán học—định dạng, mã loại và chữ số kiểm tra. Nhưng nó không thể cho bạn biết số đó có được đăng ký thực sự với AFIP hay thuộc về một người hoặc doanh nghiệp thực không. Để xác minh chính thức, hãy sử dụng [dịch vụ web của AFIP](https://www.afip.gob.ar/) hoặc công cụ tra cứu "Constancia de Inscripción". AFIP cung cấp các API để xác minh tự động, mặc dù bạn sẽ cần đăng ký là nhà phát triển và xác thực. Trong môi trường sản xuất, hãy triển khai cả hai lớp: đầu tiên chạy xác thực thuật toán (nhanh, bắt lỗi chính tả và lỗi định dạng), sau đó xác minh với cơ sở dữ liệu của AFIP (chậm hơn, nhưng xác nhận số là thực và đang hoạt động). ### 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ó—thuật toán xác thực CUIT/CUIL là một tiêu chuẩn công khai do AFIP xác định, vì vậy bạn có thể tự do triển khai trong phần mềm thương mại. Các ví dụ mã ở đây được dự định như các triển khai tham khảo. Để sử dụng trong sản xuất, hãy xem xét những phương pháp hay sau: triển khai xử lý lỗi phù hợp cho các trường hợp biên, thêm ghi nhật ký để gỡ lỗi các lỗi xác thực, xác thực với cơ sở dữ liệu chính thức của AFIP (không chỉ xác thực thuật toán), và giữ cho triển khai của bạn được cập nhật nếu AFIP thay đổi quy tắc (mặc dù thuật toán hiện tại đã ổn định trong nhiều thập kỷ). ### Công cụ có lưu trữ bất kỳ số CUIT/CUIL được tạo hoặc xác thực nào không? Không—tất cả quá trình xử lý đều diễn ra trong trình duyệt của bạn (phía máy khách). Khi bạn tạo hoặc xác thực CUIT/CUIL, việc tính toán được thực hiện cục bộ bằng JavaScript. Không có gì được gửi đến máy chủ của chúng tôi, và chúng tôi không ghi lại, lưu trữ hoặc theo dõi bất kỳ số nào bạn nhập hoặc tạo. Cách tiếp cận phía máy khách này đảm bảo quyền riêng tư và cũng có nghĩa là công cụ hoạt động ngoại tuyến sau khi trang tải. Bạn có thể xác minh điều này bằng cách mở công cụ dành cho nhà phát triển của trình duyệt và theo dõi tab mạng—bạn sẽ không thấy yêu cầu nào được gửi khi tạo hoặc xác thực số. ## Tham khảo 1. AFIP (Cơ quan Quản lý Thu nhập Công cộng). "CUIT/CUIL/CDI." Trang web chính thức. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Bộ Lao động, Việc làm và An sinh Xã hội. "CUIL - Mã Nhận dạng Lao động Duy nhất." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Cơ quan Quản lý An sinh Xã hội Quốc gia). "Lấy CUIL của tôi." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Công báo Chính thức của Cộng hòa Argentina. "Quyết định Chung AFIP 2854/2010: Quy trình. Mã Nhận dạng Thuế Duy nhất (C.U.I.T.)." 5. Bộ luật Thuế của Cộng hòa Argentina. "Nhận dạng và Đăng ký Người nộp thuế." --- Cho dù bạn đang xây dựng hệ thống hóa đơn, kiểm tra quy trình nhập nhân viên, hay tìm hiểu về các thuật toán xác thực, công cụ này cung cấp chức năng tạo và xác thực CUIT/CUIL mà bạn cần. Tạo dữ liệu thử nghiệm vượt qua xác thực thuật toán, kiểm tra số trước khi đưa vào cơ sở dữ liệu, hoặc khám phá cách hoạt động của thuật toán chữ số kiểm tra trong thực tế.