Lewati ke konten

Generator & Validator CUIT/CUIL | Alat Identifikasi Pajak Argentina

Hasilkan nomor uji CUIT/CUIL Argentina yang valid atau validasi nomor yang sudah ada. Alat daring gratis untuk pengembang menguji sistem pajak dan penggajian dengan validasi sesuai AFIP.

Generator CUIT/CUIL

Masukkan nomor DNI 8 digit atau gunakan generator acak

CUIT/CUIL yang Dihasilkan
20-23094879-9

Menggunakan DNI yang dihasilkan secara acak

Kalkulator pemuatan...
📚

Dokumentasi

Generator dan Validator CUIT/CUIL Argentina

Pengantar

Dalam sistem pajak dan ketenagakerjaan Argentina, Anda akan selalu menemukan dua pengidentifikasi kritis: CUIT (Clave Única de Identificación Tributaria) dan CUIL (Clave Única de Identificación Laboral). Anggap CUIT sebagai ID pajak untuk bisnis dan individu yang membayar pajak, sementara CUIL mengidentifikasi pekerja dalam sistem jaminan sosial. Keduanya menggunakan format 11 digit dan algoritme verifikasi yang sama, yang membuat pengujian aplikasi yang menangani nomor-nomor ini menjadi sangat penting.

Saat mengembangkan perangkat lunak untuk pasar Argentina, Anda membutuhkan data uji yang valid. Di sinilah alat ini berperan. Anda dapat menghasilkan nomor CUIT/CUIL yang secara matematis benar untuk pengujian tanpa menggunakan informasi pribadi yang sebenarnya, atau memvalidasi nomor yang ada untuk memastikan mereka sesuai dengan algoritme resmi AFIP. Yang sangat berguna adalah bahwa alat ini menangani sisi generasi (membuat nomor yang valid sesuai permintaan) dan sisi validasi (menangkap kesalahan format, kode tipe yang tidak valid, dan digit verifikasi yang salah sebelum menyebabkan masalah produksi).

Struktur dan Perhitungan CUIT/CUIL

Memahami Format

Nomor CUIT/CUIL yang valid terdiri dari 11 digit yang biasanya ditampilkan dalam format XX-XXXXXXXX-X. Berikut cara pembagiannya:

  1. Kode Tipe (2 digit pertama): Mengidentifikasi jenis entitas

    • 20, 23, 24: Individu laki-laki (CUIL)
    • 27: Individu perempuan (CUIL)
    • 30, 33, 34: Perusahaan dan organisasi (CUIT)
  2. Nomor DNI (8 digit tengah): Untuk individu, ini adalah nomor dokumen identitas nasional (DNI). Kesalahan umum: jika DNI sebenarnya memiliki kurang dari 8 digit, Anda harus mengisinya dengan nol di depan. Misalnya, DNI 1234567 menjadi 01234567 dalam CUIT/CUIL. Perusahaan menerima nomor unik yang ditetapkan.

  3. Digit Verifikasi (digit terakhir): Digit cek ini memvalidasi seluruh nomor menggunakan algoritma berbobot. Jika digit ini tidak cocok dengan perhitungan, seluruh CUIT/CUIL tidak valid—sesuatu yang sering membingungkan pengembang saat membuat data uji secara manual.

Perhitungan Digit Verifikasi

Digit verifikasi menggunakan algoritma berbobot modulo-11. Berikut cara kerjanya:

  1. Ambil 10 digit pertama CUIT/CUIL (kode tipe + DNI)
  2. Kalikan setiap digit dengan bobot yang sesuai: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Jumlahkan semua produk
  4. Hitung: 11 dikurangi (jumlah modulo 11)
  5. Tangani kasus khusus: jika hasilnya 11, gunakan 0; jika 10, gunakan 9

Yang paling sering membingungkan adalah kasus khusus di langkah 5. Saat menguji, Anda akan sesekali mendapatkan hasil 10 atau 11, dan lupa memetakan ini ke 9 dan 0 menyebabkan kegagalan validasi yang sulit di-debug jika Anda tidak menyadari aturan ini.

Secara matematis, ini dapat dinyatakan sebagai:

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

Di mana:

  • VDVD adalah digit verifikasi
  • did_i adalah digit ke-ii dari 10 digit pertama
  • wiw_i adalah bobot yang sesuai dari urutan [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  • Kasus khusus: jika VD=11VD = 11 maka VD=0VD = 0, jika VD=10VD = 10 maka VD=9VD = 9

Panduan Langkah demi Langkah

Menggunakan Generator

  1. Pilih tab "Generator" di bagian atas antarmuka alat.

  2. Pilih Kode Tipe dari menu dropdown:

    • 20: Laki-laki (CUIL)
    • 23: Bisnis (CUIT)
    • 24: Bisnis Sementara (CUIT)
    • 27: Perempuan (CUIL)
    • 30: Korporasi (CUIT)
    • 33: Asosiasi Sipil (CUIT)
    • 34: Yayasan (CUIT)
  3. Masukkan Nomor DNI (opsional):

    • Masukkan nomor DNI 8 digit di bidang yang disediakan
    • Jika dibiarkan kosong, alat akan menggunakan DNI yang dibuat secara acak
    • Jika Anda memasukkan kurang dari 8 digit, sistem akan menambahkan nol di depan
  4. Hasilkan DNI Acak (opsional):

    • Klik tombol "Acak" untuk menghasilkan nomor DNI 8 digit secara acak
  5. Lihat CUIT/CUIL yang Dihasilkan:

    • Alat secara otomatis menampilkan CUIT/CUIL yang valid berdasarkan input Anda
    • Format akan berupa XX-XXXXXXXX-X dengan digit verifikasi yang benar
  6. Salin Hasilnya:

    • Klik ikon salin untuk menyalin CUIT/CUIL yang dihasilkan ke clipboard Anda
    • Pesan konfirmasi akan muncul saat berhasil disalin

Menggunakan Validator

  1. Pilih tab "Validator" di bagian atas antarmuka alat.

  2. Masukkan CUIT/CUIL untuk Divalidasi:

    • Masukkan CUIT/CUIL dalam format XX-XXXXXXXX-X
    • Alat akan secara otomatis memformat input Anda dengan tanda hubung saat Anda mengetik
    • Anda juga dapat memasukkan nomor tanpa tanda hubung (XXXXXXXXXXX)
  3. Klik Tombol "Validasi":

    • Alat akan memeriksa format, kode tipe, dan digit verifikasi
  4. Lihat Hasil Validasi:

    • Untuk nomor CUIT/CUIL yang valid, pesan sukses hijau akan muncul
    • Untuk nomor yang tidak valid, pesan kesalahan merah akan menjelaskan masalahnya:
      • Format tidak valid (harus XX-XXXXXXXX-X)
      • Kode tipe tidak valid (harus salah satu dari: 20, 23, 24, 27, 30, 33, 34)
      • Digit verifikasi tidak valid
  5. Informasi Tambahan:

    • Untuk nomor yang valid, alat menampilkan rincian komponen:
      • Kode tipe dan artinya
      • Nomor DNI
      • Digit verifikasi

Kesalahan Umum dan Praktik Terbaik

Saat bekerja dengan validasi CUIT/CUIL di aplikasi Anda, waspadai kesalahan umum berikut:

Masalah Nol di Depan: Bug paling umum yang saya temui melibatkan nomor DNI dengan nol di depan. Ketika seseorang memasukkan DNI "1234567", kode Anda perlu memperlakukannya sebagai "01234567" untuk konstruksi CUIT/CUIL. Banyak implementasi mengonversi ke bilangan bulat untuk pemrosesan, yang menghapus nol di depan. Gunakan operasi string dengan padding yang tepat sebagai gantinya.

Kebingungan Kode Tipe: Tidak semua nomor dua digit adalah kode tipe yang valid. Hanya 20, 23, 24, 27, 30, 33, 34 yang berfungsi. Saya pernah melihat sistem yang menerima awalan dua digit apa pun, menghasilkan nomor "terlihat valid" seperti 21-12345678-X yang gagal validasi AFIP. Selalu validasi kode tipe sebelum menghitung digit verifikasi.

Asumsi Jenis Kelamin: Kode tipe 20 (laki-laki) dan 27 (perempuan) tidak dapat dipertukarkan. Jika Anda menghasilkan CUIL secara otomatis berdasarkan data demografis, pastikan kode tipe Anda sesuai dengan jenis kelamin yang terdaftar di RENAPER (registri nasional Argentina). Ketidakcocokan menyebabkan penolakan saat individu mencoba menggunakan nomor ini dengan layanan pemerintah.

Penanganan Tanda Hubung: Beberapa implementasi memerlukan tanda hubung sementara yang lain menolaknya. Praktik terbaik: terima kedua format dalam bidang input (dengan atau tanpa tanda hubung), hapus tanda hubung sebelum validasi, simpan versi tanpa tanda hubung di basis data, dan tambahkan tanda hubung hanya untuk tujuan tampilan.

Verifikasi Hilang: Validasi algoritma menangkap kesalahan format tetapi tidak mengonfirmasi CUIT/CUIL terdaftar. Dalam produksi, validasi format terlebih dahulu (cepat), kemudian verifikasi terhadap basis data AFIP (lebih lambat tetapi otoritatif). Pendekatan dua tahap ini menangkap kesalahan ketik secara instan sambil memastikan nomor tersebut nyata.

Pengujian Kasus Tepi: Selalu uji dengan digit verifikasi 0 dan 9—ini dihasilkan dari kasus khusus dalam algoritma. Juga uji DNI yang dimulai dengan nol untuk memastikan logika padding Anda berfungsi dengan benar.

Kasus Penggunaan dan Aplikasi Praktis

Pengembangan dan Pengujian

Pengembangan Perangkat Lunak: Saat membangun aplikasi untuk pasar Argentina, Anda membutuhkan data uji yang lolos validasi tanpa menggunakan informasi pengguna sebenarnya. Inilah saat di mana hal ini menjadi kritis:

  • Platform e-commerce: Prosesor pembayaran dan sistem penagihan membutuhkan nomor CUIT/CUIL yang valid. Selama pengujian beban, Anda mungkin memerlukan ribuan nomor valid untuk mensimulasikan pendaftaran pengguna yang realistis.
  • Perangkat lunak akuntansi: Modul pelaporan pajak memverifikasi format CUIT/CUIL sebelum pengiriman ke AFIP. Menguji aturan validasi ini membutuhkan nomor yang lolos algoritma digit cek.
  • Sistem manajemen SDM: Pemrosesan gaji dan kontribusi jaminan sosial bergantung pada nomor CUIL yang valid. Skenario umum: Anda menguji alur penerimaan karyawan dan perlu memverifikasi bahwa CUIL yang tidak valid memicu pesan kesalahan yang sesuai.
  • Aplikasi perbankan: Proses KYC (Kenali Pelanggan Anda) memvalidasi CUIT/CUIL sebagai bagian dari pembukaan rekening. Dari pengalaman saya, kasus tepi seperti ketidakcocokan kode tipe sering muncul selama pengujian integrasi.

Pengisian Basis Data: Saat mengisi basis data uji, menggunakan nomor CUIT/CUIL yang valid secara algoritmik memastikan batasan dan pemicu basis data Anda berfungsi sebagaimana mestinya. Hal ini sangat penting saat menguji skrip migrasi data atau proses ETL yang memvalidasi nomor identifikasi.

Pengujian Validasi Formulir: Uji jalur yang baik dan kondisi kesalahan. Hasilkan nomor valid untuk mengonfirmasi pengiriman yang berhasil, kemudian ubah digit verifikasi untuk memastikan validasi frontend dan backend Anda menangkap kesalahan sebelum mencapai basis data Anda.

Pengujian API: Pengujian integrasi harus menggunakan nomor CUIT/CUIL yang valid dalam muatan permintaan. Ini mencegah negatif palsu di mana tes gagal karena data uji yang tidak valid daripada bug sebenarnya dalam logika API Anda.

Otomasi QA: Tes terparameter mendapat manfaat dari generasi CUIT/CUIL dinamis. Alih-alih menggunakan nilai uji yang dikodekan keras yang mungkin berkonflik di seluruh jalannya, hasilkan nomor valid baru untuk setiap eksekusi uji.

Tujuan Pendidikan

Mempelajari Algoritma Validasi: Algoritma verifikasi CUIT/CUIL menunjukkan aplikasi praktis aritmatika modulo dan digit cek berbobot. Pola yang sama muncul dalam sistem identifikasi lain di seluruh dunia—nomor kartu kredit (algoritma Luhn), kode ISBN, dan nomor VAT Eropa semuanya menggunakan pendekatan checksum berbobot serupa. Memahami cara kerja validasi CUIT/CUIL memberikan wawasan mengapa algoritma ini ada: mereka menangkap kesalahan transkripsi seperti digit yang tertukar atau kesalahan digit tunggal.

Mengajar Validasi Data: Saat melatih pengembang junior tentang validasi input, sistem CUIT/CUIL menawarkan contoh dunia nyata yang lebih kompleks daripada validasi email tetapi lebih sederhana daripada verifikasi kriptografis. Ini menunjukkan prinsip pertahanan berlapis: validasi format (11 digit), validasi aturan bisnis (kode tipe valid), dan validasi algoritmik (digit cek).

Pengembangan Bisnis Internasional: Jika Anda membangun sistem untuk pasar Amerika Latin, memahami CUIT/CUIL membantu Anda memahami sistem serupa di negara tetangga. Brasil memiliki CPF/CNPJ, Chile memiliki RUT, dan Uruguay memiliki RUT—semuanya menggunakan algoritma digit cek. Pola yang Anda pelajari di sini dapat ditransfer ke sistem tersebut.

Alternatif dan Pertimbangan Produksi

Sementara alat ini berfungsi baik untuk pengembangan dan pengujian, lingkungan produksi memiliki persyaratan berbeda:

Validasi Pemerintah Resmi: Untuk aplikasi langsung, validasi algoritmik saja tidak cukup—Anda perlu memverifikasi bahwa CUIT/CUIL benar-benar terdaftar dengan AFIP (Administración Federal de Ingresos Públicos). AFIP menyediakan layanan web untuk validasi real-time, meskipun Anda perlu mendaftar dan mengautentikasi untuk mengaksesnya. Tangkapannya: sebuah nomor dapat valid secara matematis tetapi tidak resmi diberikan, jadi selalu terapkan kedua lapisan validasi di produksi.

Pustaka dan Paket: Jika Anda mengintegrasikan validasi CUIT/CUIL ke dalam basis kode Anda, pertimbangkan pustaka mapan ini daripada membuat sendiri:

  • JavaScript: validar-cuit di npm menangani validasi dan pemformatan
  • PHP: Pustaka afip-php menyediakan validasi dan integrasi layanan web AFIP
  • Python: py-cuit di PyPI mengimplementasikan algoritma lengkap

Menggunakan pustaka yang dirawat mengurangi risiko bug implementasi dan sering kali mencakup kasus tepi yang mungkin Anda lewatkan dalam kode kustom.

Perhitungan Manual: Untuk tujuan pembelajaran atau debugging, mengerjakan algoritme secara manual membantu memperkuat pemahaman. Ambil kalkulator dan contoh CUIT/CUIL, lalu ikuti proses perkalian berbobot langkah demi langkah.

Layanan Validasi Perusahaan: Aplikasi skala besar mungkin mendapat manfaat dari API validasi pihak ketiga yang tidak hanya memeriksa format tetapi juga menyilangkan referensi dengan basis data komersial. Layanan ini dapat menandai bisnis tidak aktif, mengidentifikasi entitas yang dikenai sanksi, atau memberikan metadata tambahan tentang pemegang CUIT/CUIL.

Sejarah Sistem CUIT/CUIL

Sistem identifikasi CUIT/CUIL di Argentina telah berkembang secara signifikan sejak awal pembentukannya:

Asal-Usul dan Implementasi

CUIT (Clave Única de Identificación Tributaria) pertama kali diperkenalkan di Argentina pada tahun 1970-an sebagai bagian dari upaya modernisasi sistem pemungutan pajak. Administrasi Federal Pendapatan Publik (AFIP) menerapkan pengenal unik ini untuk melacak wajib pajak secara lebih efisien dan mengurangi penggelapan pajak.

CUIL (Clave Única de Identificación Laboral) kemudian diperkenalkan untuk mengidentifikasi pekerja secara khusus dalam sistem jaminan sosial, menciptakan perbedaan antara identifikasi pajak dan identifikasi tenaga kerja sambil mempertahankan format yang konsisten.

Evolusi dan Digitalisasi

Pada tahun 1990-an, ketika Argentina menjalani reformasi ekonomi yang signifikan, sistem CUIT/CUIL menjadi semakin penting untuk melacak aktivitas ekonomi. Sistem tersebut semakin didigitalisasi, dan sistem verifikasi daring diterapkan.

Awal tahun 2000-an menyaksikan integrasi sistem CUIT/CUIL dengan berbagai layanan pemerintah digital, menjadikannya komponen penting dari inisiatif e-pemerintah Argentina. Periode ini juga melihat standarisasi algoritma verifikasi dan format yang masih digunakan saat ini.

Perkembangan Terkini

Dalam beberapa tahun terakhir, AFIP telah meningkatkan proses keamanan dan verifikasi untuk nomor CUIT/CUIL, menerapkan sistem validasi yang lebih canggih dan mengintegrasikannya dengan basis data pemerintah lainnya. Sistem ini kini memainkan peran penting dalam upaya Argentina untuk memerangi penggelapan pajak dan memformalisasi ekonomi.

Saat ini, CUIT/CUIL digunakan tidak hanya untuk tujuan pajak dan ketenagakerjaan tetapi juga untuk berbagai kegiatan termasuk perbankan, transaksi properti, layanan utilitas, dan pembelian daring, menjadikannya pengenal penting bagi individu dan bisnis yang beroperasi di Argentina.

Pertimbangan Implementasi

Saat mengimplementasikan validasi CUIT/CUIL di sistem Anda sendiri, pertimbangkan aspek teknis berikut:

Stabilitas Algoritma: Algoritma verifikasi CUIT/CUIL saat ini telah tetap tidak berubah sejak distandardisasi pada tahun 1990-an. Menurut dokumentasi teknis AFIP, pendekatan digit cek modulo-11 yang berbobot dikodifikasikan dalam Resolución General 2854/2010 dan peraturan selanjutnya. Stabilitas ini berarti implementasi jarang memerlukan pembaruan, tetapi Anda harus memantau pengumuman AFIP untuk perubahan peraturan apa pun.

Optimasi Kinerja: Algoritma verifikasi secara komputasi tidak mahal—hanya 10 perkalian, satu penambahan, dan satu operasi modulo. Untuk sistem dengan throughput tinggi yang memproses ribuan validasi per detik, hambatan biasanya adalah latensi jaringan saat memverifikasi terhadap basis data AFIP, bukan algoritma itu sendiri. Pertimbangkan untuk menyimpan hasil verifikasi AFIP di cache dengan TTL yang sesuai (biasanya 24 jam) untuk menyeimbangkan kesegaran dengan kinerja.

Pengkodean Karakter: Saat memproses data CUIT/CUIL dari sumber eksternal (PDF, dokumen yang dipindai, web scraping), waspadai masalah pengkodean karakter. Tanda hubung mungkin muncul sebagai em dash (U+2014), en dash (U+2013), atau tanda minus (U+2212) alih-alih tanda hubung-minus standar (U+002D). Normalisasikan ini sebelum validasi untuk mencegah false negatif.

Internasionalisasi: Jika aplikasi Anda melayani beberapa pasar Amerika Latin, perhatikan bahwa CUIT/CUIL Argentina menggunakan modulo-11 dengan bobot spesifik, sementara RUT Chile menggunakan modulo-11 dengan bobot berbeda, dan CPF/CNPJ Brasil menggunakan modulo-11 dengan pola yang berbeda pula. Jangan berasumsi algoritma identik—setiap sistem negara memiliki aturan berbeda. Untuk pemahaman yang lebih luas tentang algoritma digit cek, lihat standar ISO/IEC 7064 yang memformalisasi berbagai skema verifikasi berbasis modulo.

Penyimpanan Basis Data: Simpan nomor CUIT/CUIL tanpa tanda hubung sebagai CHAR(11) dengan panjang tetap atau sebagai BIGINT jika basis data Anda mendukung bilangan bulat 11 digit tanpa kehilangan presisi. Tambahkan batasan cek yang memvalidasi digit verifikasi di tingkat basis data sebagai jaring pengaman terhadap data yang rusak. Buat indeks pada bidang ini untuk pencarian yang efisien saat pengguna mencari berdasarkan CUIT/CUIL.

Contoh Kode

Python

1def calculate_verification_digit(type_code, dni):
2    # Konversi ke string dan pastikan DNI memiliki 8 digit dengan nol di depan
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Gabungkan kode tipe dan DNI
7    digits = type_code_str + dni_str
8    
9    # Bobot untuk setiap posisi
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Hitung jumlah perkalian
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Hitung digit verifikasi
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Kasus khusus
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    # Kode tipe yang valid
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"Kode tipe tidak valid. Harus salah satu dari: {valid_type_codes}")
34    
35    # Hasilkan DNI acak jika tidak disediakan
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Hitung digit verifikasi
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # Format CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Hapus tanda hubung jika ada
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Periksa format dasar
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Format tidak valid"
52    
53    # Ekstrak bagian
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    # Validasi kode tipe
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Kode tipe tidak valid"
62    
63    # Hitung dan bandingkan digit verifikasi
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Digit verifikasi tidak valid"
67    
68    return True, "CUIT/CUIL valid"
69
70# Contoh penggunaan
71print(generate_cuit_cuil(20, 12345678))  # Hasilkan untuk DNI tertentu
72print(generate_cuit_cuil(27))  # Hasilkan dengan DNI acak
73print(validate_cuit_cuil("20-12345678-9"))  # Validasi CUIT/CUIL
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Konversi ke string dan pastikan DNI memiliki 8 digit dengan nol di depan
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Gabungkan kode tipe dan DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // Bobot untuk setiap posisi
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Hitung jumlah perkalian
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Hitung digit verifikasi
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Kasus khusus
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  // Kode tipe yang valid
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Kode tipe tidak valid. Harus salah satu dari: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Hasilkan DNI acak jika tidak disediakan
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Hitung digit verifikasi
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // Format CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Hapus tanda hubung jika ada
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Periksa format dasar
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Format tidak valid' };
58  }
59  
60  // Ekstrak bagian
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  // Validasi kode tipe
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Kode tipe tidak valid' };
69  }
70  
71  // Hitung dan bandingkan digit verifikasi
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Digit verifikasi tidak valid' };
75  }
76  
77  return { isValid: true };
78}
79
80// Contoh penggunaan
81console.log(generateCuitCuil(20, 12345678)); // Hasilkan untuk DNI tertentu
82console.log(generateCuitCuil(27)); // Hasilkan dengan DNI acak
83console.log(validateCuitCuil("20-12345678-9")); // Validasi 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        // Konversi ke string dan pastikan DNI memiliki 8 digit dengan nol di depan
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Gabungkan kode tipe dan DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // Hitung jumlah perkalian
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Hitung digit verifikasi
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Kasus khusus
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("Kode tipe tidak valid. Harus salah satu dari: " + VALID_TYPE_CODES);
39        }
40        
41        // Hasilkan DNI acak jika tidak disediakan
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Hitung digit verifikasi
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // Format CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Hapus tanda hubung jika ada
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Periksa format dasar
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Format tidak valid");
61        }
62        
63        // Ekstrak bagian
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        // Validasi kode tipe
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Kode tipe tidak valid");
71        }
72        
73        // Hitung dan bandingkan digit verifikasi
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Digit verifikasi tidak valid");
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        // Contoh penggunaan
102        System.out.println(generateCuitCuil(20, 12345678)); // Hasilkan untuk DNI tertentu
103        System.out.println(generateCuitCuil(27, null)); // Hasilkan dengan DNI acak
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Validasi CUIT/CUIL
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Konversi ke string dan pastikan DNI memiliki 8 digit dengan nol di depan $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Gabungkan kode tipe dan DNI $digits = $typeCodeStr . $dniStr; // Bobot untuk setiap posisi $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Hitung jumlah perkalian $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Hitung digit verifikasi $verificationDigit = 11 - ($sumProducts % 11); // Kasus khusus if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Kode tipe yang valid $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Kode tipe tidak valid. Harus salah satu dari: " . implode(', ', $validTypeCodes)); } // Hasilkan DNI acak jika tidak disediakan if ($dni === null) { $dni = rand(10000000, 99999999); } // Hitung digit verifikasi $verificationDigit = calculateVerificationDigit($typeCode, $dni); // Format CUIT/CUIL return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Hapus tanda hubung jika ada $cuitCuilClean = str_replace('-', '', $cuitCuil); // Periksa format dasar if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, 'errorMessage' => 'Format tidak valid']; } // Ekstrak bagian $typeCode = (int)substr($cuitCuilClean, 0, 2); $dni = (int)substr($cuitCuilClean, 2, 8); $verificationDigit = (int)substr($cuitCuilClean, 10, 1); // Validasi kode tipe $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { return ['isValid' => false, 'errorMessage' => 'Kode tipe tidak valid']; } // Hitung dan bandingkan digit verifikasi $calculatedDigit = calculateVerificationDigit($typeCode, $dni); if ($calculatedDigit !== $verificationDigit) { return ['isValid' => false, 'errorMessage' => 'Digit verifikasi tidak valid']; } return ['isValid' => true]; } // Contoh penggunaan echo generateCuitCuil(20, 12345678) . "\n"; ## Pertanyaan yang Sering Diajukan ### Apa perbedaan antara CUIT dan CUIL? Berikut adalah perbedaan praktisnya: **CUIT** (Clave Única de Identificación Tributaria) mengidentifikasi wajib pajak—baik individu maupun bisnis yang mengajukan pajak ke AFIP. **CUIL** (Clave Única de Identificación Laboral) mengidentifikasi pekerja dalam sistem jaminan sosial untuk keperluan pekerjaan dan pensiun. Dalam praktiknya, banyak individu memiliki baik CUIL (dari pekerjaan pertama mereka) dan mungkin kemudian mendapatkan CUIT (jika menjadi pekerja mandiri atau memulai bisnis). Angka-angka tersebut menggunakan format dan aturan perhitungan yang identik, sehingga dari sudut pandang validasi, Anda menanganinya dengan cara yang sama. Perbedaannya penting untuk tujuan administratif: sistem penggajian biasanya bekerja dengan CUIL, sedangkan sistem penagihan dan pajak menggunakan CUIT. ### Kode jenis apa yang digunakan untuk individu dan perusahaan? Untuk individu: - 20, 23, 24: Individu laki-laki (CUIL) - 27: Individu perempuan (CUIL) Untuk perusahaan dan organisasi: - 30: Korporasi (CUIT) - 33: Asosiasi Sipil (CUIT) - 34: Yayasan (CUIT) ### Bagaimana digit verifikasi dihitung? Algoritma menggunakan perkalian berbobot: ambil masing-masing 10 digit pertama, kalikan dengan bobot **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, jumlahkan hasilnya, kemudian hitung 11 dikurangi (jumlah modulo 11). Dua kasus khusus yang membingungkan orang: ketika perhitungan menghasilkan 11, gunakan 0 sebagai digit verifikasi; ketika menghasilkan 10, gunakan 9. Kasus khusus ini ada karena digit verifikasi harus berupa satu digit (0-9). Ini adalah algoritma cek digit modulo-11, serupa dengan yang digunakan dalam kode ISBN-10 dan sistem identifikasi lainnya di seluruh dunia. ### Bisakah saya menggunakan alat ini untuk menghasilkan nomor CUIT/CUIL resmi? Tidak—alat ini menghasilkan data uji yang valid secara matematis, tetapi angka-angka tersebut tidak terdaftar secara resmi di AFIP. Anggap saja seperti menghasilkan nomor kartu kredit valid menggunakan algoritma Luhn: lolos validasi format, tetapi tidak terhubung ke akun nyata. Untuk pendaftaran CUIT/CUIL resmi, individu perlu mengunjungi AFIP dengan DNI mereka, sementara bisnis harus menyelesaikan prosedur pendaftaran perusahaan. Alat ini hanya untuk pengembangan, pengujian, dan penggunaan edukatif di mana Anda membutuhkan data yang terlihat valid dan tidak akan bertentangan dengan nomor identifikasi nyata. ### Mengapa validasi CUIT/CUIL saya gagal meskipun formatnya terlihat benar? Ketika validasi gagal meskipun formatnya terlihat benar, periksa penyebab umum berikut: 1. **Kode jenis tidak valid**: Hanya 20, 23, 24, 27, 30, 33, 34 yang valid. Menggunakan 21, 25, atau angka lain akan gagal. 2. **Digit verifikasi salah**: Digit terakhir harus sesuai dengan perhitungan algoritma. Bahkan mengubah satu digit di bagian DNI memerlukan penghitungan ulang digit cek. 3. **Masalah format**: Harus tepat 11 digit (XX-XXXXXXXX-X). Waspadai spasi ekstra atau nol awal yang hilang. 4. **Karakter tersembunyi**: Menyalin-tempel dari PDF atau situs web kadang memperkenalkan karakter Unicode tak terlihat yang merusak validasi. Tips debugging cepat: hapus digit terakhir dan hitung ulang secara manual. Jika tidak cocok, itulah penyebabnya. ### Apakah tanda hubung diperlukan dalam nomor CUIT/CUIL? Tanda hubung hanya untuk pemformatan tampilan—mereka bukan bagian dari nomor untuk tujuan perhitungan. Ketika Anda melihat **20-12345678-9**, algoritma hanya peduli pada 11 digit: **20123456789**. Sebagian besar implementasi validasi menghapus tanda hubung sebelum memproses, itulah sebabnya alat kami menerima baik **20-12345678-9** maupun **20123456789**. Dalam API dan basis data, Anda biasanya menyimpan versi tanpa tanda hubung dan menambahkan tanda hubung hanya saat menampilkan ke pengguna. Pendekatan ini mencegah inkonsistensi pemformatan yang menyebabkan kegagalan validasi. ### Bisakah nomor CUIT/CUIL memiliki kurang dari 8 digit di bagian DNI? Bagian DNI harus selalu tepat 8 digit—tanpa pengecualian. Jika DNI seseorang memiliki lebih sedikit digit (yang terjadi pada DNI lama dengan nomor lebih rendah), Anda tambahkan dengan nol di depan. Misalnya, DNI **1234567** menjadi **01234567** dalam struktur CUIT/CUIL. Ini adalah sumber umum bug saat mengonversi antara format DNI dan CUIT/CUIL. Saya pernah melihat sistem gagal validasi karena lupa menambahkan nol, memperlakukan **1234567** sebagai nomor 7 digit alih-alih **01234567**. Selalu gunakan fungsi penambahan nol di kode Anda daripada sekadar konkatenasi string. ### Bagaimana cara memverifikasi apakah CUIT/CUIL terdaftar resmi di Argentina? Alat kami memvalidasi kebenaran matematis—format, kode jenis, dan digit cek. Tetapi tidak dapat memberi tahu Anda apakah nomor tersebut benar-benar terdaftar di AFIP atau milik orang atau bisnis nyata. Untuk verifikasi resmi, gunakan [layanan web AFIP](https://www.afip.gob.ar/) atau alat pencarian "Constancia de Inscripción" mereka. AFIP menawarkan API untuk verifikasi otomatis, meskipun Anda perlu mendaftar sebagai pengembang dan mengautentikasi. Dalam lingkungan produksi, terapkan kedua lapisan: pertama jalankan validasi algoritmik (cepat, menangkap kesalahan ketik dan kesalahan format), kemudian verifikasi terhadap basis data AFIP (lebih lambat, tetapi mengonfirmasi nomor nyata dan aktif). ### Bisakah saya menggunakan alat ini dalam aplikasi komersial saya? Ya—algoritma validasi CUIT/CUIL adalah standar publik yang ditentukan oleh AFIP, sehingga Anda dapat mengimplementasikannya dengan bebas dalam perangkat lunak komersial. Contoh kode yang disediakan di sini dimaksudkan sebagai implementasi referensi. Untuk penggunaan produksi, pertimbangkan praktik terbaik ini: terapkan penanganan kesalahan yang tepat untuk kasus khusus, tambahkan logging untuk debugging kegagalan validasi, validasi terhadap basis data resmi AFIP (bukan hanya validasi algoritmik), dan pertahankan implementasi Anda tetap mutakhir jika AFIP mengubah aturan (meskipun algoritma saat ini sudah stabil selama beberapa dekade). ### Apakah alat ini menyimpan nomor CUIT/CUIL yang dihasilkan atau divalidasi? Tidak—semua pemrosesan terjadi di browser Anda (sisi klien). Saat Anda menghasilkan atau memvalidasi CUIT/CUIL, perhitungan berjalan secara lokal menggunakan JavaScript. Tidak ada yang dikirim ke server kami, dan kami tidak mencatat, menyimpan, atau melacak nomor apa pun yang Anda masukkan atau hasilkan. Pendekatan sisi klien ini memastikan privasi dan juga berarti alat berfungsi secara offline setelah halaman dimuat. Anda dapat memverifikasi ini dengan membuka alat pengembang browser Anda dan mengamati tab jaringan—Anda tidak akan melihat permintaan apa pun saat menghasilkan atau memvalidasi nomor. ## Referensi 1. AFIP (Administrasi Federal Pendapatan Publik). "CUIT/CUIL/CDI." Situs Web Resmi. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Kementerian Tenaga Kerja, Ketenagakerjaan dan Jaminan Sosial. "CUIL - Kunci Identifikasi Tenaga Kerja Tunggal." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Administrasi Nasional Jaminan Sosial). "Dapatkan CUIL saya." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Berita Resmi Republik Argentina. "Resolusi Umum AFIP 2854/2010: Prosedur. Kunci Identifikasi Pajak Tunggal (C.U.I.T.)." 5. Kode Fiskal Republik Argentina. "Identifikasi dan Pendaftaran Wajib Pajak." --- Baik Anda sedang membangun sistem penagihan, menguji alur penerimaan karyawan, atau mempelajari algoritme validasi, alat ini menyediakan generasi dan validasi CUIT/CUIL yang Anda butuhkan. Hasilkan data uji yang lolos validasi algoritmik, verifikasi nomor sebelum masuk ke basis data, atau jelajahi cara kerja algoritme digit cek dalam praktik.