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