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