[CLEAN]: Removed commented codes, unnecessary spaces.
[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         return True
155
156     def check_vat_cy(self, vat):
157         '''
158         Check Cyprus VAT number.
159         '''
160         if len(vat) != 9:
161             return False
162         try:
163             int(vat[:8])
164         except:
165             return False
166         n0 = int(vat[0])
167         n1 = int(vat[1])
168         n2 = int(vat[2])
169         n3 = int(vat[3])
170         n4 = int(vat[4])
171         n5 = int(vat[5])
172         n6 = int(vat[6])
173         n7 = int(vat[7])
174
175         def conv(x):
176             if x == 0:
177                 return 1
178             elif x == 1:
179                 return 0
180             elif x == 2:
181                 return 5
182             elif x == 3:
183                 return 7
184             elif x == 4:
185                 return 9
186             elif x == 5:
187                 return 13
188             elif x == 6:
189                 return 15
190             elif x == 7:
191                 return 17
192             elif x == 8:
193                 return 19
194             elif x == 9:
195                 return 21
196             return x
197         n0 = conv(n0)
198         n2 = conv(n2)
199         n4 = conv(n4)
200         n6 = conv(n6)
201
202         sum = n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7
203         check = chr(sum % 26 + 65)
204         if check != vat[8]:
205             return False
206         return True
207
208     def check_vat_cz(self, vat):
209         '''
210         Check Czech Republic VAT number.
211         '''
212         if len(vat) not in (8, 9, 10):
213             return False
214         try:
215             int(vat)
216         except:
217             return False
218
219         if len(vat) == 8:
220             if int(vat[0]) not in (0, 1, 2, 3, 4, 5, 6, 7, 8):
221                 return False
222             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
223                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
224                     2 * int(vat[6])
225             check = 11 - (sum % 11)
226             if check == 10:
227                 check = 0
228             if check == 11:
229                 check = 1
230             if check != int(vat[7]):
231                 return False
232         elif len(vat) == 9 and int(vat[0]) == 6:
233             sum = 8 * int(vat[1]) + 7 * int(vat[2]) + 6 * int(vat[3]) + \
234                     5 * int(vat[4]) + 4 * int(vat[5]) + 3 * int(vat[6]) + \
235                     2 * int(vat[7])
236             check = 9 - ((11 - (sum % 11)) % 10)
237             if check != int(vat[8]):
238                 return False
239         elif len(vat) == 9:
240             if int(vat[0:2]) > 53 and int(vat[0:2]) < 80:
241                 return False
242             if int(vat[2:4]) < 1:
243                 return False
244             if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
245                 return False
246             if int(vat[2:4]) > 62:
247                 return False
248             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
249                 if int(vat[4:6]) < 1:
250                     return False
251                 if int(vat[4:6]) > 28:
252                     return False
253             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
254                 if int(vat[4:6]) < 1:
255                     return False
256                 if int(vat[4:6]) > 29:
257                     return False
258             if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
259                 if int(vat[4:6]) < 1:
260                     return False
261                 if int(vat[4:6]) > 30:
262                     return False
263             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12, 51,
264                     53, 55, 57, 58, 60, 62):
265                 if int(vat[4:6]) < 1:
266                     return False
267                 if int(vat[4:6]) > 31:
268                     return False
269         elif len(vat) == 10:
270             if int(vat[0:2]) < 54:
271                 return False
272             if int(vat[2:4]) < 1:
273                 return False
274             if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
275                 return False
276             if int(vat[2:4]) > 62:
277                 return False
278             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
279                 if int(vat[4:6]) < 1:
280                     return False
281                 if int(vat[4:6]) > 28:
282                     return False
283             if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
284                 if int(vat[4:6]) < 1:
285                     return False
286                 if int(vat[4:6]) > 29:
287                     return False
288             if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
289                 if int(vat[4:6]) < 1:
290                     return False
291                 if int(vat[4:6]) > 30:
292                     return False
293             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12, 51,
294                     53, 55, 57, 58, 60, 62):
295                 if int(vat[4:6]) < 1:
296                     return False
297                 if int(vat[4:6]) > 31:
298                     return False
299             if (int(vat[0:2]) + int(vat[2:4]) + int(vat[4:6]) + int(vat[6:8]) +
300                     int(vat[8:10])) % 11 != 0:
301                 return False
302             if int(vat[0:10]) % 11 != 0:
303                 return False
304         return True
305
306     def check_vat_de(self, vat):
307         '''
308         Check Germany VAT number.
309         '''
310         if len(vat) != 9:
311             return False
312         try:
313             int(vat)
314         except:
315             return False
316         if int(vat[0:7]) <= 0:
317             return False
318         sum = 0
319         for i in range(8):
320             sum = (2 * ((int(vat[i]) + sum + 9) % 10 + 1)) % 11
321         check = 11 - sum
322         if check == 10:
323             check = 0
324         if int(vat[8]) != check:
325             return False
326         return True
327
328     def check_vat_dk(self, vat):
329         '''
330         Check Denmark VAT number.
331         '''
332         if len(vat) != 8:
333             return False
334         try:
335             int(vat)
336         except:
337             return False
338         if int(vat[0]) <= 0:
339             return False
340         sum = 2 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
341                 5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
342                 2 * int(vat[6]) + int(vat[7])
343         if sum % 11 != 0:
344             return False
345         return True
346
347     def check_vat_ee(self, vat):
348         '''
349         Check Estonia VAT number.
350         '''
351         if len(vat) != 9:
352             return False
353         try:
354             int(vat)
355         except:
356             return False
357         sum = 3 * int(vat[0]) + 7 * int(vat[1]) + 1 * int(vat[2]) + \
358                 3 * int(vat[3]) + 7 * int(vat[4]) + 1 * int(vat[5]) + \
359                 3 * int(vat[6]) + 7 * int(vat[7])
360         check = 10 - (sum % 10)
361         if check == 10:
362             check = 0
363         if check != int(vat[8]):
364             return False
365         return True
366
367     def check_vat_es(self, vat):
368         '''
369         Check Spain VAT number.
370         '''
371         if len(vat) != 9:
372             return False
373
374         conv = {
375             1: 'T',
376             2: 'R',
377             3: 'W',
378             4: 'A',
379             5: 'G',
380             6: 'M',
381             7: 'Y',
382             8: 'F',
383             9: 'P',
384             10: 'D',
385             11: 'X',
386             12: 'B',
387             13: 'N',
388             14: 'J',
389             15: 'Z',
390             16: 'S',
391             17: 'Q',
392             18: 'V',
393             19: 'H',
394             20: 'L',
395             21: 'C',
396             22: 'K',
397             23: 'E',
398         }
399         #Legal persons with profit aim
400         if vat[0] in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'U', 'V'):
401             try:
402                 int(vat[1:8])
403             except:
404                 return False
405             sum = mult_add(2, int(vat[1])) + int(vat[2]) + \
406                     mult_add(2, int(vat[3])) + int(vat[4]) + \
407                     mult_add(2, int(vat[5])) + int(vat[6]) + \
408                     mult_add(2, int(vat[7]))
409             check = 10 - (sum % 10)
410             if check == 10:
411                 check = 0
412             return True
413         #Legal persons with non-profit aim
414         elif vat[0] in ('N', 'P', 'Q', 'R', 'S', 'W'):
415             try:
416                 int(vat[1:8])
417             except:
418                 return False
419             sum = mult_add(2, int(vat[1])) + int(vat[2]) + \
420                     mult_add(2, int(vat[3])) + int(vat[4]) + \
421                     mult_add(2, int(vat[5])) + int(vat[6]) + \
422                     mult_add(2, int(vat[7]))
423             check = 10 - (sum % 10)
424             check = chr(check + 64)
425             if check != vat[8]:
426                 return False
427             return True
428         #Foreign natural persons, under age 14 or non-residents
429         elif vat[0] in ('K', 'L', 'M', 'X', 'Y', 'Z'):
430             if vat[0] == 'Y':
431                 check_value = '1' + vat[1:8]
432             elif vat[0] == 'Z':
433                 check_value = '2' + vat[1:8]
434             else:
435                 check_value = vat[1:8]
436
437             try:
438                 int(check_value)
439             except:
440                 return False
441             check = 1 + (int(check_value) % 23)
442
443             check = conv[check]
444             if check != vat[8]:
445                 return False
446             return True
447         #Spanish natural persons
448         else:
449             try:
450                 int(vat[:8])
451             except:
452                 return False
453             check = 1 + (int(vat[:8]) % 23)
454
455             check = conv[check]
456             if check != vat[8]:
457                 return False
458             return True
459
460     def check_vat_fi(self, vat):
461         '''
462         Check Finland VAT number.
463         '''
464         if len(vat) != 8:
465             return False
466         try:
467             int(vat)
468         except:
469             return False
470         sum = 7 * int(vat[0]) + 9 * int(vat[1]) + 10 * int(vat[2]) + \
471                 5 * int(vat[3]) + 8 * int(vat[4]) + 4 * int(vat[5]) + \
472                 2 * int(vat[6])
473         check = 11 - (sum % 11)
474         if check == 11:
475             check = 0
476         if check == 10:
477             return False
478         if check != int(vat[7]):
479             return False
480         return True
481
482     def check_vat_fr(self, vat):
483         '''
484         Check France VAT number.
485         '''
486         if len(vat) != 11:
487             return False
488
489         try:
490             int(vat[2:11])
491         except:
492             return False
493
494         system = None
495         try:
496             int(vat[0:2])
497             system = 'old'
498         except:
499             system = 'new'
500
501         if system == 'old':
502             check = ((int(vat[2:11]) * 100) + 12) % 97
503             if check != int(vat[0:2]):
504                 return False
505             return True
506         else:
507             conv = ['0', '1', '2', '3', '4', '5', '6', '7',
508                 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
509                 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
510                 'U', 'V', 'W', 'X', 'Y', 'Z']
511             if vat[0] not in conv \
512                     or vat[1] not in conv:
513                 return False
514             c1 = conv.index(vat[0])
515             c2 = conv.index(vat[1])
516
517             if c1 < 10:
518                 sum = c1 * 24 + c2 - 10
519             else:
520                 sum = c1 * 34 + c2 - 100
521
522             x = sum % 11
523             sum = (int(sum) / 11) + 1
524             y = (int(vat[2:11]) + sum) % 11
525             if x != y:
526                 return False
527             return True
528
529     def check_vat_gb(self, vat):
530         '''
531         Check United Kingdom VAT number.
532         '''
533
534         if len(vat) == 5:
535             try:
536                 int(vat[2:5])
537             except:
538                 return False
539
540             if vat[0:2] == 'GD':
541                 if int(vat[2:5]) >= 500:
542                     return False
543                 return True
544             if vat[0:2] == 'HA':
545                 if int(vat[2:5]) < 500:
546                     return False
547                 return True
548             return False
549         elif len(vat) in (9, 10):
550             try:
551                 int(vat)
552             except:
553                 return False
554
555             if int(vat[0:7]) < 1:
556                 return False
557             if int(vat[0:7]) > 19999 and int(vat[0:7]) < 1000000:
558                 return False
559             if int(vat[7:9]) > 97:
560                 return False
561             if len(vat) == 10 and int(vat[9]) != 3:
562                 return False
563
564             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
565                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
566                     2 * int(vat[6]) + 10 * int(vat[7]) + int(vat[8])
567             if sum % 97 != 0:
568                 return False
569             return True
570         elif len(vat) in (12, 13):
571             try:
572                 int(vat)
573             except:
574                 return False
575
576             if int(vat[0:3]) not in (0, 1):
577                 return False
578
579             if int(vat[3:10]) < 1:
580                 return False
581             if int(vat[3:10]) > 19999 and int(vat[3:10]) < 1000000:
582                 return False
583             if int(vat[10:12]) > 97:
584                 return False
585             if len(vat) == 13 and int(vat[12]) != 3:
586                 return False
587
588             sum = 8 * int(vat[3]) + 7 * int(vat[4]) + 6 * int(vat[5]) + \
589                     5 * int(vat[6]) + 4 * int(vat[7]) + 3 * int(vat[8]) + \
590                     2 * int(vat[9]) + 10 * int(vat[10]) + int(vat[11])
591             if sum % 97 != 0:
592                 return False
593             return True
594         return False
595
596     def check_vat_gr(self, vat):
597         '''
598         Check Greece VAT number.
599         '''
600         try:
601             int(vat)
602         except:
603             return False
604         if len(vat) == 8:
605             sum = 128 * int(vat[0]) + 64 * int(vat[1]) + 32 * int(vat[2]) + \
606                     16 * int(vat[3]) + 8 * int(vat[4]) + 4 * int(vat[5]) + \
607                     2 * int(vat[6])
608             check = sum % 11
609             if check == 10:
610                 check = 0
611             if check != int(vat[7]):
612                 return False
613             return True
614         elif len(vat) == 9:
615             sum = 256 * int(vat[0]) + 128 * int(vat[1]) + 64 * int(vat[2]) + \
616                     32 * int(vat[3]) + 16 * int(vat[4]) + 8 * int(vat[5]) + \
617                     4 * int(vat[6]) + 2 * int(vat[7])
618             check = sum % 11
619             if check == 10:
620                 check = 0
621             if check != int(vat[8]):
622                 return False
623             return True
624         return False
625
626     def check_vat_el(self, vat):
627         return self.check_vat_gr(vat)
628
629     def check_vat_hu(self, vat):
630         '''
631         Check Hungary VAT number.
632         '''
633         if len(vat) != 8:
634             return False
635         try:
636             int(vat)
637         except:
638             return False
639         if int(vat[0]) <= 0:
640             return False
641         sum = 9 * int(vat[0]) + 7 * int(vat[1]) + 3 * int(vat[2]) + \
642                 1 * int(vat[3]) + 9 * int(vat[4]) + 7 * int(vat[5]) + \
643                 3 * int(vat[6])
644         check = 10 - (sum % 10)
645         if check == 10:
646             check = 0
647         if check != int(vat[7]):
648             return False
649         return True
650
651     def check_vat_ie(self, vat):
652         '''
653         Check Ireland VAT number.
654         '''
655         if len(vat) != 8:
656             return False
657         if (ord(vat[1]) >= 65 and ord(vat[1]) <= 90) \
658                 or vat[1] in ('+', '*'):
659             try:
660                 int(vat[0])
661                 int(vat[2:7])
662             except:
663                 return False
664
665             if int(vat[0]) <= 6:
666                 return False
667
668             sum = 7 * int(vat[2]) + 6 * int(vat[3]) + 5 * int(vat[4]) + \
669                     4 * int(vat[5]) + 3 * int(vat[6]) + 2 * int(vat[0])
670             check = sum % 23
671             if check == 0:
672                 check = 'W'
673             else:
674                 check = chr(check + 64)
675             if check != vat[7]:
676                 return False
677             return True
678         else:
679             try:
680                 int(vat[0:7])
681             except:
682                 return False
683
684             sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
685                     5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
686                     2 * int(vat[6])
687             check = sum % 23
688             if check == 0:
689                 check = 'W'
690             else:
691                 check = chr(check + 64)
692             if check != vat[7]:
693                 return False
694             return True
695
696     def check_vat_it(self, vat):
697         '''
698         Check Italy VAT number.
699         '''
700         if len(vat) != 11:
701             return False
702         try:
703             int(vat)
704         except:
705             return False
706         if int(vat[0:7]) <= 0:
707             return False
708         if int(vat[7:10]) <= 0:
709             return False
710         if int(vat[7:10]) > 100 and int(vat[7:10]) < 120:
711             return False
712         if int(vat[7:10]) > 121:
713             return False
714
715         sum = int(vat[0]) + mult_add(2, int(vat[1])) + int(vat[2]) + \
716                 mult_add(2, int(vat[3])) + int(vat[4]) + \
717                 mult_add(2, int(vat[5])) + int(vat[6]) + \
718                 mult_add(2, int(vat[7])) + int(vat[8]) + \
719                 mult_add(2, int(vat[9]))
720         check = 10 - (sum % 10)
721         if check == 10:
722             check = 0
723         if check != int(vat[10]):
724             return False
725         return True
726
727     def check_vat_lt(self, vat):
728         '''
729         Check Lithuania VAT number.
730         '''
731         try:
732             int(vat)
733         except:
734             return False
735
736         if len(vat) == 9:
737             if int(vat[7]) != 1:
738                 return False
739             sum = 1 * int(vat[0]) + 2 * int(vat[1]) + 3 * int(vat[2]) + \
740                     4 * int(vat[3]) + 5 * int(vat[4]) + 6 * int(vat[5]) + \
741                     7 * int(vat[6]) + 8 * int(vat[7])
742             if sum % 11 == 10:
743                 sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 5 * int(vat[2]) + \
744                         6 * int(vat[3]) + 7 * int(vat[4]) + 8 * int(vat[5]) + \
745                         9 * int(vat[6]) + 1 * int(vat[7])
746             check = sum % 11
747             if check == 10:
748                 check = 0
749             if check != int(vat[8]):
750                 return False
751             return True
752         elif len(vat) == 12:
753             if int(vat[10]) != 1:
754                 return False
755             sum = 1 * int(vat[0]) + 2 * int(vat[1]) + 3 * int(vat[2]) + \
756                     4 * int(vat[3]) + 5 * int(vat[4]) + 6 * int(vat[5]) + \
757                     7 * int(vat[6]) + 8 * int(vat[7]) + 9 * int(vat[8]) + \
758                     1 * int(vat[9]) + 2 * int(vat[10])
759             if sum % 11 == 10:
760                 sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 5 * int(vat[2]) + \
761                         6 * int(vat[3]) + 7 * int(vat[4]) + 8 * int(vat[5]) + \
762                         9 * int(vat[6]) + 1 * int(vat[7]) + 2 * int(vat[8]) + \
763                         3 * int(vat[9]) + 4 * int(vat[10])
764             check = sum % 11
765             if check == 10:
766                 check = 0
767             if check != int(vat[11]):
768                 return False
769             return True
770         return False
771
772     def check_vat_lu(self, vat):
773         '''
774         Check Luxembourg VAT number.
775         '''
776         if len(vat) != 8:
777             return False
778         try:
779             int(vat)
780         except:
781             return False
782         if int(vat[0:6]) <= 0:
783             return False
784         check = int(vat[0:6]) % 89
785         if check != int(vat[6:8]):
786             return False
787         return True
788
789     def check_vat_lv(self, vat):
790         '''
791         Check Latvia VAT number.
792         '''
793         if len(vat) != 11:
794             return False
795         try:
796             int(vat)
797         except:
798             return False
799         if int(vat[0]) >= 4:
800             sum = 9 * int(vat[0]) + 1 * int(vat[1]) + 4 * int(vat[2]) + \
801                     8 * int(vat[3]) + 3 * int(vat[4]) + 10 * int(vat[5]) + \
802                     2 * int(vat[6]) + 5 * int(vat[7]) + 7 * int(vat[8]) + \
803                     6 * int(vat[9])
804             if sum % 11 == 4 and int(vat[0]) == 9:
805                 sum = sum - 45
806             if sum % 11 == 4:
807                 check = 4 - (sum % 11)
808             elif sum % 11 > 4:
809                 check = 14 - (sum % 11)
810             elif sum % 11 < 4:
811                 check = 3 - (sum % 11)
812             if check != int(vat[10]):
813                 return False
814             return True
815         else:
816             if int(vat[2:4]) == 2 and int(vat[4:6]) % 4 > 0:
817                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 28:
818                     return False
819             if int(vat[2:4]) == 2 and int(vat[4:6]) % 4 == 0:
820                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 29:
821                     return False
822             if int(vat[2:4]) in (4, 6, 9, 11):
823                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 30:
824                     return False
825             if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12):
826                 if int(vat[0:2]) < 1 or int(vat[0:2]) > 31:
827                     return False
828             if int(vat[2:4]) < 1 or int(vat[2:4]) > 12:
829                 return False
830             return True
831
832     def check_vat_mt(self, vat):
833         '''
834         Check Malta VAT number.
835         '''
836         if len(vat) != 8:
837             return False
838         try:
839             int(vat)
840         except:
841             return False
842
843         if int(vat[0:6]) < 100000:
844             return False
845
846         sum = 3 * int(vat[0]) + 4 * int(vat[1]) + 6 * int(vat[2]) + \
847                 7 * int(vat[3]) + 8 * int(vat[4]) + 9 * int(vat[5])
848         check = 37 - (sum % 37)
849         if check != int(vat[6:8]):
850             return False
851         return True
852
853     def check_vat_nl(self, vat):
854         '''
855         Check Netherlands VAT number.
856         '''
857         if len(vat) != 12:
858             return False
859         try:
860             int(vat[0:9])
861             int(vat[10:12])
862         except:
863             return False
864         if int(vat[0:8]) <= 0:
865             return False
866         if vat[9] != 'B':
867             return False
868
869         sum = 9 * int(vat[0]) + 8 * int(vat[1]) + 7 * int(vat[2]) + \
870                 6 * int(vat[3]) + 5 * int(vat[4]) + 4 * int(vat[5]) + \
871                 3 * int(vat[6]) + 2 * int(vat[7])
872
873         check = sum % 11
874         if check == 10:
875             return False
876         if check != int(vat[8]):
877             return False
878         return True
879
880     def check_vat_pl(self, vat):
881         '''
882         Check Poland VAT number.
883         '''
884         if len(vat) != 10:
885             return False
886         try:
887             int(vat)
888         except:
889             return False
890
891         sum = 6 * int(vat[0]) + 5 * int(vat[1]) + 7 * int(vat[2]) + \
892                 2 * int(vat[3]) + 3 * int(vat[4]) + 4 * int(vat[5]) + \
893                 5 * int(vat[6]) + 6 * int(vat[7]) + 7 * int(vat[8])
894         check = sum % 11
895         if check == 10:
896             return False
897         if check != int(vat[9]):
898             return False
899         return True
900
901     def check_vat_pt(self, vat):
902         '''
903         Check Portugal VAT number.
904         '''
905         if len(vat) != 9:
906             return False
907         try:
908             int(vat)
909         except:
910             return False
911
912         if int(vat[0]) <= 0:
913             return False
914
915         sum = 9 * int(vat[0]) + 8 * int(vat[1]) + 7 * int(vat[2]) + \
916                 6 * int(vat[3]) + 5 * int(vat[4]) + 4 * int(vat[5]) + \
917                 3 * int(vat[6]) + 2 * int(vat[7])
918         check = 11 - (sum % 11)
919         if check == 10 or check == 11:
920             check = 0
921         return True
922
923     def check_vat_ro(self, vat):
924         '''
925         Check Romania VAT number.
926         '''
927         try:
928             int(vat)
929         except:
930             return False
931
932         if len(vat) >= 2 and len(vat) <= 10:
933             vat = (10 - len(vat)) * '0' + vat
934             sum = 7 * int(vat[0]) + 5 * int(vat[1]) + 3 * int(vat[2]) + \
935                     2 * int(vat[3]) + 1 * int(vat[4]) + 7 * int(vat[5]) + \
936                     5 * int(vat[6]) + 3 * int(vat[7]) + 2 * int(vat[8])
937             check = (sum * 10) % 11
938             if check == 10:
939                 check = 0
940             if check != int(vat[9]):
941                 return False
942             return True
943         elif len(vat) == 13:
944             if int(vat[0]) not in (1, 2, 3, 4, 6):
945                 return False
946             if int(vat[3:5]) < 1 or int(vat[3:5]) > 12:
947                 return False
948             if int(vat[3:5]) == 2 and int(vat[1:3]) % 4 > 0:
949                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 28:
950                     return False
951             if int(vat[3:5]) == 2 and int(vat[1:3]) % 4 == 0:
952                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 29:
953                     return False
954             if int(vat[3:5]) in (4, 6, 9, 11):
955                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 30:
956                     return False
957             if int(vat[3:5]) in (1, 3, 5, 7, 8, 10, 12):
958                 if int(vat[5:7]) < 1 or int(vat[5:7]) > 31:
959                     return False
960
961             sum = 2 * int(vat[0]) + 7 * int(vat[1]) + 9 * int(vat[2]) + \
962                     1 * int(vat[3]) + 4 * int(vat[4]) + 6 * int(vat[5]) + \
963                     3 * int(vat[6]) + 5 * int(vat[7]) + 8 * int(vat[8]) + \
964                     2 * int(vat[9]) + 7 * int(vat[10]) + 9 * int(vat[11])
965             check = sum % 11
966             if check == 10:
967                 check = 1
968             if check != int(vat[12]):
969                 return False
970             return True
971         return False
972
973     def check_vat_se(self, vat):
974         '''
975         Check Sweden VAT number.
976         '''
977         if len(vat) != 12:
978             return False
979         try:
980             int(vat)
981         except:
982             return False
983
984         if int(vat[9:11]) < 0:
985             return False
986
987         sum = mult_add(2, int(vat[0])) + int(vat[1]) + \
988                 mult_add(2, int(vat[2])) + int(vat[3]) + \
989                 mult_add(2, int(vat[4])) + int(vat[5]) + \
990                 mult_add(2, int(vat[6])) + int(vat[7]) + \
991                 mult_add(2, int(vat[8]))
992         check = 10 - (sum % 10)
993         if check == 10:
994             check = 0
995         if check != int(vat[9]):
996             return False
997         return True
998
999     def check_vat_si(self, vat):
1000         '''
1001         Check Slovenia VAT number.
1002         '''
1003         if len(vat) != 8:
1004             return False
1005         try:
1006             int(vat)
1007         except:
1008             return False
1009         if int(vat[0:7]) <= 999999:
1010             return False
1011
1012         sum = 8 * int(vat[0]) + 7 * int(vat[1]) + 6 * int(vat[2]) + \
1013                 5 * int(vat[3]) + 4 * int(vat[4]) + 3 * int(vat[5]) + \
1014                 2 * int(vat[6])
1015         check = 11 - (sum % 11)
1016         if check == 10:
1017             check = 0
1018         if check == 11:
1019             check = 1
1020         if check != int(vat[7]):
1021             return False
1022         return True
1023
1024     def check_vat_sk(self, vat):
1025         '''
1026         Check Slovakia VAT number.
1027         '''
1028         try:
1029             int(vat)
1030         except:
1031             return False
1032         if len(vat) not in(9, 10):
1033             return False
1034
1035         if int(vat[0:2]) == 0 and len(vat) == 10:
1036             return True
1037
1038         if len(vat) == 10:
1039             if int(vat[0:2]) < 54 or int(vat[0:2]) > 99:
1040                 return False
1041
1042         if len(vat) == 9:
1043             if int(vat[0:2]) > 53 :
1044                 return False
1045
1046         if int(vat[2:4]) < 1:
1047             return False
1048         if int(vat[2:4]) > 12 and int(vat[2:4]) < 51:
1049             return False
1050         if int(vat[2:4]) > 62:
1051             return False
1052         if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 > 0:
1053             if int(vat[4:6]) < 1 or int(vat[4:6]) > 28:
1054                 return False
1055         if int(vat[2:4]) in (2, 52) and int(vat[0:2]) % 4 == 0:
1056             if int(vat[4:6]) < 1 or int(vat[4:6]) > 29:
1057                 return False
1058         if int(vat[2:4]) in (4, 6, 9, 11, 54, 56, 59, 61):
1059             if int(vat[4:6]) < 1 or int(vat[4:6]) > 30:
1060                 return False
1061         if int(vat[2:4]) in (1, 3, 5, 7, 8, 10, 12,
1062                 51, 53, 55, 57, 58, 60, 62):
1063             if int(vat[4:6]) < 1 or int(vat[4:6]) > 31:
1064                 return False
1065         return True
1066
1067 res_partner()
1068
1069 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: