🛠️

Whiz Tools

Build • Create • Innovate

ابزار تولید و اعتبارسنجی CUIT/CUIL آرژانتینی

شماره‌های CUIT/CUIL معتبر آرژانتینی را برای تست تولید کنید یا شماره‌های موجود را اعتبارسنجی کنید. ابزار ساده‌ای برای توسعه‌دهندگان که با شماره‌های شناسایی مالیاتی و کاری آرژانتینی کار می‌کنند.

تولیدکننده CUIT/CUIL

یک شماره DNI هشت رقمی وارد کنید یا از تولیدکننده تصادفی استفاده کنید

CUIT/CUIL تولید شده

📚

مستندات

تولید و اعتبارسنجی CUIT/CUIL آرژانتینی

مقدمه

CUIT (Clave Única de Identificación Tributaria) و CUIL (Clave Única de Identificación Laboral) آرژانتین، شماره‌های شناسایی منحصر به فردی هستند که در آرژانتین برای اهداف مالیاتی و استخدامی به ترتیب استفاده می‌شوند. این کدهای ۱۱ رقمی برای افراد و کسب‌وکارها ضروری هستند تا به‌طور قانونی در سیستم اقتصادی آرژانتین فعالیت کنند. ابزار تولید و اعتبارسنجی CUIT/CUIL ما، راهی ساده و کارآمد برای تولید شماره‌های CUIT/CUIL معتبر برای اهداف آزمایشی و اعتبارسنجی شماره‌های موجود به‌منظور اطمینان از انطباق آن‌ها با فرمت رسمی و الگوریتم اعتبارسنجی ارائه می‌دهد.

چه شما یک توسعه‌دهنده باشید که در حال آزمایش برنامه‌هایی هستید که با شناسه‌های مالیاتی آرژانتینی کار می‌کنند، یک متخصص QA که عملکرد سیستم را بررسی می‌کند، یا فقط به درک چگونگی کار این شماره‌های شناسایی نیاز دارید، این ابزار یک راه‌حل ساده بدون پیچیدگی‌های غیرضروری را ارائه می‌دهد. این ابزار شامل دو عملکرد اصلی است: یک تولیدکننده که شماره‌های CUIT/CUIL معتبر را به‌صورت تصادفی یا بر اساس پارامترهای خاص تولید می‌کند و یک اعتبارسنج که بررسی می‌کند آیا یک شماره CUIT/CUIL داده‌شده با فرمت صحیح و قوانین محاسباتی مطابقت دارد یا خیر.

ساختار و محاسبه CUIT/CUIL

درک فرمت

یک شماره CUIT/CUIL معتبر شامل ۱۱ رقم است که معمولاً به‌صورت فرمت XX-XXXXXXXX-X نمایش داده می‌شود:

  1. کد نوع (دو رقم اول): نوع نهاد را نشان می‌دهد

    • ۲۰، ۲۳، ۲۴: افراد مرد (CUIL)
    • ۲۷: افراد زن (CUIL)
    • ۳۰، ۳۳، ۳۴: شرکت‌ها و سازمان‌ها (CUIT)
  2. شماره DNI (هشت رقم میانی): برای افراد، این شماره شناسنامه ملی آن‌ها (DNI) است که در صورت لزوم با صفرهای پیشرو پر می‌شود تا به ۸ رقم برسد. برای شرکت‌ها، این یک شماره اختصاصی است.

  3. رقم اعتبارسنجی (رقم آخر): یک رقم چک که با استفاده از یک الگوریتم خاص محاسبه می‌شود تا کل شماره را اعتبارسنجی کند.

محاسبه رقم اعتبارسنجی

رقم اعتبارسنجی با استفاده از الگوریتم زیر محاسبه می‌شود:

  1. ۱۰ رقم اول CUIT/CUIL (کد نوع + DNI) را بگیرید
  2. هر رقم را با وزن مربوطه از این توالی ضرب کنید: ۵، ۴، ۳، ۲، ۷، ۶، ۵، ۴، ۳، ۲
  3. تمام محصولات حاصل را جمع کنید
  4. ۱۱ منهای باقی‌مانده مجموع تقسیم بر ۱۱ را محاسبه کنید
  5. اگر نتیجه ۱۱ باشد، رقم اعتبارسنجی ۰ است
  6. اگر نتیجه ۱۰ باشد، رقم اعتبارسنجی ۹ است
  7. در غیر این صورت، نتیجه رقم اعتبارسنجی است

