2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2008-08-22 13:33:44 +00:00
##############################################################################
#
2010-05-11 06:59:53 +00:00
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
2010-05-11 06:59:53 +00:00
# Copyright (C) 2008-2009 B2CK, Cedric Krier, Bertrand Chenal (the methods "check_vat_[a-z]{2}"
2008-08-22 13:33:44 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
2008-08-22 13:33:44 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2008-08-22 13:33:44 +00:00
#
2008-11-03 19:18:56 +00:00
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2008-08-22 13:33:44 +00:00
#
2008-11-03 19:18:56 +00:00
##############################################################################
2009-04-15 08:57:38 +00:00
import string
2010-05-12 05:59:51 +00:00
from osv import osv , fields
2010-05-11 12:50:02 +00:00
from tools . translate import _
_ref_vat = {
2010-05-12 05:59:51 +00:00
' be ' : ' BE0477472701 ' , ' at ' : ' ATU12345675 ' ,
' bg ' : ' BG1234567892 ' , ' cy ' : ' CY12345678F ' ,
' cz ' : ' CZ12345679 ' , ' de ' : ' DE123456788 ' ,
' dk ' : ' DK12345674 ' , ' ee ' : ' EE123456780 ' ,
' es ' : ' ESA12345674 ' , ' fi ' : ' FI12345671 ' ,
' fr ' : ' FR32123456789 ' , ' gb ' : ' GB123456782 ' ,
' gr ' : ' GR12345670 ' , ' hu ' : ' HU12345676 ' ,
' ie ' : ' IE1234567T ' , ' it ' : ' IT12345670017 ' ,
' lt ' : ' LT123456715 ' , ' lu ' : ' LU12345613 ' ,
' lv ' : ' LV41234567891 ' , ' mt ' : ' MT12345634 ' ,
' nl ' : ' NL123456782B90 ' , ' pl ' : ' PL1234567883 ' ,
' pt ' : ' PT123456789 ' , ' ro ' : ' RO1234567897 ' ,
' se ' : ' SE123456789701 ' , ' si ' : ' SI12345679 ' ,
2011-02-11 11:29:07 +00:00
' sk ' : ' SK0012345675 ' , ' el ' : ' EL12345670 ' ,
' mx ' : ' MXABC123456T1B '
2010-05-12 05:59:51 +00:00
}
2008-08-22 13:33:44 +00:00
2008-11-25 16:49:39 +00:00
def mult_add ( i , j ) :
""" Sum each digits of the multiplication of i and j. """
return reduce ( lambda x , y : x + int ( y ) , str ( i * j ) , 0 )
2008-08-22 13:33:44 +00:00
class res_partner ( osv . osv ) :
_inherit = ' res.partner '
2008-09-02 13:26:51 +00:00
2010-05-11 12:50:02 +00:00
def _split_vat ( self , vat ) :
vat_country , vat_number = vat [ : 2 ] . lower ( ) , vat [ 2 : ] . replace ( ' ' , ' ' )
return vat_country , vat_number
2010-11-19 13:48:01 +00:00
def check_vat ( self , cr , uid , ids , context = None ) :
2008-08-22 13:33:44 +00:00
'''
Check the VAT number depending of the country .
http : / / sima - pc . com / nif . php
'''
2010-11-19 13:48:01 +00:00
for partner in self . browse ( cr , uid , ids , context = context ) :
2008-08-22 13:33:44 +00:00
if not partner . vat :
2010-05-11 12:57:51 +00:00
continue
2010-05-11 12:50:02 +00:00
vat_country , vat_number = self . _split_vat ( partner . vat )
if not hasattr ( self , ' check_vat_ ' + vat_country ) :
2010-05-11 06:59:53 +00:00
return False
2009-04-15 08:57:38 +00:00
check = getattr ( self , ' check_vat_ ' + vat_country )
2008-08-26 14:32:01 +00:00
if not check ( vat_number ) :
2008-08-22 13:33:44 +00:00
return False
return True
2010-05-12 05:59:51 +00:00
def vat_change ( self , cr , uid , ids , value , context = None ) :
2008-09-02 13:26:51 +00:00
return { ' value ' : { ' vat_subjected ' : bool ( value ) } }
_columns = {
2009-01-22 12:04:01 +00:00
' vat_subjected ' : fields . boolean ( ' VAT Legal Statement ' , help = " Check this box if the partner is subjected to the VAT. It will be used for the VAT legal statement. " )
2008-09-02 13:26:51 +00:00
}
2010-05-11 12:50:02 +00:00
2010-12-07 07:18:00 +00:00
def _construct_constraint_msg ( self , cr , uid , ids , context = None ) :
2010-05-11 12:50:02 +00:00
def default_vat_check ( cn , vn ) :
# by default, a VAT number is valid if:
# it starts with 2 letters
# has more than 3 characters
return cn [ 0 ] in string . ascii_lowercase and cn [ 1 ] in string . ascii_lowercase
vat_country , vat_number = self . _split_vat ( self . browse ( cr , uid , ids ) [ 0 ] . vat )
if default_vat_check ( vat_country , vat_number ) :
2010-05-12 05:59:51 +00:00
vat_no = vat_country in _ref_vat and _ref_vat [ vat_country ] or ' Country Code + Vat Number '
return _ ( ' The Vat does not seems to be correct. You should have entered something like this %s ' ) , ( vat_no )
return _ ( ' The VAT is invalid, It should begin with the country code ' ) , ( )
2010-05-11 12:50:02 +00:00
_constraints = [ ( check_vat , _construct_constraint_msg , [ " vat " ] ) ]
2008-09-02 13:26:51 +00:00
2008-08-26 08:23:15 +00:00
# code from the following methods come from Tryton (B2CK)
2010-05-11 06:59:53 +00:00
# http://www.tryton.org/hgwebdir.cgi/modules/relationship/file/544d1de586d9/party.py
2008-08-22 13:33:44 +00:00
def check_vat_at ( self , vat ) :
'''
Check Austria VAT number .
'''
if len ( vat ) != 9 :
return False
if vat [ 0 ] != ' U ' :
return False
num = vat [ 1 : ]
try :
int ( num )
except :
return False
sum = int ( num [ 0 ] ) + mult_add ( 2 , int ( num [ 1 ] ) ) + \
int ( num [ 2 ] ) + mult_add ( 2 , int ( num [ 3 ] ) ) + \
int ( num [ 4 ] ) + mult_add ( 2 , int ( num [ 5 ] ) ) + \
int ( num [ 6 ] )
check = 10 - ( ( sum + 4 ) % 10 )
if check == 10 :
check = 0
if int ( vat [ - 1 : ] ) != check :
return False
return True
def check_vat_be ( self , vat ) :
'''
Check Belgium VAT number .
'''
if len ( vat ) != 10 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ - 2 : ] ) != \
97 - ( int ( vat [ : 8 ] ) % 97 ) :
return False
return True
def check_vat_bg ( self , vat ) :
'''
Check Bulgaria VAT number .
'''
2009-06-23 08:54:41 +00:00
if len ( vat ) not in [ 9 , 10 ] :
2008-08-22 13:33:44 +00:00
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 ] ) in ( 2 , 3 ) and \
int ( vat [ 1 : 2 ] ) != 22 :
return False
sum = 4 * int ( vat [ 0 ] ) + 3 * int ( vat [ 1 ] ) + 2 * int ( vat [ 2 ] ) + \
7 * int ( vat [ 3 ] ) + 6 * int ( vat [ 4 ] ) + 5 * int ( vat [ 5 ] ) + \
4 * int ( vat [ 6 ] ) + 3 * int ( vat [ 7 ] ) + 2 * int ( vat [ 8 ] )
check = 11 - ( sum % 11 )
if check == 11 :
check = 0
return True
def check_vat_cy ( self , vat ) :
'''
Check Cyprus VAT number .
'''
if len ( vat ) != 9 :
return False
try :
int ( vat [ : 8 ] )
except :
return False
n0 = int ( vat [ 0 ] )
n1 = int ( vat [ 1 ] )
n2 = int ( vat [ 2 ] )
n3 = int ( vat [ 3 ] )
n4 = int ( vat [ 4 ] )
n5 = int ( vat [ 5 ] )
n6 = int ( vat [ 6 ] )
n7 = int ( vat [ 7 ] )
def conv ( x ) :
if x == 0 :
return 1
elif x == 1 :
return 0
elif x == 2 :
return 5
elif x == 3 :
return 7
elif x == 4 :
return 9
elif x == 5 :
return 13
elif x == 6 :
return 15
elif x == 7 :
return 17
elif x == 8 :
return 19
elif x == 9 :
return 21
return x
n0 = conv ( n0 )
n2 = conv ( n2 )
n4 = conv ( n4 )
n6 = conv ( n6 )
sum = n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7
check = chr ( sum % 26 + 65 )
if check != vat [ 8 ] :
return False
return True
def check_vat_cz ( self , vat ) :
'''
Check Czech Republic VAT number .
'''
if len ( vat ) not in ( 8 , 9 , 10 ) :
return False
try :
int ( vat )
except :
return False
if len ( vat ) == 8 :
if int ( vat [ 0 ] ) not in ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) :
return False
sum = 8 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 3 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] )
check = 11 - ( sum % 11 )
if check == 10 :
check = 0
if check == 11 :
check = 1
if check != int ( vat [ 7 ] ) :
return False
elif len ( vat ) == 9 and int ( vat [ 0 ] ) == 6 :
sum = 8 * int ( vat [ 1 ] ) + 7 * int ( vat [ 2 ] ) + 6 * int ( vat [ 3 ] ) + \
5 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + 3 * int ( vat [ 6 ] ) + \
2 * int ( vat [ 7 ] )
check = 9 - ( ( 11 - ( sum % 11 ) ) % 10 )
if check != int ( vat [ 8 ] ) :
return False
elif len ( vat ) == 9 :
if int ( vat [ 0 : 2 ] ) > 53 and int ( vat [ 0 : 2 ] ) < 80 :
return False
if int ( vat [ 2 : 4 ] ) < 1 :
return False
if int ( vat [ 2 : 4 ] ) > 12 and int ( vat [ 2 : 4 ] ) < 51 :
return False
if int ( vat [ 2 : 4 ] ) > 62 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 > 0 :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 28 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 == 0 :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 29 :
return False
if int ( vat [ 2 : 4 ] ) in ( 4 , 6 , 9 , 11 , 54 , 56 , 59 , 61 ) :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 30 :
return False
if int ( vat [ 2 : 4 ] ) in ( 1 , 3 , 5 , 7 , 8 , 10 , 12 , 51 ,
53 , 55 , 57 , 58 , 60 , 62 ) :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 31 :
return False
elif len ( vat ) == 10 :
if int ( vat [ 0 : 2 ] ) < 54 :
return False
if int ( vat [ 2 : 4 ] ) < 1 :
return False
if int ( vat [ 2 : 4 ] ) > 12 and int ( vat [ 2 : 4 ] ) < 51 :
return False
if int ( vat [ 2 : 4 ] ) > 62 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 > 0 :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 28 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 == 0 :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 29 :
return False
if int ( vat [ 2 : 4 ] ) in ( 4 , 6 , 9 , 11 , 54 , 56 , 59 , 61 ) :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 30 :
return False
if int ( vat [ 2 : 4 ] ) in ( 1 , 3 , 5 , 7 , 8 , 10 , 12 , 51 ,
53 , 55 , 57 , 58 , 60 , 62 ) :
if int ( vat [ 4 : 6 ] ) < 1 :
return False
if int ( vat [ 4 : 6 ] ) > 31 :
return False
if ( int ( vat [ 0 : 2 ] ) + int ( vat [ 2 : 4 ] ) + int ( vat [ 4 : 6 ] ) + int ( vat [ 6 : 8 ] ) +
int ( vat [ 8 : 10 ] ) ) % 11 != 0 :
return False
if int ( vat [ 0 : 10 ] ) % 11 != 0 :
return False
return True
def check_vat_de ( self , vat ) :
'''
Check Germany VAT number .
'''
if len ( vat ) != 9 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 7 ] ) < = 0 :
return False
sum = 0
for i in range ( 8 ) :
sum = ( 2 * ( ( int ( vat [ i ] ) + sum + 9 ) % 10 + 1 ) ) % 11
check = 11 - sum
if check == 10 :
check = 0
if int ( vat [ 8 ] ) != check :
return False
return True
def check_vat_dk ( self , vat ) :
'''
Check Denmark VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 ] ) < = 0 :
return False
sum = 2 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 3 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] ) + int ( vat [ 7 ] )
if sum % 11 != 0 :
return False
return True
def check_vat_ee ( self , vat ) :
'''
Check Estonia VAT number .
'''
if len ( vat ) != 9 :
return False
try :
int ( vat )
except :
return False
sum = 3 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 1 * int ( vat [ 2 ] ) + \
3 * int ( vat [ 3 ] ) + 7 * int ( vat [ 4 ] ) + 1 * int ( vat [ 5 ] ) + \
3 * int ( vat [ 6 ] ) + 7 * int ( vat [ 7 ] )
check = 10 - ( sum % 10 )
if check == 10 :
check = 0
if check != int ( vat [ 8 ] ) :
return False
return True
def check_vat_es ( self , vat ) :
'''
Check Spain VAT number .
'''
if len ( vat ) != 9 :
return False
conv = {
1 : ' T ' ,
2 : ' R ' ,
3 : ' W ' ,
4 : ' A ' ,
5 : ' G ' ,
6 : ' M ' ,
7 : ' Y ' ,
8 : ' F ' ,
9 : ' P ' ,
10 : ' D ' ,
11 : ' X ' ,
12 : ' B ' ,
13 : ' N ' ,
14 : ' J ' ,
15 : ' Z ' ,
16 : ' S ' ,
17 : ' Q ' ,
18 : ' V ' ,
19 : ' H ' ,
20 : ' L ' ,
21 : ' C ' ,
22 : ' K ' ,
23 : ' E ' ,
}
2009-10-08 06:19:24 +00:00
#Legal persons with profit aim
if vat [ 0 ] in ( ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' J ' , ' U ' , ' V ' ) :
2008-08-22 13:33:44 +00:00
try :
2009-10-08 06:19:24 +00:00
int ( vat [ 1 : 8 ] )
2008-08-22 13:33:44 +00:00
except :
return False
sum = mult_add ( 2 , int ( vat [ 1 ] ) ) + int ( vat [ 2 ] ) + \
mult_add ( 2 , int ( vat [ 3 ] ) ) + int ( vat [ 4 ] ) + \
mult_add ( 2 , int ( vat [ 5 ] ) ) + int ( vat [ 6 ] ) + \
mult_add ( 2 , int ( vat [ 7 ] ) )
check = 10 - ( sum % 10 )
if check == 10 :
check = 0
return True
2009-10-08 06:19:24 +00:00
#Legal persons with non-profit aim
elif vat [ 0 ] in ( ' N ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' W ' ) :
2008-08-22 13:33:44 +00:00
try :
int ( vat [ 1 : 8 ] )
except :
return False
sum = mult_add ( 2 , int ( vat [ 1 ] ) ) + int ( vat [ 2 ] ) + \
mult_add ( 2 , int ( vat [ 3 ] ) ) + int ( vat [ 4 ] ) + \
mult_add ( 2 , int ( vat [ 5 ] ) ) + int ( vat [ 6 ] ) + \
mult_add ( 2 , int ( vat [ 7 ] ) )
check = 10 - ( sum % 10 )
check = chr ( check + 64 )
if check != vat [ 8 ] :
return False
return True
2009-10-08 06:19:24 +00:00
#Foreign natural persons, under age 14 or non-residents
elif vat [ 0 ] in ( ' K ' , ' L ' , ' M ' , ' X ' , ' Y ' , ' Z ' ) :
if vat [ 0 ] == ' Y ' :
check_value = ' 1 ' + vat [ 1 : 8 ]
elif vat [ 0 ] == ' Z ' :
check_value = ' 2 ' + vat [ 1 : 8 ]
else :
check_value = vat [ 1 : 8 ]
2008-08-22 13:33:44 +00:00
try :
2009-10-08 06:19:24 +00:00
int ( check_value )
2008-08-22 13:33:44 +00:00
except :
return False
2009-10-08 06:19:24 +00:00
check = 1 + ( int ( check_value ) % 23 )
2008-08-22 13:33:44 +00:00
check = conv [ check ]
if check != vat [ 8 ] :
return False
return True
2009-10-08 06:19:24 +00:00
#Spanish natural persons
2008-08-22 13:33:44 +00:00
else :
try :
int ( vat [ : 8 ] )
except :
return False
check = 1 + ( int ( vat [ : 8 ] ) % 23 )
check = conv [ check ]
if check != vat [ 8 ] :
return False
return True
def check_vat_fi ( self , vat ) :
'''
Check Finland VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
sum = 7 * int ( vat [ 0 ] ) + 9 * int ( vat [ 1 ] ) + 10 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 8 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] )
check = 11 - ( sum % 11 )
if check == 11 :
check = 0
if check == 10 :
return False
if check != int ( vat [ 7 ] ) :
return False
return True
def check_vat_fr ( self , vat ) :
'''
Check France VAT number .
'''
if len ( vat ) != 11 :
return False
try :
int ( vat [ 2 : 11 ] )
except :
return False
system = None
try :
int ( vat [ 0 : 2 ] )
system = ' old '
except :
system = ' new '
if system == ' old ' :
check = ( ( int ( vat [ 2 : 11 ] ) * 100 ) + 12 ) % 97
if check != int ( vat [ 0 : 2 ] ) :
return False
return True
else :
conv = [ ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' ,
' 8 ' , ' 9 ' , ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' ,
' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' ,
' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z ' ]
if vat [ 0 ] not in conv \
or vat [ 1 ] not in conv :
return False
c1 = conv . index ( vat [ 0 ] )
c2 = conv . index ( vat [ 1 ] )
if c1 < 10 :
sum = c1 * 24 + c2 - 10
else :
sum = c1 * 34 + c2 - 100
x = sum % 11
sum = ( int ( sum ) / 11 ) + 1
y = ( int ( vat [ 2 : 11 ] ) + sum ) % 11
if x != y :
return False
return True
def check_vat_gb ( self , vat ) :
'''
Check United Kingdom VAT number .
'''
if len ( vat ) == 5 :
try :
int ( vat [ 2 : 5 ] )
except :
return False
if vat [ 0 : 2 ] == ' GD ' :
if int ( vat [ 2 : 5 ] ) > = 500 :
return False
return True
if vat [ 0 : 2 ] == ' HA ' :
if int ( vat [ 2 : 5 ] ) < 500 :
return False
return True
return False
elif len ( vat ) in ( 9 , 10 ) :
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 7 ] ) < 1 :
return False
if int ( vat [ 0 : 7 ] ) > 19999 and int ( vat [ 0 : 7 ] ) < 1000000 :
return False
if int ( vat [ 7 : 9 ] ) > 97 :
return False
if len ( vat ) == 10 and int ( vat [ 9 ] ) != 3 :
return False
sum = 8 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 3 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] ) + 10 * int ( vat [ 7 ] ) + int ( vat [ 8 ] )
2011-01-17 20:44:55 +00:00
if int ( vat [ 0 : 3 ] ) > 100 :
if sum % 97 not in ( 0 , 55 , 42 ) :
return False
else :
if sum % 97 != 0 :
return False
2008-08-22 13:33:44 +00:00
return True
elif len ( vat ) in ( 12 , 13 ) :
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 3 ] ) not in ( 0 , 1 ) :
return False
if int ( vat [ 3 : 10 ] ) < 1 :
return False
if int ( vat [ 3 : 10 ] ) > 19999 and int ( vat [ 3 : 10 ] ) < 1000000 :
return False
if int ( vat [ 10 : 12 ] ) > 97 :
return False
if len ( vat ) == 13 and int ( vat [ 12 ] ) != 3 :
return False
sum = 8 * int ( vat [ 3 ] ) + 7 * int ( vat [ 4 ] ) + 6 * int ( vat [ 5 ] ) + \
5 * int ( vat [ 6 ] ) + 4 * int ( vat [ 7 ] ) + 3 * int ( vat [ 8 ] ) + \
2 * int ( vat [ 9 ] ) + 10 * int ( vat [ 10 ] ) + int ( vat [ 11 ] )
if sum % 97 != 0 :
return False
return True
return False
def check_vat_gr ( self , vat ) :
'''
Check Greece VAT number .
'''
try :
int ( vat )
except :
return False
if len ( vat ) == 8 :
sum = 128 * int ( vat [ 0 ] ) + 64 * int ( vat [ 1 ] ) + 32 * int ( vat [ 2 ] ) + \
16 * int ( vat [ 3 ] ) + 8 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] )
check = sum % 11
if check == 10 :
check = 0
if check != int ( vat [ 7 ] ) :
return False
return True
elif len ( vat ) == 9 :
sum = 256 * int ( vat [ 0 ] ) + 128 * int ( vat [ 1 ] ) + 64 * int ( vat [ 2 ] ) + \
32 * int ( vat [ 3 ] ) + 16 * int ( vat [ 4 ] ) + 8 * int ( vat [ 5 ] ) + \
4 * int ( vat [ 6 ] ) + 2 * int ( vat [ 7 ] )
check = sum % 11
if check == 10 :
check = 0
if check != int ( vat [ 8 ] ) :
return False
return True
return False
def check_vat_el ( self , vat ) :
return self . check_vat_gr ( vat )
def check_vat_hu ( self , vat ) :
'''
Check Hungary VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 ] ) < = 0 :
return False
sum = 9 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 3 * int ( vat [ 2 ] ) + \
1 * int ( vat [ 3 ] ) + 9 * int ( vat [ 4 ] ) + 7 * int ( vat [ 5 ] ) + \
3 * int ( vat [ 6 ] )
check = 10 - ( sum % 10 )
if check == 10 :
check = 0
if check != int ( vat [ 7 ] ) :
return False
return True
def check_vat_ie ( self , vat ) :
'''
Check Ireland VAT number .
'''
if len ( vat ) != 8 :
return False
if ( ord ( vat [ 1 ] ) > = 65 and ord ( vat [ 1 ] ) < = 90 ) \
or vat [ 1 ] in ( ' + ' , ' * ' ) :
try :
int ( vat [ 0 ] )
int ( vat [ 2 : 7 ] )
except :
return False
if int ( vat [ 0 ] ) < = 6 :
return False
sum = 7 * int ( vat [ 2 ] ) + 6 * int ( vat [ 3 ] ) + 5 * int ( vat [ 4 ] ) + \
4 * int ( vat [ 5 ] ) + 3 * int ( vat [ 6 ] ) + 2 * int ( vat [ 0 ] )
check = sum % 23
if check == 0 :
check = ' W '
else :
check = chr ( check + 64 )
if check != vat [ 7 ] :
return False
return True
else :
try :
int ( vat [ 0 : 7 ] )
except :
return False
sum = 8 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 3 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] )
check = sum % 23
if check == 0 :
check = ' W '
else :
check = chr ( check + 64 )
if check != vat [ 7 ] :
return False
return True
def check_vat_it ( self , vat ) :
'''
Check Italy VAT number .
'''
if len ( vat ) != 11 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 7 ] ) < = 0 :
return False
if int ( vat [ 7 : 10 ] ) < = 0 :
return False
if int ( vat [ 7 : 10 ] ) > 100 and int ( vat [ 7 : 10 ] ) < 120 :
return False
sum = int ( vat [ 0 ] ) + mult_add ( 2 , int ( vat [ 1 ] ) ) + int ( vat [ 2 ] ) + \
mult_add ( 2 , int ( vat [ 3 ] ) ) + int ( vat [ 4 ] ) + \
mult_add ( 2 , int ( vat [ 5 ] ) ) + int ( vat [ 6 ] ) + \
mult_add ( 2 , int ( vat [ 7 ] ) ) + int ( vat [ 8 ] ) + \
mult_add ( 2 , int ( vat [ 9 ] ) )
check = 10 - ( sum % 10 )
if check == 10 :
check = 0
if check != int ( vat [ 10 ] ) :
return False
return True
def check_vat_lt ( self , vat ) :
'''
Check Lithuania VAT number .
'''
try :
int ( vat )
except :
return False
if len ( vat ) == 9 :
if int ( vat [ 7 ] ) != 1 :
return False
sum = 1 * int ( vat [ 0 ] ) + 2 * int ( vat [ 1 ] ) + 3 * int ( vat [ 2 ] ) + \
4 * int ( vat [ 3 ] ) + 5 * int ( vat [ 4 ] ) + 6 * int ( vat [ 5 ] ) + \
7 * int ( vat [ 6 ] ) + 8 * int ( vat [ 7 ] )
if sum % 11 == 10 :
sum = 3 * int ( vat [ 0 ] ) + 4 * int ( vat [ 1 ] ) + 5 * int ( vat [ 2 ] ) + \
6 * int ( vat [ 3 ] ) + 7 * int ( vat [ 4 ] ) + 8 * int ( vat [ 5 ] ) + \
9 * int ( vat [ 6 ] ) + 1 * int ( vat [ 7 ] )
check = sum % 11
if check == 10 :
check = 0
if check != int ( vat [ 8 ] ) :
return False
return True
elif len ( vat ) == 12 :
if int ( vat [ 10 ] ) != 1 :
return False
sum = 1 * int ( vat [ 0 ] ) + 2 * int ( vat [ 1 ] ) + 3 * int ( vat [ 2 ] ) + \
4 * int ( vat [ 3 ] ) + 5 * int ( vat [ 4 ] ) + 6 * int ( vat [ 5 ] ) + \
7 * int ( vat [ 6 ] ) + 8 * int ( vat [ 7 ] ) + 9 * int ( vat [ 8 ] ) + \
1 * int ( vat [ 9 ] ) + 2 * int ( vat [ 10 ] )
if sum % 11 == 10 :
sum = 3 * int ( vat [ 0 ] ) + 4 * int ( vat [ 1 ] ) + 5 * int ( vat [ 2 ] ) + \
6 * int ( vat [ 3 ] ) + 7 * int ( vat [ 4 ] ) + 8 * int ( vat [ 5 ] ) + \
9 * int ( vat [ 6 ] ) + 1 * int ( vat [ 7 ] ) + 2 * int ( vat [ 8 ] ) + \
3 * int ( vat [ 9 ] ) + 4 * int ( vat [ 10 ] )
check = sum % 11
if check == 10 :
check = 0
if check != int ( vat [ 11 ] ) :
return False
return True
return False
def check_vat_lu ( self , vat ) :
'''
Check Luxembourg VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 6 ] ) < = 0 :
return False
check = int ( vat [ 0 : 6 ] ) % 89
if check != int ( vat [ 6 : 8 ] ) :
return False
return True
def check_vat_lv ( self , vat ) :
'''
Check Latvia VAT number .
'''
if len ( vat ) != 11 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 ] ) > = 4 :
sum = 9 * int ( vat [ 0 ] ) + 1 * int ( vat [ 1 ] ) + 4 * int ( vat [ 2 ] ) + \
8 * int ( vat [ 3 ] ) + 3 * int ( vat [ 4 ] ) + 10 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] ) + 5 * int ( vat [ 7 ] ) + 7 * int ( vat [ 8 ] ) + \
6 * int ( vat [ 9 ] )
if sum % 11 == 4 and int ( vat [ 0 ] ) == 9 :
sum = sum - 45
if sum % 11 == 4 :
check = 4 - ( sum % 11 )
elif sum % 11 > 4 :
check = 14 - ( sum % 11 )
elif sum % 11 < 4 :
check = 3 - ( sum % 11 )
if check != int ( vat [ 10 ] ) :
return False
return True
else :
if int ( vat [ 2 : 4 ] ) == 2 and int ( vat [ 4 : 6 ] ) % 4 > 0 :
if int ( vat [ 0 : 2 ] ) < 1 or int ( vat [ 0 : 2 ] ) > 28 :
return False
if int ( vat [ 2 : 4 ] ) == 2 and int ( vat [ 4 : 6 ] ) % 4 == 0 :
if int ( vat [ 0 : 2 ] ) < 1 or int ( vat [ 0 : 2 ] ) > 29 :
return False
if int ( vat [ 2 : 4 ] ) in ( 4 , 6 , 9 , 11 ) :
if int ( vat [ 0 : 2 ] ) < 1 or int ( vat [ 0 : 2 ] ) > 30 :
return False
if int ( vat [ 2 : 4 ] ) in ( 1 , 3 , 5 , 7 , 8 , 10 , 12 ) :
if int ( vat [ 0 : 2 ] ) < 1 or int ( vat [ 0 : 2 ] ) > 31 :
return False
if int ( vat [ 2 : 4 ] ) < 1 or int ( vat [ 2 : 4 ] ) > 12 :
return False
return True
def check_vat_mt ( self , vat ) :
'''
Check Malta VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 6 ] ) < 100000 :
return False
sum = 3 * int ( vat [ 0 ] ) + 4 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
7 * int ( vat [ 3 ] ) + 8 * int ( vat [ 4 ] ) + 9 * int ( vat [ 5 ] )
check = 37 - ( sum % 37 )
if check != int ( vat [ 6 : 8 ] ) :
return False
return True
def check_vat_nl ( self , vat ) :
'''
Check Netherlands VAT number .
'''
if len ( vat ) != 12 :
return False
try :
int ( vat [ 0 : 9 ] )
int ( vat [ 10 : 12 ] )
except :
return False
if int ( vat [ 0 : 8 ] ) < = 0 :
return False
if vat [ 9 ] != ' B ' :
return False
sum = 9 * int ( vat [ 0 ] ) + 8 * int ( vat [ 1 ] ) + 7 * int ( vat [ 2 ] ) + \
6 * int ( vat [ 3 ] ) + 5 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + \
3 * int ( vat [ 6 ] ) + 2 * int ( vat [ 7 ] )
check = sum % 11
if check == 10 :
return False
if check != int ( vat [ 8 ] ) :
return False
return True
def check_vat_pl ( self , vat ) :
'''
Check Poland VAT number .
'''
if len ( vat ) != 10 :
return False
try :
int ( vat )
except :
return False
sum = 6 * int ( vat [ 0 ] ) + 5 * int ( vat [ 1 ] ) + 7 * int ( vat [ 2 ] ) + \
2 * int ( vat [ 3 ] ) + 3 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + \
5 * int ( vat [ 6 ] ) + 6 * int ( vat [ 7 ] ) + 7 * int ( vat [ 8 ] )
check = sum % 11
if check == 10 :
return False
if check != int ( vat [ 9 ] ) :
return False
return True
def check_vat_pt ( self , vat ) :
'''
Check Portugal VAT number .
'''
if len ( vat ) != 9 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 ] ) < = 0 :
return False
sum = 9 * int ( vat [ 0 ] ) + 8 * int ( vat [ 1 ] ) + 7 * int ( vat [ 2 ] ) + \
6 * int ( vat [ 3 ] ) + 5 * int ( vat [ 4 ] ) + 4 * int ( vat [ 5 ] ) + \
3 * int ( vat [ 6 ] ) + 2 * int ( vat [ 7 ] )
check = 11 - ( sum % 11 )
2009-06-23 08:54:41 +00:00
if check == 10 or check == 11 :
2008-08-22 13:33:44 +00:00
check = 0
return True
def check_vat_ro ( self , vat ) :
'''
Check Romania VAT number .
'''
try :
int ( vat )
except :
return False
2009-11-17 09:35:01 +00:00
if len ( vat ) > = 2 and len ( vat ) < = 10 :
vat = ( 10 - len ( vat ) ) * ' 0 ' + vat
2008-08-22 13:33:44 +00:00
sum = 7 * int ( vat [ 0 ] ) + 5 * int ( vat [ 1 ] ) + 3 * int ( vat [ 2 ] ) + \
2 * int ( vat [ 3 ] ) + 1 * int ( vat [ 4 ] ) + 7 * int ( vat [ 5 ] ) + \
5 * int ( vat [ 6 ] ) + 3 * int ( vat [ 7 ] ) + 2 * int ( vat [ 8 ] )
check = ( sum * 10 ) % 11
if check == 10 :
check = 0
if check != int ( vat [ 9 ] ) :
return False
return True
elif len ( vat ) == 13 :
if int ( vat [ 0 ] ) not in ( 1 , 2 , 3 , 4 , 6 ) :
return False
if int ( vat [ 3 : 5 ] ) < 1 or int ( vat [ 3 : 5 ] ) > 12 :
return False
if int ( vat [ 3 : 5 ] ) == 2 and int ( vat [ 1 : 3 ] ) % 4 > 0 :
if int ( vat [ 5 : 7 ] ) < 1 or int ( vat [ 5 : 7 ] ) > 28 :
return False
if int ( vat [ 3 : 5 ] ) == 2 and int ( vat [ 1 : 3 ] ) % 4 == 0 :
if int ( vat [ 5 : 7 ] ) < 1 or int ( vat [ 5 : 7 ] ) > 29 :
return False
if int ( vat [ 3 : 5 ] ) in ( 4 , 6 , 9 , 11 ) :
if int ( vat [ 5 : 7 ] ) < 1 or int ( vat [ 5 : 7 ] ) > 30 :
return False
if int ( vat [ 3 : 5 ] ) in ( 1 , 3 , 5 , 7 , 8 , 10 , 12 ) :
if int ( vat [ 5 : 7 ] ) < 1 or int ( vat [ 5 : 7 ] ) > 31 :
return False
sum = 2 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 9 * int ( vat [ 2 ] ) + \
1 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 6 * int ( vat [ 5 ] ) + \
3 * int ( vat [ 6 ] ) + 5 * int ( vat [ 7 ] ) + 8 * int ( vat [ 8 ] ) + \
2 * int ( vat [ 9 ] ) + 7 * int ( vat [ 10 ] ) + 9 * int ( vat [ 11 ] )
check = sum % 11
if check == 10 :
check = 1
if check != int ( vat [ 12 ] ) :
return False
return True
return False
def check_vat_se ( self , vat ) :
'''
Check Sweden VAT number .
'''
if len ( vat ) != 12 :
return False
try :
int ( vat )
except :
return False
2009-06-18 08:41:56 +00:00
if int ( vat [ 9 : 11 ] ) < 0 :
return False
2010-05-11 06:59:53 +00:00
2008-08-22 13:33:44 +00:00
sum = mult_add ( 2 , int ( vat [ 0 ] ) ) + int ( vat [ 1 ] ) + \
mult_add ( 2 , int ( vat [ 2 ] ) ) + int ( vat [ 3 ] ) + \
mult_add ( 2 , int ( vat [ 4 ] ) ) + int ( vat [ 5 ] ) + \
mult_add ( 2 , int ( vat [ 6 ] ) ) + int ( vat [ 7 ] ) + \
mult_add ( 2 , int ( vat [ 8 ] ) )
check = 10 - ( sum % 10 )
if check == 10 :
check = 0
if check != int ( vat [ 9 ] ) :
return False
return True
def check_vat_si ( self , vat ) :
'''
Check Slovenia VAT number .
'''
if len ( vat ) != 8 :
return False
try :
int ( vat )
except :
return False
if int ( vat [ 0 : 7 ] ) < = 999999 :
return False
sum = 8 * int ( vat [ 0 ] ) + 7 * int ( vat [ 1 ] ) + 6 * int ( vat [ 2 ] ) + \
5 * int ( vat [ 3 ] ) + 4 * int ( vat [ 4 ] ) + 3 * int ( vat [ 5 ] ) + \
2 * int ( vat [ 6 ] )
check = 11 - ( sum % 11 )
if check == 10 :
check = 0
if check == 11 :
check = 1
if check != int ( vat [ 7 ] ) :
return False
return True
def check_vat_sk ( self , vat ) :
'''
Check Slovakia VAT number .
'''
try :
int ( vat )
except :
return False
if len ( vat ) not in ( 9 , 10 ) :
return False
2010-12-09 08:00:42 +00:00
if int ( vat [ 0 : 2 ] ) in ( 0 , 10 , 20 ) and len ( vat ) == 10 :
2008-08-22 13:33:44 +00:00
return True
if len ( vat ) == 10 :
if int ( vat [ 0 : 2 ] ) < 54 or int ( vat [ 0 : 2 ] ) > 99 :
return False
if len ( vat ) == 9 :
if int ( vat [ 0 : 2 ] ) > 53 :
return False
if int ( vat [ 2 : 4 ] ) < 1 :
return False
if int ( vat [ 2 : 4 ] ) > 12 and int ( vat [ 2 : 4 ] ) < 51 :
return False
if int ( vat [ 2 : 4 ] ) > 62 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 > 0 :
if int ( vat [ 4 : 6 ] ) < 1 or int ( vat [ 4 : 6 ] ) > 28 :
return False
if int ( vat [ 2 : 4 ] ) in ( 2 , 52 ) and int ( vat [ 0 : 2 ] ) % 4 == 0 :
if int ( vat [ 4 : 6 ] ) < 1 or int ( vat [ 4 : 6 ] ) > 29 :
return False
if int ( vat [ 2 : 4 ] ) in ( 4 , 6 , 9 , 11 , 54 , 56 , 59 , 61 ) :
if int ( vat [ 4 : 6 ] ) < 1 or int ( vat [ 4 : 6 ] ) > 30 :
return False
if int ( vat [ 2 : 4 ] ) in ( 1 , 3 , 5 , 7 , 8 , 10 , 12 ,
51 , 53 , 55 , 57 , 58 , 60 , 62 ) :
if int ( vat [ 4 : 6 ] ) < 1 or int ( vat [ 4 : 6 ] ) > 31 :
return False
return True
2011-02-11 11:29:07 +00:00
def check_vat_mx ( self , vat ) :
'''
Verificar RFC mà © xico
'''
if not 12 < = len ( vat ) < = 13 :
return False
elif len ( vat ) == 12 and not vat [ : 3 ] . isalpha ( ) | vat [ 3 : 9 ] . isdigit ( ) | vat [ - 3 : ] . isalnum ( ) :
return False
elif len ( vat ) == 13 and not vat [ : 4 ] . isalpha ( ) | vat [ 4 : 10 ] . isdigit ( ) | vat [ - 3 : ] . isalnum ( ) :
return False
return True
2008-08-22 13:33:44 +00:00
res_partner ( )
2011-01-17 20:44:55 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: