ابزار تولید و اعتبارسنجی CUIT/CUIL | ابزار شناسه مالیاتی آرژانتین
تولید اعداد آزمایشی معتبر CUIT/CUIL آرژانتین یا اعتبارسنجی شمارههای موجود. ابزار آنلاین رایگان برای توسعهدهندگان جهت آزمایش سیستمهای شناسه مالیاتی و حقوق و دستمزد با اعتبارسنجی مطابق با AFIP.
تولیدکننده CUIT/CUIL
یک شماره DNI 8 رقمی را وارد کنید یا از تولیدکننده تصادفی استفاده کنید
استفاده از DNI تولید شده تصادفی
مستندات
ژنراتور و اعتبارسنجی CUIT/CUIL آرژانتین
مقدمه
در سیستمهای مالیاتی و کاری آرژانتین، شما مدام با دو شناسه حیاتی مواجه خواهید شد: CUIT (کلید یکتای شناسایی مالیاتی) و CUIL (کلید یکتای شناسایی کارگری). CUIT را میتوان شناسه مالیاتی برای کسبوکارها و افرادی دانست که مالیات میپردازند، در حالی که CUIL کارگران را در سیستم تأمین اجتماعی شناسایی میکند. هر دو از فرمت 11 رقمی و الگوریتم تأیید یکسانی استفاده میکنند که این موضوع آزمایش برنامههایی که با این شمارهها سر و کار دارند را بسیار مهم میسازد.
هنگام توسعه نرمافزار برای بازار آرژانتین، شما به دادههای آزمایشی معتبر نیاز دارید. دقیقاً همین جا این ابزار به کمک شما میآید. میتوانید اعداد CUIT/CUIL ریاضیاً صحیح برای آزمایش تولید کنید بدون اینکه از اطلاعات شخصی واقعی استفاده کنید، یا شمارههای موجود را اعتبارسنجی کنید تا مطمئن شوید که با الگوریتم رسمی AFIP مطابقت دارند. نکته بسیار مفید اینجاست که این ابزار هم جنبه تولید (ایجاد اعداد معتبر در هر زمان) و هم جنبه اعتبارسنجی (شناسایی خطاهای فرمت، کدهای نوع نامعتبر و ارقام تأیید نادرست قبل از ایجاد مشکل در محیط تولید) را پوشش میدهد.
ساختار و محاسبه CUIT/CUIL
درک فرمت
یک شماره CUIT/CUIL معتبر شامل 11 رقم است که معمولاً در فرمت XX-XXXXXXXX-X نمایش داده میشود. در اینجا نحوه تفکیک آن آمده است:
-
کد نوع (2 رقم اول): شناسایی نوع موجودیت
- 20، 23، 24: افراد مذکر (CUIL)
- 27: افراد مؤنث (CUIL)
- 30، 33، 34: شرکتها و سازمانها (CUIT)
-
شماره DNI (8 رقم میانی): برای افراد، این شماره سند هویت ملی آنها است (DNI). یک اشتباه رایج: اگر DNI واقعی کمتر از 8 رقم دارد، باید با صفرهای اضافی در ابتدا پر شود. برای مثال، DNI 1234567 به صورت 01234567 در CUIT/CUIL میشود. شرکتها شماره اختصاصی دریافت میکنند.
-
رقم تأیید (رقم آخر): این رقم بررسی، کل شماره را با استفاده از یک الگوریتم وزنی اعتبارسنجی میکند. اگر این رقم با محاسبه مطابقت نداشته باشد، کل CUIT/CUIL نامعتبر است - چیزی که اغلب توسعهدهندگان را در هنگام ساخت دادههای آزمایشی غافلگیر میکند.
محاسبه رقم تأیید
رقم تأیید از یک الگوریتم وزنی مدولو-11 استفاده میکند. در اینجا نحوه کار آن آمده است:
- 10 رقم اول CUIT/CUIL (کد نوع + DNI) را بردارید
- هر رقم را در وزن متناظرش ضرب کنید: 5، 4، 3، 2، 7، 6، 5، 4، 3، 2
- همه محصولات را جمع کنید
- محاسبه کنید: 11 منهای (مجموع مدولو 11)
- موارد حاشیهای را مدیریت کنید: اگر نتیجه 11 باشد، از 0 استفاده کنید؛ اگر 10 باشد، از 9 استفاده کنید
چیزی که اکثر افراد را گیج میکند، موارد حاشیهای در مرحله 5 است. هنگام آزمایش، گاهی اوقات نتیجهای 10 یا 11 دریافت میکنید و فراموش کردن نگاشت آنها به 9 و 0 به ترتیب، باعث شکستهای اعتبارسنجی میشود که اگر از این قانون آگاه نباشید، اشکالزدایی آن دشوار است.
از نظر ریاضی، این میتواند به صورت زیر بیان شود:
جایی که:
- رقم تأیید است
- امین رقم از 10 رقم اول است
- وزن متناظر از دنباله [5، 4، 3، 2، 7، 6، 5، 4، 3، 2] است
- موارد خاص: اگر باشد، آنگاه ، اگر باشد، آنگاه
راهنمای گام به گام
استفاده از تولیدکننده
-
برگه "تولیدکننده" را در بالای رابط ابزار انتخاب کنید.
-
یک کد نوع را از منوی کشویی انتخاب کنید:
- 20: مرد (CUIL)
- 23: کسب و کار (CUIT)
- 24: کسب و کار موقت (CUIT)
- 27: زن (CUIL)
- 30: شرکت (CUIT)
- 33: انجمن مدنی (CUIT)
- 34: بنیاد (CUIT)
-
شماره DNI را وارد کنید (اختیاری):
- یک شماره DNI 8 رقمی را در فیلد مربوطه وارد کنید
- اگر خالی گذاشته شود، ابزار یک DNI تصادفی تولید میکند
- اگر کمتر از 8 رقم وارد کنید، سیستم با صفرهای اضافی کامل میشود
-
تولید DNI تصادفی (اختیاری):
- برای تولید یک شماره DNI 8 رقمی تصادفی، دکمه "تصادفی" را کلیک کنید
-
CUIT/CUIL تولید شده را مشاهده کنید:
- ابزار به طور خودکار یک CUIT/CUIL معتبر بر اساس ورودی شما نمایش میدهد
- فرمت XX-XXXXXXXX-X با رقم تأیید صحیح خواهد بود
-
نتیجه را کپی کنید:
- برای کپی کردن CUIT/CUIL تولید شده در کلیپبورد، آیکون کپی را کلیک کنید
- پیام تأیید پس از کپی شدن موفقیتآمیز ظاهر میشود
استفاده از اعتبارسنج
-
برگه "اعتبارسنج" را در بالای رابط ابزار انتخاب کنید.
-
CUIT/CUIL برای اعتبارسنجی را وارد کنید:
- CUIT/CUIL را در فرمت XX-XXXXXXXX-X وارد کنید
- ابزار به طور خودکار ورودی شما را با خط تیره فرمتبندی میکند
- میتوانید شماره را بدون خط تیره (XXXXXXXXXXX) نیز وارد کنید
-
دکمه "اعتبارسنجی" را کلیک کنید:
- ابزار فرمت، کد نوع و رقم تأیید را بررسی میکند
-
نتیجه اعتبارسنجی را مشاهده کنید:
- برای شمارههای CUIT/CUIL معتبر، یک پیام موفقیت سبز ظاهر میشود
- برای شمارههای نامعتبر، یک پیام خطای قرمز دلیل را توضیح میدهد:
- فرمت نامعتبر (باید XX-XXXXXXXX-X باشد)
- کد نوع نامعتبر (باید یکی از: 20، 23، 24، 27، 30، 33، 34 باشد)
- رقم تأیید نامعتبر
-
اطلاعات اضافی:
- برای شمارههای معتبر، ابزار جزئیات اجزا را نمایش میدهد:
- کد نوع و معنای آن
- شماره DNI
- رقم تأیید
- برای شمارههای معتبر، ابزار جزئیات اجزا را نمایش میدهد:
اشتباهات رایج و بهترین شیوهها
هنگام کار با اعتبارسنجی CUIT/CUIL در برنامههای خود، به این تلههای رایج توجه کنید:
مشکلات صفر پیشرو: رایجترین باگی که برخورد کردهام شامل شمارههای DNI با صفرهای پیشرو میشود. زمانی که کسی DNI "1234567" را وارد میکند، کد شما باید آن را به عنوان "01234567" برای ساخت CUIT/CUIL در نظر بگیرد. بسیاری از پیادهسازیها برای پردازش به عدد صحیح تبدیل میشوند که صفرهای پیشرو را حذف میکند. به جای آن از عملیات رشتهای با پدینگ مناسب استفاده کنید.
سردرگمی کد نوع: همه کدهای دو رقمی کد نوع معتبر نیستند. فقط 20، 23، 24، 27، 30، 33، 34 کار میکنند. سیستمهایی را دیدهام که هر پیشوند دو رقمی را میپذیرند که منجر به اعداد "به ظاهر معتبر" مانند 21-12345678-X میشود که در اعتبارسنجی AFIP شکست میخورند. همیشه قبل از محاسبه رقم تأیید، کد نوع را اعتبارسنجی کنید.
فرض جنسیت: کدهای نوع 20 (مرد) و 27 (زن) قابل جابجایی نیستند. اگر CUILها را بر اساس دادههای جمعیتشناختی به طور خودکار تولید میکنید، اطمینان حاصل کنید که کد نوع شما با جنسیت واقعی ثبت شده در RENAPER (ثبت ملی آرژانتین) مطابقت دارد. عدم تطابق باعث رد شدن در هنگام استفاده افراد از این شمارهها در خدمات دولتی میشود.
مدیریت خط تیره: برخی پیادهسازیها نیاز به خط تیره دارند در حالی که برخی دیگر آنها را رد میکنند. بهترین شیوه: پذیرش هر دو فرمت در فیلدهای ورودی (با یا بدون خط تیره)، حذف خط تیرهها قبل از اعتبارسنجی، ذخیره نسخه بدون خط تیره در پایگاه دادهها، و اضافه کردن خط تیرهها فقط برای نمایش.
فقدان تأیید: اعتبارسنجی الگوریتم خطاهای فرمت را شناسایی میکند اما تأیید نمیکند که CUIT/CUIL ثبت شده باشد. در محیط تولید، ابتدا فرمت را اعتبارسنجی کنید (سریع)، سپس در مقابل پایگاه داده AFIP تأیید کنید (کندتر اما معتبر). این رویکرد دو مرحلهای اشتباهات تایپی را بلافاصله شناسایی میکند در حالی که هنوز اطمینان میدهد که عدد واقعی است.
آزمون موارد حاشیهای: همیشه با ارقام تأیید 0 و 9 آزمایش کنید - اینها از موارد خاص در الگوریتم ناشی میشوند. همچنین DNIهایی که با صفر شروع میشوند را آزمایش کنید تا مطمئن شوید منطق پدینگ شما درست کار میکند.
موارد استفاده و کاربردهای عملی
توسعه و تست
توسعه نرمافزار: هنگام ساخت برنامههایی برای بازار آرژانتین، به دادههای تستی نیاز دارید که بدون استفاده از اطلاعات کاربر واقعی از اعتبارسنجی عبور کنند. در اینجا این موضوع بسیار مهم است:
- پلتفرمهای تجارت الکترونیک: پردازشگرهای پرداخت و سیستمهای صورتحساب نیازمند شمارههای CUIT/CUIL معتبر هستند. در حین بارگذاری تست، ممکن است به هزاران شماره معتبر برای شبیهسازی ثبتنام کاربر واقعی نیاز داشته باشید.
- نرمافزارهای حسابداری: ماژولهای گزارش مالیاتی فرمت CUIT/CUIL را قبل از ارسال به AFIP بررسی میکنند. برای تست این قوانین اعتبارسنجی، به شمارههایی نیاز دارید که از الگوریتم رقم کنترل عبور کنند.
- سیستمهای مدیریت منابع انسانی: پردازش حقوق و دستمزد و مشارکتهای تأمین اجتماعی به شمارههای CUIL معتبر وابسته هستند. سناریوی رایج: در حال تست جریانهای استخدام کارمند هستید و نیاز دارید تأیید کنید که CUILهای نامعتبر پیامهای خطای مناسب را فعال میکنند.
- برنامههای بانکداری: فرآیندهای KYC (شناخت مشتری) CUIT/CUIL را به عنوان بخشی از افتتاح حساب اعتبارسنجی میکنند. از تجربه من، موارد حاشیهای مانند عدم تطابق کد نوع اغلب در طول تست یکپارچگی ظاهر میشوند.
پرکردن پایگاه داده: هنگام تغذیه پایگاههای داده تستی، استفاده از شمارههای CUIT/CUIL معتبر از نظر الگوریتمی اطمینان میدهد که محدودیتها و تریگرهای پایگاه داده شما به درستی کار میکنند. این موضوع بهویژه هنگام تست اسکریپتهای مهاجرت داده یا فرآیندهای ETL که شمارههای شناسایی را اعتبارسنجی میکنند، مهم است.
تست اعتبارسنجی فرم: هم مسیر موفق و هم شرایط خطا را تست کنید. شمارههای معتبر تولید کنید تا ارسال موفق را تأیید کنید، سپس رقم تأیید را اصلاح کنید تا مطمئن شوید اعتبارسنجی frontend و backend خطا را قبل از رسیدن به پایگاه داده شما شناسایی میکند.
تست API: تستهای یکپارچگی باید از شمارههای CUIT/CUIL معتبر در بارهای درخواست استفاده کنند. این از منفیهای کاذب جلوگیری میکند که در آن تستها به دلیل دادههای تستی نامعتبر به جای باگهای واقعی در منطق API شما شکست میخورند.
خودکارسازی QA: تستهای پارامتریک از تولید پویای CUIT/CUIL سود میبرند. به جای hardcode کردن مقادیر تستی که ممکن است در اجراهای مختلف تداخل داشته باشند، برای هر اجرای تست، شمارههای معتبر جدید تولید کنید.
اهداف آموزشی
یادگیری الگوریتمهای اعتبارسنجی: الگوریتم تأیید CUIT/CUIL کاربرد عملی حساب مدولو و ارقام کنترل وزنی را نشان میدهد. این الگوی مشابه در سیستمهای شناسایی دیگر در سراسر جهان ظاهر میشود - شمارههای کارت اعتباری (الگوریتم Luhn)، کدهای ISBN و شمارههای VAT اروپایی همگی از رویکردهای مشابه checksum وزنی استفاده میکنند. درک نحوه کار اعتبارسنجی CUIT/CUIL بینش ارائه میدهد که چرا این الگوریتمها وجود دارند: آنها خطاهای رونویسی مانند ارقام جابجا شده یا اشتباهات تک رقمی را شناسایی میکنند.
آموزش اعتبارسنجی داده: هنگام آموزش توسعهدهندگان جوان در مورد اعتبارسنجی ورودی، سیستم CUIT/CUIL یک مثال واقعی ارائه میدهد که پیچیدهتر از اعتبارسنجی ایمیل اما سادهتر از تأیید رمزنگاری است. این اصل دفاع در عمق را نشان میدهد: اعتبارسنجی فرمت (11 رقم)، اعتبارسنجی قوانین کسب و کار (کدهای نوع معتبر) و اعتبارسنجی الگوریتمی (رقم کنترل).
توسعه کسب و کار بینالمللی: اگر سیستمهایی برای بازارهای آمریکای لاتین میسازید، درک CUIT/CUIL به شما کمک میکند تا سیستمهای مشابه در کشورهای همسایه را درک کنید. برزیل CPF/CNPJ دارد، شیلی RUT دارد و اروگوئه RUT دارد - همه از الگوریتمهای رقم کنترل استفاده میکنند. الگوهایی که اینجا یاد میگیرید به آن سیستمها منتقل میشوند.
جایگزینها و ملاحظات تولید
در حالی که این ابزار برای توسعه و تست بسیار خوب کار میکند، محیطهای تولید نیازمند الزامات متفاوتی هستند:
اعتبارسنجی رسمی دولتی: برای برنامههای زنده، اعتبارسنجی الگوریتمی به تنهایی کافی نیست - شما باید تأیید کنید که CUIT/CUIL واقعاً با AFIP (اداره فدرال درآمدهای عمومی) ثبت شده است. AFIP وب سرویسهایی برای اعتبارسنجی بلادرنگ ارائه میدهد، اگرچه برای دسترسی باید ثبتنام و احراز هویت کنید. نکته اینجاست: یک شماره میتواند از نظر ریاضی معتبر باشد اما رسماً تخصیص داده نشده باشد، بنابراین همیشه هر دو لایه اعتبارسنجی را در تولید پیادهسازی کنید.
کتابخانهها و بستهها: اگر در حال یکپارچهسازی اعتبارسنجی CUIT/CUIL در کدبیس خود هستید، به جای ساخت خودتان، این کتابخانههای موجود را در نظر بگیرید:
- JavaScript:
validar-cuitدر npm اعتبارسنجی و قالببندی را مدیریت میکند - PHP: کتابخانه
afip-phpهم اعتبارسنجی و هم یکپارچگی وب سرویس AFIP را ارائه میدهد - Python:
py-cuitدر PyPI الگوریتم کامل را پیادهسازی میکند
استفاده از کتابخانههای نگهداری شده، خطر باگهای پیادهسازی را کاهش میدهد و اغلب موارد حاشیهای را که ممکن است در کد سفارشی از قلم بیفتند، شامل میشود.
محاسبه دستی: برای اهداف یادگیری یا اشکالزدایی، کار کردن با الگوریتم به صورت دستی به تثبیت درک کمک میکند. یک ماشین حساب و یک CUIT/CUIL نمونه بردارید و سپس فرآیند ضرب وزنی را مرحله به مرحله دنبال کنید.
سرویسهای اعتبارسنجی سازمانی: برنامههای بزرگ مقیاس ممکن است از APIهای اعتبارسنجی شخص ثالث سود ببرند که نه تنها فرمت را بررسی میکنند بلکه در پایگاههای داده تجاری نیز مرجع متقاطع قرار میدهند. این سرویسها میتوانند مشاغل غیرفعال را علامتگذاری کنند، نهادهای تحریم شده را شناسایی کنند یا اطلاعات اضافی در مورد دارنده CUIT/CUIL ارائه دهند.
تاریخچه سیستم CUIT/CUIL
سیستم شناسایی CUIT/CUIL در آرژانتین از زمان شروع به طور قابل توجهی تکامل یافته است:
خاستگاه و اجرا
CUIT (کلید یکتای شناسایی مالیاتی) در دهه ۱۹۷۰ میلادی برای اولین بار در آرژانتین معرفی شد و بخشی از تلاشها برای مدرنسازی سیستم جمعآوری مالیات بود. اداره فدرال درآمدهای عمومی (AFIP) این شناسه یکتا را برای ردیابی مؤدیان مالیاتی با کارآیی بیشتر و کاهش فرار مالیاتی پیاده کرد.
CUIL (کلید یکتای شناسایی کارگری) بعداً برای شناسایی اختصاصی کارگران در سیستم تأمین اجتماعی معرفی شد، که تمایزی بین شناسایی مالیاتی و شناسایی کاری ایجاد کرد و در عین حال فرمتی یکنواخت را حفظ نمود.
تکامل و دیجیتالسازی
در دهه ۱۹۹۰، زمانی که آرژانتین اصلاحات اقتصادی گستردهای را پشت سر میگذاشت، سیستم CUIT/CUIL برای ردیابی فعالیتهای اقتصادی اهمیت فزایندهای پیدا کرد. این سیستم بیشتر دیجیتال شد و سیستمهای تأیید آنلاین پیادهسازی گردید.
اوایل دهه ۲۰۰۰ شاهد ادغام سیستم CUIT/CUIL با خدمات مختلف دولت الکترونیک بود، که آن را به مؤلفه ضروری ابتکارات دولت الکترونیک آرژانتین تبدیل کرد. این دوره همچنین شاهد استانداردسازی الگوریتم تأیید و فرمتی بود که هماکنون نیز مورد استفاده قرار میگیرد.
تحولات اخیر
در سالهای اخیر، AFIP فرآیندهای امنیتی و تأیید شمارههای CUIT/CUIL را ارتقا داده، سیستمهای اعتبارسنجی پیچیدهتری را پیاده کرده و آنها را با پایگاههای داده دولتی دیگر ادغام نموده است. این سیستم اکنون نقش حیاتی در تلاشهای آرژانتین برای مبارزه با فرار مالیاتی و رسمیسازی اقتصاد ایفا میکند.
امروزه، CUIT/CUIL نه تنها برای اهداف مالیاتی و اشتغال، بلکه برای طیف گستردهای از فعالیتها از جمله بانکداری، معاملات ملکی، خدمات عمومی و خریدهای آنلاین استفاده میشود، که آن را به شناسهای ضروری برای افراد و کسبوکارهای فعال در آرژانتین تبدیل کرده است.
ملاحظات پیادهسازی
هنگام پیادهسازی اعتبارسنجی CUIT/CUIL در سیستمهای خود، این جنبههای فنی را در نظر بگیرید:
پایداری الگوریتم: الگوریتم تأیید CUIT/CUIL از زمان استانداردسازی در دهه ۱۹۹۰ تاکنون بدون تغییر باقی مانده است. طبق مستندات فنی AFIP، رویکرد رقم کنترلی مدولو-۱۱ با وزن در مصوبه عمومی ۲۸۵۴/۲۰۱۰ و مقررات بعدی کدگذاری شده است. این ثبات بدان معناست که پیادهسازیها به ندرت نیاز به بهروزرسانی دارند، اما باید اطلاعیههای AFIP را برای هرگونه تغییرات مقرراتی زیر نظر داشته باشید.
بهینهسازی عملکرد: الگوریتم تأیید از نظر محاسباتی کم هزینه است - فقط ۱۰ ضرب، یک جمع و یک عملیات مدولو. برای سیستمهای با پردازش بالا که هزاران اعتبارسنجی در ثانیه انجام میدهند، گلوگاه معمولاً تأخیر شبکه هنگام تأیید در پایگاه داده AFIP است، نه خود الگوریتم. در نظر بگیرید که نتایج تأیید AFIP را با TTL مناسب (معمولاً ۲۴ ساعت) کش کنید تا بین تازگی و عملکرد توازن برقرار شود.
کدگذاری کاراکتر: هنگام پردازش دادههای CUIT/CUIL از منابع خارجی (PDF، اسناد اسکن شده، وب اسکرپینگ)، به مشکلات کدگذاری کاراکتر توجه کنید. خط تیره ممکن است به صورت خط تیره بلند (U+2014)، خط تیره متوسط (U+2013)، یا علامت منفی (U+2212) به جای خط تیره استاندارد (U+002D) ظاهر شود. قبل از اعتبارسنجی، آنها را یکسانسازی کنید تا از منفی کاذب جلوگیری شود.
بینالمللیسازی: اگر برنامه شما بازارهای مختلف آمریکای لاتین را پوشش میدهد، توجه کنید که CUIT/CUIL آرژانتین از مدولو-۱۱ با وزنهای خاص استفاده میکند، در حالی که RUT شیلی از مدولو-۱۱ با وزنهای متفاوت و CPF/CNPJ برزیل از مدولو-۱۱ با الگوی دیگری بهره میبرد. فرض نکنید که الگوریتمها یکسان هستند - هر سیستم کشوری قوانین متمایزی دارد. برای درک گستردهتر الگوریتمهای رقم کنترلی، به استاندارد ISO/IEC 7064 مراجعه کنید که طرحهای تأیید مبتنی بر مدولو را رسمیت میبخشد.
ذخیرهسازی پایگاه داده: شمارههای CUIT/CUIL را بدون خط تیره به صورت CHAR(11) با طول ثابت یا BIGINT در صورتی که پایگاه داده شما از اعداد ۱۱ رقمی بدون از دست دادن دقت پشتیبانی میکند، ذخیره کنید. یک محدودیت بررسی اضافه کنید که رقم تأیید را در سطح پایگاه داده به عنوان یک شبکه ایمنی در برابر دادههای خراب شده تأیید میکند. برای جستجوی کارآمد هنگامی که کاربران با CUIT/CUIL جستجو میکنند، شاخص ایجاد کنید.
نمونههای کد
پایتون
1def calculate_verification_digit(type_code, dni):
2 # تبدیل به رشته و اطمینان از اینکه DNI 8 رقمی است با صفرهای اضافی در ابتدا
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 8 رقمی است با صفرهای اضافی در ابتدا
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 8 رقمی است با صفرهای اضافی در ابتدا
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}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // تبدیل به رشته و اطمینان از اینکه DNI 8 رقمی است با صفرهای اضافی در ابتدا $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // ترکیب کد نوع و DNI $digits = $typeCodeStr . $dniStr; // ضرایب برای هر موقعیت $weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; // محاسبه مجموع ضربها $sumProducts = 0; for ($i = 0; $i < 10; $i++) { $sumProducts += (int)$digits[$i] * $weights[$i]; } // محاسبه رقم تأیید $verificationDigit = 11 - ($sumProducts % 11); // موارد خاص if ($verificationDigit == 11) { $verificationDigit = 0; } else if ($verificationDigit == 10) { $verificationDigit = 9; } return $verificationDigit; } function generateCuitCuil($typeCode, $dni = null) { // کدهای نوع معتبر $validTypeCodes = [20, 23, 24, 27, 30, 33, 34]; if (!in_array($typeCode, $validTypeCodes)) { throw new Exception("کد نوع نامعتبر. باید یکی از: " . implode(', ', $validTypeCodes)); } // تولید DNI تصادفی اگر ارائه نشده باشد if ($dni === null) { $dni = rand(10000000, 99999999); } // محاسبه رقم تأیید $verificationDigit = calculateVerificationDigit($typeCode, $dni); // فرمت ## سؤالات متداول ### تفاوت بین CUIT و CUIL چیست؟ تمایز عملی این است: **CUIT** (کلید یکتای شناسایی مالیاتی) مؤدیان مالیاتی - اعم از افراد و کسبوکارها که با AFIP اظهارنامه مالیاتی ارائه میدهند - را شناسایی میکند. **CUIL** (کلید یکتای شناسایی کاری) کارگران را در سیستم تأمین اجتماعی برای اشتغال و بازنشستگی شناسایی میکند. در عمل، بسیاری از افراد هم CUIL (از اولین شغل خود) دارند و ممکن است بعداً CUIT (اگر خوداشتغال شوند یا کسبوکاری راهاندازی کنند) دریافت کنند. شمارهها از نظر قالببندی و قوانین محاسبه یکسان هستند، بنابراین از نظر اعتبارسنجی، آنها را به همین شکل مدیریت میکنید. تمایز برای اهداف اداری مهم است: سیستمهای حقوق و دستمزد معمولاً با CUIL کار میکنند، در حالی که سیستمهای صورتحساب و مالیات از CUIT استفاده میکنند. ### کدام کدهای نوع برای افراد و کدام برای شرکتها استفاده میشوند؟ برای افراد: - 20، 23، 24: افراد مذکر (CUIL) - 27: افراد مؤنث (CUIL) برای شرکتها و سازمانها: - 30: شرکتهای تجاری (CUIT) - 33: انجمنهای مدنی (CUIT) - 34: بنیادها (CUIT) ### رقم تأیید چگونه محاسبه میشود؟ الگوریتم از ضرب وزنی استفاده میکند: هر یک از 10 رقم اول را در اوزان **5، 4، 3، 2، 7، 6، 5، 4، 3، 2** ضرب کنید، مجموع محصولات را محاسبه کنید، سپس 11 منهای (مجموع مدولو 11) را محاسبه کنید. دو مورد حاشیهای افراد را گیج میکند: هنگامی که محاسبه 11 را نتیجه میدهد، از 0 به عنوان رقم تأیید استفاده کنید؛ هنگامی که 10 را نتیجه میدهد، از 9 استفاده کنید. این موارد خاص وجود دارند زیرا رقم تأیید باید یک رقم تک (0-9) باشد. این یک الگوریتم رقم بررسی مدولو-11 است، مشابه آنچه در کدهای ISBN-10 و سایر سیستمهای شناسایی در سراسر جهان استفاده میشود. ### آیا میتوانم از این ابزار برای تولید شمارههای CUIT/CUIL رسمی استفاده کنم؟ خیر - این ابزار دادههای آزمایشی از نظر ریاضی معتبر تولید میکند، اما شمارهها به طور رسمی در AFIP ثبت نشدهاند. مانند تولید یک شماره کارت اعتباری معتبر با استفاده از الگوریتم لوهن: از نظر فرمت معتبر است، اما به یک حساب واقعی متصل نیست. برای ثبت رسمی CUIT/CUIL، افراد باید با DNI خود به AFIP مراجعه کنند، در حالی که شرکتها باید مراحل ثبت شرکت را تکمیل کنند. ابزار صرفاً برای توسعه، آزمایش و استفاده آموزشی است که به دادههای معتبر نیاز دارید که با شمارههای شناسایی واقعی تداخل نداشته باشند. (ادامه ترجمه در همین سبک...) ## مراجع 1. AFIP (اداره فدرال درآمدهای عمومی). "CUIT/CUIL/CDI." وبسایت رسمی. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. وزارت کار، اشتغال و تأمین اجتماعی. "CUIL - کد یکتای شناسایی شغلی." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (اداره ملی تأمین اجتماعی). "دریافت CUIL من." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. نشریه رسمی جمهوری آرژانتین. "دستورالعمل عمومی AFIP 2854/2010: رویه. کد یکتای شناسایی مالیاتی (C.U.I.T.)." 5. قانون مالی جمهوری آرژانتین. "شناسایی و ثبت مؤدیان مالیاتی." --- چه در حال ساخت سیستم صورتحساب، آزمایش جریانهای ورود کارکنان، یا یادگیری الگوریتمهای اعتبارسنجی باشید، این ابزار تولید و اعتبارسنجی CUIT/CUIL را که نیاز دارید فراهم میکند. دادههای آزمایشی که از اعتبارسنجی الگوریتمی عبور میکنند تولید کنید، شمارهها را قبل از ورود به پایگاه داده تأیید کنید، یا نحوه کار الگوریتم رقم کنترل را عملاً بررسی کنید.