isVAT.js 8.1 KB

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