İçeriğe geç

CUIT/CUIL Oluşturucu ve Doğrulayıcı | Arjantin Vergi Kimlik Numarası Aracı

Geçerli Arjantin CUIT/CUIL test numaraları oluşturun veya mevcut olanları doğrulayın. Geliştiriciler için AFIP uyumlu doğrulama ile vergi kimlik numarası ve bordro sistemlerini test etmeye yönelik ücretsiz çevrimiçi araç.

CUIT/CUIL Oluşturucu

8 haneli bir DNI numarası girin veya rastgele oluşturucuyu kullanın

Oluşturulan CUIT/CUIL
20-25125041-4

Rastgele oluşturulan DNI kullanılıyor

Yükleme hesaplayıcısı...
📚

Belgeler

Arjantin CUIT/CUIL Üreteç ve Doğrulayıcı

Giriş

Arjantin'in vergi ve emek sistemlerinde, sürekli olarak iki kritik tanımlayıcıyla karşılaşacaksınız: CUIT (Vergi Tanımlama Numarası) ve CUIL (İş Tanımlama Numarası). CUIT'i vergi ödeyen işletmeler ve bireyler için vergi kimliği olarak düşünün, CUIL ise sosyal güvenlik sistemindeki çalışanları tanımlar. Her ikisi de aynı 11 haneli formatı ve doğrulama algoritmasını kullanır, bu da bu numaraları işleyen uygulamaları test etmeyi özellikle önemli kılar.

Arjantin pazarı için yazılım geliştirirken, geçerli test verilerine ihtiyacınız vardır. İşte bu araç tam da bu noktada devreye girer. Gerçek kişisel bilgileri kullanmadan matematiksel olarak doğru CUIT/CUIL numaraları oluşturabilir veya mevcut numaraları AFIP'in resmi algoritmasına uygunluğunu doğrulayabilirsiniz. Özellikle yararlı olan, aracın hem üretim (talep üzerine geçerli numaralar oluşturma) hem de doğrulama (format hatalarını, geçersiz tip kodlarını ve üretim sorunları çıkarmadan önce yanlış doğrulama basamaklarını yakalama) tarafını ele almasıdır.

CUIT/CUIL Yapısı ve Hesaplaması

Formatı Anlama

Geçerli bir CUIT/CUIL numarası, tipik olarak XX-XXXXXXXX-X formatında görünen 11 haneden oluşur. İşte nasıl ayrıştırılır:

  1. Tür Kodu (ilk 2 hane): Varlık türünü tanımlar

    • 20, 23, 24: Erkek bireyler (CUIL)
    • 27: Kadın bireyler (CUIL)
    • 30, 33, 34: Şirketler ve kuruluşlar (CUIT)
  2. DNI Numarası (orta 8 hane): Bireyler için, bu ulusal kimlik belgesi numarasıdır (DNI). Yaygın bir tuzak: Eğer gerçek DNI 8 haneden azsa, başına sıfır eklemek gerekir. Örneğin, DNI 1234567, CUIT/CUIL'de 01234567 olur. Şirketler bunun yerine benzersiz bir atanmış numara alır.

  3. Doğrulama Hanesi (son hane): Bu kontrol hanesi, ağırlıklı bir algoritma kullanarak tüm numarayı doğrular. Bu hane hesaplamaya uymazsa, tüm CUIT/CUIL geçersiz sayılır—bu, geliştiricilerin test verisi oluştururken sıklıkla karşılaştığı bir durumdur.

Doğrulama Hanesi Hesaplaması

Doğrulama hanesi, modulo-11 ağırlıklı bir algoritma kullanır. İşte nasıl çalışır:

  1. CUIT/CUIL'in ilk 10 hanesini alın (tür kodu + DNI)
  2. Her haneyi karşılık gelen ağırlıkla çarpın: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
  3. Tüm çarpımları toplayın
  4. Hesaplayın: 11 eksi (toplam modulo 11)
  5. Sınır durumlarını ele alın: sonuç 11 ise 0 kullanın; 10 ise 9 kullanın

İnsanların en çok takıldığı şey, 5. adımdaki sınır durumlardır. Test ederken bazen 10 veya 11 sonucu alırsınız ve bunları sırasıyla 9 ve 0'a eşlemediğinizde, bu kuraldan haberdar değilseniz hata ayıklaması zor olan doğrulama hataları ortaya çıkar.

Matematiksel olarak, bu şu şekilde ifade edilebilir:

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

Burada:

  • VDVD doğrulama hanesidir
  • did_i ilk 10 hanenin ii. hanesidir
  • wiw_i [5, 4, 3, 2, 7, 6, 5, 4, 3, 2] dizisinden karşılık gelen ağırlıktır
  • Özel durumlar: eğer VD=11VD = 11 ise VD=0VD = 0, eğer VD=10VD = 10 ise VD=9VD = 9

