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