update bots

This commit is contained in:
2026-05-18 14:15:59 +07:00
parent b0ce866a2f
commit b9054d178e
5775 changed files with 832577 additions and 38 deletions

View File

@@ -0,0 +1,100 @@
from datetime import date
from string import ascii_uppercase
from typing import Optional
from faker.utils.checksums import luhn_checksum
from .. import Provider as BaseProvider
class Provider(BaseProvider):
"""
A Faker provider for the German VAT ID and the pension insurance number
Sources:
- http://ec.europa.eu/taxation_customs/vies/faq.html#item_11
- https://de.wikipedia.org/wiki/Versicherungsnummer
"""
vat_id_formats = ("DE#########",)
def __letter_to_digit_string(self, letter: str) -> str:
digit = ascii_uppercase.index(letter) + 1
if len(str(digit)) == 2:
return str(digit)
return "0" + str(digit)
def __get_rvnr_checkdigit(self, rvnr: str) -> str:
# replace the letter at index 8 with its corresponding number
letter = rvnr[8]
rvnr = rvnr[:8] + self.__letter_to_digit_string(letter) + rvnr[9:]
# calculate the product of each digit with the corresponding factor
factors = [2, 1, 2, 5, 7, 1, 2, 1, 2, 1, 2, 1]
products = []
for index, digit in enumerate(rvnr):
products.append(int(digit) * factors[index])
# calculate the digit sum for each product
digit_sums = []
for product in products:
digit_sum = 0
while product:
digit_sum += product % 10
product = product // 10
digit_sums.append(digit_sum)
# get the check digit by summing up the digit sums and calculating the modulo of 10
return str(sum(digit_sums) % 10)
def vat_id(self) -> str:
"""
http://ec.europa.eu/taxation_customs/vies/faq.html#item_11
:return: A random German VAT ID
"""
return self.bothify(self.random_element(self.vat_id_formats))
def rvnr(self, birthdate: Optional[date] = None) -> str:
"""
Pension insurance number (German: "Rentenversicherungsnummer", abbr. "RVNR")
Source: https://de.wikipedia.org/wiki/Versicherungsnummer
:return: A valid German pension insurance number
"""
_birthdate = birthdate or self.generator.date_object()
format: str = f"##{_birthdate:%d%m%y}?##"
rvnr: str = self.bothify(format, letters=ascii_uppercase)
return rvnr + self.__get_rvnr_checkdigit(rvnr)
def kvnr(self) -> str:
"""
German health insurance number ("Krankenversichertennummer", abbr. "KVNR")
Source: https://de.wikipedia.org/wiki/Krankenversichertennummer
:return: a random health insurance number
"""
letter_number: str = str(self.random_int(min=1, max=26))
if len(letter_number) == 1:
letter_number = "0" + letter_number
first_part_format: str = letter_number + "########"
first_part: str = self.numerify(first_part_format)
first_checkdigit: int = luhn_checksum(int(first_part[::-1]))
second_part_format: str = "#########"
second_part: str = self.numerify(second_part_format)
kvnr: str = first_part + str(first_checkdigit) + second_part
kvnr_checkdigit: int = luhn_checksum(int(kvnr[::-1]))
kvnr = kvnr + str(kvnr_checkdigit)
letter: str = ascii_uppercase[int(letter_number) - 1]
kvnr = letter + kvnr[2:]
return kvnr