isVAT.js 7.5 KB

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