راستی آزمایی کد ملی ایران با AngularJS

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

به‌طور منطقی، اعتبارسنجی کد ملی ایران به دو بخش مجزا از هم تفکیک‌شده است:

  • راستی آزمایی شکلی
  • راستی آزمایی هویتی

راستی آزماییِ هویتی به فرآیندی اشاره دارد که طی آن ارتباطِ واقعیِ کد ملی با یک فرد حقیقی، مورد ارزیابی قرار می‌گیرد. به‌عنوان‌مثال می‌توان به این گزاره اشاره کرد: آیا کد  ۱-۶۲۲۴۳۳-۲۲۸ متعلق به آقای شریفی است یا خیر! که البته پرداختن به این نوع اعتبارسنجی در محدوده‌ی این نوشتار نیست و فرصتی دیگر می‌طلبد.

اما کد ملی، همانند تمامی کدهای تشخیصی و سریالی، همچون بارکدها، سریال چک‌های تضمینی، سریال شناسنامه، سریال کارت‌های اعتباری و غیره، جهت جلوگیری از سوءاستفاده و تقلب، دارای ساختارِ شکلیِ منطقی‌ای است که ارقام آن باهم می‌سازند. به‌عبارت‌دیگر هر رشته عددِ ده‌رقمیِ کد ملی، فارغ از اینکه به یک شخص حقیقی تعلق دارد یا خیر، به‌خودی‌خود یک کد ملی نیست! در این نوشتار به توصیف ابعاد این نوع راستی آزمایی و معرفی دیرکتیوِ ویژه‌ای جهت استفاده در پروژه‌های AngularJS پرداخته‌شده است.

الگوریتم تشخیص

کد ملی شامل یک‌رشته‌ی ده‌رقمی از اعداد است که از چپ به راست ب سه بخش تقسیم می‌شوند. به جدول زیر دقت کنید:

۱۶۲۲۴۳۳۲۲۸
کد کنترلیکد منحصربه‌فردکد شهرستان محل صدور
  • کد شهرستان محل صدور، شناسه‌ای است که به محل صدور کد ملی (یا تولد) فرد، اشاره دارد.
  • شش رقم بعدی، عددی منحصربه‌فرد به ازای هر کد شهرستان است.
  • کد کنترل یا Check Digit ، عددی است تک‌رقمی که با اعمال الگوریتمی منطقی بر روی ۹ رقم پیشینش به دست می‌آید.

کد کنترلی یا Check Digit، ابزاری برای پرهیز از افزونگی و جلوگیری از خطاهای انسانی در ورود کدهای شناسایی از قبیل، حساب‌های بانکی و کدهای شناسایی است که از جهاتی با بیت توازن (Parity bit) در محاسبات دودویی رایانه‌ای قابل‌مقایسه است.

بارکد و Check Digit

راستی آزمایی کد کنترلی

اگر یک کد ده‌رقمی را به‌صورت یک مجموعه‌ی ۱۰ عضوی در نظر بگیریم و به هر عضو از این مجموعه با توجه به جایگاهش از سمت راست، ردیفِ متناظرش را اختصاص دهیم به شکل زیر خواهیم رسید:

ارقام۱۳۳۴۲۲۶۸۲۲
جایگاه۱۲۳۴۵۶۷۸۹۱۰
جایگاه اعداد در کد ملی، از راست به چپ چینش می‌شود.

برای تشخیص صحتِ کد کنترلی در یک کد ملی، هر عضو (به‌غیراز کد کنترلی) را در موقعیتش ضرب کرده و حاصل را باهم جمع می‌کنیم. اگر باقیمانده‌ی تقسیم این حاصلِ جمع بر عدد ۱۱، کوچک‌تر از ۲ بود، کد کنترلی باید برابر باقی‌مانده باشد و اگر بزرگ‌تر از ۲ بود کد کنترلی باید برابر ۱۱ منهای باقیمانده باشد. در غیر این صورت کد ملی ازنظر شکلی نامعتبر است.

قواعد شکلیِ دیگر

