""" Контрольные суммы для ИНН (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)