8000 Retain RO prefix in Romanian VAT numbers · nuno-andre/python-stdnum@c5eb2d8 · GitHub
[go: up one dir, main page]

Skip to content

Commit c5eb2d8

Browse files
committed
Retain RO prefix in Romanian VAT numbers
This does not strip the RO prefix from Romanian VAT numbers to be able to keep the distinction between a CUI/CIF that is registered for VAT (which commonly has the RO prefix) and those that don't. Closes arthurdejong#231
1 parent 1f6c77f commit c5eb2d8

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

stdnum/eu/vat.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,28 @@ def compact(number):
7474
"""Convert the number to the minimal representation. This strips the
7575
number of any valid separators and removes surrounding whitespace."""
7676
number = clean(number, '').upper().strip()
77-
module = _get_cc_module(number[:2])
77+
cc = number[:2]
78+
module = _get_cc_module(cc)
7879
if not module:
7980
raise InvalidComponent()
80-
return number[:2] + module.compact(number[2:])
81+
number = module.compact(number)
82+
if not number.startswith(cc):
83+
number = cc + number
84+
return number
8185

8286

8387
def validate(number):
8488
"""Check if the number is a valid VAT number. This performs the
8589
country-specific check for the number."""
8690
number = clean(number, '').upper().strip()
87-
module = _get_cc_module(number[:2])
91+
cc = number[:2]
92+
module = _get_cc_module(cc)
8893
if not module:
8994
raise InvalidComponent()
90-
return number[:2] + module.validate(number[2:])
95+
number = module.validate(number)
96+
if not number.startswith(cc):
97+
number = cc + number
98+
return number
9199

92100

93101
def is_valid(number):

stdnum/ro/cf.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
The Romanian CF is used for VAT purposes and can be from 2 to 10 digits long.
2424
2525
>>> validate('RO 185 472 90') # VAT CUI/CIF
26-
'18547290'
26+
'RO18547290'
2727
>>> validate('185 472 90') # non-VAT CUI/CIF
2828
'18547290'
2929
>>> validate('1630615123457') # CNP
@@ -38,10 +38,7 @@
3838
def compact(number):
3939
"""Convert the number to the minimal representation. This strips the
4040
number of any valid separators and removes surrounding whitespace."&quo 8000 t;"
41-
number = clean(number, ' -').upper().strip()
42-
if number.startswith('RO'):
43-
number = number[2:]
44-
return number
41+
return clean(number, ' -').upper().strip()
4542

4643

4744
# for backwards compatibility
@@ -52,11 +49,14 @@ def validate(number):
5249
"""Check if the number is a valid VAT number. This checks the length,
5350
formatting and check digit."""
5451
number = compact(number)
55-
if len(number) == 13:
52+
cnumber = number
53+
if cnumber.startswith('RO'):
54+
cnumber = cnumber[2:]
55+
if len(cnumber) == 13:
5656
# apparently a CNP can also be used (however, not all sources agree)
57-
cnp.validate(number)
58-
elif 2 <= len(number) <= 10:
59-
cui.validate(number)
57+
cnp.validate(cnumber)
58+
elif 2 <= len(cnumber) <= 10:
59+
cui.validate(cnumber)
6060
else:
6161
raise InvalidLength()
6262
return number

tests/test_eu_vat.doctest

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,3 +912,10 @@ These numbers should be mostly valid except that they have the wrong length.
912912
... '''
913913
>>> [x for x in numbers.splitlines() if x and not caught(x, InvalidLength)]
914914
[]
915+
916+
917+
Romanian CIF numbers assume that the RO prefix is part of the number so the
918+
EU VAT module should not return the prefix twice.
919+
920+
>>> vat.compact('RO 21996566')
921+
'RO21996566'

0 commit comments

Comments
 (0)
0