Search This Blog

Title of the confirm dialog

Description of what is about to happen

Validasi NPWP


Nomor Pokok Wajib Pajak (Indonesia)

Kartu NPWP memiliki kode seri dengan 15 (lima belas) angka, yang menggunakan format seperti berikut: 99.999.999.9-999.999.


Dua(2) digit pertama, 99.999.999.9-999.999 menunjukkan Identitas Wajib Pajak, yaitu:
○ 01 sampai 03 adalah Wajib Pajak Badan
○ 04 dan 06 adalah Wajib Pajak Pengusaha
○ 05 adalah Wajib Pajak Karyawan
○ 07 sampai 09 adalah Wajib Pajak Orang Pribadi


Enam(6) digit berikut, 99.999.999.9-999.999 menunjukkan Nomor Registrasi / Urut yang diberikan Kantor Pusat Direktorat Jenderal Pajak kepada Kantor Pelayanan Pajak (KPP).

Satu(1) digit berikutnya 99.999.999.9-999.999 berfungsi sebagai alat pengaman untuk menghindari terjadinya pemalsuan atau kesalahan pada NPWP.

Tiga(3) digit berikut, 99.999.999.9-999.999 adalah Kode KPP, contohnya 001, berarti NPWP tersebut dikeluarkan di KPP Pratama Jakarta Matraman.

Tiga digit terakhir, 99.999.999.9-999.999 menunjukkan Status Wajib Pajak:
○ 000 berarti Tunggal atau Pusat
○ 00x (001,002 dst) berarti Cabang, dimana angka akhir menunjukkan urutan cabang (cabang ke-1 maka 001, cabang ke-2 maka 002, dst.).


Langkah Validasi

NPWP#: 12.345.678.x-123.000
Data untuk proses validasi: 12345678123000 (hanya angka tanpa tanda titik “.” ataupun strip “-” )

Langkah-langkah untuk validasi kode seri NPWP adalah sebagai berikut:
1.Gunakan 8 digit angka awal dari NPWP => 12345678.
2.Kalikan digit ganjil dengan 1 dan digit genap dengan angka 2.
3.Jumlahkan masing-masing hasilnya, untuk hasil bilangan dengan 2 digit perlakukan sebagai dua buah bilangan, 1+4+3+8+5+1+2+7+1+6=38
4.Lakukan pembulatan ke atas ke bilangan puluhan terdekat, 38 => 40
5.Digit ke-9 NPWP (x) adalah hasil langkah ke-4 dikurangi dengan hasil langkah ke-3, x=40–38=2
Penghitungan:
8 digit awal 1 2 3 4 5 6 7 8
ganjil x1, genap x2 1 4 3 8 5 12 7 16
hitung, >9 jadi dua angka 1 4 3 8 5 1+2 7 1+6
hitung, >9 jadi dua angka 1 4 3 8 5 3 7 7
total pembulatan puluhan keatas 38 -> 40 - 38 = 2

Sehingga NPWP yang benar adalah 12.345.678.2-123.000

Source Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; // .Net FrameWork 4.0
 
namespace TechScale
{
    public static class NPWP
    {
        /// <summary>
        /// return logical validity of npwp
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        internal static bool IsValid(string arg)
        {
            var dat = arg.Where(w => w >= '0' && w <= '9'); if (dat.Count() != 15) { return false; }
            var f08 = dat.Take(8);
            var h08 = f08.Select((s, i) => { return CharsSum(s, i); }).Sum();
            var d09 = h08 % 10 == 0 ? h08 : ((int)Math.Ceiling(h08 / 10d)) * 10; d09 -= h08;
            var val = string.Concat(
                      string.Concat(f08), d09,
                      string.Concat(dat.Select((s, i) => { return i >= 9 ? s.ToString() : ""; })));
            return val == string.Concat(dat);
        }
        /// <summary>
        /// valid npwp digit #9
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        internal static int ValidCheckCode(string arg)
        {
            var dat = arg.Where(w => w >= '0' && w <= '9'); if (dat.Count() < 8) { return -1; }
            var f08 = dat
                      .Take(8)
                      .Select((s, i) => { return CharsSum(s, i); })
                      .Sum();
            var d09 = f08 % 10 == 0 ? f08 : ((int)Math.Ceiling(f08 / 10m)) * 10; d09 -= f08;
            return d09;
        }
        private static int CharsSum(int s, int i)
        {
            var res = (s - 48) * (i % 2 == 0 ? 1 : 2);
            return
                res > 9 ?
                res.ToString().Select(n => Convert.ToInt32(n.ToString())).Sum() :
                res;
        }
    }
}

Test

Immediate Window
?NPWP.IsValid("12.345.678.2-123.000")
 true
?NPWP.ValidCheckCode("12345678")
 2

varyes = NPWP.IsValid("12.345.678.2-123.000"); // return true vardgt = NPWP.ValidCheckCode("12345678"); // return 2

TOP