از نظر ریاضی، این می‌تواند به‌صورت زیر بیان شود:

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

که در آن:

  • VDVD رقم اعتبارسنجی است
  • did_i رقم ii-ام از ۱۰ رقم اول است
  • wiw_i وزن مربوطه از توالی [۵، ۴، ۳، ۲، ۷، ۶، ۵، ۴، ۳، ۲] است
  • موارد خاص: اگر VD=11VD = 11 سپس VD=0VD = 0، اگر VD=10VD = 10 سپس VD=9VD = 9

راهنمای گام به گام

استفاده از تولیدکننده

  1. بر روی برگه "تولیدکننده" در بالای رابط ابزار کلیک کنید.

  2. یک کد نوع از منوی کشویی انتخاب کنید:

    • ۲۰: مرد (CUIL)
    • ۲۳: کسب‌وکار (CUIT)
    • ۲۴: کسب‌وکار موقت (CUIT)
    • ۲۷: زن (CUIL)
    • ۳۰: شرکت (CUIT)
    • ۳۳: انجمن مدنی (CUIT)
    • ۳۴: بنیاد (CUIT)
  3. یک شماره DNI وارد کنید (اختیاری):

    • یک شماره ۸ رقمی DNI را در فیلد مربوطه وارد کنید
    • اگر خالی بگذارید، ابزار از یک DNI تصادفی تولید شده استفاده خواهد کرد
    • اگر کمتر از ۸ رقم وارد کنید، سیستم با صفرهای پیشرو پر خواهد کرد
  4. تولید DNI تصادفی (اختیاری):

    • بر روی دکمه "تصادفی" کلیک کنید تا یک شماره ۸ رقمی DNI تصادفی تولید شود
  5. CUIT/CUIL تولید شده را مشاهده کنید:

    • ابزار به‌طور خودکار یک CUIT/CUIL معتبر بر اساس ورودی‌های شما نمایش می‌دهد
    • فرمت آن XX-XXXXXXXX-X خواهد بود با رقم اعتبارسنجی صحیح
  6. نتیجه را کپی کنید:

    • بر روی آیکون کپی کلیک کنید تا CUIT/CUIL تولید شده را به کلیپ‌بورد خود کپی کنید
    • یک پیام تأیید هنگامی که به‌طور موفقیت‌آمیز کپی شد، ظاهر خواهد شد

استفاده از اعتبارسنج

  1. بر روی برگه "اعتبارسنج" در بالای رابط ابزار کلیک کنید.

  2. CUIT/CUIL برای اعتبارسنجی را وارد کنید:

    • CUIT/CUIL را در فرمت XX-XXXXXXXX-X وارد کنید
    • ابزار به‌طور خودکار ورودی شما را با خط تیره‌ها فرمت می‌کند
    • شما همچنین می‌توانید شماره را بدون خط تیره وارد کنید (XXXXXXXXXXX)
  3. بر روی دکمه "اعتبارسنجی" کلیک کنید:

    • ابزار فرمت، کد نوع و رقم اعتبارسنجی را بررسی خواهد کرد
  4. نتیجه اعتبارسنجی را مشاهده کنید:

    • برای شماره‌های CUIT/CUIL معتبر، یک پیام موفقیت سبز رنگ ظاهر خواهد شد
    • برای شماره‌های نامعتبر، یک پیام خطای قرمز رنگ مشکل را توضیح می‌دهد:
      • فرمت نامعتبر (باید XX-XXXXXXXX-X باشد)
      • کد نوع نامعتبر (باید یکی از: ۲۰، ۲۳، ۲۴، ۲۷، ۳۰، ۳۳، ۳۴ باشد)
      • رقم اعتبارسنجی نامعتبر
  5. اطلاعات اضافی:

    • برای شماره‌های معتبر، ابزار اجزای تشکیل‌دهنده را نمایش می‌دهد:
      • کد نوع و معنی آن
      • شماره DNI
      • رقم اعتبارسنجی

