تخطي إلى المحتوى

مولد ومتحقق من CUIT/CUIL | أداة معرف الضرائب الأرجنتينية

توليد أرقام اختبار صالحة لـ CUIT/CUIL الأرجنتينية أو التحقق من الأرقام الموجودة. أداة مجانية عبر الإنترنت للمطورين لاختبار أنظمة معرف الضرائب وكشوف المرتبات مع التحقق المتوافق مع AFIP.

مولد CUIT/CUIL

أدخل رقم DNI من 8 أرقام أو استخدم المولد العشوائي

CUIT/CUIL المولد
20-76696108-9

استخدام DNI المولد عشوائيًا

حاسبة التحميل...
📚

التوثيق

مولد ومتحقق من CUIT/CUIL الأرجنتيني

مقدمة

في الأنظمة الضريبية والعمالية الأرجنتينية، ستواجه باستمرار معرّفين حيويين: CUIT (مفتاح التعريف الضريبي الفريد) و CUIL (مفتاح التعريف العمالي الفريد). فكر في CUIT كرقم تعريف ضريبي للشركات والأفراد الذين يدفعون الضرائب، بينما يحدد CUIL العمال في نظام الضمان الاجتماعي. كلاهما يستخدم نفس التنسيق من 11 رقمًا ونفس خوارزمية التحقق، مما يجعل اختبار التطبيقات التي تتعامل مع هذه الأرقام أمرًا بالغ الأهمية.

عند تطوير برمجيات للسوق الأرجنتيني، ستحتاج إلى بيانات اختبار صالحة. وهنا يأتي دور هذه الأداة. يمكنك إنشاء أرقام CUIT/CUIL رياضيًا صحيحة للاختبار دون استخدام معلومات شخصية حقيقية، أو التحقق من الأرقام الموجودة للتأكد من مطابقتها للخوارزمية الرسمية لـ AFIP. والأكثر فائدة أن الأداة تتعامل مع جانبي الإنشاء (إنشاء أرقام صالحة عند الطلب) والتحقق (اكتشاف أخطاء التنسيق، وأكواد الأنواع غير الصالحة، والأرقام التحققية غير الصحيحة قبل أن تسبب مشاكل في الإنتاج).

هيكل وحساب CUIT/CUIL

فهم التنسيق

يتكون رقم CUIT/CUIL الصالح من 11 رقمًا يتم عرضه عادةً بالتنسيق XX-XXXXXXXX-X. إليك كيفية تفصيله:

  1. رمز النوع (أول رقمين): يحدد نوع الكيان

    • 20، 23، 24: الأفراد الذكور (CUIL)
    • 27: الأفراد الإناث (CUIL)
    • 30، 33، 34: الشركات والمنظمات (CUIT)
  2. رقم الهوية الوطنية (8 أرقام وسطى): للأفراد، هذا هو رقم وثيقة الهوية الوطنية (DNI). خطأ شائع: إذا كان رقم الهوية الفعلي أقل من 8 أرقام، يجب إضافة أصفار في البداية. على سبيل المثال، DNI 1234567 يصبح 01234567 في CUIT/CUIL. تتلقى الشركات رقمًا فريدًا بدلاً من ذلك.

  3. الرقم التحققي (الرقم الأخير): يتحقق هذا الرقم من صحة الرقم بأكمله باستخدام خوارزمية موزونة. إذا لم يتطابق هذا الرقم مع الحساب، يكون CUIT/CUIL غير صالح - وهو أمر يربك المطورين غالبًا عند إنشاء بيانات اختبار يدويًا.

حساب الرقم التحققي

يستخدم الرقم التحققي خوارزمية موزونة بنظام القسمة 11. إليك كيفية عمله:

  1. خذ أول 10 أرقام من CUIT/CUIL (رمز النوع + رقم الهوية)
  2. اضرب كل رقم في وزنه المقابل: 5، 4، 3، 2، 7، 6، 5، 4، 3، 2
  3. اجمع جميع المنتجات
  4. احسب: 11 مطروحًا من (المجموع بنظام القسمة 11)
  5. التعامل مع الحالات الحدية: إذا كانت النتيجة 11، استخدم 0؛ إذا كانت 10، استخدم 9

