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