Check the validity of the format of an EU VAT number
npm install jsvat-be-fix







bash
npm i jsvat --save
`
(or yarn add jsvat)
For legacy versions (below v2.0.0) also possible: Bower: bower i jsvat --save
Getting Started
`javascript
import { checkVAT, belgium, austria } from 'jsvat';
checkVAT('BE0411905847', [belgium]); // true: accept only Belgium VATs
checkVAT('BE0411905847', [belgium, austria]); // true: accept only Belgium or Austria VATs
checkVAT('BE0411905847', [austria]); // false: accept only Austria VATs
`
or
`javascript
import { checkVAT, countries } from 'jsvat';
('countries');
checkVAT('BE0411905847', countries); // check against all supported countries
`
to check against all supported countries
Return value
checkVAT() returns VatCheckResult object:
`typescript
export interface VatCheckResult {
value?: string; // 'BE0411905847': your VAT without extra characters (like '-', spaces, etc)
isValid: boolean; // The main result. Indicates if VAT is correct against provided countries or not
isValidFormat: boolean; // Indicates the validation of the format of VAT only. E.g. "BE0411905847" is a valid VAT, and "BE0897221791" is not. But they both has valid format, so "isValidFormat" will return "true"
isSupportedCountry: boolean; // Indicates if "jsvat" could recognize the VAT. Sometimes you want to understand - if it's an invalid VAT from supported country or from an unknown one
country?: {
// VAT's country (null if not found). By "supported" I mean imported.
name: string; // ISO country name of VAT
isoCode: {
// Country ISO codes
short: string;
long: string;
numeric: string;
};
};
}
`
List of supported Countries:
- Andorra
- Austria
- Belgium
- Brazil
- Bulgaria
- Switzerland
- Cyprus
- Czech Republic
- Germany
- Denmark
- Greece
- Spain
- Europe
- Estonia
- Finland
- France
- United Kingdom
- Croatia
- Hungary
- Ireland
- Italy
- Latvia
- Lithuania
- Luxembourg
- Malta
- Netherlands
- Norway
- Poland
- Portugal
- Romania
- Russia Federation
- Serbia
- Slovenia
- Slovakia republic
- Sweden
How to import all countries at once?
`javascript
import { checkVAT, countries } from 'jsvat';
// const { checkVAT, countries } = require('jsvat');
checkVAT('WD12345678', countries);
`
Extend countries list - add your own country:
You can add your own country.
In general Country should implement following structure:
`typescript
interface Country {
name: string;
codes: ReadonlyArray;
calcFn: (vat: string, options?: object) => boolean; //options - isn't a mandatory param
rules: {
multipliers: {}; // you can leave it empty
regex: ReadonlyArray;
};
}
`
Example:
`javascript
import { checkVAT } from 'jsvat';
export const wonderland = {
name: 'Wonderland',
codes: ['WD', 'WDR', '999'], // This codes should follow ISO standards (short, long and numeric), but it's your own business
calcFn: (vat) => {
return vat.length === 10;
},
rules: {
regex: [/^(WD)(\d{8})$/]
}
};
checkVAT('WD12345678', [wonderland]); // true
`
About modules... ES6 / CommonJS / AMD / UMD / System
jsvat build includes es6, commonjs, amd, umd and system builds at the same time.
By default you will stick to es6 version for browsers and build tools (webpack, etc):
which expects you to import it as
`javascript
import { checkVAT, belgium, austria } from 'jsvat';
`
Node.js automatically will pick up CommonJS version by default.
Means you could import it like:
`jsx harmony
// Modern Frontend and Node
const { checkVAT, belgium, austria } = require('jsvat');
// Node.js
const { checkVAT, belgium, austria } = require('jsvat');
// Legacy Frontend
;
`
Alternatively you can specify which module system you do want, e.g.:
`jsx harmony
// CommonJS (i.g nodejs)
const { checkVAT, belgium, austria } = require('jsvat/lib/commonjs');
// ES6
import { checkVAT, belgium, austria } from 'jsvat/lib/es6';
// UMD
;
// AMD
const { checkVAT, belgium, austria } = require('jsvat/lib/amd');
// System
import { checkVAT, belgium, austria } from 'jsvat/lib/system';
`
How jsvat checks validity?
There is 2-step check:
1. Compare with list of Regexps;
For example regexp for austria is /^(AT)U(\d{8})$/.
Looks like ATU99999999 is valid (it's satisfy the regexp), but actually it's should be invalid.
2. Some magic mathematical counting;
Here we make some mathematical calculation (different for each country).
After that we may be sure that ATU99999999and for example ATV66889218 isn't valid, but ATU12011204` is valid.