موارد استفاده

توسعه و آزمایش

  1. توسعه نرم‌افزار: تولید شماره‌های CUIT/CUIL معتبر برای آزمایش برنامه‌هایی که با شناسایی مالیاتی آرژانتینی کار می‌کنند، مانند:

    • پلتفرم‌های تجارت الکترونیک
    • نرم‌افزارهای حسابداری
    • سیستم‌های مدیریت منابع انسانی
    • پرتال‌های خدمات دولتی
    • برنامه‌های بانکی
  2. پر کردن پایگاه داده: ایجاد داده‌های آزمایشی واقعی برای سیستم‌هایی که اطلاعات کاربران آرژانتینی را ذخیره می‌کنند، به‌منظور اطمینان از اینکه محدودیت‌ها و قوانین اعتبارسنجی پایگاه داده به درستی کار می‌کنند.

  3. آزمایش اعتبارسنجی فرم: آزمایش اعتبارسنجی ورودی برای فرم‌های وب که اطلاعات CUIT/CUIL را جمع‌آوری می‌کنند، بررسی اینکه پیام‌های خطای مناسب برای ورودی‌های نامعتبر ظاهر می‌شوند.

  4. آزمایش API: تولید بارهای معتبر برای نقاط پایانی API که به شماره‌های CUIT/CUIL نیاز دارند، اطمینان از اینکه آزمایش‌های یکپارچه‌سازی از داده‌های معتبر استفاده می‌کنند.

  5. خودکارسازی QA: گنجاندن تولید CUIT/CUIL در اسکریپت‌های آزمایش خودکار برای ایجاد موارد آزمایشی پویا به‌جای استفاده از داده‌های آزمایشی ایستا.

اهداف آموزشی

  1. یادگیری الگوریتم‌های اعتبارسنجی: درک چگونگی کار الگوریتم‌های رقم چک در عمل با مشاهده فرآیند اعتبارسنجی CUIT/CUIL.

  2. آموزش تکنیک‌های اعتبارسنجی داده: استفاده به‌عنوان یک مثال آموزشی هنگام آموزش تکنیک‌های اعتبارسنجی فرم به توسعه‌دهندگان جدید.

  3. درک الزامات کسب‌وکار آرژانتینی: یادگیری درباره سیستم شناسایی استفاده شده در آرژانتین برای توسعه کسب‌وکار بین‌المللی.

Alternatives

در حالی که ابزار ما یک راه ساده برای تولید و اعتبارسنجی شماره‌های CUIT/CUIL ارائه می‌دهد، ممکن است روش‌های جایگزینی را نیز در نظر بگیرید:

  1. اعتبارسنجی رسمی دولتی: برای محیط‌های تولید، همیشه شماره‌های CUIT/CUIL را در صورت امکان در برابر پایگاه داده رسمی AFIP (Administración Federal de Ingresos Públicos) اعتبارسنجی کنید.

  2. کتابخانه‌ها و بسته‌ها: چندین زبان برنامه‌نویسی کتابخانه‌هایی دارند که به‌طور خاص برای اعتبارسنجی شناسه مالیاتی آرژانتینی طراحی شده‌اند:

    • جاوا اسکریپت: بسته npm validar-cuit
    • PHP: کتابخانه afip-php
    • پایتون: بسته py-cuit
  3. محاسبه دستی: برای اهداف آموزشی، ممکن است رقم اعتبارسنجی را به‌صورت دستی با استفاده از الگوریتم توصیف شده در بالا محاسبه کنید.

  4. خدمات اعتبارسنجی جامع کسب‌وکار: برای برنامه‌های شرکتی، در نظر بگیرید که از خدمات اعتبارسنجی جامع استفاده کنید که نه تنها فرمت را بررسی می‌کند بلکه وجود و وضعیت نهاد مرتبط با CUIT/CUIL را نیز تأیید می‌کند.

تاریخچه سیستم CUIT/CUIL

