From f8af2f6fc0521edec91d461a9a6623bd1e8097bf Mon Sep 17 00:00:00 2001 From: Nathan Suttie Date: Wed, 30 Sep 2026 14:22:36 +1000 Subject: [PATCH] Fix OGRNIP check digits for two-digit remainders --- stdnum/ru/ogrn.py | 2 +- tests/test_ru_ogrn.doctest | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/stdnum/ru/ogrn.py b/stdnum/ru/ogrn.py index 7c2bde7e..9995f908 100644 --- a/stdnum/ru/ogrn.py +++ b/stdnum/ru/ogrn.py @@ -59,7 +59,7 @@ def calc_check_digit(number: str) -> str: if len(number) == 13: return str(int(number[:-1]) % 11 % 10) else: - return str(int(number[:-1]) % 13) + return str(int(number[:-1]) % 13 % 10) def validate(number: str) -> str: diff --git a/tests/test_ru_ogrn.doctest b/tests/test_ru_ogrn.doctest index c19a973f..2bacceaf 100644 --- a/tests/test_ru_ogrn.doctest +++ b/tests/test_ru_ogrn.doctest @@ -47,7 +47,7 @@ Traceback (most recent call last): InvalidChecksum: ... -Checks of the 13 digit ОГРНИП, OGRNIP +Checks of the 15 digit ОГРНИП, OGRNIP >>> ogrn.validate('985768585948944') # OGRNIP with invalid start digit Traceback (most recent call last): @@ -74,3 +74,17 @@ This is a list of OGRNs that should all be valid numbers: ... ''' >>> [x for x in valid_numbers.splitlines() if x and not ogrn.is_valid(x)] [] + + +For OGRNIP, take the last digit of the remainder when dividing by 13, +even when that remainder has two digits. + +>>> numbers = ['304500116000180', '398386756508891', '316774600000162'] +>>> [int(number[:-1]) % 13 for number in numbers] +[10, 11, 12] +>>> [ogrn.calc_check_digit(number) for number in numbers] +['0', '1', '2'] +>>> [ogrn.validate(number) for number in numbers] +['304500116000180', '398386756508891', '316774600000162'] +>>> [ogrn.is_valid(number[:-1] + '9') for number in numbers] +[False, False, False]