Adım Adım Kılavuz

Jeneratörü Kullanma

  1. Araç arayüzünün üst kısmındaki "Jeneratör" sekmesini seçin.

  2. Açılır menüden bir Tür Kodu Seçin:

    • 20: Erkek (CUIL)
    • 23: İşletme (CUIT)
    • 24: Geçici İşletme (CUIT)
    • 27: Kadın (CUIL)
    • 30: Şirket (CUIT)
    • 33: Sivil Dernek (CUIT)
    • 34: Vakıf (CUIT)
  3. DNI Numarası Girin (isteğe bağlı):

    • Sağlanan alana 8 haneli bir DNI numarası girin
    • Boş bırakılırsa, araç rastgele oluşturulmuş bir DNI kullanacaktır
    • 8 haneden az girerseniz, sistem başında sıfırlarla tamamlayacaktır
  4. Rastgele DNI Oluştur (isteğe bağlı):

    • Rastgele 8 haneli bir DNI numarası oluşturmak için "Rastgele" düğmesine tıklayın
  5. Oluşturulan CUIT/CUIL'i Görüntüleyin:

    • Araç, girişlerinize göre otomatik olarak geçerli bir CUIT/CUIL görüntüler
    • Doğru doğrulama basamağı ile XX-XXXXXXXX-X formatında olacaktır
  6. Sonucu Kopyalayın:

    • Oluşturulan CUIT/CUIL'i panoya kopyalamak için kopyalama simgesine tıklayın
    • Başarıyla kopyalandığında bir onay mesajı görünecektir

Doğrulayıcıyı Kullanma

  1. Araç arayüzünün üst kısmındaki "Doğrulayıcı" sekmesini seçin.

  2. Doğrulanacak CUIT/CUIL'i Girin:

    • CUIT/CUIL'i XX-XXXXXXXX-X formatında girin
    • Araç, girişinizi yazarken otomatik olarak tire ile biçimlendirecektir
    • Tiresiz olarak da girebilirsiniz (XXXXXXXXXXX)
  3. "Doğrula" Düğmesine Tıklayın:

    • Araç, formatı, tür kodunu ve doğrulama basamağını kontrol edecektir
  4. Doğrulama Sonucunu Görüntüleyin:

    • Geçerli CUIT/CUIL numaraları için yeşil bir başarı mesajı görünecektir
    • Geçersiz numaralar için kırmızı bir hata mesajı nedeni açıklayacaktır:
      • Geçersiz format (XX-XXXXXXXX-X olmalı)
      • Geçersiz tür kodu (20, 23, 24, 27, 30, 33, 34'ten biri olmalı)
      • Geçersiz doğrulama basamağı
  5. Ek Bilgiler:

    • Geçerli numaralar için araç bileşenlerin dökümünü görüntüler:
      • Tür kodu ve anlamı
      • DNI numarası
      • Doğrulama basamağı

Yaygın Hatalar ve En İyi Uygulamalar

CUIT/CUIL doğrulamasını uygulamalarınızda çalıştırırken, bu sık karşılaşılan tuzaklara dikkat edin:

Sıfır Doldurma Sorunları: Karşılaştığım en yaygın hata, başında sıfır olan DNI numaralarıdır. Biri "1234567" DNI girdiğinde, kodunuzun bunu CUIT/CUIL oluşturma için "01234567" olarak ele alması gerekir. Birçok uygulama işleme için tam sayılara dönüştürür, bu da başındaki sıfırları siler. Bunun yerine uygun doldurma ile dize işlemleri kullanın.

Tip Kodu Karmaşası: Tüm iki basamaklı numaralar geçerli tip kodları değildir. Sadece 20, 23, 24, 27, 30, 33, 34 çalışır. Herhangi bir iki basamaklı ön eki kabul eden sistemler gördüm, bu da AFIP doğrulamasını geçemeyen "geçerli görünen" 21-12345678-X gibi numaralara yol açar. Doğrulama basamağını hesaplamadan önce her zaman tip kodunu doğrulayın.

Cinsiyet Varsayımları: 20 (erkek) ve 27 (kadın) tip kodları birbirinin yerine kullanılamaz. CUIT/CUIL'leri demografik verilere göre otomatik olarak oluştururken, tip kodunun RENAPER (Arjantin'in ulusal kayıt sistemi) ile kayıtlı gerçek cinsiyetle eşleştiğinden emin olun. Uyuşmazlıklar, bireyler bu numaraları devlet hizmetlerinde kullanmaya çalıştığında reddedilmeye neden olur.