سیستم شناسایی CUIT/CUIL در آرژانتین از زمان تأسیس آن به‌طور قابل توجهی تکامل یافته است:

ریشه‌ها و اجرا

CUIT (Clave Única de Identificación Tributaria) برای اولین بار در آرژانتین در دهه ۱۹۷۰ معرفی شد به‌عنوان بخشی از تلاش‌ها برای مدرن‌سازی سیستم جمع‌آوری مالیات. اداره کل درآمدهای عمومی (AFIP) این شناسایی منحصر به فرد را برای ردیابی مؤدیان مالیاتی به‌طور مؤثرتر و کاهش فرار مالیاتی اجرا کرد.

CUIL (Clave Única de Identificación Laboral) بعداً معرفی شد تا به‌طور خاص کارگران را در سیستم تأمین اجتماعی شناسایی کند و تمایزی بین شناسایی مالیاتی و شناسایی کاری ایجاد کند در حالی که فرمت یکسانی را حفظ کرد.

تکامل و دیجیتالی شدن

در دهه ۱۹۹۰، با توجه به اصلاحات اقتصادی قابل توجهی که در آرژانتین انجام شد، سیستم CUIT/CUIL به‌طور فزاینده‌ای برای ردیابی فعالیت‌های اقتصادی مهم شد. سیستم به‌طور بیشتری دیجیتالی شد و سیستم‌های اعتبارسنجی آنلاین پیاده‌سازی شدند.

اوایل دهه ۲۰۰۰ شاهد ادغام سیستم CUIT/CUIL با خدمات دولتی دیجیتال مختلف بود، که آن را به یک جزء اساسی از ابتکارات دولت الکترونیک آرژانتین تبدیل کرد. این دوره همچنین شاهد استانداردسازی الگوریتم و فرمت اعتبارسنجی بود که هنوز هم مورد استفاده قرار می‌گیرد.

تحولات اخیر

در سال‌های اخیر، AFIP فرآیندهای امنیتی و اعتبارسنجی برای شماره‌های CUIT/CUIL را بهبود بخشیده است و سیستم‌های اعتبارسنجی پیچیده‌تری را پیاده‌سازی کرده و آن‌ها را با سایر پایگاه‌های داده دولتی ادغام کرده است. این سیستم اکنون نقش حیاتی در تلاش‌های آرژانتین برای مبارزه با فرار مالیاتی و رسمی‌سازی اقتصاد ایفا می‌کند.

امروز، CUIT/CUIL نه تنها برای اهداف مالیاتی و استخدامی بلکه برای طیف وسیعی از فعالیت‌ها از جمله بانکداری، معاملات ملکی، خدمات عمومی و خریدهای آنلاین استفاده می‌شود و آن را به یک شناسایی ضروری برای افراد و کسب‌وکارهایی که در آرژانتین فعالیت می‌کنند، تبدیل کرده است.

مثال‌های کد

پایتون

1def calculate_verification_digit(type_code, dni):
2    # تبدیل به رشته و اطمینان از اینکه DNI با صفرهای پیشرو به ۸ رقم برسد
3    type_code_str = str(type_code)
4    dni_str = str(dni).zfill(8)
5    
6    # ترکیب کد نوع و DNI
7    digits = type_code_str + dni_str
8    
9    # وزن‌ها برای هر موقعیت
10    weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11    
12    # محاسبه مجموع محصولات
13    sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14    
15    # محاسبه رقم اعتبارسنجی
16    verification_digit = 11 - (sum_products % 11)
17    
18    # موارد خاص
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    # کدهای نوع معتبر
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"کد نوع نامعتبر. باید یکی از: {valid_type_codes} باشد.")
34    
35    # تولید DNI تصادفی اگر ارائه نشده باشد
36    if dni is None:
37        dni = random.randint(10000000, 99999999)
38    
39    # محاسبه رقم اعتبارسنجی
40    verification_digit = calculate_verification_digit(type_code, dni)
41    
42    # فرمت CUIT/CUIL
43    return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46    # حذف خط تیره‌ها اگر موجود باشد
47    cuit_cuil_clean = cuit_cuil.replace("-", "")
48    
49    # بررسی فرمت پایه
50    if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51        return False, "فرمت نامعتبر"
52    
53    # استخراج اجزا
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    # اعتبارسنجی کد نوع
59    valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60    if type_code not in valid_type_codes:
61        return False, "کد نوع نامعتبر"
62    
63    # محاسبه و مقایسه رقم اعتبارسنجی
64    calculated_digit = calculate_verification_digit(type_code, dni)
65    if calculated_digit != verification_digit:
66        return False, "رقم اعتبارسنجی نامعتبر"
67    
68    return True, "CUIT/CUIL معتبر"
69
70# مثال استفاده
71print(generate_cuit_cuil(20, 12345678))  # تولید برای DNI خاص
72print(generate_cuit_cuil(27))  # تولید با DNI تصادفی
73print(validate_cuit_cuil("20-12345678-9"))  # اعتبارسنجی یک CUIT/CUIL
74

