تأتي الأرقام الضريبية البرازيلية على شكلين، والتفريق بينهما هو الخطوة الأولى في أي فحص. فـ CPF يعرف الشخص الطبيعي، و CNPJ يعرف الكيان القانوني. وكلاهما ينتهي برقمي تحقق لا برقم واحد، وهذا يسمح لحساب أكثر طموحا قليلا بأن يلتقط صنفا أوسع من أخطاء الكتابة.
والزوجان حالة دراسية جيدة لأن الرقمين قصيران بما يكفي لفحصهما يدويا، وقديمان بما يكفي لأن قواعدهما عامة في كل مكان، ومختلفان بما يكفي لأن إجراء واحدا متعجلا سيخطئ في أحدهما على الأقل. وفي ما يلي كيف يبنى كل منهما وما تستطيع أداة التحقق أن تقوله عنه بصدق.
ما هما CPF و CNPJ؟
CPF هو سجل دافعي الضرائب من الأشخاص الطبيعيين، وهو الرقم الذي يطلب من المواطن البرازيلي عند نافذة مصرف أو مكتب فندق أو صفحة دفع إلكترونية. و CNPJ هو سجل دافعي الضرائب من الكيانات القانونية، وهو الرقم المطبوع على كل فاتورة وبطاقة عمل تصدرها شركة. فواحد يخص شخصا، والآخر يخص منظمة، والسجلان اللذان يقفان خلفهما منفصلان.
ولأن الدورين متوازيان، كثيرا ما يناقش الرقمان معا وينفذان معا، والمفردات المشتركة تخفي حقيقة أن تخطيطيهما الداخليين ليسا متطابقين. والمطور الذي يقرأ عن أحدهما ويفترض أن الآخر يعمل مثله سينتج إجراء يرفض قيما صحيحة نحو نصف الوقت.
والسلاسل المذكورة في هذه المقالة أمثلة وهمية بنيت لبيان كيف يتصرف الرقمان فحسب. ولا سجل حقيقي يخص أي شخص أو شركة منسوخ أو معدل هنا، ومرور مثال عبر الفحص لا يقول شيئا عن أي أحد.
كيف يختلف الرقمان في الشكل؟
الفرق الظاهر أن رقم الكيان القانوني أطول من الآخر، وهذا نتيجة لسجل أكبر وتقسيمات داخلية فيه. أما رقم الشخص فهو الشكل الأكثر إحكاما، وحجمه يناسب فردا واحدا دون فروع.
والفرق البنيوي أهم من الطول. فتنسيق الكيان القانوني مركب من أجزاء تعرف تسجيل الشركة على أكثر من مستوى، ولذلك ليست حقوله الداخلية كتلة متجانسة من الأرقام. أما تنسيق الشخص فمستو إلى حد كبير: متن تسلسلي وعلامة منطقة ورقما التحقق.
ولا ينبغي وصف أي من التنسيقين بترديد مواضعه الدقيقة في النص. فالقواعد المنشورة هي مصدر الحقيقة، والجدول المنسوخ إلى صفحة داخلية يتقادم بسرعة. عامل التخطيط كبيانات يقرأها الكود، لا كمعرفة موزعة في تعليقات ثلاثة ملفات.
فكرة رقم التحقق: مجموع موزون ثم باقي القسمة
يستخرج التنسيقان رقمية الختاميين بالعائلة نفسها من الحساب، مرة بعد مرة. فكل واحد من الموضعين الأخيرين يحسب من الأرقام التي قبله: اضرب كل رقم في وزن يعتمد على موضعه، واجمع النواتج، واقسم على معامل، وحول الباقي إلى رقم تحقق عبر تحويل منشور.
والرقم الثاني يحسب بعد الأول، ويدخل الأول ضمن مدخلات حساب الثاني. وهذه السلسلة هي سبب استحالة التحقق من الرقمين باستقلال: فتغيير حساب الرقم الثاني دون تمرير الأول ينتج قيما تبدو صحيحة في العزلة وتفشل في الاجتماع.
والعائلة هي العائلة المبنية على المعامل التي تستعرضها مقالة خوارزميات رقم التحقق، وخطوة التحويل هي حيث تنحرف التنفيذات الساذجة. فحين تترك القسمة باقيا لا يترجم مباشرة إلى رقم واحد، تحدد القاعدة المنشورة ما يجب فعله به، والإجراء الذي يهمل هذه الخطوة سيخالف المعيار في مجموعة جزئية صغيرة من المدخلات لكنها قابلة للتكرار.
لماذا تستبعد السلاسل المكررة الأرقام؟
الأرقام المكررة هي المثال المضاد الكلاسيكي لأي فحص معياري. فسلسلة مؤلفة من حرف واحد مكرر تهزم الحساب البسيط لأن الأوزان والقيم المكررة تتفاعل تفاعلا يترك المجموع على حاله، فيخرج رقم التحقق مطابقا. ولذلك تستبعد القواعد المنشورة هذه السلاسل صراحة بدل أن تترك الحساب يلاحظها بنفسه.
وهذا الاستبعاد ليس قصورا في الخوارزمية؛ إنه إعلان مقصود بأن رقم تسجيل بهذا الشكل لن يصدر أبدا. والأداة التي تنفذ الحساب وتتخطى الاستبعاد ستقبل قيمة لم يكن السجل نفسه ليولدها، وهذه بالتحديد هي الثغرة التي تمرر نصوصا بديلة عبر النماذج.
ويستحق المنطق نفسه التعميم. فكلما حدد نظام استثناءا، كان الاستثناء جزءا من القاعدة لا إضافة اختيارية، ومكان تنفيذه بجانب الحساب لا عند المستدعي.
فحص التنسيق وحالة السجل شيئان مختلفان
نجاح الفحص يعني أن رقمي الختام يتفقان مع المتن. لا شيء غير ذلك. أما هل صدر الرقم يوما، وهل ما زال نشطا، وهل يخص الشخص الذي يكتبه—فكل ذلك في سجل الهيئة الضريبية الذي لا تراه أداة تعمل دون اتصال.
والسجل أيضا ليس الشيء الذي يستشار في كل مناسبة. فالسؤال عن حالة ضريبية شخص نشاط آخر غير التحقق من أن سلسلة سليمة الصياغة، ويحمل نتائج قانونية وتبعات على الخصوصية لا يحملها فحص نموذج أبدا. وبناء الحساب محليا ومعاملة السجل كتكامل منفصل ومقصود يمنع الشأنين من التسرب أحدهما إلى الآخر.
وصياغة الخطأ يجب أن تحمل هذا الفرق. فالمستخدم الذي يقال له إنه رقمه غير صالح قد يستنتج أن في تسجيله مشكلة، والحال أن السلسلة وحدها هي التي فشلت في الحساب. والرسالة يجب أن تقول إن الأرقام لا تتفق، وأن تترك حالة التسجيل خارجها.
للمطورين: التنظيف والإخفاء ورسائل الخطأ
مجموعة قليلة من العادات تبقي هذين النظامين بعيدين عن المتاعب.
- طبع بالطريقة نفسها للاثنين: أزل علامات العرض، واحتفظ بالأرقام، وتذكر أن التنظيف ليس إصلاحا.
- حدد النظام من السياق لا من تخمين. اسأل المستدعي أي نوع من دافعي الضرائب يتوقعه الحقل بدل استنتاجه من الطول وحده.
- أعلن أي الرقمين فشل، أو هل فشل الاثنان، لأن موضع الفشل يشير إلى مكان الخطأ المطبعي.
- لا تسجل قيمة كاملة في بيانات التشخيص في بيئة الإنتاج. سجل النتيجة وصورة مخفية.
والعناية نفسها تنطبق على من يقرأ الأرقام لا على الكود فقط. فالصورة المخفية تبقي من الأحرف الأولى ما يكفي ليتعرف صاحبها عليها، وتحذف من الأحرف الأخيرة ما يكفي ليجعلها بلا فائدة للآخرين، ومقالة قواعد التحقق من الهوية الوطنية مفيدة كمرافق حين يتعامل منتج واحد مع عدة ولايات قضائية في الوقت نفسه. وإذا كان منتجك يقبل أيضا معرفات حسابات عابرة للحدود، فإن مقالة بنية IBAN تبين كيف يركب فحص ثان مستقل داخل سلسلة واحدة.
الخطوات التالية
اكتب أي النظامين يقصده كل حقل في منتجك، ثم اختبر إجراءك بقيمة متنها مسموح ورقما ختامها ليس كذلك. وستبين لك أداة التحقق من الأرقام كيف ينبغي أن تصف الأداة هذه النتيجة، وتضع مقالة قواعد التحقق من الهوية الوطنية الزوج في السياق الأوسع لأنظمة ترقيم صممت دون أن يعرف بعضها بعضا.