ما يربك الناس غالبًا هي الحالات الحدية في الخطوات 5. عند الاختبار، ستحصل أحيانًا على نتيجة 10 أو 11، ونسيان تعيين هذه القيم إلى 9 و0 على التوالي يسبب فشل التحقق الذي يمكن أن يكون صعب التصحيح إذا لم تكن على دراية بهذه القاعدة.

رياضيًا، يمكن التعبير عن ذلك كالتالي:

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

حيث:

  • VDVD هو الرقم التحققي
  • did_i هو الرقم ii من أول 10 أرقام
  • wiw_i هو الوزن المقابل من المتتالية [5، 4، 3، 2، 7، 6، 5، 4، 3، 2]
  • حالات خاصة: إذا كان VD=11VD = 11 فإن VD=0VD = 0، وإذا كان VD=10VD = 10 فإن VD=9VD = 9

دليل خطوة بخطوة

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

  1. حدد علامة التبويب "المولد" في أعلى واجهة الأداة.

  2. اختر رمز النوع من القائمة المنسدلة:

    • 20: ذكر (CUIL)
    • 23: شركة (CUIT)
    • 24: شركة مؤقتة (CUIT)
    • 27: أنثى (CUIL)
    • 30: شركة مساهمة (CUIT)
    • 33: جمعية مدنية (CUIT)
    • 34: مؤسسة (CUIT)
  3. أدخل رقم DNI (اختياري):

    • أدخل رقم DNI مكون من 8 أرقام في الحقل المخصص
    • إذا تُرك فارغًا، ستستخدم الأداة رقم DNI عشوائي
    • إذا أدخلت أقل من 8 أرقام، سيتم إضافة أصفار في البداية
  4. توليد DNI عشوائي (اختياري):

    • انقر على زر "عشوائي" لتوليد رقم DNI عشوائي مكون من 8 أرقام
  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)
      • رمز نوع غير صالح (يجب أن يكون أحد: 20، 23، 24، 27، 30، 33، 34)
      • رقم تحقق غير صالح
  5. معلومات إضافية:

    • بالنسبة للأرقام الصالحة، ستعرض الأداة تفصيل المكونات:
      • رمز النوع ومعناه
      • رقم DNI
      • رقم التحقق

الأخطاء الشائعة وأفضل الممارسات

عند العمل مع التحقق من CUIT/CUIL في تطبيقاتك، انتبه لهذه الأخطاء الشائعة:

مشاكل التعبئة بالأصفار: الخطأ الأكثر شيوعًا الذي واجهته يتعلق بأرقام الهوية الوطنية (DNI) التي تبدأ بأصفار. عندما يدخل شخص ما رقم هوية "1234567"، يجب على الكود التعامل معه كـ "01234567" لإنشاء CUIT/CUIL. العديد من التنفيذات تحول إلى أعداد صحيحة للمعالجة، مما يزيل الأصفار الرائدة. استخدم عمليات السلاسل مع التعبئة المناسبة بدلاً من ذلك.

التباس رمز النوع: ليست كل الأرقام المكونة من رقمين صالحة كرموز نوع. فقط 20، 23، 24، 27، 30، 33، 34 تعمل. لقد رأيت أنظمة تقبل أي بادئة من رقمين، مما يؤدي إلى أرقام تبدو "صالحة" مثل 21-12345678-X والتي تفشل في التحقق من AFIP. تحقق دائمًا من رمز النوع قبل حساب الرقم التحققي.

افتراضات الجنس: رموز النوع 20 (ذكر) و27 (أنثى) ليست قابلة للتبديل. إذا كنت تولد CUILs تلقائيًا بناءً على البيانات الديموغرافية، تأكد من أن رمز النوع يتطابق مع الجنس الفعلي المسجل في RENAPER (السجل الوطني الأرجنتيني). التباينات تؤدي إلى الرفض عندما يحاول الأفراد استخدام هذه الأرقام مع الخدمات الحكومية.

معالجة الشرطات: بعض التنفيذات تتطلب الشرطات بينما ترفضها أخرى. أفضل الممارسات: قبول كلا التنسيقين في حقول الإدخال (مع أو بدون شرطات)، إزالة الشرطات قبل التحقق، تخزين النسخة بدون شرطات في قواعد البيانات، وإضافة الشرطات فقط لأغراض العرض.