جاوا اسکریپت

1function calculateVerificationDigit(typeCode, dni) {
2  // تبدیل به رشته و اطمینان از اینکه DNI با صفرهای پیشرو به ۸ رقم برسد
3  const typeCodeStr = typeCode.toString();
4  const dniStr = dni.toString().padStart(8, '0');
5  
6  // ترکیب کد نوع و DNI
7  const digits = typeCodeStr + dniStr;
8  
9  // وزن‌ها برای هر موقعیت
10  const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11  
12  // محاسبه مجموع محصولات
13  let sumProducts = 0;
14  for (let i = 0; i < 10; i++) {
15    sumProducts += parseInt(digits[i]) * weights[i];
16  }
17  
18  // محاسبه رقم اعتبارسنجی
19  let verificationDigit = 11 - (sumProducts % 11);
20  
21  // موارد خاص
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  // کدهای نوع معتبر
33  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34  
35  if (!validTypeCodes.includes(typeCode)) {
36    throw new Error(`کد نوع نامعتبر. باید یکی از: ${validTypeCodes.join(', ')} باشد.`);
37  }
38  
39  // تولید DNI تصادفی اگر ارائه نشده باشد
40  if (dni === undefined) {
41    dni = Math.floor(Math.random() * 90000000) + 10000000;
42  }
43  
44  // محاسبه رقم اعتبارسنجی
45  const verificationDigit = calculateVerificationDigit(typeCode, dni);
46  
47  // فرمت CUIT/CUIL
48  return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52  // حذف خط تیره‌ها اگر موجود باشد
53  const cuitCuilClean = cuitCuil.replace(/-/g, '');
54  
55  // بررسی فرمت پایه
56  if (!/^\d{11}$/.test(cuitCuilClean)) {
57    return { isValid: false, errorMessage: 'فرمت نامعتبر' };
58  }
59  
60  // استخراج اجزا
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  // اعتبارسنجی کد نوع
66  const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67  if (!validTypeCodes.includes(typeCode)) {
68    return { isValid: false, errorMessage: 'کد نوع نامعتبر' };
69  }
70  
71  // محاسبه و مقایسه رقم اعتبارسنجی
72  const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73  if (calculatedDigit !== verificationDigit) {
74    return { isValid: false, errorMessage: 'رقم اعتبارسنجی نامعتبر' };
75  }
76  
77  return { isValid: true };
78}
79
80// مثال استفاده
81console.log(generateCuitCuil(20, 12345678)); // تولید برای DNI خاص
82console.log(generateCuitCuil(27)); // تولید با DNI تصادفی
83console.log(validateCuitCuil("20-12345678-9")); // اعتبارسنجی یک CUIT/CUIL
84

