isVAT.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. "use strict";
  2. function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = isVAT;
  7. exports.vatMatchers = void 0;
  8. var _assertString = _interopRequireDefault(require("./util/assertString"));
  9. var algorithms = _interopRequireWildcard(require("./util/algorithms"));
  10. function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
  11. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. var CH = function CH(str) {
  14. // @see {@link https://www.ech.ch/de/ech/ech-0097/5.2.0}
  15. var hasValidCheckNumber = function hasValidCheckNumber(digits) {
  16. var lastDigit = digits.pop(); // used as check number
  17. var weights = [5, 4, 3, 2, 7, 6, 5, 4];
  18. var calculatedCheckNumber = (11 - digits.reduce(function (acc, el, idx) {
  19. return acc + el * weights[idx];
  20. }, 0) % 11) % 11;
  21. return lastDigit === calculatedCheckNumber;
  22. }; // @see {@link https://www.estv.admin.ch/estv/de/home/mehrwertsteuer/uid/mwst-uid-nummer.html}
  23. return /^(CHE[- ]?)?(\d{9}|(\d{3}\.\d{3}\.\d{3})|(\d{3} \d{3} \d{3})) ?(TVA|MWST|IVA)?$/.test(str) && hasValidCheckNumber(str.match(/\d/g).map(function (el) {
  24. return +el;
  25. }));
  26. };
  27. var PT = function PT(str) {
  28. var match = str.match(/^(PT)?(\d{9})$/);
  29. if (!match) {
  30. return false;
  31. }
  32. var tin = match[2];
  33. var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
  34. return parseInt(a, 10);
  35. }), 9) % 11;
  36. if (checksum > 9) {
  37. return parseInt(tin[8], 10) === 0;
  38. }
  39. return checksum === parseInt(tin[8], 10);
  40. };
  41. var vatMatchers = {
  42. /**
  43. * European Union VAT identification numbers
  44. */
  45. AT: function AT(str) {
  46. return /^(AT)?U\d{8}$/.test(str);
  47. },
  48. BE: function BE(str) {
  49. return /^(BE)?\d{10}$/.test(str);
  50. },
  51. BG: function BG(str) {
  52. return /^(BG)?\d{9,10}$/.test(str);
  53. },
  54. HR: function HR(str) {
  55. return /^(HR)?\d{11}$/.test(str);
  56. },
  57. CY: function CY(str) {
  58. return /^(CY)?\w{9}$/.test(str);
  59. },
  60. CZ: function CZ(str) {
  61. return /^(CZ)?\d{8,10}$/.test(str);
  62. },
  63. DK: function DK(str) {
  64. return /^(DK)?\d{8}$/.test(str);
  65. },
  66. EE: function EE(str) {
  67. return /^(EE)?\d{9}$/.test(str);
  68. },
  69. FI: function FI(str) {
  70. return /^(FI)?\d{8}$/.test(str);
  71. },
  72. FR: function FR(str) {
  73. return /^(FR)?\w{2}\d{9}$/.test(str);
  74. },
  75. DE: function DE(str) {
  76. return /^(DE)?\d{9}$/.test(str);
  77. },
  78. EL: function EL(str) {
  79. return /^(EL)?\d{9}$/.test(str);
  80. },
  81. HU: function HU(str) {
  82. return /^(HU)?\d{8}$/.test(str);
  83. },
  84. IE: function IE(str) {
  85. return /^(IE)?\d{7}\w{1}(W)?$/.test(str);
  86. },
  87. IT: function IT(str) {
  88. return /^(IT)?\d{11}$/.test(str);
  89. },
  90. LV: function LV(str) {
  91. return /^(LV)?\d{11}$/.test(str);
  92. },
  93. LT: function LT(str) {
  94. return /^(LT)?\d{9,12}$/.test(str);
  95. },
  96. LU: function LU(str) {
  97. return /^(LU)?\d{8}$/.test(str);
  98. },
  99. MT: function MT(str) {
  100. return /^(MT)?\d{8}$/.test(str);
  101. },
  102. NL: function NL(str) {
  103. return /^(NL)?\d{9}B\d{2}$/.test(str);
  104. },
  105. PL: function PL(str) {
  106. return /^(PL)?(\d{10}|(\d{3}-\d{3}-\d{2}-\d{2})|(\d{3}-\d{2}-\d{2}-\d{3}))$/.test(str);
  107. },
  108. PT: PT,
  109. RO: function RO(str) {
  110. return /^(RO)?\d{2,10}$/.test(str);
  111. },
  112. SK: function SK(str) {
  113. return /^(SK)?\d{10}$/.test(str);
  114. },
  115. SI: function SI(str) {
  116. return /^(SI)?\d{8}$/.test(str);
  117. },
  118. ES: function ES(str) {
  119. return /^(ES)?\w\d{7}[A-Z]$/.test(str);
  120. },
  121. SE: function SE(str) {
  122. return /^(SE)?\d{12}$/.test(str);
  123. },
  124. /**
  125. * VAT numbers of non-EU countries
  126. */
  127. AL: function AL(str) {
  128. return /^(AL)?\w{9}[A-Z]$/.test(str);
  129. },
  130. MK: function MK(str) {
  131. return /^(MK)?\d{13}$/.test(str);
  132. },
  133. AU: function AU(str) {
  134. return /^(AU)?\d{11}$/.test(str);
  135. },
  136. BY: function BY(str) {
  137. return /^(УНП )?\d{9}$/.test(str);
  138. },
  139. CA: function CA(str) {
  140. return /^(CA)?\d{9}$/.test(str);
  141. },
  142. IS: function IS(str) {
  143. return /^(IS)?\d{5,6}$/.test(str);
  144. },
  145. IN: function IN(str) {
  146. return /^(IN)?\d{15}$/.test(str);
  147. },
  148. ID: function ID(str) {
  149. return /^(ID)?(\d{15}|(\d{2}.\d{3}.\d{3}.\d{1}-\d{3}.\d{3}))$/.test(str);
  150. },
  151. IL: function IL(str) {
  152. return /^(IL)?\d{9}$/.test(str);
  153. },
  154. KZ: function KZ(str) {
  155. return /^(KZ)?\d{9}$/.test(str);
  156. },
  157. NZ: function NZ(str) {
  158. return /^(NZ)?\d{9}$/.test(str);
  159. },
  160. NG: function NG(str) {
  161. return /^(NG)?(\d{12}|(\d{8}-\d{4}))$/.test(str);
  162. },
  163. NO: function NO(str) {
  164. return /^(NO)?\d{9}MVA$/.test(str);
  165. },
  166. PH: function PH(str) {
  167. return /^(PH)?(\d{12}|\d{3} \d{3} \d{3} \d{3})$/.test(str);
  168. },
  169. RU: function RU(str) {
  170. return /^(RU)?(\d{10}|\d{12})$/.test(str);
  171. },
  172. SM: function SM(str) {
  173. return /^(SM)?\d{5}$/.test(str);
  174. },
  175. SA: function SA(str) {
  176. return /^(SA)?\d{15}$/.test(str);
  177. },
  178. RS: function RS(str) {
  179. return /^(RS)?\d{9}$/.test(str);
  180. },
  181. CH: CH,
  182. TR: function TR(str) {
  183. return /^(TR)?\d{10}$/.test(str);
  184. },
  185. UA: function UA(str) {
  186. return /^(UA)?\d{12}$/.test(str);
  187. },
  188. GB: function GB(str) {
  189. return /^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/.test(str);
  190. },
  191. UZ: function UZ(str) {
  192. return /^(UZ)?\d{9}$/.test(str);
  193. },
  194. /**
  195. * VAT numbers of Latin American countries
  196. */
  197. AR: function AR(str) {
  198. return /^(AR)?\d{11}$/.test(str);
  199. },
  200. BO: function BO(str) {
  201. return /^(BO)?\d{7}$/.test(str);
  202. },
  203. BR: function BR(str) {
  204. return /^(BR)?((\d{2}.\d{3}.\d{3}\/\d{4}-\d{2})|(\d{3}.\d{3}.\d{3}-\d{2}))$/.test(str);
  205. },
  206. CL: function CL(str) {
  207. return /^(CL)?\d{8}-\d{1}$/.test(str);
  208. },
  209. CO: function CO(str) {
  210. return /^(CO)?\d{10}$/.test(str);
  211. },
  212. CR: function CR(str) {
  213. return /^(CR)?\d{9,12}$/.test(str);
  214. },
  215. EC: function EC(str) {
  216. return /^(EC)?\d{13}$/.test(str);
  217. },
  218. SV: function SV(str) {
  219. return /^(SV)?\d{4}-\d{6}-\d{3}-\d{1}$/.test(str);
  220. },
  221. GT: function GT(str) {
  222. return /^(GT)?\d{7}-\d{1}$/.test(str);
  223. },
  224. HN: function HN(str) {
  225. return /^(HN)?$/.test(str);
  226. },
  227. MX: function MX(str) {
  228. return /^(MX)?\w{3,4}\d{6}\w{3}$/.test(str);
  229. },
  230. NI: function NI(str) {
  231. return /^(NI)?\d{3}-\d{6}-\d{4}\w{1}$/.test(str);
  232. },
  233. PA: function PA(str) {
  234. return /^(PA)?$/.test(str);
  235. },
  236. PY: function PY(str) {
  237. return /^(PY)?\d{6,8}-\d{1}$/.test(str);
  238. },
  239. PE: function PE(str) {
  240. return /^(PE)?\d{11}$/.test(str);
  241. },
  242. DO: function DO(str) {
  243. return /^(DO)?(\d{11}|(\d{3}-\d{7}-\d{1})|[1,4,5]{1}\d{8}|([1,4,5]{1})-\d{2}-\d{5}-\d{1})$/.test(str);
  244. },
  245. UY: function UY(str) {
  246. return /^(UY)?\d{12}$/.test(str);
  247. },
  248. VE: function VE(str) {
  249. return /^(VE)?[J,G,V,E]{1}-(\d{9}|(\d{8}-\d{1}))$/.test(str);
  250. }
  251. };
  252. exports.vatMatchers = vatMatchers;
  253. function isVAT(str, countryCode) {
  254. (0, _assertString.default)(str);
  255. (0, _assertString.default)(countryCode);
  256. if (countryCode in vatMatchers) {
  257. return vatMatchers[countryCode](str);
  258. }
  259. throw new Error("Invalid country code: '".concat(countryCode, "'"));
  260. }