Tire İşleme: Bazı uygulamalar tireleri gerektirir, bazıları reddeder. En iyi uygulama: girdi alanlarında her iki formatı da kabul edin (tireli veya tiresiz), doğrulamadan önce tireleri çıkarın, veritabanlarında tire olmayan sürümü saklayın ve yalnızca görüntüleme amacıyla tireleri ekleyin.

Eksik Doğrulama: Algoritma doğrulaması format hatalarını yakalar ancak CUIT/CUIL'in kayıtlı olduğunu onaylamaz. Üretimde, önce formatı doğrulayın (hızlı), sonra AFIP veritabanına karşı doğrulayın (yavaş ama yetkili). Bu iki aşamalı yaklaşım, yazım hatalarını anında yakalar ve aynı zamanda numaranın gerçek olduğunu sağlar.

Kenar Durum Testi: Her zaman 0 ve 9 doğrulama basamaklarıyla test edin—bunlar algoritmanın özel durumlarından kaynaklanır. Ayrıca sıfırla başlayan DNI'ları test ederek doldurma mantığınızın doğru çalıştığından emin olun.

Kullanım Alanları ve Pratik Uygulamalar

Geliştirme ve Test

Yazılım Geliştirme: Arjantin pazarı için uygulama geliştirirken, gerçek kullanıcı bilgilerini kullanmadan doğrulamadan geçen test verileri gerekecektir. İşte bu noktada kritik olan:

  • E-ticaret platformları: Ödeme işlemcileri ve faturalama sistemleri geçerli CUIT/CUIL numaraları gerektirir. Yük testlerinde, gerçekçi kullanıcı kayıtlarını simüle etmek için binlerce geçerli numara gerekebilir.
  • Muhasebe yazılımı: Vergi raporlama modülleri, AFIP'e gönderilmeden önce CUIT/CUIL formatını doğrular. Bu doğrulama kurallarını test etmek, kontrol basamağı algoritmasını geçen numaralar gerektirir.
  • İnsan Kaynakları yönetim sistemleri: Bordro işleme ve sosyal güvenlik katkıları geçerli CUIL numaralarına bağlıdır. Yaygın bir senaryo: çalışan ekleme akışını test ederken, geçersiz CUILlerin uygun hata mesajlarını tetiklemesini doğrulamak.
  • Bankacılık uygulamaları: KYC (Müşterini Tanı) süreçleri, hesap açma sırasında CUIT/CUIL'i doğrular. Deneyimlerime göre, tür kodu uyuşmazlıkları gibi kenar durumlar genellikle entegrasyon testlerinde ortaya çıkar.

Veritabanı Doldurma: Test veritabanlarını doldururken, algoritmik olarak geçerli CUIT/CUIL numaraları kullanmak, veritabanı kısıtlamalarınızın ve tetikleyicilerinizin beklendiği gibi çalışmasını sağlar. Bu, özellikle tanımlama numaralarını doğrulayan veri geçiş betikleri veya ETL süreçlerini test ederken önemlidir.

Form Doğrulama Testi: Hem başarılı senaryoyu hem de hata durumlarını test edin. Başarılı gönderimi onaylamak için geçerli numaralar oluşturun, sonra doğrulama basamağını değiştirerek ön yüz ve arka yüz doğrulamanızın hatayı veritabanına ulaşmadan yakalayıp yakalamadığını kontrol edin.

API Testi: Entegrasyon testleri, istek yüklerinde geçerli CUIT/CUIL numaraları kullanmalıdır. Bu, testlerin API mantığındaki gerçek hatalar yerine geçersiz test verileri nedeniyle başarısız olmasını engeller.

Kalite Güvence Otomasyonu: Parametrelendirilmiş testler, dinamik CUIT/CUIL oluşturumundan faydalanır. Test çalıştırmaları arasında çakışabilecek sabit kodlanmış test değerleri yerine, her test yürütmesi için taze geçerli numaralar oluşturun.

Eğitim Amaçları

Doğrulama Algoritmalarını Öğrenme: CUIT/CUIL doğrulama algoritması, modülo aritmetik ve ağırlıklı kontrol basamaklarının pratik uygulamasını gösterir. Aynı desen dünya çapındaki diğer tanımlama sistemlerinde de görülür—kredi kartı numaraları (Luhn algoritması), ISBN kodları ve Avrupa KDV numaraları benzer ağırlıklı checksum yaklaşımları kullanır. CUIT/CUIL doğrulamasının nasıl çalıştığını anlamak, bu algoritmaların neden var olduğunu açıklar: aktarma hataları gibi yer değiştirmiş basamakları veya tek basamak hatalarını yakalarlar.

Veri Doğrulamayı Öğretme: Genç geliştiricilere girdi doğrulaması öğretirken, CUIT/CUIL sistemi, e-posta doğrulamasından daha karmaşık ama kriptografik doğrulamadan daha basit gerçek dünya örneği sunar. Derinlemesine savunma ilkesini gösterir: format doğrulaması (11 basamak), iş kuralı doğrulaması (geçerli tür kodları) ve algoritmik doğrulama (kontrol basamağı).