التحقق المفقود: يكشف التحقق من الخوارزمية عن أخطاء التنسيق ولكنه لا يؤكد تسجيل CUIT/CUIL. في الإنتاج، تحقق من التنسيق أولاً (سريع)، ثم تحقق من قاعدة بيانات AFIP (أبطأ ولكن موثوق). هذا النهج ذو المرحلتين يلتقط الأخطاء الإملائية على الفور مع ضمان واقعية الرقم.

اختبار الحالات الحدية: اختبر دائمًا مع الأرقام التحققية 0 و9 - وهي نتيجة للحالات الخاصة في الخوارزمية. اختبر أيضًا أرقام الهوية الوطنية التي تبدأ بأصفار للتأكد من عمل منطق التعبئة بشكل صحيح.

الاستخدامات والتطبيقات العملية

التطوير والاختبار

تطوير البرمجيات: عند بناء تطبيقات للسوق الأرجنتيني، ستحتاج إلى بيانات اختبار تمر بالتحقق دون استخدام معلومات المستخدم الحقيقية. إليك حيث يصبح هذا أمرًا حاسمًا:

  • منصات التجارة الإلكترونية: معالجو المدفوعات وأنظمة إصدار الفواتير تتطلب أرقام CUIT/CUIL صالحة. أثناء اختبار التحميل، قد تحتاج إلى آلاف الأرقام الصالحة لمحاكاة عمليات تسجيل المستخدمين الواقعية.
  • برامج المحاسبة: وحدات إعداد التقارير الضريبية تتحقق من تنسيق CUIT/CUIL قبل التقديم إلى AFIP. يتطلب اختبار قواعد التحقق هذه أرقامًا تمر بخوارزمية رقم التحقق.
  • أنظمة إدارة الموارد البشرية: معالجة كشوف المرتبات والمساهمات الاجتماعية تعتمد على أرقام CUIL الصالحة. سيناريو شائع: أنت تختبر تدفقات استقبال الموظفين وتحتاج إلى التحقق من أن أرقام CUIL غير الصالحة تثير رسائل الخطأ المناسبة.
  • تطبيقات المصرفية: تتحقق عمليات اعرف عميلك (KYC) من CUIT/CUIL كجزء من فتح الحساب. في خبرتي، غالبًا ما تظهر الحالات الحدية مثل عدم تطابق رمز النوع أثناء اختبار التكامل.

تعبئة قاعدة البيانات: عند زرع قواعد بيانات الاختبار، يضمن استخدام أرقام CUIT/CUIL صالحة خوارزميًا أن قيود قاعدة البيانات والمشغلات تعمل كما هو متوقع. هذا مهم بشكل خاص عند اختبار نصوص ترحيل البيانات أو عمليات الاستخراج والتحويل والتحميل (ETL) التي تتحقق من أرقام الهوية.

اختبار التحقق من النموذج: اختبر كلا من المسار السعيد وحالات الخطأ. قم بإنشاء أرقام صالحة للتأكد من نجاح التقديم، ثم عدّل رقم التحقق للتأكد من أن التحقق الخاص بواجهة المستخدم والخادم يلتقط الخطأ قبل وصوله إلى قاعدة البيانات.

اختبار واجهة برمجة التطبيقات (API): يجب أن تستخدم الاختبارات المتكاملة أرقام CUIT/CUIL صالحة في حموضات الطلب. هذا يمنع السلبيات الكاذبة حيث تفشل الاختبارات بسبب بيانات اختبار غير صالحة بدلاً من الأخطاء الفعلية في منطق واجهة برمجة التطبيقات.

أتمتة ضمان الجودة: تستفيد الاختبارات المعلمة من إنشاء CUIT/CUIL ديناميكي. بدلاً من تشفير قيم اختبار ثابتة قد تتعارض عبر تشغيلات الاختبار، قم بإنشاء أرقام صالحة جديدة لكل تنفيذ اختبار.

الأغراض التعليمية

تعلم خوارزميات التحقق: تُظهر خوارزمية التحقق من CUIT/CUIL التطبيق العملي للحساب بالباقي والأرقام التحققية الموزونة. يظهر هذا النمط نفسه في أنظمة الهوية الأخرى في جميع أنحاء العالم - أرقام بطاقات الائتمان (خوارزمية لون)، وأكواد ISBN، وأرقام ضريبة القيمة المضافة الأوروبية تستخدم جميعها نهجًا مماثلًا للمجموع التحققي الموزون. فهم كيفية عمل التحقق من 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، ثم اتبع عملية الضرب الموزونة خطوة بخطوة.

