isVAT.js 5.9 KB

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