جاوا

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        // تبدیل به رشته و اطمینان از اینکه DNI با صفرهای پیشرو به ۸ رقم برسد
11        String typeCodeStr = String.valueOf(typeCode);
12        String dniStr = String.format("%08d", dni);
13        
14        // ترکیب کد نوع و DNI
15        String digits = typeCodeStr + dniStr;
16        
17        // محاسبه مجموع محصولات
18        int sumProducts = 0;
19        for (int i = 0; i < 10; i++) {
20            sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21        }
22        
23        // محاسبه رقم اعتبارسنجی
24        int verificationDigit = 11 - (sumProducts % 11);
25        
26        // موارد خاص
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("کد نوع نامعتبر. باید یکی از: " + VALID_TYPE_CODES);
39        }
40        
41        // تولید DNI تصادفی اگر ارائه نشده باشد
42        if (dni == null) {
43            Random random = new Random();
44            dni = 10000000 + random.nextInt(90000000);
45        }
46        
47        // محاسبه رقم اعتبارسنجی
48        int verificationDigit = calculateVerificationDigit(typeCode, dni);
49        
50        // فرمت CUIT/CUIL
51        return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52    }
53    
54    public static ValidationResult validateCuitCuil(String cuitCuil) {
55        // حذف خط تیره‌ها اگر موجود باشد
56        String cuitCuilClean = cuitCuil.replace("-", "");
57        
58        // بررسی فرمت پایه
59        if (!cuitCuilClean.matches("\\d{11}")) {
60            return new ValidationResult(false, "فرمت نامعتبر");
61        }
62        
63        // استخراج اجزا
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        // اعتبارسنجی کد نوع
69        if (!VALID_TYPE_CODES.contains(typeCode)) {
70            return new ValidationResult(false, "کد نوع نامعتبر");
71        }
72        
73        // محاسبه و مقایسه رقم اعتبارسنجی
74        int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75        if (calculatedDigit != verificationDigit) {
76            return new ValidationResult(false, "رقم اعتبارسنجی نامعتبر");
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        // مثال استفاده
102        System.out.println(generateCuitCuil(20, 12345678)); // تولید برای DNI خاص
103        System.out.println(generateCuitCuil(27, null)); // تولید با DNI تصادفی
104        System.out.println(validateCuitCuil("20-12345678-9").isValid()); // اعتبارسنجی یک CUIT/CUIL
105    }
106}
107

PHP

1<?php
2
3function calculateVerificationDigit($typeCode, $dni) {
4    // تبدیل به رشته و اطمینان از اینکه DNI با صفرهای پیشرو به ۸ رقم برسد
5    $typeCodeStr = (string)$typeCode;
6    $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT);
7    
8    // ترکیب کد نوع و DNI
9    $digits = $typeCodeStr . $dniStr;
10    
11    // وزن‌ها برای هر موقعیت
12    $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
13    
14    // محاسبه مجموع محصولات
15    $sumProducts = 0;
16    for ($i = 0; $i < 10; $i++) {
17        $sumProducts += (int)$digits[$i] * $weights[$i];
18    }
19    
20    // محاسبه رقم اعتبارسنجی
21    $verificationDigit = 11 - ($sumProducts % 11);
22    
23    // موارد خاص
24    if ($verificationDigit == 11) {
25        $verificationDigit = 0;
26    } else if ($verificationDigit == 10) {
27        $verificationDigit = 9;
28    }
29    
30    return $verificationDigit;
31}
32
33function generateCuitCuil($typeCode, $dni = null) {
34    // کدهای نوع معتبر
35    $validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
36    
37    if (!in_array($typeCode, $validTypeCodes)) {
38        throw new Exception("کد نوع نامعتبر. باید یکی از: " . implode(', ', $validTypeCodes));
39    }
40    
41    // تولید DNI تصادفی اگر ارائه نشده باشد
42    if ($dni === null) {
43        $dni = rand(10000000, 99999999);
44    }
45    
46    // محاسبه رقم اعتبارسنجی
47    $verificationDigit = calculateVerificationDigit($typeCode, $dni);
48    
49    // فرمت CUIT/CUIL
50    return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit);
51}
52
53function validateCuitCuil($cuitCuil) {
54    // حذف خط تیره‌ها اگر موجود باشد
55    $cuitCuilClean = str_replace('-', '', $cuitCuil);
56    
57    // بررسی فرمت پایه
58    if (!preg_match('/^\d{11}$/', $cuitCuilClean)) {
59        return ['isValid' => false, 'errorMessage' => 'فرمت نامعتبر'];
60    }
61    
62    // استخراج اجزا
63    $typeCode = (int)substr($cuitCuilClean, 0, 2);
64    $dni = (int)substr($cuitCuilClean, 2, 8);
65    $verificationDigit = (int)substr($cuitCuilClean, 10, 1);
66    
67    // اعتبارسنجی کد نوع
68    $validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
69    if (!in_array($typeCode, $validTypeCodes)) {
70        return ['isValid' => false, 'errorMessage' => 'کد نوع نامعتبر'];
71    }
72    
73    // محاسبه و مقایسه رقم اعتبارسنجی
74    $calculatedDigit = calculateVerificationDigit($typeCode, $dni);
75    if ($calculatedDigit !== $verificationDigit) {
76        return ['isValid' => false, 'errorMessage' => 'رقم اعتبارسنجی نامعتبر'];
77    }
78    
79    return ['isValid' => true];
80}
81
82// مثال استفاده
83echo generateCuitCuil(20, 12345678) . "\n"; // تولید برای DNI خاص
84echo generateCuitCuil(27) . "\n"; // تولید با DNI تصادفی
85var_dump(validateCuitCuil("20-12345678-9")); // اعتبارسنجی یک CUIT/CUIL
86?>
87