علاوه بر کد کنترلی، دو قاعده‌ی شکلی دیگر نیز برای صحت کد ملی، حائز اهمیت‌اند:

  • کدی که با سه صفر شروع شود، کدی نامعتبر است. کد شهرستان محل صدور نمی‌تواند تماماً صفر باشد.
  • کدی که از ارقام تکراری تشکیل‌شده باشد، نامعتبر است. کدهای ۱-۱۱۱۱۱۱-۱۱۱ یا ۶-۶۶۶۶۶۶-۶۶۶ نامعتبر هستند حتی اگر در الگوریتم کد کنترلی، معتبر تشخیص داده شوند.
  • کدی که کمتر یا بیشتر از ۱۰ رقم داشته باشد، نامعتبر است.

دیرکتیو کد ملی ایران

اگر در پروژه‌ای مبتنی بر AngularJS، نیاز به اخذ ورودی کد ملی در فرم‌های خود داشتید، تمام امکانات فوق، به‌صورت یکجا در مجموعۀ angular-iran-nationa-id در دسترس است.

روش کار بسیار ساده است. ابتدا باید ماژول angular-iran-national-id را در پروژه‌ی خود بارگذاری و نصب کنید. بهترین روش استفاده از ابزار Bower برای نصب کتابخانه است:

bower install --save angular-iran-national-id

و یا:

npm install --save angular-iran-national-id

با توجه به ساختار پروژه، ممکن است نیاز به افزودن کتابخانه، به سربرگ فایل HTML خود داشته باشید.

<script type="text/javascript" src="path/to/dist/angular-iran-national-id.min.js"> </script>

مرحله‌ی بعدی، تزریق ماژول angular-iran-national-id به ماژول اپلیکیشن است.

angular
	.module('App', [
		'angular-iran-national-id',
		... // other dependencies
	]);

این ماژول، دیرکتیوی به نام islet-iran-national-id را در اختیارتان قرار می‌دهد که می‌توانید در فیلدهای موردنظرتان، آزادانه از آن استفاده کنید:

<input type="text" ng-model="model" islet-iran-national-id maxlength="10" minlength="10" />

این دیرکتیو، در صورت معتبر نبودنِ مقدار واردشده، به‌طور ویژه کلاسی به اسم ng-invalid-iran-national-id به فیلد موردنظر اضافه می‌کند که می‌توانید از آن برای رنگ‌آمیزی یا شخصی‌سازی فیلد بهره بگیرید.

نکته: به علت موجود بودن دیرکتیوهای کمکی پیش‌ساخته، از پیاده سازی مجدد آن‌ها پرهیز شده است. به همین منظور برای محدود کردن طول ورودی به حداکثر مجازِ کد ملی (ده رقم) از دیرکتیوهای پیش‌ساخته‌ی maxlength و minlength استفاده کنید.

See the Pen angular-iran-national-id with form by Soheil Samadzadeh (@sszdh) on CodePen.

👋

6 پاسخ

  1. سلام

    ممنون خیلی عالی بود من توی یک پروژه ازش استفاده کردم
    فقط یک سوال اینکه وقتی از ولیدیشن شما استفاده میکنم با اینتر فرمم کار نمیکنه
    ممنون میشم اگه راهکاری برای این بدید.

    1. به نظر میرسه با بروزرسانی که صورت گرفت دیگر مشکلی در این خصوص نداشته باشید.
      لطفا به پکیج جدید آپدیت کنید. (v1.2.5)

      از توجه و تذکر شما سپاسگزارم 🙂

      1. بسیار ممنون
        بله درست شد.

  2. یاسین نیم‌رخ
    یاسین

    سلام وعرض ادب .ممنون از این امکانی که کار کردید ولی من نتونستم استفاده کنم .
    من یه همچین حالتی تو صفحه ام دارم
    angular.module(‘myApp’, [‘angular-iran-national-id’])
    .controller(‘Ctrl’, [‘$scope’, Ctrl])
    .directive(‘pwCheck’, pwCheck);

    1. متشکرم،
      کدتون رو جایی آنلاین اشتراک بذارید یا به این نمونه کد رجوع کنید: https://codepen.io/sszdh/pen/EvKJgW

      موفق باشید.

      1. یاسین نیم‌رخ
        یاسین

        ممنون از پاسخگویی تان .
        در اینجا برایتان کدهایم رو گذاشتم :
        https://codepen.io/YA30N/pen/PxdQKK

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *