[FIX] base_vat: slovakia vat number check problem
[odoo/odoo.git] / addons / base_vat / base_vat.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6 #    Copyright (C) 2008-2009 B2CK, Cedric Krier, Bertrand Chenal (the methods "check_vat_[a-z]{2}"
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU General Public License as published by
10 #    the Free Software Foundation, either version 3 of the License, or
11 #    (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU General Public License for more details.
17 #
18 #    You should have received a copy of the GNU General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22 import string
23
24 from osv import osv, fields
25 from tools.translate import _
26
27 _ref_vat = {
28     'be': 'BE0477472701', 'at': 'ATU12345675',
29     'bg': 'BG1234567892', 'cy': 'CY12345678F',
30     'cz': 'CZ12345679', 'de': 'DE123456788',
31     'dk': 'DK12345674', 'ee': 'EE123456780',
32     'es': 'ESA12345674', 'fi': 'FI12345671',
33     'fr': 'FR32123456789', 'gb': 'GB123456782',
34     'gr': 'GR12345670', 'hu': 'HU12345676',
35     'ie': 'IE1234567T', 'it': 'IT12345670017',
36     'lt': 'LT123456715', 'lu': 'LU12345613',
37     'lv': 'LV41234567891', 'mt': 'MT12345634',
38     'nl': 'NL123456782B90', 'pl': 'PL1234567883',
39     'pt': 'PT123456789', 'ro': 'RO1234567897',
40     'se': 'SE123456789701', 'si': 'SI12345679',
41     'sk': 'SK0012345675', 'el': 'EL12345670'
42             }
43
44 def mult_add(i, j):
45     """Sum each digits of the multiplication of i and j."""
46     return reduce(lambda x, y: x + int(y), str(i*j), 0)
47
48 class res_partner(osv.osv):
49     _inherit = 'res.partner'
50
51     def _split_vat(self, vat):
52         vat_country, vat_number = vat[:2].lower(), vat[2:].replace(' ', '')
53         return vat_country, vat_number
54
55     def check_vat(self, cr, uid, ids):
56         '''
57         Check the VAT number depending of the country.
58         http://sima-pc.com/nif.php
59         '''
60         for partner in self.browse(cr, uid, ids):
61             if not partner.vat:
62                 continue
63             vat_country, vat_number = self._split_vat(partner.vat)
64             if not hasattr(self, 'check_vat_' + vat_country):
65                 return False
66             check = getattr(self, 'check_vat_' + vat_country)
67             if not check(vat_number):
68                 return False
69         return True
70
71     def vat_change(self, cr, uid, ids, value, context=None):
72         return {'value': {'vat_subjected': bool(value)}}
73
74     _columns = {
75         '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.")
76     }
77
78     def _construct_constraint_msg(self, cr, uid, ids, context=None):
79         def default_vat_check(cn, vn):
80             # by default, a VAT number is valid if:
81             #  it starts with 2 letters
82             #  has more than 3 characters
83             return cn[0] in string.ascii_lowercase and cn[1] in string.ascii_lowercase
84         vat_country, vat_number = self._split_vat(self.browse(cr, uid, ids)[0].vat)
85         if default_vat_check(vat_country, vat_number):
86             vat_no = vat_country in _ref_vat and _ref_vat[vat_country] or 'Country Code + Vat Number'
87             return _('The Vat does not seems to be correct. You should have entered something like this %s'), (vat_no)
88         return _('The VAT is invalid, It should begin with the country code'), ()
89
90     _constraints = [(check_vat, _construct_constraint_msg, ["vat"])]
91
92     # code from the following methods come from Tryton (B2CK)
93     # http://www.tryton.org/hgwebdir.cgi/modules/relationship/file/544d1de586d9/party.py
94     def check_vat_at(self, vat):
95         '''
96         Check Austria VAT number.
97         '''
98         if len(vat) != 9:
99             return False
100         if vat[0] != 'U':
101             return False
102         num = vat[1:]
103         try:
104             int(num)
105         except:
106             return False
107         sum = int(num[0]) + mult_add(2, int(num[1])) + \
108                 int(num[2]) + mult_add(2, int(num[3])) + \
109                 int(num[4]) + mult_add(2, int(num[5])) + \
110                 int(num[6])
111         check = 10 - ((sum + 4) % 10)
112         if check == 10:
113             check = 0
114         if int(vat[-1:]) != check:
115             return False
116         return True
117
118     def check_vat_be(self, vat):
119         '''
120         Check Belgium VAT number.
121         '''
122         if len(vat) != 10:
123             return False
124         try:
125             int(vat)
126         except:
127             return False
128         if int(vat[-2:]) != \
129                 97 - (int(vat[:8]) % 97):
130             return False
131         return True
132
133     def check_vat_bg(self, vat):
134         '''
135         Check Bulgaria VAT number.
136         '''
137         if len(vat) not in [9,10]:
138             return False
139         try:
140             int(vat)
141         except:
142             return False
143         if int(vat[0]) in (2, 3) and \
144                 int(vat[1:2]) != 22:
145             return False
146         sum = 4 * int(vat[0]) + 3 * int(vat[1]) + 2 * int(vat[2]) + \
147                 7 * int(vat[3]) + 6 * int(vat[4]) + 5 * int(vat[5]) + \
148                 4 * int(vat[6]) + 3 * int(vat[7]) + 2 * int(vat[8])
149         check = 11 - (sum % 11)
150         if check == 11:
151             check = 0
152         return True
153
154     def check_vat_cy(self, vat):
155         '''
156         Check Cyprus VAT number.
157         '''
158         if len(vat) != 9:
159             return False
160         try:
161             int(vat[:8])
162         except:
163             return False
164         n0 = int(vat[0])
165         n1 = int(vat[1])
166         n2 = int(vat[2])
167         n3 = int(vat[3])
168         n4 = int(vat[4])
169         n5 = int(vat[5])
170         n6 = int(vat[6])
171         n7 = int(vat[7])
172
173         def conv(x):
174             if x == 0:
175                 return 1
176             elif x == 1:
177                 return 0
178             elif x == 2:
179                 return 5
180             elif x == 3:
181                 return 7
182             elif x == 4:
183                 return 9
184             elif x == 5:
185                 return 13
186             elif x == 6:
187                 return 15
188             elif x == 7:
189                 return 17
190             elif x == 8:
191                 return 19
192             elif x == 9:
193                 return 21
194             return x
195         n0 = conv(n0)
196         n2 = conv(n2)
197         n4 = conv(n4)
198         n6 = conv(n6)
199
200         sum = n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7
201         check = chr(sum % 26 + 65)
202         if check != vat[8]:
203             return False
204         return True
205
206     def check_vat_cz(self, vat):
207         '''
208         Check Czech Republic VAT number.
209         '''
210         if len(vat) not in (8, 9, 10):
211             return False
212         try:
213             int(vat)
214         except:
215             return False
216
217         if len(vat) == 8:
218             if int(vat[0]) not in (0, 1, 2, 3, 4, 5, 6, 7, 8):
219                 return False
220             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
221                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
222                     2 * int(vat[6])
223             check = 11 - (sum % 11)
224             if check == 10:
225                 check = 0
226             if check == 11:
227                 check = 1
228             if check != int(vat[7]):
229                 return False
230         elif len(vat) == 9 and int(vat[0]) == 6:
231             sum = 8 * int(vat[1]) + 7 * int(vat[2]) + 6 * int(vat[3]) + \
232                     5 * int(vat[4]) + 4 * int(vat[5]) + 3 * int(vat[6]) + \
233                     2 * int(vat[7])
234             check = 9 - ((11 - (sum % 11)) % 10)
235             if check != int(vat[8]):
236                 return False
237         elif len(vat) == 9:
238             if int(vat[0:2]) > 53 and int(vat[0:2]) < 80:
239                 return False
240             if int(vat[2:4]) < 1:
241                 return False
242             if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
243                 return False
244             if int(vat[2:4]) > 62:
245                 return False
246             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
247                 if int(vat[4:6]) < 1:
248                     return False
249                 if int(vat[4:6]) > 28:
250                     return False
251             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
252                 if int(vat[4:6]) < 1:
253                     return False
254                 if int(vat[4:6]) > 29:
255                     return False
256             if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
257                 if int(vat[4:6]) < 1:
258                     return False
259                 if int(vat[4:6]) > 30:
260                     return False
261             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12, 51,
262                     53, 55, 57, 58, 60, 62):
263                 if int(vat[4:6]) < 1:
264                     return False
265                 if int(vat[4:6]) > 31:
266                     return False
267         elif len(vat) == 10:
268             if int(vat[0:2]) < 54:
269                 return False
270             if int(vat[2:4]) < 1:
271                 return False
272             if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
273                 return False
274             if int(vat[2:4]) > 62:
275                 return False
276             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
277                 if int(vat[4:6]) < 1:
278                     return False
279                 if int(vat[4:6]) > 28:
280                     return False
281             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
282                 if int(vat[4:6]) < 1:
283                     return False
284                 if int(vat[4:6]) > 29:
285                     return False
286             if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
287                 if int(vat[4:6]) < 1:
288                     return False
289                 if int(vat[4:6]) > 30:
290                     return False
291             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12, 51,
292                     53, 55, 57, 58, 60, 62):
293                 if int(vat[4:6]) < 1:
294                     return False
295                 if int(vat[4:6]) > 31:
296                     return False
297             if (int(vat[0:2]) + int(vat[2:4]) + int(vat[4:6]) + int(vat[6:8]) +
298                     int(vat[8:10])) % 11 != 0:
299                 return False
300             if int(vat[0:10]) % 11 != 0:
301                 return False
302         return True
303
304     def check_vat_de(self, vat):
305         '''
306         Check Germany VAT number.
307         '''
308         if len(vat) != 9:
309             return False
310         try:
311             int(vat)
312         except:
313             return False
314         if int(vat[0:7]) <= 0:
315             return False
316         sum = 0
317         for i in range(8):
318             sum = (2 * ((int(vat[i]) + sum + 9) % 10 + 1)) % 11
319         check = 11 - sum
320         if check == 10:
321             check = 0
322         if int(vat[8]) != check:
323             return False
324         return True
325
326     def check_vat_dk(self, vat):
327         '''
328         Check Denmark VAT number.
329         '''
330         if len(vat) != 8:
331             return False
332         try:
333             int(vat)
334         except:
335             return False
336         if int(vat[0]) <= 0:
337             return False
338         sum = 2 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
339                 5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
340                 2 * int(vat[6]) + int(vat[7])
341         if sum % 11 != 0:
342             return False
343         return True
344
345     def check_vat_ee(self, vat):
346         '''
347         Check Estonia VAT number.
348         '''
349         if len(vat) != 9:
350             return False
351         try:
352             int(vat)
353         except:
354             return False
355         sum = 3 * int(vat[0]) + 7 * int(vat[1]) + 1 * int(vat[2]) + \
356                 3 * int(vat[3]) + 7 * int(vat[4]) + 1 * int(vat[5]) + \
357                 3 * int(vat[6]) + 7 * int(vat[7])
358         check = 10 - (sum % 10)
359         if check == 10:
360             check = 0
361         if check != int(vat[8]):
362             return False
363         return True
364
365     def check_vat_es(self, vat):
366         '''
367         Check Spain VAT number.
368         '''
369         if len(vat) != 9:
370             return False
371
372         conv = {
373             1: 'T',
374             2: 'R',
375             3: 'W',
376             4: 'A',
377             5: 'G',
378             6: 'M',
379             7: 'Y',
380             8: 'F',
381             9: 'P',
382             10: 'D',
383             11: 'X',
384             12: 'B',
385             13: 'N',
386             14: 'J',
387             15: 'Z',
388             16: 'S',
389             17: 'Q',
390             18: 'V',
391             19: 'H',
392             20: 'L',
393             21: 'C',
394             22: 'K',
395             23: 'E',
396         }
397         #Legal persons with profit aim
398         if vat[0] in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'U', 'V'):
399             try:
400                 int(vat[1:8])
401             except:
402                 return False
403             sum = mult_add(2, int(vat[1])) + int(vat[2]) + \
404                     mult_add(2, int(vat[3])) + int(vat[4]) + \
405                     mult_add(2, int(vat[5])) + int(vat[6]) + \
406                     mult_add(2, int(vat[7]))
407             check = 10 - (sum % 10)
408             if check == 10:
409                 check = 0
410             return True
411         #Legal persons with non-profit aim
412         elif vat[0] in ('N', 'P', 'Q', 'R', 'S', 'W'):
413             try:
414                 int(vat[1:8])
415             except:
416                 return False
417             sum = mult_add(2, int(vat[1])) + int(vat[2]) + \
418                     mult_add(2, int(vat[3])) + int(vat[4]) + \
419                     mult_add(2, int(vat[5])) + int(vat[6]) + \
420                     mult_add(2, int(vat[7]))
421             check = 10 - (sum % 10)
422             check = chr(check + 64)
423             if check != vat[8]:
424                 return False
425             return True
426         #Foreign natural persons, under age 14 or non-residents
427         elif vat[0] in ('K', 'L', 'M', 'X', 'Y', 'Z'):
428             if vat[0] == 'Y':
429                 check_value = '1' + vat[1:8]
430             elif vat[0] == 'Z':
431                 check_value = '2' + vat[1:8]
432             else:
433                 check_value = vat[1:8]
434
435             try:
436                 int(check_value)
437             except:
438                 return False
439             check = 1 + (int(check_value) % 23)
440
441             check = conv[check]
442             if check != vat[8]:
443                 return False
444             return True
445         #Spanish natural persons
446         else:
447             try:
448                 int(vat[:8])
449             except:
450                 return False
451             check = 1 + (int(vat[:8]) % 23)
452
453             check = conv[check]
454             if check != vat[8]:
455                 return False
456             return True
457
458     def check_vat_fi(self, vat):
459         '''
460         Check Finland VAT number.
461         '''
462         if len(vat) != 8:
463             return False
464         try:
465             int(vat)
466         except:
467             return False
468         sum = 7 * int(vat[0]) + 9 * int(vat[1]) + 10 * int(vat[2]) + \
469                 5 * int(vat[3]) + 8 * int(vat[4]) + 4 * int(vat[5]) + \
470                 2 * int(vat[6])
471         check = 11 - (sum % 11)
472         if check == 11:
473             check = 0
474         if check == 10:
475             return False
476         if check != int(vat[7]):
477             return False
478         return True
479
480     def check_vat_fr(self, vat):
481         '''
482         Check France VAT number.
483         '''
484         if len(vat) != 11:
485             return False
486
487         try:
488             int(vat[2:11])
489         except:
490             return False
491
492         system = None
493         try:
494             int(vat[0:2])
495             system = 'old'
496         except:
497             system = 'new'
498
499         if system == 'old':
500             check = ((int(vat[2:11]) * 100) + 12) % 97
501             if check != int(vat[0:2]):
502                 return False
503             return True
504         else:
505             conv = ['0', '1', '2', '3', '4', '5', '6', '7',
506                 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
507                 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
508                 'U', 'V', 'W', 'X', 'Y', 'Z']
509             if vat[0] not in conv \
510                     or vat[1] not in conv:
511                 return False
512             c1 = conv.index(vat[0])
513             c2 = conv.index(vat[1])
514
515             if c1 < 10:
516                 sum = c1 * 24 + c2 - 10
517             else:
518                 sum = c1 * 34 + c2 - 100
519
520             x = sum % 11
521             sum = (int(sum) / 11) + 1
522             y = (int(vat[2:11]) + sum) % 11
523             if x != y:
524                 return False
525             return True
526
527     def check_vat_gb(self, vat):
528         '''
529         Check United Kingdom VAT number.
530         '''
531
532         if len(vat) == 5:
533             try:
534                 int(vat[2:5])
535             except:
536                 return False
537
538             if vat[0:2] == 'GD':
539                 if int(vat[2:5]) >= 500:
540                     return False
541                 return True
542             if vat[0:2] == 'HA':
543                 if int(vat[2:5]) < 500:
544                     return False
545                 return True
546             return False
547         elif len(vat) in (9, 10):
548             try:
549                 int(vat)
550             except:
551                 return False
552
553             if int(vat[0:7]) < 1:
554                 return False
555             if int(vat[0:7]) > 19999 and int(vat[0:7]) < 1000000:
556                 return False
557             if int(vat[7:9]) > 97:
558                 return False
559             if len(vat) == 10 and int(vat[9]) != 3:
560                 return False
561
562             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
563                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
564                     2 * int(vat[6]) + 10 * int(vat[7]) + int(vat[8])
565             if sum % 97 != 0:
566                 return False
567             return True
568         elif len(vat) in (12, 13):
569             try:
570                 int(vat)
571             except:
572                 return False
573
574             if int(vat[0:3]) not in (0, 1):
575                 return False
576
577             if int(vat[3:10]) < 1:
578                 return False
579             if int(vat[3:10]) > 19999 and int(vat[3:10]) < 1000000:
580                 return False
581             if int(vat[10:12]) > 97:
582                 return False
583             if len(vat) == 13 and int(vat[12]) != 3:
584                 return False
585
586             sum = 8 * int(vat[3]) + 7 * int(vat[4]) + 6 * int(vat[5]) + \
587                     5 * int(vat[6]) + 4 * int(vat[7]) + 3 * int(vat[8]) + \
588                     2 * int(vat[9]) + 10 * int(vat[10]) + int(vat[11])
589             if sum % 97 != 0:
590                 return False
591             return True
592         return False
593
594     def check_vat_gr(self, vat):
595         '''
596         Check Greece VAT number.
597         '''
598         try:
599             int(vat)
600         except:
601             return False
602         if len(vat) == 8:
603             sum = 128 * int(vat[0]) + 64 * int(vat[1]) + 32 * int(vat[2]) + \
604                     16 * int(vat[3]) + 8 * int(vat[4]) + 4 * int(vat[5]) + \
605                     2 * int(vat[6])
606             check = sum % 11
607             if check == 10:
608                 check = 0
609             if check != int(vat[7]):
610                 return False
611             return True
612         elif len(vat) == 9:
613             sum = 256 * int(vat[0]) + 128 * int(vat[1]) + 64 * int(vat[2]) + \
614                     32 * int(vat[3]) + 16 * int(vat[4]) + 8 * int(vat[5]) + \
615                     4 * int(vat[6]) + 2 * int(vat[7])
616             check = sum % 11
617             if check == 10:
618                 check = 0
619             if check != int(vat[8]):
620                 return False
621             return True
622         return False
623
624     def check_vat_el(self, vat):
625         return self.check_vat_gr(vat)
626
627     def check_vat_hu(self, vat):
628         '''
629         Check Hungary VAT number.
630         '''
631         if len(vat) != 8:
632             return False
633         try:
634             int(vat)
635         except:
636             return False
637         if int(vat[0]) <= 0:
638             return False
639         sum = 9 * int(vat[0]) + 7 * int(vat[1]) + 3 * int(vat[2]) + \
640                 1 * int(vat[3]) + 9 * int(vat[4]) + 7 * int(vat[5]) + \
641                 3 * int(vat[6])
642         check = 10 - (sum % 10)
643         if check == 10:
644             check = 0
645         if check != int(vat[7]):
646             return False
647         return True
648
649     def check_vat_ie(self, vat):
650         '''
651         Check Ireland VAT number.
652         '''
653         if len(vat) != 8:
654             return False
655         if (ord(vat[1]) >= 65 and ord(vat[1]) <= 90) \
656                 or vat[1] in ('+', '*'):
657             try:
658                 int(vat[0])
659                 int(vat[2:7])
660             except:
661                 return False
662
663             if int(vat[0]) <= 6:
664                 return False
665
666             sum = 7 * int(vat[2]) + 6 * int(vat[3]) + 5 * int(vat[4]) + \
667                     4 * int(vat[5]) + 3 * int(vat[6]) + 2 * int(vat[0])
668             check = sum % 23
669             if check == 0:
670                 check = 'W'
671             else:
672                 check = chr(check + 64)
673             if check != vat[7]:
674                 return False
675             return True
676         else:
677             try:
678                 int(vat[0:7])
679             except:
680                 return False
681
682             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
683                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
684                     2 * int(vat[6])
685             check = sum % 23
686             if check == 0:
687                 check = 'W'
688             else:
689                 check = chr(check + 64)
690             if check != vat[7]:
691                 return False
692             return True
693
694     def check_vat_it(self, vat):
695         '''
696         Check Italy VAT number.
697         '''
698         if len(vat) != 11:
699             return False
700         try:
701             int(vat)
702         except:
703             return False
704         if int(vat[0:7]) <= 0:
705             return False
706         if int(vat[7:10]) <= 0:
707             return False
708         if int(vat[7:10]) > 100 and int(vat[7:10]) < 120:
709             return False
710
711         sum = int(vat[0]) + mult_add(2, int(vat[1])) + int(vat[2]) + \
712                 mult_add(2, int(vat[3])) + int(vat[4]) + \
713                 mult_add(2, int(vat[5])) + int(vat[6]) + \
714                 mult_add(2, int(vat[7])) + int(vat[8]) + \
715                 mult_add(2, int(vat[9]))
716         check = 10 - (sum % 10)
717         if check == 10:
718             check = 0
719         if check != int(vat[10]):
720             return False
721         return True
722
723     def check_vat_lt(self, vat):
724         '''
725         Check Lithuania VAT number.
726         '''
727         try:
728             int(vat)
729         except:
730             return False
731
732         if len(vat) == 9:
733             if int(vat[7]) != 1:
734                 return False
735             sum = 1 * int(vat[0]) + 2 * int(vat[1]) + 3 * int(vat[2]) + \
736                     4 * int(vat[3]) + 5 * int(vat[4]) + 6 * int(vat[5]) + \
737                     7 * int(vat[6]) + 8 * int(vat[7])
738             if sum % 11 == 10:
739                 sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 5 * int(vat[2]) + \
740                         6 * int(vat[3]) + 7 * int(vat[4]) + 8 * int(vat[5]) + \
741                         9 * int(vat[6]) + 1 * int(vat[7])
742             check = sum % 11
743             if check == 10:
744                 check = 0
745             if check != int(vat[8]):
746                 return False
747             return True
748         elif len(vat) == 12:
749             if int(vat[10]) != 1:
750                 return False
751             sum = 1 * int(vat[0]) + 2 * int(vat[1]) + 3 * int(vat[2]) + \
752                     4 * int(vat[3]) + 5 * int(vat[4]) + 6 * int(vat[5]) + \
753                     7 * int(vat[6]) + 8 * int(vat[7]) + 9 * int(vat[8]) + \
754                     1 * int(vat[9]) + 2 * int(vat[10])
755             if sum % 11 == 10:
756                 sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 5 * int(vat[2]) + \
757                         6 * int(vat[3]) + 7 * int(vat[4]) + 8 * int(vat[5]) + \
758                         9 * int(vat[6]) + 1 * int(vat[7]) + 2 * int(vat[8]) + \
759                         3 * int(vat[9]) + 4 * int(vat[10])
760             check = sum % 11
761             if check == 10:
762                 check = 0
763             if check != int(vat[11]):
764                 return False
765             return True
766         return False
767
768     def check_vat_lu(self, vat):
769         '''
770         Check Luxembourg VAT number.
771         '''
772         if len(vat) != 8:
773             return False
774         try:
775             int(vat)
776         except:
777             return False
778         if int(vat[0:6]) <= 0:
779             return False
780         check = int(vat[0:6]) % 89
781         if check != int(vat[6:8]):
782             return False
783         return True
784
785     def check_vat_lv(self, vat):
786         '''
787         Check Latvia VAT number.
788         '''
789         if len(vat) != 11:
790             return False
791         try:
792             int(vat)
793         except:
794             return False
795         if int(vat[0]) >= 4:
796             sum = 9 * int(vat[0]) + 1 * int(vat[1]) + 4 * int(vat[2]) + \
797                     8 * int(vat[3]) + 3 * int(vat[4]) + 10 * int(vat[5]) + \
798                     2 * int(vat[6]) + 5 * int(vat[7]) + 7 * int(vat[8]) + \
799                     6 * int(vat[9])
800             if sum % 11 == 4 and int(vat[0]) == 9:
801                 sum = sum - 45
802             if sum % 11 == 4:
803                 check = 4 - (sum % 11)
804             elif sum % 11 > 4:
805                 check = 14 - (sum % 11)
806             elif sum % 11 < 4:
807                 check = 3 - (sum % 11)
808             if check != int(vat[10]):
809                 return False
810             return True
811         else:
812             if int(vat[2:4]) == 2 and int(vat[4:6]) % 4 > 0:
813                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 28:
814                     return False
815             if int(vat[2:4]) == 2 and int(vat[4:6]) % 4 == 0:
816                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 29:
817                     return False
818             if int(vat[2:4]) in (4, 6, 9, 11):
819                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 30:
820                     return False
821             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12):
822                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 31:
823                     return False
824             if int(vat[2:4]) < 1 or int(vat[2:4]) > 12:
825                 return False
826             return True
827
828     def check_vat_mt(self, vat):
829         '''
830         Check Malta VAT number.
831         '''
832         if len(vat) != 8:
833             return False
834         try:
835             int(vat)
836         except:
837             return False
838
839         if int(vat[0:6]) < 100000:
840             return False
841
842         sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 6 * int(vat[2]) + \
843                 7 * int(vat[3]) + 8 * int(vat[4]) + 9 * int(vat[5])
844         check = 37 - (sum % 37)
845         if check != int(vat[6:8]):
846             return False
847         return True
848
849     def check_vat_nl(self, vat):
850         '''
851         Check Netherlands VAT number.
852         '''
853         if len(vat) != 12:
854             return False
855         try:
856             int(vat[0:9])
857             int(vat[10:12])
858         except:
859             return False
860         if int(vat[0:8]) <= 0:
861             return False
862         if vat[9] != 'B':
863             return False
864
865         sum = 9 * int(vat[0]) + 8 * int(vat[1]) + 7 * int(vat[2]) + \
866                 6 * int(vat[3]) + 5 * int(vat[4]) + 4 * int(vat[5]) + \
867                 3 * int(vat[6]) + 2 * int(vat[7])
868
869         check = sum % 11
870         if check == 10:
871             return False
872         if check != int(vat[8]):
873             return False
874         return True
875
876     def check_vat_pl(self, vat):
877         '''
878         Check Poland VAT number.
879         '''
880         if len(vat) != 10:
881             return False
882         try:
883             int(vat)
884         except:
885             return False
886
887         sum = 6 * int(vat[0]) + 5 * int(vat[1]) + 7 * int(vat[2]) + \
888                 2 * int(vat[3]) + 3 * int(vat[4]) + 4 * int(vat[5]) + \
889                 5 * int(vat[6]) + 6 * int(vat[7]) + 7 * int(vat[8])
890         check = sum % 11
891         if check == 10:
892             return False
893         if check != int(vat[9]):
894             return False
895         return True
896
897     def check_vat_pt(self, vat):
898         '''
899         Check Portugal VAT number.
900         '''
901         if len(vat) != 9:
902             return False
903         try:
904             int(vat)
905         except:
906             return False
907
908         if int(vat[0]) <= 0:
909             return False
910
911         sum = 9 * int(vat[0]) + 8 * int(vat[1]) + 7 * int(vat[2]) + \
912                 6 * int(vat[3]) + 5 * int(vat[4]) + 4 * int(vat[5]) + \
913                 3 * int(vat[6]) + 2 * int(vat[7])
914         check = 11 - (sum % 11)
915         if check == 10 or check == 11:
916             check = 0
917         return True
918
919     def check_vat_ro(self, vat):
920         '''
921         Check Romania VAT number.
922         '''
923         try:
924             int(vat)
925         except:
926             return False
927
928         if len(vat) >= 2 and len(vat) <= 10:
929             vat = (10 - len(vat)) * '0' + vat
930             sum = 7 * int(vat[0]) + 5 * int(vat[1]) + 3 * int(vat[2]) + \
931                     2 * int(vat[3]) + 1 * int(vat[4]) + 7 * int(vat[5]) + \
932                     5 * int(vat[6]) + 3 * int(vat[7]) + 2 * int(vat[8])
933             check = (sum * 10) % 11
934             if check == 10:
935                 check = 0
936             if check != int(vat[9]):
937                 return False
938             return True
939         elif len(vat) == 13:
940             if int(vat[0]) not in (1, 2, 3, 4, 6):
941                 return False
942             if int(vat[3:5]) < 1 or int(vat[3:5]) > 12:
943                 return False
944             if int(vat[3:5]) == 2 and int(vat[1:3]) % 4 > 0:
945                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 28:
946                     return False
947             if int(vat[3:5]) == 2 and int(vat[1:3]) % 4 == 0:
948                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 29:
949                     return False
950             if int(vat[3:5]) in (4, 6, 9, 11):
951                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 30:
952                     return False
953             if int(vat[3:5]) in (1, 3, 5, 7, 8, 10, 12):
954                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 31:
955                     return False
956
957             sum = 2 * int(vat[0]) + 7 * int(vat[1]) + 9 * int(vat[2]) + \
958                     1 * int(vat[3]) + 4 * int(vat[4]) + 6 * int(vat[5]) + \
959                     3 * int(vat[6]) + 5 * int(vat[7]) + 8 * int(vat[8]) + \
960                     2 * int(vat[9]) + 7 * int(vat[10]) + 9 * int(vat[11])
961             check = sum % 11
962             if check == 10:
963                 check = 1
964             if check != int(vat[12]):
965                 return False
966             return True
967         return False
968
969     def check_vat_se(self, vat):
970         '''
971         Check Sweden VAT number.
972         '''
973         if len(vat) != 12:
974             return False
975         try:
976             int(vat)
977         except:
978             return False
979
980         if int(vat[9:11]) < 0:
981             return False
982
983         sum = mult_add(2, int(vat[0])) + int(vat[1]) + \
984                 mult_add(2, int(vat[2])) + int(vat[3]) + \
985                 mult_add(2, int(vat[4])) + int(vat[5]) + \
986                 mult_add(2, int(vat[6])) + int(vat[7]) + \
987                 mult_add(2, int(vat[8]))
988         check = 10 - (sum % 10)
989         if check == 10:
990             check = 0
991         if check != int(vat[9]):
992             return False
993         return True
994
995     def check_vat_si(self, vat):
996         '''
997         Check Slovenia VAT number.
998         '''
999         if len(vat) != 8:
1000             return False
1001         try:
1002             int(vat)
1003         except:
1004             return False
1005         if int(vat[0:7]) <= 999999:
1006             return False
1007
1008         sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
1009                 5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
1010                 2 * int(vat[6])
1011         check = 11 - (sum % 11)
1012         if check == 10:
1013             check = 0
1014         if check == 11:
1015             check = 1
1016         if check != int(vat[7]):
1017             return False
1018         return True
1019
1020     def check_vat_sk(self, vat):
1021         '''
1022         Check Slovakia VAT number.
1023         '''
1024         try:
1025             int(vat)
1026         except:
1027             return False
1028         if len(vat) not in(9, 10):
1029             return False
1030
1031         if int(vat[0:2]) in (0, 10, 20) and len(vat) == 10:
1032             return True
1033
1034         if len(vat) == 10:
1035             if int(vat[0:2]) < 54 or int(vat[0:2]) > 99:
1036                 return False
1037
1038         if len(vat) == 9:
1039             if int(vat[0:2]) > 53 :
1040                 return False
1041
1042         if int(vat[2:4]) < 1:
1043             return False
1044         if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
1045             return False
1046         if int(vat[2:4]) > 62:
1047             return False
1048         if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
1049             if int(vat[4:6]) < 1 or int(vat[4:6]) > 28:
1050                 return False
1051         if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
1052             if int(vat[4:6]) < 1 or int(vat[4:6]) > 29:
1053                 return False
1054         if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
1055             if int(vat[4:6]) < 1 or int(vat[4:6]) > 30:
1056                 return False
1057         if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12,
1058                 51, 53, 55, 57, 58, 60, 62):
1059             if int(vat[4:6]) < 1 or int(vat[4:6]) > 31:
1060                 return False
1061         return True
1062
1063 res_partner()
1064
1065 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: