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