Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/stdnum/ch/vat.py
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2015-10-08 14:30:57 +0200
committerArthur de Jong <arthur@arthurdejong.org>2015-10-08 14:33:15 +0200
commit320ecea83701cf1a371e360542504414a6403249 (patch)
treec620cf7c6634877be0e9917d9babbfcc20ca7e38 /stdnum/ch/vat.py
parentec9bcb0f13971b70e40dff7a6de3d4744ee4ea61 (diff)
Add Swiss UID and VAT numbers
The Swiss VAT number (MWST, TVA, IVA, TPV) is the UID (Unternehmens-Identifikationsnummer) followed by one of the VAT abbreviations.
Diffstat (limited to 'stdnum/ch/vat.py')
-rw-r--r--stdnum/ch/vat.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/stdnum/ch/vat.py b/stdnum/ch/vat.py
new file mode 100644
index 0000000..a61c49e
--- /dev/null
+++ b/stdnum/ch/vat.py
@@ -0,0 +1,79 @@
+# vat.py - functions for handling Swiss VAT numbers
+# coding: utf-8
+#
+# Copyright (C) 2015 Arthur de Jong
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+"""VAT, MWST, TVA, IVA, TPV (Mehrwertsteuernummer, the Swiss VAT number).
+
+The Swiss VAT number is based on the UID but is followed by either "MWST"
+(Mehrwertsteuer, the German abbreviation for VAT), "TVA" (Taxe sur la valeur
+ajoutée in French), "IVA" (Imposta sul valore aggiunto in Italian) or "TPV"
+(Taglia sin la plivalur in Romanian).
+
+This module only supports the "new" format that was introduced in 2011 which
+completely replaced the "old" 6-digit format in 2014.
+
+More information is available at:
+ https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/
+ https://www.uid.admin.ch/
+
+>>> validate('CHE-107.787.577 IVA')
+'CHE107787577IVA'
+>>> validate('CHE-107.787.578 IVA')
+Traceback (most recent call last):
+ ...
+InvalidChecksum: ...
+>>> format('CHE107787577IVA')
+'CHE-107.787.577 IVA'
+"""
+
+from stdnum.exceptions import *
+from stdnum.ch import uid
+
+
+def compact(number):
+ """Convert the number to the minimal representation. This strips
+ surrounding whitespace and separators."""
+ return uid.compact(number)
+
+
+def validate(number):
+ """Checks to see if the number provided is a valid number. This checks
+ the length, formatting and check digit."""
+ number = compact(number)
+ if len(number) not in (15, 16):
+ raise InvalidLength()
+ uid.validate(number[:12])
+ if number[12:] not in ('MWST', 'TVA', 'IVA', 'TPV'):
+ raise InvalidComponent()
+ return number
+
+
+def is_valid(number):
+ """Checks to see if the number provided is a valid number. This checks
+ the length, formatting and check digit."""
+ try:
+ return bool(validate(number))
+ except ValidationError:
+ return False
+
+
+def format(number):
+ """Reformat the passed number to the standard format."""
+ number = compact(number)
+ return uid.format(number[:12]) + ' ' + number[12:]