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