Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2024-06-23 16:12:59 +0200
committerArthur de Jong <arthur@arthurdejong.org>2024-06-23 16:18:19 +0200
commite951daca447f678f5a3f3c70dcc535eb8d7449b4 (patch)
treec4d2b13049a3389164db62dad4364f89fa7e7904
parent1da003f4523369d982ad923e6ad5c3093dac298b (diff)
Support 16 digit Indonesian NPWP numbersHEADmaster
The Indonesian NPWP is being switched from 15 to 16 digits. The number is now the NIK for Indonesian citizens and the old format with a leading 0 for others (organisations and non-citizens). See https://www.grantthornton.co.id/insights/global-insights1/updates-regarding-the-format-of-indonesian-tax-id-numbers/ Closes https://github.com/arthurdejong/python-stdnum/issues/432
-rw-r--r--stdnum/id/npwp.py24
-rw-r--r--tests/test_id_npwp.doctest11
2 files changed, 30 insertions, 5 deletions
diff --git a/stdnum/id/npwp.py b/stdnum/id/npwp.py
index cfa668c..effa8ec 100644
--- a/stdnum/id/npwp.py
+++ b/stdnum/id/npwp.py
@@ -2,6 +2,7 @@
# coding: utf-8
#
# Copyright (C) 2020 Leandro Regueiro
+# Copyright (C) 2024 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -24,11 +25,15 @@ The Nomor Pokok Wajib Pajak (NPWP) is assigned to organisations and
individuals (families) by the Indonesian Tax Office after registration by the
tax payers.
-The number consists of 15 digits of which the first 2 denote the type of
+The number consists of 16 digits and is either a NIK (Nomor Induk Kependudukan)
+or a number that starts with a 0, followed by 2 digits that denote the type of
entity, 6 digits to identify the tax payer, a check digit over the first 8
digits followed by 3 digits to identify the local tax office and 3 digits for
branch code.
+This module also accepts the old 15 digit format which is just the 16 digit
+format without the starting 0.
+
More information:
* https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Indonesia-TIN.pdf
@@ -49,6 +54,7 @@ InvalidLength: ...
from stdnum import luhn
from stdnum.exceptions import *
+from stdnum.id import nik
from stdnum.util import clean, isdigits
@@ -64,12 +70,20 @@ def compact(number):
def validate(number):
"""Check if the number is a valid Indonesia NPWP number."""
number = compact(number)
- if len(number) != 15:
- raise InvalidLength()
if not isdigits(number):
raise InvalidFormat()
- luhn.validate(number[:9])
- return number
+ if len(number) == 15:
+ # Old 15 digit format
+ luhn.validate(number[:9])
+ return number
+ if len(number) == 16:
+ # New format since 2024: either a NIK (for Indonesian citizens) or
+ # the old number with a 0 at the beginning
+ if not number.startswith('0'):
+ return nik.validate(number)
+ luhn.validate(number[:10])
+ return number
+ raise InvalidLength()
def is_valid(number):
diff --git a/tests/test_id_npwp.doctest b/tests/test_id_npwp.doctest
index 13a78d9..621aa53 100644
--- a/tests/test_id_npwp.doctest
+++ b/tests/test_id_npwp.doctest
@@ -1,6 +1,7 @@
test_id_npwp.doctest - more detailed doctests for stdnum.id.npwp module
Copyright (C) 2020 Leandro Regueiro
+Copyright (C) 2024 Arthur de Jong
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -49,6 +50,16 @@ Traceback (most recent call last):
InvalidChecksum: ...
+Since 2024 the numbers have been changed to a 16 digit format. They can
+either be a NIK (for Indonesian citizens) or a 0 followed by the original
+15-digit number.
+
+>>> npwp.validate('3171011708450001') # NIK
+'3171011708450001'
+>>> npwp.validate('083.132.665.7-201.000') # extra 0 prepended
+'0831326657201000'
+
+
These have been found online and should all be valid numbers.
>>> numbers = '''