70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
"""
|
|
Контрольные суммы для ИНН (10 и 12 знаков) и ОГРН.
|
|
|
|
Используются генераторами фиктивных значений для создания
|
|
синтаксически корректных номеров.
|
|
"""
|
|
|
|
|
|
def checksum_inn10(inn: str) -> str:
|
|
"""Контрольная сумма для 10-значного ИНН (юридические лица).
|
|
|
|
Алгоритм:
|
|
1. Умножаем первые 9 цифр на коэффициенты [2,4,10,3,5,9,4,6,8]
|
|
2. Суммируем, берём (сумма % 11) % 10
|
|
|
|
Args:
|
|
inn: 9 цифр ИНН (без контрольной суммы)
|
|
|
|
Returns:
|
|
Одна цифра контрольной суммы
|
|
"""
|
|
coeffs = [2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
s = sum(int(inn[i]) * coeffs[i] for i in range(9))
|
|
return str((s % 11) % 10)
|
|
|
|
|
|
def checksum_inn12(inn: str) -> str:
|
|
"""Контрольные суммы для 12-значного ИНН (физические лица).
|
|
|
|
Алгоритм (две контрольные цифры):
|
|
1. n1: умножаем первые 10 цифр на [7,2,4,10,3,5,9,4,6,8],
|
|
берём (сумма % 11) % 10
|
|
2. n2: добавляем n1 к числу, умножаем 11 цифр на
|
|
[3,7,2,4,10,3,5,9,4,6,8], берём (сумма % 11) % 10
|
|
|
|
Args:
|
|
inn: 10 цифр ИНН (без контрольных сумм)
|
|
|
|
Returns:
|
|
Две цифры контрольных сумм (n1 + n2)
|
|
"""
|
|
c1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
c2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
|
|
# Первая контрольная цифра
|
|
s1 = sum(int(inn[i]) * c1[i] for i in range(10))
|
|
n1 = (s1 % 11) % 10
|
|
|
|
# Вторая контрольная цифра (с учётом первой)
|
|
inn2 = inn + str(n1)
|
|
s2 = sum(int(inn2[i]) * c2[i] for i in range(11))
|
|
n2 = (s2 % 11) % 10
|
|
|
|
return str(n1) + str(n2)
|
|
|
|
|
|
def checksum_ogrn(ogrn: str) -> str:
|
|
"""Контрольная сумма для ОГРН (13 знаков).
|
|
|
|
Алгоритм: первые 12 цифр как число % 11, затем % 10.
|
|
|
|
Args:
|
|
ogrn: 12 цифр ОГРН (без контрольной суммы)
|
|
|
|
Returns:
|
|
Одна цифра контрольной суммы
|
|
"""
|
|
s = int(ogrn) % 11
|
|
return str(s % 10)
|