Uluslararası İş Geliştirme: Latin Amerika pazarları için sistemler geliştiriyorsanız, CUIT/CUIL'i anlamak, komşu ülkelerdeki benzer sistemleri kavramanıza yardımcı olur. Brezilya'da CPF/CNPJ, Şili'de RUT ve Uruguay'da RUT—hepsi kontrol basamağı algoritmaları kullanır. Burada öğrendiğiniz desenler o sistemlere de aktarılır.

Alternatifler ve Üretim Değerlendirmeleri

Bu araç geliştirme ve test için iyi çalışsa da, üretim ortamları farklı gereksinimlere sahiptir:

Resmi Devlet Doğrulaması: Canlı uygulamalar için, algoritmik doğrulama tek başına yeterli değildir—CUIT/CUIL'in AFIP (Gelir İdaresi Federal İdaresi) ile gerçekten kayıtlı olduğunu doğrulamanız gerekir. AFIP, gerçek zamanlı doğrulama için web servisleri sağlar, ancak erişmek için kayıt ve kimlik doğrulama yapmanız gerekir. Püf nokta: bir numara matematiksel olarak geçerli olabilir ama resmi olarak atanmamış olabilir, bu yüzden üretimde her zaman doğrulamanın her iki katmanını da uygulayın.

Kütüphaneler ve Paketler: CUIT/CUIL doğrulamasını kod tabanınıza entegre ediyorsanız, kendi çözümünüzü yazmak yerine bu yerleşik kütüphaneleri düşünün:

  • JavaScript: npm'deki validar-cuit doğrulama ve biçimlendirmeyi halleder
  • PHP: afip-php kütüphanesi hem doğrulama hem de AFIP web servisi entegrasyonu sağlar
  • Python: PyPI'daki py-cuit tam algoritmayı uygular

Bakımı yapılan kütüphaneler kullanmak, uygulama hatası riskini azaltır ve genellikle özel kodda kaçırabileceğiniz kenar durumları içerir.

Manuel Hesaplama: Öğrenme amaçları veya hata ayıklama için, algoritmayı elle çalıştırmak anlayışı pekiştirir. Bir hesap makinesi ve örnek bir CUIT/CUIL alın, sonra ağırlıklı çarpma sürecini adım adım izleyin.

Kurumsal Doğrulama Servisleri: Büyük ölçekli uygulamalar, formatı kontrol etmenin ötesinde ticari veritabanlarıyla çapraz referans yapan üçüncü taraf doğrulama API'lerinden faydalanabilir. Bu hizmetler, pasif işletmeleri işaretleyebilir, yaptırıma tabi kuruluşları belirleyebilir veya CUIT/CUIL sahibi hakkında ek meta veriler sağlayabilir.

CUIT/CUIL Sisteminin Tarihçesi

Arjantin'deki CUIT/CUIL tanımlama sistemi kuruluşundan bu yana önemli ölçüde gelişmiştir:

Kökenleri ve Uygulanması

CUIT (Clave Única de Identificación Tributaria), vergi tahsilat sistemini modernleştirme çabalarının bir parçası olarak 1970'lerde Arjantin'de ilk kez tanıtıldı. Kamu Gelirleri Federal İdaresi (AFIP), vergi mükelleflerini daha verimli bir şekilde takip etmek ve vergi kaçakçılığını azaltmak için bu benzersiz tanımlayıcıyı uyguladı.

CUIL (Clave Única de Identificación Laboral), daha sonra sosyal güvenlik sisteminde çalışanları özellikle tanımlamak için tanıtıldı, böylece vergi tanımlaması ve emek tanımlaması arasında bir ayrım oluşturulurken tutarlı bir format korundu.

Gelişim ve Sayısallaştırma

1990'larda, Arjantin önemli ekonomik reformlardan geçerken, CUIT/CUIL sistemi ekonomik faaliyetleri izlemede giderek daha önemli hale geldi. Sistem daha fazla sayısallaştırıldı ve çevrimiçi doğrulama sistemleri uygulandı.

2000'li yılların başında, CUIT/CUIL sistemi çeşitli dijital devlet hizmetleriyle entegre edildi ve Arjantin'in e-devlet girişimlerinin temel bir bileşeni haline geldi. Bu dönem aynı zamanda bugün hala kullanımda olan doğrulama algoritmasının ve formatın standartlaştırıldığı bir dönemdi.

Son Gelişmeler

