app/django/contrib/localflavor/it/util.py
changeset 54 03e267d67478
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     1 from django.utils.encoding import smart_str, smart_unicode
       
     2 
       
     3 def ssn_check_digit(value):
       
     4     "Calculate Italian social security number check digit."
       
     5     ssn_even_chars = {
       
     6         '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8,
       
     7         '9': 9, 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7,
       
     8         'I': 8, 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15,
       
     9         'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23,
       
    10         'Y': 24, 'Z': 25
       
    11     }
       
    12     ssn_odd_chars = {
       
    13         '0': 1, '1': 0, '2': 5, '3': 7, '4': 9, '5': 13, '6': 15, '7': 17, '8':
       
    14         19, '9': 21, 'A': 1, 'B': 0, 'C': 5, 'D': 7, 'E': 9, 'F': 13, 'G': 15,
       
    15         'H': 17, 'I': 19, 'J': 21, 'K': 2, 'L': 4, 'M': 18, 'N': 20, 'O': 11,
       
    16         'P': 3, 'Q': 6, 'R': 8, 'S': 12, 'T': 14, 'U': 16, 'V': 10, 'W': 22,
       
    17         'X': 25, 'Y': 24, 'Z': 23
       
    18     }
       
    19     # Chars from 'A' to 'Z'
       
    20     ssn_check_digits = [chr(x) for x in range(65, 91)]
       
    21 
       
    22     ssn = value.upper()
       
    23     total = 0
       
    24     for i in range(0, 15):
       
    25         try:
       
    26             if i % 2 == 0:
       
    27                 total += ssn_odd_chars[ssn[i]]
       
    28             else:
       
    29                 total += ssn_even_chars[ssn[i]]
       
    30         except KeyError:
       
    31             msg = "Character '%(char)s' is not allowed." % {'char': ssn[i]}
       
    32             raise ValueError(msg)
       
    33     return ssn_check_digits[total % 26]
       
    34 
       
    35 def vat_number_check_digit(vat_number):
       
    36     "Calculate Italian VAT number check digit."
       
    37     normalized_vat_number = smart_str(vat_number).zfill(10)
       
    38     total = 0
       
    39     for i in range(0, 10, 2):
       
    40         total += int(normalized_vat_number[i])
       
    41     for i in range(1, 11, 2):
       
    42         quotient , remainder = divmod(int(normalized_vat_number[i]) * 2, 10)
       
    43         total += quotient + remainder
       
    44     return smart_unicode((10 - total % 10) % 10)