Membuat Sistem Validasi NIK Di Dart
Latar Belakang:
Di negara Indonesia setiap orang yang telah berusia lebih dari 17 tahun diwajibkan membuat sebuah kartu identitas diri sendiri pada kelurahan setempat orang tersebut tinggal, dan kartu tersebut diberi nama KTP (Kartu Tanda Penduduk).
Dahulu KTP hanyalah sebuah kartu biasa yang belum terintegrasi dengan sistem digital, tetapi sekarang setelah munculnya E-KTP, data pribadi di dalam kartu ini bisa dibaca dengan sistem dan cara tertentu. Setiap KTP mempunyai sebuah kode unik yang berbeda dengan pengguna KTP lain yang dinamakan dengan NIK (Nomor Induk Kependudukan). Terkadang ketika melakukan urusan administrasi di kelurahan ataupun RT setempat mereka masih menggunakan metode lama dengan mengirim berkas fotokopi KTP. Beberapa orang merasa terganggu dengan hal ini, namun kelurahan dan pengurus desa setempat memerlukannya untuk pengarsipan.
Kenapa hal ini sampai terjadi?
Karena proses digitalisasi di birokrasi belum tersebar secara menyeluruh.
Dari sini saya melihat sebuah peluang kecil untuk membuat sistem sederhana untuk membaca KTP dengan data yang masih terbatas menggunakan NIK.
Digitalisasi NIK
Seperti yang kita ketahui, NIK terdiri dari 16 digit yang tiap barisnya mempunyai arti tertentu. Saya ingin agar proses pembacaan tersebut bisa dilakukan secara otomatis melalui sistem. Sehingga untuk mendapatkan sekedar data geografi tidak memerlukan proses input manual. Tetapi kekurangannya kita tidak bisa mendapatkan informasi nama, foto dan tanda tangan dari kode tersebut.
Kemudian munculah sebuah ide, saya membuat sebuah library dalam bahasa Dart untuk mengidentifikasi data geografi KTP seseorang menggunakan pola pada NIK, yang bernama nik_validator. Library ini akan membaca pola dari NIK dan menyocokkan dengan data yang ada sehingga mendapat hasil akhir yang sesuai.
Terkadang data kode Provinsi, Kabupatan dan Kecamatan terlihat tidak layak untuk ditampilkan karena hanya berupa angka. Orang awam tidak akan paham apa maksudnya, maka dari itu saya melakukan pemetaan atau mapping lagi dari kode tersebut menjadi nama lokasi nyata. Kita bisa lihat pada pemetaan berikut.
Data di atas saya dapatkan dari salah satu repository di Github dan merasa kalau cakupan datanya cukup lengkap, terdiri dari 7500++ baris yang dipecah antara provinsi, kabkot, kecamatan dan lainnya
Pembuktian
Akhirnya setelah dari hasil analisa di atas saya membuat libray untuk membaca NIK yang menerima inputan parameter berupa NIK dan akan mengembalikan response berupa data geografi dan informasi kecil lainnya. Tapi perlu diingat kembali kalau cara ini tidak seratus persen akurat karena kita tidak bisa mendapatkan nama, foto dan tanda tangan dari KTP. Tetapi untuk sekedar membuktikan bahwa NIK yang diinput adalah valid mungkin cara ini bisa jadi salah satu solusi sementara. Karena memang untuk mengurus integrasi service ke Dukcapil terbilang rumit.
Saya akan membahas mengenai data yang diolah pada library tersebut. Bagaimana bisa dari sekedar angka bisa menjadi informasi yang readable.
- Kode Unik: Nomor ini diambil dari 4 digit terakhir dari NIK, biasanya nomor ini menandakan nomor urut dari kelurahan tempat KTP dibuat.
- Jenis Kelamin: Mengambil tanggal lahir pada baris ke 7-8. Jika untuk jenis kelamin wanita biasanya angka ini akan ditambah 40. Jadi untuk memastikan pemilik KTP seorang perempuan atau bukan adalah jika tanggal lahirnya di atas angka 40. Kalau di bawahnya berarti Laki-Laki.
- Tanggal Lahir: Mengambil tanggal dari baris ke 7-8 dan jika jenis kelaminnya wanita maka hasilnya akan dikurangi 40. Lalu mengambil bulan dari baris 9-10. Dan mengambil tahun dari baris 11-12.
- Usia: Dihitung melalui perbandingan dari tanggal lahir dengan tanggal saat ini sehingga bisa mendapat selisihnya.
- Ulang Tahun: Dihitung melalui perbandingan tanggal dan bulan lahir dengan waktu saat ini.
- Zodiak: Mencari zodiak menggunakan table zodiak berdasarkan tanggal dan bulan.
- Provinsi, Kota, Kecamatan, Kode Pos: Diambil melalui file mapping lokasi di atas. Untuk mendapatkan Kode Pos, kita harus mendapatkan kecamatannya terlebih dahulu.
Karena dibuat dalam bentuk library maka kalian bisa menggunakannya pada project Fluttermu. Untuk mencobanya bisa mengikuti panduan pada bagian di bawah ini.
Selain menggunakan cara di atas, perpaduannya bisa dikombinasikan dengan metode lain seperti OCR. Jadi aplikasi akan mengambil gambar lalu OCR akan mengambil seluruh teks yang ada digambar tersebut. Kemudian menggunakan Regex kita akan mencari pola tertentu untuk mendapatkan NIK ataupun data lainnya. Hal ini meminimalisir usaha untuk menginput nomor NIK yang panjang, jadi cukup dengan kamera hp saja.
Kita akan sedikit membedah isi dari beberapa baris code pada aplikasi di atas agar lebih memahami fungsinya.
final _picker = ImagePicker();
final XFile? _xImage = await _picker.pickImage(source: source, imageQuality: 100);
Bagian ini dipakai untuk mengambil gambar, source nantinya akan diatur ke Kamera. Untuk kualitas diatur paling tinggi agar memaksimalkan pembacaan OCR.
final inputImage = InputImage.fromFilePath(_image!.path);
final text = await _textDetector?.processImage(inputImage);
RegExp regEx = RegExp(nikPattern);
_nik = [];
_textElements = [];
for (TextBlock block in text!.blocks) {
for (TextLine line in block.lines) {
String _text = line.text.trim().replaceAll(" ", "");
if (regEx.hasMatch(_text)) {
var _result = await parse(regEx.stringMatch(_text)!);
if (_result != null) {
_nik?.add(_result);
}
for (TextElement element in line.elements) {
_textElements?.add(element);
}
}
}
Kita akan menganalisa hasil gambar yang diambil dari kamera untuk mencari seluruh teks yang ada pada gambar tersebut. Kemudian dengan regex kita akan mencari pola-pola tertentu yang dianalisa sebagai NIK. Sedangkan TeksElements dipakai untuk membuat garis kotak pada foto yang diindikasi sebagai NIK.
Lantas NIKPatternnya seperti apa?
String nikPattern = r"((1[1-9])|(21)|([37][1-6])|(5[1-4])|(6[1-5])|([8-9][1-2]))[0-9]{2}[0-9]{2}(([0-6][0-9])|(7[0-1]))((0[1-9])|(1[0-2]))([0-9]{2})[0-9]{4}";
Selanjutnya difungsi berbeda cukup menggunakan nik_validator untuk memetakan isi dari NIK yang didapat lewat hasil scan sebelumnya.
NIKModel result = await NIKValidator.instance.parse(nik: text);
if (result.valid == true) {
return result;
}
return null;
Kebetulan saya membagikan demo code di atas dalam repository di Github, kalian bisa mempelajarinya jika merasa ingin memodifikasi atau sekedar mempelajari tiap baris kodenya.
KTP Scanner RepositorySekiranya mungkin itu yang bisa saya jelaskan mengenai pembahasan tentang membaca digit NIK menjadi sebuah informasi. Kedepannya saya akan membagikan lagi studi kasus lain untuk pengelolaan data KTP dengan metode berbeda.