Son yıllarda, AFIP, CUIT/CUIL numaralarının güvenliğini ve doğrulama süreçlerini geliştirdi, daha gelişmiş doğrulama sistemleri uyguladı ve bunları diğer devlet veri tabanlarıyla entegre etti. Sistem artık Arjantin'in vergi kaçakçılığıyla mücadele etme ve ekonomiyi kayıt altına alma çabalarında çok önemli bir rol oynamaktadır.

Bugün, CUIT/CUIL, yalnızca vergi ve istihdam amaçları için değil, aynı zamanda bankacılık, mülk işlemleri, kamu hizmetleri ve çevrimiçi satın almalar da dahil olmak üzere geniş bir faaliyet yelpazesi için kullanılmaktadır ve bu, Arjantin'de faaliyet gösteren hem bireyler hem de işletmeler için temel bir tanımlayıcı haline gelmiştir.

Uygulama Değerlendirmeleri

Kendi sistemlerinizde CUIT/CUIL doğrulaması uygularken, bu teknik hususları göz önünde bulundurun:

Algoritma Kararlılığı: Mevcut CUIT/CUIL doğrulama algoritması 1990'lardan bu yana değişmeden kalmıştır. AFIP'in teknik dokümantasyonuna göre, modulo-11 ağırlıklı kontrol basamağı yaklaşımı Resolución General 2854/2010 ve sonraki düzenlemelerde kodlanmıştır. Bu kararlılık, uygulamaların nadiren güncelleme gerektirdiği anlamına gelir, ancak herhangi bir düzenleyici değişiklik için AFIP duyurularını izlemeniz gerekir.

Performans Optimizasyonu: Doğrulama algoritması hesaplama açısından ucuzdur—sadece 10 çarpma, bir toplama ve bir modulo işlemi. Saniyede binlerce doğrulama işleyen yüksek performanslı sistemler için darboğaz, algoritmanın kendisi değil, AFIP veritabanına karşı doğrulama yaparken ağ gecikmesidir. Uygun TTL'lerle (genellikle 24 saat) AFIP doğrulama sonuçlarını önbelleğe almayı düşünün.

Karakter Kodlaması: Harici kaynaklardan (PDF'ler, taranmış belgeler, web kazıma) CUIT/CUIL verilerini işlerken, karakter kodlama sorunlarına dikkat edin. Tire, standart tire-eksi (U+002D) yerine em dash (U+2014), en dash (U+2013) veya eksi işareti (U+2212) olarak görünebilir. Yanlış negatiflerden kaçınmak için bunları doğrulamadan önce normalleştirin.

Uluslararasılaştırma: Uygulamanız birden fazla Latin Amerika pazarına hizmet ediyorsa, Arjantin'in CUIT/CUIL'inin belirli ağırlıklarla modulo-11 kullandığını, Şili'nin RUT'unun farklı ağırlıklarla modulo-11 kullandığını ve Brezilya'nın CPF/CNPJ'sinin tamamen farklı bir modulo-11 deseni kullandığını not edin. Algoritmaların özdeş olduğunu varsaymayın—her ülkenin sistemi kendine özgü kurallara sahiptir. Kontrol basamağı algoritmaları hakkında daha geniş bir anlayış için, çeşitli modulo tabanlı doğrulama şemalarını resmileştiren ISO/IEC 7064 standardına bakın.

Veritabanı Depolama: CUIT/CUIL numaralarını tire olmadan sabit uzunlukta CHAR(11) veya veritabanınız 11 basamaklı tamsayıları hassasiyet kaybı olmadan destekliyorsa BIGINT olarak saklayın. Bozulmuş verilere karşı bir güvenlik ağı olarak veritabanı düzeyinde doğrulama basamağını doğrulayan bir kontrol kısıtlaması ekleyin. Kullanıcılar CUIT/CUIL'e göre arama yaptığında verimli aramalar için bu alana dizin oluşturun.

Kod Örnekleri

Python

1def calculate_verification_digit(type_code, dni):
2    # Dizeye dönüştür ve DNI'ın başında sıfırlar olacak şekilde 8 haneli olmasını sağla
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # Tür kodu ve DNI'ı birleştir
7    digits = type_code_str + dni_str
8    
9    # Her konum için ağırlıklar
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # Çarpımların toplamını hesapla
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # Doğrulama basamağını hesapla
16    verification_digit = 11 - (sum_products % 11)
17    
18    # Özel durumlar
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    # Geçerli tür kodları
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"Geçersiz tür kodu. Şunlardan biri olmalı: {valid_type_codes}")
34    
35    # Sağlanmadıysa rastgele DNI oluştur
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # Doğrulama basamağını hesapla
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # CUIT/CUIL formatı
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # Varsa kısa çizgileri kaldır
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # Temel formatı kontrol et
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "Geçersiz format"
52    
53    # Parçaları çıkart
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    # Tür kodunu doğrula
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "Geçersiz tür kodu"
62    
63    # Doğrulama basamağını hesapla ve karşılaştır
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "Geçersiz doğrulama basamağı"
67    
68    return True, "Geçerli CUIT/CUIL"
69
70# Örnek kullanım
71print(generate_cuit_cuil(20, 12345678))  # Belirli bir DNI için oluştur
72print(generate_cuit_cuil(27))  # Rastgele DNI ile oluştur
73print(validate_cuit_cuil("20-12345678-9"))  # Bir CUIT/CUIL'i doğrula
74