سوالات متداول

تفاوت بین CUIT و CUIL چیست؟

CUIT (Clave Única de Identificación Tributaria) برای اهداف شناسایی مالیاتی استفاده می‌شود و به هر دو فرد و نهادهای قانونی که نیاز به پرداخت مالیات در آرژانتین دارند، اختصاص می‌یابد. CUIL (Clave Única de Identificación Laboral) به‌طور خاص برای کارگران است و برای اهداف کاری و تأمین اجتماعی استفاده می‌شود. در حالی که آن‌ها فرمت و الگوریتم محاسباتی یکسانی را به اشتراک می‌گذارند، اما اهداف اداری متفاوتی دارند.

کدام کدهای نوع برای افراد و کدام برای شرکت‌ها استفاده می‌شود؟

برای افراد:

  • ۲۰، ۲۳، ۲۴: افراد مرد (CUIL)
  • ۲۷: افراد زن (CUIL)

برای شرکت‌ها و سازمان‌ها:

  • ۳۰: شرکت‌ها (CUIT)
  • ۳۳: انجمن‌های مدنی (CUIT)
  • ۳۴: بنیادها (CUIT)

رقم اعتبارسنجی چگونه محاسبه می‌شود؟

رقم اعتبارسنجی با استفاده از یک الگوریتم مجموع وزنی محاسبه می‌شود. هر یک از ۱۰ رقم اول با وزن مربوطه (۵، ۴، ۳، ۲، ۷، ۶، ۵، ۴، ۳، ۲) ضرب می‌شود و نتایج جمع می‌شود. رقم اعتبارسنجی ۱۱ منهای باقی‌مانده مجموع تقسیم بر ۱۱ است. موارد خاص: اگر نتیجه ۱۱ باشد، رقم اعتبارسنجی ۰ است؛ اگر نتیجه ۱۰ باشد، رقم اعتبارسنجی ۹ است.

آیا می‌توانم از این ابزار برای تولید شماره‌های CUIT/CUIL واقعی و رسمی استفاده کنم؟

خیر، این ابزار برای اهداف آزمایشی و آموزشی طراحی شده است. شماره‌های تولید شده از نظر ریاضی معتبر هستند و با الگوریتم CUIT/CUIL مطابقت دارند، اما به‌طور رسمی در اداره مالیات آرژانتین (AFIP) ثبت نشده‌اند. برای ثبت رسمی CUIT/CUIL، افراد و شرکت‌ها باید مراحل قانونی مناسب را از طریق AFIP دنبال کنند.

چرا اعتبارسنجی CUIT/CUIL من با وجود اینکه فرمت درست به نظر می‌رسد، ناموفق است؟

اعتبارسنجی می‌تواند به چندین دلیل ناموفق شود:

  1. کد نوع یکی از کدهای معتبر نیست (۲۰، ۲۳، ۲۴، ۲۷، ۳۰، ۳۳، ۳۴)
  2. رقم اعتبارسنجی با مقدار محاسبه‌شده بر اساس الگوریتم مطابقت ندارد
  3. فرمت نادرست است (باید XX-XXXXXXXX-X باشد)
  4. در ورودی کاراکترهای غیر عددی وجود دارد (به جز خط تیره‌ها)

