Files
drhider/drhider/checksum.py
T
2026-07-12 08:22:20 +04:00

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)