JavaScript

1function calculateVerificationDigit(typeCode, dni) {
2  // Dizeye dönüştür ve DNI'ın başında sıfırlar olacak şekilde 8 haneli olmasını sağla
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // Tür kodu ve DNI'ı birleştir
7  const digits = typeCodeStr + dniStr;
8  
9  // Her konum için ağırlıklar
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // Çarpımların toplamını hesapla
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // Doğrulama basamağını hesapla
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // Özel durumlar
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  // Geçerli tür kodları
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`Geçersiz tür kodu. Şunlardan biri olmalı: ${validTypeCodes.join(', ')}`);
37  }
38  
39  // Sağlanmadıysa rastgele DNI oluştur
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // Doğrulama basamağını hesapla
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // CUIT/CUIL formatı
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // Varsa kısa çizgileri kaldır
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // Temel formatı kontrol et
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'Geçersiz format' };
58  }
59  
60  // Parçaları çıkart
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  // Tür kodunu doğrula
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'Geçersiz tür kodu' };
69  }
70  
71  // Doğrulama basamağını hesapla ve karşılaştır
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'Geçersiz doğrulama basamağı' };
75  }
76  
77  return { isValid: true };
78}
79
80// Örnek kullanım
81console.log(generateCuitCuil(20, 12345678)); // Belirli bir DNI için oluştur
82console.log(generateCuitCuil(27)); // Rastgele DNI ile oluştur
83console.log(validateCuitCuil("20-12345678-9")); // Bir CUIT/CUIL'i doğrula
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        // Dizeye dönüştür ve DNI'ın başında sıfırlar olacak şekilde 8 haneli olmasını sağla
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // Tür kodu ve DNI'ı birleştir
15        String digits = typeCodeStr + dniStr;
16        
17        // Çarpımların toplamını hesapla
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // Doğrulama basamağını hesapla
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // Özel durumlar
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("Geçersiz tür kodu. Şunlardan biri olmalı: " + VALID_TYPE_CODES);
39        }
40        
41        // Sağlanmadıysa rastgele DNI oluştur
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // Doğrulama basamağını hesapla
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // CUIT/CUIL formatı
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // Varsa kısa çizgileri kaldır
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // Temel formatı kontrol et
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "Geçersiz format");
61        }
62        
63        // Parçaları çıkart
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        // Tür kodunu doğrula
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "Geçersiz tür kodu");
71        }
72        
73        // Doğrulama basamağını hesapla ve karşılaştır
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "Geçersiz doğrulama basamağı");
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        // Örnek kullanım
102        System.out.println(generateCuitCuil(20, 12345678)); // Belirli bir DNI için oluştur
103        System.out.println(generateCuitCuil(27, null)); // Rastgele DNI ile oluştur
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Bir CUIT/CUIL'i doğrula
105    }
106}
107

PHP