آیا خط تیره‌ها در شماره‌های CUIT/CUIL الزامی هستند؟

در حالی که شماره‌های CUIT/CUIL معمولاً با خط تیره‌ها (XX-XXXXXXXX-X) نوشته و نمایش داده می‌شوند، خط تیره‌ها بخشی از شماره واقعی برای اهداف محاسباتی نیستند. اعتبارسنج ما هر دو فرمت (با یا بدون خط تیره) را می‌پذیرد و به‌درستی هر دو فرمت را اعتبارسنجی خواهد کرد.

آیا می‌توان یک شماره CUIT/CUIL کمتر از ۸ رقم در بخش DNI داشته باشد؟

خیر، بخش DNI همیشه باید دقیقاً ۸ رقم باشد. اگر DNI واقعی کمتر از ۸ رقم باشد، باید با صفرهای پیشرو پر شود تا به ۸ رقم برسد. به‌عنوان مثال، اگر DNI شخصی ۱۲۳۴۵۶۷ باشد، در CUIT/CUIL به‌صورت ۰۱۲۳۴۵۶۷ نمایش داده می‌شود.

چگونه می‌توانم بررسی کنم که آیا یک CUIT/CUIL به‌طور رسمی در آرژانتین ثبت شده است؟

برای بررسی اینکه آیا یک CUIT/CUIL به‌طور رسمی ثبت شده و فعال است، باید از وب‌سایت یا خدمات رسمی AFIP (Administración Federal de Ingresos Públicos) استفاده کنید. ابزار ما فقط اعتبارسنجی ریاضی شماره را انجام می‌دهد، نه وضعیت رسمی ثبت آن.

آیا می‌توانم از این ابزار در برنامه تجاری خود استفاده کنم؟

بله، می‌توانید الگوریتم و منطق نشان‌داده‌شده در این ابزار را در برنامه‌های تجاری خود ادغام کنید. الگوریتم اعتبارسنجی CUIT/CUIL یک استاندارد عمومی است. با این حال، برای محیط‌های تولید، توصیه می‌شود که از پیاده‌سازی مدیریت خطاهای مناسب و در نظر گرفتن اعتبارسنجی اضافی در برابر منابع رسمی در صورت لزوم استفاده کنید.

آیا این ابزار هیچ‌یک از شماره‌های CUIT/CUIL تولید شده یا اعتبارسنجی شده را ذخیره می‌کند؟

خیر، این ابزار هیچ‌یک از اطلاعات وارد شده یا تولید شده را ذخیره نمی‌کند. تمام پردازش‌ها در سمت کاربر در مرورگر شما انجام می‌شود و هیچ داده‌ای به سرورها ارسال یا در آن‌ها ذخیره نمی‌شود. این امر حریم خصوصی و امنیت هر گونه اطلاعاتی که وارد می‌کنید را تضمین می‌کند.

منابع

  1. AFIP (Administración Federal de Ingresos Públicos). "CUIT/CUIL/CDI." وب‌سایت رسمی. https://www.afip.gob.ar/

  2. وزارت کار، اشتغال و امنیت اجتماعی. "CUIL - Clave Única de Identificación Laboral." https://www.argentina.gob.ar/trabajo

  3. ANSES (Administración Nacional de la Seguridad Social). "دریافت CUIL من." https://www.anses.gob.ar/

  4. بولتن رسمی جمهوری آرژانتین. "تصمیم‌نامه عمومی AFIP ۲۸۵۴/۲۰۱۰: رویه. کلید شناسایی مالیاتی (C.U.I.T.)."

  5. کد مالیاتی جمهوری آرژانتین. "شناسایی و ثبت مؤدیان مالیاتی."


آماده‌اید تا شماره‌های CUIT/CUIL آرژانتینی را تولید یا اعتبارسنجی کنید؟ هم‌اکنون از ابزار ما استفاده کنید و فرآیند آزمایش خود را ساده کنید!