Files
OurUmbraco/OurUmbraco.Site/scripts/jsvat.js
T
Sebastiaan Janssen 810cbd267f Initial commit
2012-12-17 09:41:11 +01:00

1009 lines
31 KiB
JavaScript

/*==============================================================================
Application: Utility Function
Author: John Gardner
Version: V1.0
Date: 30th July 2005
Description: Used to check the validity of an EU VAT number
Version: V1.1
Date: 3rd August 2005
Description: Lithunian legal entities & Maltese check digit checks added.
Version: V1.2
Date: 20th October 2005
Description: Italian checks refined (thanks Matteo Mike Peluso).
Version: V1.3
Date: 16th November 2005
Description: Error in GB numbers ending in 00 fixed (thanks Guy Dawson).
Version: V1.4
Date: 28th September 2006
Description: EU-type numbers added.
Version: V1.5
Date: 1st January 2007
Description: Romanian and Bulgarian numbers added.
Version: V1.6
Date: 7th January 2007
Description: Error with Slovenian numbers (thanks to Ales Hotko).
Version: V1.7
Date: 10th February 2007
Description: Romanian check digits added. Thanks to Dragu Costel for test suite.
Version: V1.8
Date: 3rd August 2007
Description: IE code modified to allow + and * in old format numbers. Thanks
to Antonin Moy of Spehere Solutions for pointing out the error.
Version: V1.9
Date: 6th August 2007
Description: BE code modified to make a specific check that the leading
character of 10 digit numbers is 0 (belts and braces).
Version: V1.10
Date: 10th August 2007
Description: Cypriot check digit support added.
Check digit validation support for non-standard UK numbers
Version: V1.11
Date: 25th September 2007
Description: Spain check digit support for personal numbers.
Author: David Perez Carmona
Version: V1.12
Date: 23rd November 2009
Description: GB code modified to take into account new style check digits.
Thanks to Guy Dawson of Crossflight Ltd for pointing out the
necessity.
Parameters: toCheck - VAT number be checked.
This function checks the value of the parameter for a valid European VAT number.
If the number is found to be invalid format, the function returns a value of
false. Otherwise it returns the VAT number re-formatted.
Example call:
if (checkVATNumber (myVATNumber))
alert ("VAT number has a valid format")
else
alert ("VAT number has invalid format");
------------------------------------------------------------------------------*/
function checkVATNumber (toCheck) {
// Array holds the regular expressions for the valid VAT number
var vatexp = new Array ();
// To change the default country (e.g. from the UK to Germany - DE):
// 1. Change the country code in the defCCode variable below to "DE".
// 2. Remove the question mark from the regular expressions associated
// with the UK VAT number: i.e. "(GB)?" -> "(GB)"
// 3. Add a question mark into the regular expression associated with
// Germany's number following the country code: i.e. "(DE)" -> "(DE)?"
var defCCode = "GB";
// Note - VAT codes without the "**" in the comment do not have check digit
// checking.
vatexp.push (/^(AT)U(\d{8})$/); //** Austria
vatexp.push (/^(BE)(\d{9,10})$/); //** Belgium
vatexp.push (/^(BG)(\d{9,10})$/); // Bulgaria
vatexp.push (/^(CY)(\d{8}[A-Z])$/); //** Cyprus
vatexp.push (/^(CZ)(\d{8,10})(\d{3})?$/); //** Czech Republic
vatexp.push (/^(DE)(\d{9})$/); //** Germany
vatexp.push (/^(DK)((\d{8}))$/); //** Denmark
vatexp.push (/^(EE)(\d{9})$/); //** Estonia
vatexp.push (/^(EL)(\d{8,9})$/); //** Greece
vatexp.push (/^(ES)([A-Z]\d{8})$/); //** Spain (1)
vatexp.push (/^(ES)(\d{8}[A-Z])$/); // Spain (2)
vatexp.push (/^(ES)([A-Z]\d{7}[A-Z])$/); //** Spain (3)
vatexp.push (/^(EU)(\d{9})$/); //** EU-type
vatexp.push (/^(FI)(\d{8})$/); //** Finland
vatexp.push (/^(FR)(\d{11})$/); //** France (1)
vatexp.push (/^(FR)[(A-H)|(J-N)|(P-Z)]\d{10}$/); // France (2)
vatexp.push (/^(FR)\d[(A-H)|(J-N)|(P-Z)]\d{9}$/); // France (3)
vatexp.push (/^(FR)[(A-H)|(J-N)|(P-Z)]{2}\d{9}$/); // France (4)
vatexp.push (/^(GB)?(\d{9})$/); //** UK (standard)
vatexp.push (/^(GB)?(\d{10})$/); //** UK (Commercial)
vatexp.push (/^(GB)?(\d{12})$/); //UK (IOM standard)
vatexp.push (/^(GB)?(\d{13})$/); //UK (IOM commercial)
vatexp.push (/^(GB)?(GD\d{3})$/); //** UK (Government)
vatexp.push (/^(GB)?(HA\d{3})$/); //** UK (Health authority)
vatexp.push (/^(GR)(\d{8,9})$/); //** Greece
vatexp.push (/^(HU)(\d{8})$/); //** Hungary
vatexp.push (/^(IE)(\d{7}[A-W])$/); //** Ireland (1)
vatexp.push (/^(IE)([7-9][A-Z\*\+)]\d{5}[A-W])$/); //** Ireland (2)
vatexp.push (/^(IT)(\d{11})$/); //** Italy
vatexp.push (/^(LV)(\d{11})$/); //** Latvia
vatexp.push (/^(LT)(\d{9}|\d{12})$/); //** Lithunia
vatexp.push (/^(LU)(\d{8})$/); //** Luxembourg
vatexp.push (/^(MT)(\d{8})$/); //** Malta
vatexp.push (/^(NL)(\d{9})B\d{2}$/); //** Netherlands
vatexp.push (/^(PL)(\d{10})$/); //** Poland
vatexp.push (/^(PT)(\d{9})$/); //** Portugal
vatexp.push (/^(RO)(\d{2,10})$/); //** Romania
vatexp.push (/^(SI)(\d{8})$/); //** Slovenia
vatexp.push (/^(SK)(\d{9}|\d{10})$/); // Slovakia Republic
vatexp.push (/^(SE)(\d{10}\d[1-4])$/); //** Sweden
// Load up the string to check
var VATNumber = toCheck.toUpperCase();
// Remove spaces from the VAT number to help validation
var chars = [" ","-",",","."];
for ( var i=0; i<chars.length; i++) {
while (VATNumber.indexOf(chars[i])!= -1) {
VATNumber = VATNumber.slice (0,VATNumber.indexOf(chars[i])) + VATNumber.slice (VATNumber.indexOf(chars[i])+1);
}
}
// Assume we're not going to find a valid VAT number
var valid = false;
// Check the string against the types of VAT numbers
for (i=0; i<vatexp.length; i++) {
if (vatexp[i].test(VATNumber)) {
var cCode = RegExp.$1; // Isolate country code
var cNumber = RegExp.$2; // Isolate the number
if (cCode.length == 0) cCode = defCCode; // Set up default country code
// Now look at the check digits for those countries we know about.
switch (cCode) {
case "AT":
valid = ATVATCheckDigit (cNumber);
break;
case "BE":
valid = BEVATCheckDigit (cNumber);
break;
case "BG":
// The SIMA validation rules are incorrect for Bulgarian numbers.
//valid = BGVATCheckDigit (cNumber)
valid = true;
break;
case "CY":
valid = CYVATCheckDigit (cNumber);
break;
case "CZ":
valid = CZVATCheckDigit (cNumber);
break;
case "DE":
valid = DEVATCheckDigit (cNumber);
break;
case "DK":
valid = DKVATCheckDigit (cNumber);
break;
case "EE":
valid = EEVATCheckDigit (cNumber);
break;
case "EL":
valid = ELVATCheckDigit (cNumber);
break;
case "ES":
valid = ESVATCheckDigit (cNumber);
break;
case "EU":
valid = EUVATCheckDigit (cNumber);
break;
case "FI":
valid = FIVATCheckDigit (cNumber);
break;
case "FR":
valid = FRVATCheckDigit (cNumber);
break;
case "GB":
valid = UKVATCheckDigit (cNumber);
break;
case "GR":
valid = ELVATCheckDigit (cNumber);
break;
case "HU":
valid = HUVATCheckDigit (cNumber);
break;
case "IE":
valid = IEVATCheckDigit (cNumber);
break;
case "IT":
valid = ITVATCheckDigit (cNumber);
break;
case "LT":
valid = LTVATCheckDigit (cNumber);
break;
case "LU":
valid = LUVATCheckDigit (cNumber);
break;
case "LV":
valid = LVVATCheckDigit (cNumber);
break;
case "MT":
valid = MTVATCheckDigit (cNumber);
break;
case "NL":
valid = NLVATCheckDigit (cNumber);
break;
case "PL":
valid = PLVATCheckDigit (cNumber);
break;
case "PT":
valid = PTVATCheckDigit (cNumber);
break;
case "RO":
valid = ROVATCheckDigit (cNumber);
break;
case "SE":
valid = SEVATCheckDigit (cNumber);
break;
case "SI":
valid = SIVATCheckDigit (cNumber);
break;
default:
valid = true;
}
// Load new VAT number back into the form element
if (valid) valid = VATNumber;
// We have found that the number is valid - break from loop
break;
}
}
// Return with either an error or the reformatted VAT number
return valid;
}
function ATVATCheckDigit (vatnumber) {
// Checks the check digits of an Austrian VAT number.
var total = 0;
var multipliers = [1,2,1,2,1,2,1];
var temp = 0;
// Extract the next digit and multiply by the appropriate multiplier.
for (var i = 0; i < 7; i++) {
temp = Number(vatnumber.charAt(i)) * multipliers[i];
if (temp > 9)
total = total + Math.floor(temp/10) + temp%10
else
total = total + temp;
}
// Establish check digit.
total = 10 - (total+4) % 10;
if (total == 10) total = 0;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function BEVATCheckDigit (vatnumber) {
// Checks the check digits of a Belgium VAT number.
// First character of 10 digit numbers should be 0
if (vatnumber.length == 10 && vatnumber.slice(0,1) != "0") return false;
// Nine digit numbers have a 0 inserted at the front.
if (vatnumber.length == 9) vatnumber = "0" + vatnumber;
// Modulus 97 check on last nine digits
if (97 - vatnumber.slice (0,8) % 97 == vatnumber.slice (8,10))
return true
else
return false;
}
function BGVATCheckDigit (vatnumber) {
// Check the check digit of 10 digit Bulgarian VAT numbers.
if (vatnumber.length != 10) return true;
var total = 0;
var multipliers = [4,3,2,7,6,5,4,3,2];
var temp = 0;
// Extract the next digit and multiply by the appropriate multiplier.
for (var i = 0; i < 9; i++) {
temp = temp + Number(vatnumber.charAt(i)) * multipliers[i];
}
// Establish check digit.
total = 11 - total % 11;
if (total == 10) total = 0;
if (total == 11) total = 1;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (9,10))
return true
else
return false;
}
function CYVATCheckDigit (vatnumber) {
// Checks the check digits of a Cypriot VAT number.
// Extract the next digit and multiply by the counter.
var total = 0;
for (var i = 0; i < 8; i++) {
var temp = Number(vatnumber.charAt(i));
if (i % 2 == 0) {
switch (temp) {
case 0: temp = 1; break;
case 1: temp = 0; break;
case 2: temp = 5; break;
case 3: temp = 7; break;
case 4: temp = 9; break;
default: temp = temp*2 + 3;
}
}
total = total + temp;
}
// Establish check digit using modulus 26, and translate to char. equivalent.
total = total % 26;
total = String.fromCharCode(total+65);
// Check to see if the check digit given is correct
if (total == vatnumber.substr (8,1))
return true
else
return false;
}
function CZVATCheckDigit (vatnumber) {
// Checks the check digits of a Czech Republic VAT number.
var total = 0;
var multipliers = [8,7,6,5,4,3,2];
// Only do check digit validation for standard VAT numbers
if (vatnumber.length != 8) return true;
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit.
total = 11 - total % 11;
if (total == 10) total = 0;
if (total == 11) total = 1;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function DEVATCheckDigit (vatnumber) {
// Checks the check digits of a German VAT number.
var product = 10;
var sum = 0;
var checkdigit = 0;
for (var i = 0; i < 8; i++) {
// Extract the next digit and implement perculiar algorithm!.
sum = (Number(vatnumber.charAt(i)) + product) % 10;
if (sum == 0) {sum = 10};
product = (2 * sum) % 11;
}
// Establish check digit.
if (11 - product == 10) {checkdigit = 0} else {checkdigit = 11 - product};
// Compare it with the last two characters of the VAT number. If the same,
// then it is a valid check digit.
if (checkdigit == vatnumber.slice (8,9))
return true
else
return false;
}
function DKVATCheckDigit (vatnumber) {
// Checks the check digits of a Danish VAT number.
var total = 0;
var multipliers = [2,7,6,5,4,3,2,1];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit.
total = total % 11;
// The remainder should be 0 for it to be valid..
if (total == 0)
return true
else
return false;
}
function EEVATCheckDigit (vatnumber) {
// Checks the check digits of an Estonian VAT number.
var total = 0;
var multipliers = [3,7,1,3,7,1,3,7];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits using modulus 10.
total = 10 - total % 10;
if (total == 10) total = 0;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
function ELVATCheckDigit (vatnumber) {
// Checks the check digits of a Greek VAT number.
var total = 0;
var multipliers = [256,128,64,32,16,8,4,2];
//eight character numbers should be prefixed with an 0.
if (vatnumber.length == 8) {vatnumber = "0" + vatnumber};
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit.
total = total % 11;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
function ESVATCheckDigit (vatnumber) {
// Checks the check digits of a Spanish VAT number.
var total = 0;
var temp = 0;
var multipliers = [2,1,2,1,2,1,2];
var esexp = new Array ();
esexp.push (/^[A-H]\d{8}$/);
esexp.push (/^[N|P|Q|S]\d{7}[A-Z]$/);
esexp.push (/^[0-9]{8}[A-Z]$/);
var i = 0;
// With profit companies
if (esexp[0].test(vatnumber)) {
// Extract the next digit and multiply by the counter.
for (i = 0; i < 7; i++) {
temp = Number(vatnumber.charAt(i+1)) * multipliers[i];
if (temp > 9)
total = total + Math.floor(temp/10) + temp%10
else
total = total + temp;
}
// Now calculate the check digit itself.
total = 10 - total % 10;
if (total == 10) {total = 0;}
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
// Non-profit companies
else if (esexp[1].test(vatnumber)) {
// Extract the next digit and multiply by the counter.
for (i = 0; i < 7; i++) {
temp = Number(vatnumber.charAt(i+1)) * multipliers[i];
if (temp > 9)
total = total + Math.floor(temp/10) + temp%10
else
total = total + temp;
}
// Now calculate the check digit itself.
total = 10 - total % 10;
total = String.fromCharCode(total+64);
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
// Personal number (NIF)
else if (esexp[2].test(vatnumber)) {
return vatnumber.charAt(8) == 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(Number(vatnumber.substring(0, 8)) % 23);
}
else return true;
}
function EUVATCheckDigit (vatnumber) {
// We know litle about EU numbers apart from the fact that the first 3 digits
// represent the country, and that there are nine digits in total.
return true;
}
function FIVATCheckDigit (vatnumber) {
// Checks the check digits of a Finnish VAT number.
var total = 0;
var multipliers = [7,9,10,5,8,4,2];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit.
total = 11 - total % 11;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function FRVATCheckDigit (vatnumber) {
// Checks the check digits of a French VAT number.
if (!(/^\d{11}$/).test(vatnumber)) return true;
// Extract the last nine digits as an integer.
var total = vatnumber.substring(2);
// Establish check digit.
total = (total*100+12) % 97;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (0,2))
return true
else
return false;
}
function HUVATCheckDigit (vatnumber) {
// Checks the check digits of a Hungarian VAT number.
var total = 0;
var multipliers = [9,7,3,1,9,7,3];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit.
total = 10 - total % 10;
if (total == 10) total = 0;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function IEVATCheckDigit (vatnumber) {
// Checks the check digits of an Irish VAT number.
var total = 0;
var multipliers = [8,7,6,5,4,3,2];
// If the code is in the old format, we need to convert it to the new.
if (/^\d[A-Z\*\+]/.test(vatnumber)) {
vatnumber = "0" + vatnumber.substring(2,7) + vatnumber.substring(0,1) + vatnumber.substring(7,8);
}
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digit using modulus 23, and translate to char. equivalent.
total = total % 23;
if (total == 0)
total = "W"
else
total = String.fromCharCode(total+64);
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function ITVATCheckDigit (vatnumber) {
// Checks the check digits of an Italian VAT number.
var total = 0;
var multipliers = [1,2,1,2,1,2,1,2,1,2];
var temp;
// The last three digits are the issuing office, and cannot exceed more 201
temp=Number(vatnumber.slice(0,7));
if (temp==0) return false;
temp=Number(vatnumber.slice(7,10));
if ((temp<1) || (temp>201)) return false;
// Extract the next digit and multiply by the appropriate
for (var i = 0; i < 10; i++) {
temp = Number(vatnumber.charAt(i)) * multipliers[i];
if (temp > 9)
total = total + Math.floor(temp/10) + temp%10
else
total = total + temp;
}
// Establish check digit.
total = 10 - total % 10;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (10,11))
return true
else
return false;
}
function LTVATCheckDigit (vatnumber) {
// Checks the check digits of a Lithuanian VAT number.
// Only do check digit validation for standard VAT numbers
if (vatnumber.length != 9) return true;
// Extract the next digit and multiply by the counter+1.
var total = 0;
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * (i+1);
// Can have a double check digit calculation!
if (total % 11 == 10) {
var multipliers = [3,4,5,6,7,8,9,1];
total = 0;
for (i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
}
// Establish check digit.
total = total % 11;
if (total == 10) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
function LUVATCheckDigit (vatnumber) {
// Checks the check digits of a Luxembourg VAT number.
if (vatnumber.slice (0,6) % 89 == vatnumber.slice (6,8))
return true
else
return false;
}
function LVVATCheckDigit (vatnumber) {
// Checks the check digits of a Latvian VAT number.
// Only check the legal bodies
if ((/^[0-3]/).test(vatnumber)) return true;
var total = 0;
var multipliers = [9,1,4,8,3,10,2,5,7,6];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 10; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits by getting modulus 11.
if (total%11 == 4 && vatnumber[0] ==9) total = total - 45;
if (total%11 == 4)
total = 4 - total%11
else if (total%11 > 4)
total = 14 - total%11
else if (total%11 < 4)
total = 3 - total%11;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (10,11))
return true
else
return false;
}
function MTVATCheckDigit (vatnumber) {
// Checks the check digits of a Maltese VAT number.
var total = 0;
var multipliers = [3,4,6,7,8,9];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 6; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits by getting modulus 37.
total = 37 - total % 37;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (6,8) * 1)
return true
else
return false;
}
function NLVATCheckDigit (vatnumber) {
// Checks the check digits of a Dutch VAT number.
var total = 0; //
var multipliers = [9,8,7,6,5,4,3,2];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits by getting modulus 11.
total = total % 11;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
function PLVATCheckDigit (vatnumber) {
// Checks the check digits of a Polish VAT number.
var total = 0;
var multipliers = [6,5,7,2,3,4,5,6,7];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 9; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits subtracting modulus 11 from 11.
total = total % 11;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same, then it's a valid
// check digit.
if (total == vatnumber.slice (9,10))
return true
else
return false;
}
function PTVATCheckDigit (vatnumber) {
// Checks the check digits of a Portugese VAT number.
var total = 0;
var multipliers = [9,8,7,6,5,4,3,2];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits subtracting modulus 11 from 11.
total = 11 - total % 11;
if (total > 9) {total = 0;};
// Compare it with the last character of the VAT number. If it is the same, then it's a valid
// check digit.
if (total == vatnumber.slice (8,9))
return true
else
return false;
}
function ROVATCheckDigit (vatnumber) {
// Checks the check digits of a Romanian VAT number.
var multipliers = [7,5,3,2,1,7,5,3,2,1];
// Extract the next digit and multiply by the counter.
var VATlen = vatnumber.length;
multipliers = multipliers.slice (10-VATlen);
var total = 0;
for (var i = 0; i < vatnumber.length-1; i++) {
total = total + Number(vatnumber.charAt(i)) * multipliers[i];
}
// Establish check digits by getting modulus 11.
total = (10 * total) % 11;
if (total == 10) total = 0;
// Compare it with the last character of the VAT number. If it is the same, then it's a valid
// check digit.
if (total == vatnumber.slice (vatnumber.length-1, vatnumber.length))
return true
else
return false;
}
function SEVATCheckDigit (vatnumber) {
// Checks the check digits of a Swedish VAT number.
var total = 0;
var multipliers = [2,1,2,1,2,1,2,1,2];
var temp = 0;
// Extract the next digit and multiply by the appropriate multiplier.
for (var i = 0; i < 9; i++) {
temp = Number(vatnumber.charAt(i)) * multipliers[i];
if (temp > 9)
total = total + Math.floor(temp/10) + temp%10
else
total = total + temp;
}
// Establish check digits by subtracting mod 10 of total from 10.
total = 10 - (total % 10);
if (total == 10) total = 0;
// Compare it with the 10th character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (9,10))
return true
else
return false;
}
function SKVATCheckDigit (vatnumber) {
// Checks the check digits of a Slovak VAT number.
var total = 0;
var multipliers = [8,7,6,5,4,3,2];
// Extract the next digit and multiply by the counter.
for (var i = 3; i < 9; i++) {
total = total + Number(vatnumber.charAt(i)) * multipliers[i-3];
}
// Establish check digits by getting modulus 11.
total = 11 - total % 11;
if (total > 9) total = total - 10;
// Compare it with the last character of the VAT number. If it is the same,
// then it's a valid check digit.
if (total == vatnumber.slice (9,10))
return true
else
return false;
}
function SIVATCheckDigit (vatnumber) {
// Checks the check digits of a Slovenian VAT number.
var total = 0;
var multipliers = [8,7,6,5,4,3,2];
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Establish check digits by subtracting 97 from total until negative.
total = 11 - total % 11;
if (total > 9) {total = 0;};
// Compare the number with the last character of the VAT number. If it is the
// same, then it's a valid check digit.
if (total == vatnumber.slice (7,8))
return true
else
return false;
}
function UKVATCheckDigit (vatnumber) {
// Checks the check digits of a UK VAT number.
var multipliers = [8,7,6,5,4,3,2];
// Government departments
if (vatnumber.substr(0,2) == 'GD') {
if (vatnumber.substr(2,3) < 500)
return true
else
return false;
}
// Health authorities
if (vatnumber.substr(0,2) == 'HA') {
if (vatnumber.substr(2,3) > 499)
return true
else
return false;
}
// Standard and commercial numbers
if (vatnumber.length == 9 || vatnumber.length == 10) {
var total = 0;
if (vatnumber.length == 10 && vatnumber.slice (9,10) != '3') return false;
// Extract the next digit and multiply by the counter.
for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
// Old numbers use a simple 97 modulus, but new numbers use an adaptation of that (less
// 55). Our VAT number could use either system, so we check it against both.
// Establish check digits by subtracting 97 from total until negative.
var cd = total;
while (cd > 0) {cd = cd - 97;}
// Get the absolute value and compare it with the last two characters of the
// VAT number. If the same, then it is a valid traditional check digit.
cd = Math.abs(cd);
if (cd == vatnumber.slice (7,9)) return true;
// Now try the new method by subtracting 55 from the check digit if we can - else add 42
if (cd >= 55)
cd = cd - 55
else
cd = cd + 42;
if (cd == vatnumber.slice (7,9))
return true
else
return false;
}
// We don't check 12 and 13 digit UK numbers - not only can we not find any,
// but the information found on the format is contradictory.
return true;
}