Files
tradon/modules/account_be/ogm_vcs.py
2026-03-14 09:42:12 +00:00

46 lines
1.4 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from stdnum.exceptions import (
InvalidChecksum, InvalidFormat, InvalidLength, ValidationError)
from stdnum.util import clean, isdigits
def compact(number: str) -> str:
"""Convert the number to the minimal representation. This strips the number
of any invalid separators and removes surrounding whitespace."""
return clean(number, ' +/').strip()
def calc_check_digits(number: str) -> str:
"""Calculate the check digit that should be added."""
number = compact(number)
return '%02d' % ((int(number[:10]) % 97) or 97)
def validate(number: str) -> str:
"""Check if the number is a valid OGM-VCS."""
number = compact(number)
if not isdigits(number) or int(number) <= 0:
raise InvalidFormat()
if len(number) != 12:
raise InvalidLength()
if calc_check_digits(number) != number[-2:]:
raise InvalidChecksum()
return number
def is_valid(number: str) -> bool:
"""Check if the number is a valid VAT number."""
try:
return bool(validate(number))
except ValidationError:
return False
def format(number: str) -> str:
"""Format the number provided for output."""
number = compact(number)
number = number.rjust(12, '0')
return f'{number[:3]}/{number[3:7]}/{number[7:]}'