HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/faker/providers/ssn/th_TH/__init__.py
from random import randint

from .. import Provider as BaseProvider


class Provider(BaseProvider):
    # Source:
    # https://en.wikipedia.org/wiki/Thai_identity_card#Identification_number
    # Thai national identity number has 13 digits, in this format:
    # 1-2345-67890-12-3
    # Digit 1: Person category
    # Digits 2-5: Province and amphoe code of registrar's office (ISO 3166-2)
    # Digits 6-12: Birth certificate number
    # Digit 13: Checksum

    def ssn(self) -> str:
        """
        Thai national ID
        """
        category = randint(1, 8)
        province = randint(10, 96)
        amphoe = 0
        if province == 10:  # Bangkok
            amphoe = randint(1, 50)  # Bangkok has district number up to 50
        else:
            amphoe = randint(1, 20)  # Provinces outside Bangkok has 20 or less
        birth_book = randint(1, 99999)
        birth_sheet = randint(1, 99)

        digits = f"{category:01d}{province:02d}{amphoe:02d}{birth_book:05d}{birth_sheet:02d}"
        checksum = (
            (int(digits[0]) * 13)
            + (int(digits[1]) * 12)
            + (int(digits[2]) * 11)
            + (int(digits[3]) * 10)
            + (int(digits[4]) * 9)
            + (int(digits[5]) * 8)
            + (int(digits[6]) * 7)
            + (int(digits[7]) * 6)
            + (int(digits[8]) * 5)
            + (int(digits[9]) * 4)
            + (int(digits[10]) * 3)
            + (int(digits[11]) * 2)
        )
        checksum = checksum % 11
        checksum = 11 - checksum
        if checksum > 9:
            checksum = checksum - 10

        nat_id = f"{category:01d}-{province:02d}{amphoe:02d}-{birth_book:05d}-{birth_sheet:02d}-{checksum:01d}"

        return nat_id

    def vat_id(self) -> str:
        """
        Personal VAT ID is the same as national ID
        (Corporate VAT ID is different)
        """
        return self.ssn()