<?php function calculateVerificationDigit($typeCode, $dni) { // Dizeye dönüştür ve DNI'ın başında sıfırlar olacak şekilde 8 haneli olmasını sağla $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Tür kodu ve DNI'ı birleştir $digits = $typeCodeStr . $dniStr; // Her konum için ağırlıklar $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // Çarpımların toplamını hesapla $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // Doğrulama basamağını hesapla $verificationDigit = 11 - ($sumProducts % 11); // Özel durumlar if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // Geçerli tür kodları $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("Geçersiz tür kodu. Şunlardan biri olmalı: " . implode(', ', $validTypeCodes)); } // Sağlanmadıysa rastgele DNI oluştur if ($dni === null) { $dni = rand(10000000, 99999999); } // Doğrulama basamağını hesapla $verificationDigit = calculateVerificationDigit($typeCode, $dni); // CUIT/CUIL formatı return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCuil) { // Varsa kısa çizgileri kaldır $cuitCuilClean = str_replace('-', '', $cuitCuil); // Temel formatı kontrol et if (!preg_match('/^\d{11}$/', $cuitCuilClean)) { return ['isValid' => false, ## Sık Sorulan Sorular ### CUIT ve CUIL Arasındaki Fark Nedir? İşte pratik ayrım: **CUIT** (Vergi Tanımlama Anahtarı), AFIP'e vergi beyannamesi veren hem bireyler hem de işletmeleri tanımlar. **CUIL** (İş Tanımlama Anahtarı), istihdam ve emeklilik amaçları için sosyal güvenlik sistemindeki çalışanları tanımlar. Pratikte, birçok birey hem CUIL'e (ilk işinden) sahiptir ve daha sonra CUIT alabilir (serbest meslek sahibi olursa veya bir işletme kurarsa). Numaralar özdeş biçimlendirme ve hesaplama kuralları kullanır, dolayısıyla doğrulama açısından aynı şekilde ele alınırlar. Ayrım idari amaçlar için önemlidir: bordro sistemleri tipik olarak CUIL ile, faturalama ve vergi sistemleri ise CUIT ile çalışır. ### Bireyler ve şirketler için hangi tip kodları kullanılır? Bireyler için: - 20, 23, 24: Erkek bireyler (CUIL) - 27: Kadın bireyler (CUIL) Şirketler ve kuruluşlar için: - 30: Şirketler (CUIT) - 33: Sivil Dernekler (CUIT) - 34: Vakıflar (CUIT) ### Doğrulama basamağı nasıl hesaplanır? Algoritma ağırlıklı çarpma kullanır: ilk 10 basamağı alın, **5, 4, 3, 2, 7, 6, 5, 4, 3, 2** ağırlıklarıyla çarpın, çarpımları toplayın, sonra 11 eksi (toplam modulo 11) hesaplayın. İki sınır durum insanları yanıltır: hesaplama 11 verirse, doğrulama basamağı olarak 0 kullanın; 10 verirse 9 kullanın. Bu özel durumlar, doğrulama basamağının tek basamak (0-9) olması gerektiği içindir. Bu, ISBN-10 kodlarında ve dünya çapındaki diğer tanımlama sistemlerinde kullanılan modulo-11 kontrol basamağı algoritmasına benzer. ### Bu aracı gerçek, resmi CUIT/CUIL numaraları oluşturmak için kullanabilir miyim? Hayır—bu araç matematiksel olarak geçerli test verileri oluşturur, ancak numaralar AFIP ile resmi olarak kayıtlı değildir. Luhn algoritmasını kullanarak geçerli bir kredi kartı numarası oluşturmak gibi düşünün: format doğrulamasını geçer, ancak gerçek bir hesapla bağlantılı değildir. Resmi CUIT/CUIL kaydı için, bireyler DNI'leriyle AFIP'e gitmeli, şirketler ise kurumsal kayıt prosedürlerini tamamlamalıdır. Araç yalnızca gerçek tanımlama numaralarıyla çakışmayacak geçerli görünen verilere ihtiyaç duyulan geliştirme, test ve eğitim amaçlıdır. ### Format doğru görünmesine rağmen CUIT/CUIL doğrulamam neden başarısız oluyor? Doğrulama, doğru görünen formata rağmen başarısız olduğunda, bu yaygın nedenleri kontrol edin: 1. **Geçersiz tip kodu**: Yalnızca 20, 23, 24, 27, 30, 33, 34 geçerlidir. 21, 25 veya diğer numaraları kullanmak başarısızlığa neden olur. 2. **Yanlış doğrulama basamağı**: Son basamak algoritmanın hesaplamasıyla eşleşmelidir. DNI bölümünde bir basamağı değiştirmek, kontrol basamağının yeniden hesaplanmasını gerektirir. 3. **Format sorunları**: Kesinlikle 11 basamak olmalı (XX-XXXXXXXX-X). Fazladan boşluklar veya eksik başlangıç sıfırları konusunda dikkatli olun. 4. **Gizli karakterler**: PDF'lerden veya web sitelerinden kopyala-yapıştır yapmak bazen doğrulamayı bozan görünmez Unicode karakterleri getirir. Hızlı bir hata ayıklama ipucu: son basamağı çıkarın ve manuel olarak yeniden hesaplayın. Eşleşmiyorsa, sorun budur. ### CUIT/CUIL numaralarında kısa çizgiler gerekli mi? Kısa çizgiler yalnızca görüntü biçimlendirmesi içindir—hesaplama amaçları için gerçek numaranın parçası değildir. **20-12345678-9** görürken, algoritma yalnızca 11 basamağa bakar: **20123456789**. Çoğu doğrulama uygulaması, işleme öncesi kısa çizgileri çıkarır, bu yüzden aracımız hem **20-12345678-9** hem de **20123456789**'u kabul eder. API'lerde ve veritabanlarında, genellikle kısa çizgisiz sürümü saklayın ve yalnızca kullanıcılara görüntülerken kısa çizgileri ekleyin. Bu yaklaşım, biçimlendirme tutarsızlıklarının doğrulama hatalarına neden olmasını önler. ### CUIT/CUIL numarasının DNI bölümünde 8'den az basamak olabilir mi? DNI bölümü her zaman kesinlikle 8 basamak olmalıdır—hiçbir istisna yoktur. Birinin gerçek DNI'si daha az basamağa sahipse (eski, düşük numaralı DNI'lerde olduğu gibi), başına sıfır ekleyin. Örneğin, DNI **1234567** CUIT/CUIL yapısında **01234567** olur. Bu, DNI ve CUIT/CUIL formatları arasında dönüştürme yaparken sık karşılaşılan bir hata kaynağıdır. Sıfır doldurma işlevleri kullanmayıp basit dize birleştirmesi yapan sistemlerin bunu **01234567** yerine 7 basamaklı **1234567** olarak ele aldığını gördüm. Kodunuzda her zaman basit dize birleştirmesi yerine sıfır doldurma işlevleri kullanın. ### Arjantin'de bir CUIT/CUIL'in resmi olarak kayıtlı olup olmadığını nasıl doğrulayabilirim? Aracımız matematiksel doğruluğu doğrular—format, tip kodu ve kontrol basamağı. Ancak numaranın AFIP ile gerçekten kayıtlı olup olmadığını veya gerçek bir kişiye veya işletmeye ait olup olmadığını söyleyemez. Resmi doğrulama için, [AFIP'in web hizmetlerini](https://www.afip.gob.ar/) veya "Kayıt Belgesi" arama aracını kullanın. AFIP, otomatik doğrulama için API'ler sunar, ancak geliştirici olarak kayıt yaptırmanız ve kimlik doğrulaması yapmanız gerekir. Üretim ortamlarında her iki katmanı da uygulayın: önce algoritmik doğrulamayı çalıştırın (hızlı, yazım hatalarını ve format hatalarını yakalar), sonra AFIP veritabanında doğrulayın (yavaş, ancak numaranın gerçek ve aktif olduğunu onaylar). ### Bu aracı ticari uygulamamda kullanabilir miyim? Evet—CUIT/CUIL doğrulama algoritması AFIP tarafından tanımlanmış bir kamu standardıdır, dolayısıyla ticari yazılımda serbestçe uygulayabilirsiniz. Burada sağlanan kod örnekleri referans uygulamaları olarak tasarlanmıştır. Üretim kullanımı için şu en iyi uygulamaları dikkate alın: sınır durumlar için uygun hata işleme uygulayın, doğrulama hatalarında hata günlüğü ekleyin, yalnızca algoritmik doğrulamadan ziyade AFIP'in resmi veritabanında doğrulayın ve AFIP kuralları değişirse uygulamanızı güncel tutun (ancak mevcut algoritma on yıllardır kararlıdır). ### Araç oluşturulan veya doğrulanan CUIT/CUIL numaralarını depoluyor mu? Hayır—tüm işlemler tarayıcınızda (istemci tarafında) gerçekleşir. Bir CUIT/CUIL oluşturduğunuzda veya doğruladığınızda, hesaplama JavaScript kullanılarak yerel olarak çalışır. Sunucularımıza hiçbir şey gönderilmez ve girdiğiniz veya oluşturduğunuz numaraları kaydetmez, depolamayız veya izlemeyiz. Bu istemci tarafı yaklaşımı gizliliği sağlar ve ayrıca sayfanın yüklenmesinden sonra aracın çevrimdışı çalışmasını sağlar. Tarayıcınızın geliştirici araçlarını açarak ve ağ sekmesini izleyerek bunu doğrulayabilirsiniz—numara oluştururken veya doğrularken hiçbir istek gönderilmediğini göreceksiniz. ## Referanslar 1. AFIP (Kamu Gelirleri Federal İdaresi). "CUIT/CUIL/CDI." Resmi Web Sitesi. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Çalışma, İstihdam ve Sosyal Güvenlik Bakanlığı. "CUIL - İş Tanımlama Tekil Anahtarı." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Ulusal Sosyal Güvenlik İdaresi). "CUIL'imi Al." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Arjantin Cumhuriyeti Resmi Gazetesi. "AFIP Genel Kararı 2854/2010: Prosedür. Tekil Vergi Tanımlama Anahtarı (C.U.I.T.)." 5. Arjantin Cumhuriyeti Mali Kanunu. "Vergi Mükelleflerinin Tanımlanması ve Kaydı." --- İster bir fatura sistemi oluşturuyor, çalışan oryantasyon akışlarını test ediyor, ya da doğrulama algoritmaları hakkında bilgi ediniyorsunuz olun, bu araç ihtiyacınız olan CUIT/CUIL oluşturma ve doğrulamayı sağlar. Algoritma doğrulamasını geçen test verileri oluşturun, veritabanına girmeden önce numaraları doğrulayın veya kontrol basamağı algoritmasının pratikte nasıl çalıştığını keşfedin.