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