خدمات التحقق المؤسسية: قد تستفيد التطبيقات واسعة النطاق من واجهات برمجة التطبيقات للتحقق من طرف ثالث التي لا تتحقق من التنسيق فحسب، بل تتبادل أيضًا مع قواعد البيانات التجارية. يمكن لهذه الخدمات تمييز الشركات غير النشطة، وتحديد الكيانات الخاضعة للعقوبات، أو توفير بيانات وصفية إضافية عن حامل CUIT/CUIL.

تاريخ نظام CUIT/CUIL

تطور نظام التعريف CUIT/CUIL في الأرجنتين بشكل كبير منذ بدايته:

الأصول والتنفيذ

تم إدخال CUIT (المفتاح الفريد للتعريف الضريبي) لأول مرة في الأرجنتين في السبعينيات كجزء من الجهود الرامية إلى تحديث نظام تحصيل الضرائب. نفذت الإدارة الاتحادية للإيرادات العامة (AFIP) هذا المعرف الفريد لتتبع دافعي الضرائب بشكل أكثر كفاءة والحد من التهرب الضريبي.

تم إدخال CUIL (المفتاح الفريد للتعريف العمالي) لاحقًا لتحديد العمال بشكل محدد في نظام الضمان الاجتماعي، مما خلق تمييزًا بين التعريف الضريبي والتعريف العمالي مع الحفاظ على تنسيق متسق.

التطور والرقمنة

في التسعينيات، وأثناء قيام الأرجنتين بإصلاحات اقتصادية كبيرة، أصبح نظام CUIT/CUIL مهمًا بشكل متزايد لتتبع النشاط الاقتصادي. تمت رقمنة النظام بشكل أكبر، وتم تنفيذ أنظمة التحقق عبر الإنترنت.

شهدت أوائل العقد الأول من القرن الحادي والعشرين دمج نظام CUIT/CUIL مع مختلف الخدمات الحكومية الرقمية، مما جعله مكونًا أساسيًا في مبادرات الحكومة الإلكترونية في الأرجنتين. شهدت هذه الفترة أيضًا توحيد خوارزمية التحقق والتنسيق الذي لا يزال مستخدمًا حتى اليوم.

التطورات الحديثة

في السنوات الأخيرة، عززت AFIP عمليات الأمن والتحقق لأرقام CUIT/CUIL، وقامت بتنفيذ أنظمة تحقق أكثر تطورًا ودمجها مع قواعد البيانات الحكومية الأخرى. يلعب النظام الآن دورًا حاسمًا في جهود الأرجنتين لمكافحة التهرب الضريبي وتنظيم الاقتصاد.

اليوم، يُستخدم CUIT/CUIL ليس فقط للأغراض الضريبية والعمالية، بل أيضًا لمجموعة واسعة من الأنشطة بما في ذلك الخدمات المصرفية، والمعاملات العقارية، وخدمات المرافق، والمشتريات عبر الإنترنت، مما يجعله معرفًا أساسيًا للأفراد والشركات العاملة في الأرجنتين.

اعتبارات التنفيذ

عند تنفيذ التحقق من CUIT/CUIL في أنظمتك الخاصة، ضع في الاعتبار هذه الجوانب التقنية:

ثبات الخوارزمية: ظلت خوارزمية التحقق الحالية لـ CUIT/CUIL دون تغيير منذ توحيدها في التسعينيات. وفقًا لـ الوثائق التقنية لـ AFIP، فإن نهج الرقم التحققي ذي الوزن بنظام القسمة 11 مشفر في القرار العام 2854/2010 والتشريعات اللاحقة. يعني هذا الثبات أن التنفيذات نادرًا ما تحتاج إلى تحديثات، ولكن يجب عليك مراقبة إعلانات AFIP لأي تغييرات تنظيمية.

تحسين الأداء: خوارزمية التحقق رخيصة الحوسبة - مجرد 10 عمليات ضرب، وعملية جمع واحدة، وعملية قسمة باقي واحدة. بالنسبة للأنظمة عالية الإنتاجية التي تعالج آلاف عمليات التحقق في الثانية، يكون العائق النموذجي هو زمن استجابة الشبكة عند التحقق من قاعدة بيانات AFIP، وليس الخوارزمية نفسها. فكر في تخزين نتائج التحقق من AFIP مع وقت انتهاء صلاحية مناسب (عادة 24 ساعة) للموازنة بين الحداثة والأداء.

