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