import os
from typing import Union
from datetime import date, datetime
import pandas as pd
this_dir, this_filename = os.path.split(__file__)
[docs]
DATA_PATH = os.path.join(this_dir, "data", "regcode.csv")
[docs]
rc = pd.read_csv(DATA_PATH)
[docs]
def _check_length(idnum: Union[str, int]) -> str:
idnum = str(idnum)
if len(idnum) == 16:
return idnum
elif len(idnum) < 16:
raise ValueError(f'Identification number (KK) is too short ({len(idnum)} characters), length should be 16')
elif len(idnum) > 16:
raise ValueError(f'Identification number (KK) is too long ({len(idnum)} characters), length should be 16')
else:
raise ValueError(f'Identification number (KK) {len(idnum)} characters, length should be 16')
[docs]
def _check_reg(idnum: str):
rcode = idnum[6:12]
if int(rcode[:2]) > 31:
rcode = rcode.replace(rcode[:2], str(int(rcode[:2]) - 40).zfill(2), 1)
try:
rdtm = datetime.strptime(rcode, "%d%m%y")
now = datetime.now()
if rdtm > now:
rdtm = rdtm.replace(year = rdtm.year - 100)
except:
# return NaN if registration date is invalid
rdtm = float('nan')
return rdtm
[docs]
def province(idnum: Union[str, int]):
idnum = _check_length(idnum)
prov_code = int(idnum[:2])
try:
prov = rc.loc[rc['code'] == prov_code, 'region'].item()
except:
prov = float('nan')
return prov
[docs]
def city(idnum: Union[str, int]):
idnum = _check_length(idnum)
city_code = int(idnum[:4])
try:
city = rc.loc[rc['code'] == city_code, 'region'].item()
except:
city = float('nan')
return city
[docs]
def district(idnum: Union[str, int]):
idnum = _check_length(idnum)
dist_code = int(idnum[:6])
try:
dist = rc.loc[rc['code'] == dist_code, 'region'].item()
except:
dist = float('nan')
return dist
[docs]
def regdate(idnum: Union[str, int]):
idnum = _check_length(idnum)
rdtm = _check_reg(idnum)
try:
rdate = rdtm.day
except:
rdate = float('nan')
return rdate
[docs]
def regmonth(idnum: Union[str, int]):
idnum = _check_length(idnum)
rdtm = _check_reg(idnum)
try:
rmonth = rdtm.month
except:
rmonth = float('nan')
return rmonth
[docs]
def regyear(idnum: Union[str, int]):
idnum = _check_length(idnum)
rdtm = _check_reg(idnum)
try:
ryear = rdtm.year
except:
ryear = float('nan')
return ryear
[docs]
def regdtm(idnum: Union[str, int]): # registration day in datetime data type
idnum = _check_length(idnum)
rdtm = _check_reg(idnum)
return rdtm
[docs]
def regday(idnum: Union[str, int]): # registration day in string data type
idnum = _check_length(idnum)
rdtm = _check_reg(idnum)
try:
rday = rdtm.strftime("%d %B %Y")
except:
rday = float('nan')
return rday
[docs]
def nth_pub(idnum: Union[str, int]) -> int:
idnum = _check_length(idnum)
nth = int(idnum[13:])
return nth
[docs]
def all_info(idnum: Union[str, int]) -> dict:
kk_dict = {'NIK': int(idnum), 'province': province(idnum), 'city': city(idnum), 'district': district(idnum),
'regist_datetime': regdtm(idnum), 'regist_day': regday(idnum),
'regist_code': nth_pub(idnum)}
return kk_dict