ترميز الأحرف: عند معالجة بيانات CUIT/CUIL من مصادر خارجية (ملفات PDF، مستندات ممسوحة ضوئيًا، استخراج ويب)، انتبه لمشكلات ترميز الأحرف. قد يظهر الشرطة كشرطة طويلة (U+2014)، أو شرطة متوسطة (U+2013)، أو علامة طرح (U+2212) بدلاً من الشرطة القياسية (U+002D). قم بتوحيد هذه الأحرف قبل التحقق لمنع النتائج السلبية الخاطئة.

التدويل: إذا كانت تطبيقاتك تخدم أسواقًا لاتينية متعددة، لاحظ أن CUIT/CUIL الأرجنتيني يستخدم القسمة 11 مع أوزان محددة، بينما يستخدم RUT التشيلي القسمة 11 مع أوزان مختلفة، ويستخدم CPF/CNPJ البرازيلي القسمة 11 مع نمط مختلف تمامًا. لا تفترض أن الخوارزميات متطابقة - لكل نظام دولة قواعده الخاصة. للحصول على فهم أوسع لخوارزميات الرقم التحققي، راجع المعيار ISO/IEC 7064 الذي يصادق على مخططات التحقق المختلفة القائمة على القسمة.

تخزين قاعدة البيانات: خزّن أرقام CUIT/CUIL بدون شرطات كـ CHAR(11) ثابت الطول أو كـ BIGINT إذا كانت قاعدة البيانات تدعم الأعداد الصحيحة من 11 رقمًا دون فقدان الدقة. أضف قيدًا للتحقق يتحقق من الرقم التحققي على مستوى قاعدة البيانات كشبكة أمان ضد البيانات المعطوبة. أنشئ فهارس على هذا الحقل للبحث الفعال عندما يبحث المستخدمون بـ CUIT/CUIL.

أمثلة التعليمات البرمجية

Python

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

JavaScript

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

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        // تحويل إلى سلسلة والتأكد من أن 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}
107

PHP

<?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 return sprintf("%d-%08d-%d", $typeCode, $dni, $verificationDigit); } function validateCuitCuil($cuitCu ## الأسئلة الشائعة ### ما هو الفرق بين CUIT و CUIL؟ إليك التمييز العملي: **CUIT** (مفتاح التعريف الضريبي الفريد) يحدد دافعي الضرائب - سواء الأفراد والشركات التي تقدم الإقرارات الضريبية إلى AFIP. **CUIL** (مفتاح التعريف العمالي الفريد) يحدد العمال في نظام الضمان الاجتماعي لأغراض التوظيف والتقاعد. عمليًا، يمتلك العديد من الأفراد كل من CUIL (من وظيفتهم الأولى) وقد يحصلون لاحقًا على CUIT (إذا أصبحوا عاملين لحسابهم الخاص أو بدأوا عملًا تجاريًا). تستخدم الأرقام نفس تنسيق وقواعد الحساب، لذا من منظور التحقق، يتم التعامل معها بنفس الطريقة. يهم التمييز للأغراض الإدارية: تعمل أنظمة كشوف المرتبات عادةً مع CUIL، بينما تستخدم أنظمة الفوترة والضرائب CUIT. ### ما هي رموز الأنواع المستخدمة للأفراد والشركات؟ للأفراد: - 20، 23، 24: الذكور (CUIL) - 27: الإناث (CUIL) للشركات والمنظمات: - 30: الشركات (CUIT) - 33: الجمعيات المدنية (CUIT) - 34: المؤسسات (CUIT) ### كيف يتم حساب الرقم التحققي؟ يستخدم الخوارزمية الضرب الموزون: خذ كل من الأرقام العشرة الأولى، اضربها في الأوزان **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، يحتاج الأفراد إلى زيارة 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 الذي تحتاجه. قم بإنشاء بيانات اختبار تمر بالتحقق الخوارزمي، والتحقق من الأرقام قبل وصولها إلى قاعدة البيانات، أو استكشاف كيفية عمل خوارزمية رقم التحقق في الممارسة العملية.