vat.js 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  1. (function($) {
  2. $.fn.bootstrapValidator.i18n.vat = $.extend($.fn.bootstrapValidator.i18n.vat || {}, {
  3. 'default': 'Please enter a valid VAT number',
  4. countryNotSupported: 'The country code %s is not supported',
  5. country: 'Please enter a valid %s VAT number',
  6. countries: {
  7. AT: 'Austrian',
  8. BE: 'Belgian',
  9. BG: 'Bulgarian',
  10. BR: 'Brazil',
  11. CH: 'Swiss',
  12. CY: 'Cypriot',
  13. CZ: 'Czech',
  14. DE: 'German',
  15. DK: 'Danish',
  16. EE: 'Estonian',
  17. ES: 'Spanish',
  18. FI: 'Finnish',
  19. FR: 'French',
  20. GB: 'United Kingdom',
  21. GR: 'Greek',
  22. EL: 'Greek',
  23. HU: 'Hungarian',
  24. HR: 'Croatian',
  25. IE: 'Irish',
  26. IS: 'Iceland',
  27. IT: 'Italian',
  28. LT: 'Lithuanian',
  29. LU: 'Luxembourg',
  30. LV: 'Latvian',
  31. MT: 'Maltese',
  32. NL: 'Dutch',
  33. NO: 'Norwegian',
  34. PL: 'Polish',
  35. PT: 'Portuguese',
  36. RO: 'Romanian',
  37. RU: 'Russian',
  38. RS: 'Serbian',
  39. SE: 'Swedish',
  40. SI: 'Slovenian',
  41. SK: 'Slovak',
  42. ZA: 'South African'
  43. }
  44. });
  45. $.fn.bootstrapValidator.validators.vat = {
  46. html5Attributes: {
  47. message: 'message',
  48. country: 'country'
  49. },
  50. // Supported country codes
  51. COUNTRY_CODES: [
  52. 'AT', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU',
  53. 'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'ZA'
  54. ],
  55. /**
  56. * Validate an European VAT number
  57. *
  58. * @param {BootstrapValidator} validator The validator plugin instance
  59. * @param {jQuery} $field Field element
  60. * @param {Object} options Consist of key:
  61. * - message: The invalid message
  62. * - country: The ISO 3166-1 country code. It can be
  63. * - One of country code defined in COUNTRY_CODES
  64. * - Name of field which its value defines the country code
  65. * - Name of callback function that returns the country code
  66. * - A callback function that returns the country code
  67. * @returns {Boolean|Object}
  68. */
  69. validate: function(validator, $field, options) {
  70. var value = $field.val();
  71. if (value === '') {
  72. return true;
  73. }
  74. var country = options.country;
  75. if (!country) {
  76. country = value.substr(0, 2);
  77. } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
  78. // Determine the country code
  79. country = validator.getDynamicOption($field, country);
  80. }
  81. if ($.inArray(country, this.COUNTRY_CODES) === -1) {
  82. return {
  83. valid: false,
  84. message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.countryNotSupported, country)
  85. };
  86. }
  87. var method = ['_', country.toLowerCase()].join('');
  88. return this[method](value)
  89. ? true
  90. : {
  91. valid: false,
  92. message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.vat.country, $.fn.bootstrapValidator.i18n.vat.countries[country.toUpperCase()])
  93. };
  94. },
  95. // VAT validators
  96. /**
  97. * Validate Austrian VAT number
  98. * Example:
  99. * - Valid: ATU13585627
  100. * - Invalid: ATU13585626
  101. *
  102. * @param {String} value VAT number
  103. * @returns {Boolean}
  104. */
  105. _at: function(value) {
  106. if (!/^ATU[0-9]{8}$/.test(value)) {
  107. return false;
  108. }
  109. value = value.substr(3);
  110. var sum = 0,
  111. weight = [1, 2, 1, 2, 1, 2, 1],
  112. temp = 0;
  113. for (var i = 0; i < 7; i++) {
  114. temp = parseInt(value.charAt(i), 10) * weight[i];
  115. if (temp > 9) {
  116. temp = Math.floor(temp / 10) + temp % 10;
  117. }
  118. sum += temp;
  119. }
  120. sum = 10 - (sum + 4) % 10;
  121. if (sum === 10) {
  122. sum = 0;
  123. }
  124. return (sum + '' === value.substr(7, 1));
  125. },
  126. /**
  127. * Validate Belgian VAT number
  128. * Example:
  129. * - Valid: BE0428759497
  130. * - Invalid: BE431150351
  131. *
  132. * @param {String} value VAT number
  133. * @returns {Boolean}
  134. */
  135. _be: function(value) {
  136. if (!/^BE[0]{0,1}[0-9]{9}$/.test(value)) {
  137. return false;
  138. }
  139. value = value.substr(2);
  140. if (value.length === 9) {
  141. value = '0' + value;
  142. }
  143. if (value.substr(1, 1) === '0') {
  144. return false;
  145. }
  146. var sum = parseInt(value.substr(0, 8), 10) + parseInt(value.substr(8, 2), 10);
  147. return (sum % 97 === 0);
  148. },
  149. /**
  150. * Validate Bulgarian VAT number
  151. * Example:
  152. * - Valid: BG175074752,
  153. * BG7523169263, BG8032056031,
  154. * BG7542011030,
  155. * BG7111042925
  156. * - Invalid: BG175074753, BG7552A10004, BG7111042922
  157. *
  158. * @param {String} value VAT number
  159. * @returns {Boolean}
  160. */
  161. _bg: function(value) {
  162. if (!/^BG[0-9]{9,10}$/.test(value)) {
  163. return false;
  164. }
  165. value = value.substr(2);
  166. var sum = 0, i = 0;
  167. // Legal entities
  168. if (value.length === 9) {
  169. for (i = 0; i < 8; i++) {
  170. sum += parseInt(value.charAt(i), 10) * (i + 1);
  171. }
  172. sum = sum % 11;
  173. if (sum === 10) {
  174. sum = 0;
  175. for (i = 0; i < 8; i++) {
  176. sum += parseInt(value.charAt(i), 10) * (i + 3);
  177. }
  178. }
  179. sum = sum % 10;
  180. return (sum + '' === value.substr(8));
  181. }
  182. // Physical persons, foreigners and others
  183. else if (value.length === 10) {
  184. // Validate Bulgarian national identification numbers
  185. var egn = function(value) {
  186. // Check the birth date
  187. var year = parseInt(value.substr(0, 2), 10) + 1900,
  188. month = parseInt(value.substr(2, 2), 10),
  189. day = parseInt(value.substr(4, 2), 10);
  190. if (month > 40) {
  191. year += 100;
  192. month -= 40;
  193. } else if (month > 20) {
  194. year -= 100;
  195. month -= 20;
  196. }
  197. if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
  198. return false;
  199. }
  200. var sum = 0,
  201. weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];
  202. for (var i = 0; i < 9; i++) {
  203. sum += parseInt(value.charAt(i), 10) * weight[i];
  204. }
  205. sum = (sum % 11) % 10;
  206. return (sum + '' === value.substr(9, 1));
  207. },
  208. // Validate Bulgarian personal number of a foreigner
  209. pnf = function(value) {
  210. var sum = 0,
  211. weight = [21, 19, 17, 13, 11, 9, 7, 3, 1];
  212. for (var i = 0; i < 9; i++) {
  213. sum += parseInt(value.charAt(i), 10) * weight[i];
  214. }
  215. sum = sum % 10;
  216. return (sum + '' === value.substr(9, 1));
  217. },
  218. // Finally, consider it as a VAT number
  219. vat = function(value) {
  220. var sum = 0,
  221. weight = [4, 3, 2, 7, 6, 5, 4, 3, 2];
  222. for (var i = 0; i < 9; i++) {
  223. sum += parseInt(value.charAt(i), 10) * weight[i];
  224. }
  225. sum = 11 - sum % 11;
  226. if (sum === 10) {
  227. return false;
  228. }
  229. if (sum === 11) {
  230. sum = 0;
  231. }
  232. return (sum + '' === value.substr(9, 1));
  233. };
  234. return (egn(value) || pnf(value) || vat(value));
  235. }
  236. return false;
  237. },
  238. /**
  239. * Validate Brazilian VAT number (CNPJ)
  240. *
  241. * @param {String} value VAT number
  242. * @returns {Boolean}
  243. */
  244. _br: function(value) {
  245. if (value === '') {
  246. return true;
  247. }
  248. cnpj = value.replace(/[^\d]+/g, '');
  249. if (cnpj == '') return false;
  250. if (cnpj.length != 14)
  251. return false;
  252. // Remove invalids CNPJs
  253. if (cnpj == "00000000000000" ||
  254. cnpj == "11111111111111" ||
  255. cnpj == "22222222222222" ||
  256. cnpj == "33333333333333" ||
  257. cnpj == "44444444444444" ||
  258. cnpj == "55555555555555" ||
  259. cnpj == "66666666666666" ||
  260. cnpj == "77777777777777" ||
  261. cnpj == "88888888888888" ||
  262. cnpj == "99999999999999")
  263. return false;
  264. // Validate verification digits
  265. length = cnpj.length - 2
  266. numbers = cnpj.substring(0, length);
  267. digits = cnpj.substring(length);
  268. sum = 0;
  269. pos = length - 7;
  270. for (i = length; i >= 1; i--) {
  271. sum += numbers.charAt(length - i) * pos--;
  272. if (pos < 2)
  273. pos = 9;
  274. }
  275. result = sum % 11 < 2 ? 0 : 11 - sum % 11;
  276. if (result != digits.charAt(0))
  277. return false;
  278. length = length + 1;
  279. numbers = cnpj.substring(0, length);
  280. sum = 0;
  281. pos = length - 7;
  282. for (i = length; i >= 1; i--) {
  283. sum += numbers.charAt(length - i) * pos--;
  284. if (pos < 2)
  285. pos = 9;
  286. }
  287. result = sum % 11 < 2 ? 0 : 11 - sum % 11;
  288. if (result != digits.charAt(1))
  289. return false;
  290. return true;
  291. },
  292. /**
  293. * Validate Swiss VAT number
  294. *
  295. * @param {String} value VAT number
  296. * @returns {Boolean}
  297. */
  298. _ch: function(value) {
  299. if (!/^CHE[0-9]{9}(MWST)?$/.test(value)) {
  300. return false;
  301. }
  302. value = value.substr(3);
  303. var sum = 0,
  304. weight = [5, 4, 3, 2, 7, 6, 5, 4];
  305. for (var i = 0; i < 8; i++) {
  306. sum += parseInt(value.charAt(i), 10) * weight[i];
  307. }
  308. sum = 11 - sum % 11;
  309. if (sum === 10) {
  310. return false;
  311. }
  312. if (sum === 11) {
  313. sum = 0;
  314. }
  315. return (sum + '' === value.substr(8, 1));
  316. },
  317. /**
  318. * Validate Cypriot VAT number
  319. * Examples:
  320. * - Valid: CY10259033P
  321. * - Invalid: CY10259033Z
  322. *
  323. * @param {String} value VAT number
  324. * @returns {Boolean}
  325. */
  326. _cy: function(value) {
  327. if (!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(value)) {
  328. return false;
  329. }
  330. value = value.substr(2);
  331. // Do not allow to start with "12"
  332. if (value.substr(0, 2) === '12') {
  333. return false;
  334. }
  335. // Extract the next digit and multiply by the counter.
  336. var sum = 0,
  337. translation = {
  338. '0': 1, '1': 0, '2': 5, '3': 7, '4': 9,
  339. '5': 13, '6': 15, '7': 17, '8': 19, '9': 21
  340. };
  341. for (var i = 0; i < 8; i++) {
  342. var temp = parseInt(value.charAt(i), 10);
  343. if (i % 2 === 0) {
  344. temp = translation[temp + ''];
  345. }
  346. sum += temp;
  347. }
  348. sum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[sum % 26];
  349. return (sum + '' === value.substr(8, 1));
  350. },
  351. /**
  352. * Validate Czech Republic VAT number
  353. * Can be:
  354. * i) Legal entities (8 digit numbers)
  355. * ii) Individuals with a RC (the 9 or 10 digit Czech birth number)
  356. * iii) Individuals without a RC (9 digit numbers beginning with 6)
  357. *
  358. * Examples:
  359. * - Valid: i) CZ25123891; ii) CZ7103192745, CZ991231123; iii) CZ640903926
  360. * - Invalid: i) CZ25123890; ii) CZ1103492745, CZ590312123
  361. *
  362. * @param {String} value VAT number
  363. * @returns {Boolean}
  364. */
  365. _cz: function(value) {
  366. if (!/^CZ[0-9]{8,10}$/.test(value)) {
  367. return false;
  368. }
  369. value = value.substr(2);
  370. var sum = 0,
  371. i = 0;
  372. if (value.length === 8) {
  373. // Do not allow to start with '9'
  374. if (value.charAt(0) + '' === '9') {
  375. return false;
  376. }
  377. sum = 0;
  378. for (i = 0; i < 7; i++) {
  379. sum += parseInt(value.charAt(i), 10) * (8 - i);
  380. }
  381. sum = 11 - sum % 11;
  382. if (sum === 10) {
  383. sum = 0;
  384. }
  385. if (sum === 11) {
  386. sum = 1;
  387. }
  388. return (sum + '' === value.substr(7, 1));
  389. } else if (value.length === 9 && (value.charAt(0) + '' === '6')) {
  390. sum = 0;
  391. // Skip the first (which is 6)
  392. for (i = 0; i < 7; i++) {
  393. sum += parseInt(value.charAt(i + 1), 10) * (8 - i);
  394. }
  395. sum = 11 - sum % 11;
  396. if (sum === 10) {
  397. sum = 0;
  398. }
  399. if (sum === 11) {
  400. sum = 1;
  401. }
  402. sum = [8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10][sum - 1];
  403. return (sum + '' === value.substr(8, 1));
  404. } else if (value.length === 9 || value.length === 10) {
  405. // Validate Czech birth number (Rodné číslo), which is also national identifier
  406. var year = 1900 + parseInt(value.substr(0, 2), 10),
  407. month = parseInt(value.substr(2, 2), 10) % 50 % 20,
  408. day = parseInt(value.substr(4, 2), 10);
  409. if (value.length === 9) {
  410. if (year >= 1980) {
  411. year -= 100;
  412. }
  413. if (year > 1953) {
  414. return false;
  415. }
  416. } else if (year < 1954) {
  417. year += 100;
  418. }
  419. if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
  420. return false;
  421. }
  422. // Check that the birth date is not in the future
  423. if (value.length === 10) {
  424. var check = parseInt(value.substr(0, 9), 10) % 11;
  425. if (year < 1985) {
  426. check = check % 10;
  427. }
  428. return (check + '' === value.substr(9, 1));
  429. }
  430. return true;
  431. }
  432. return false;
  433. },
  434. /**
  435. * Validate German VAT number
  436. * Examples:
  437. * - Valid: DE136695976
  438. * - Invalid: DE136695978
  439. *
  440. * @param {String} value VAT number
  441. * @returns {Boolean}
  442. */
  443. _de: function(value) {
  444. if (!/^DE[0-9]{9}$/.test(value)) {
  445. return false;
  446. }
  447. value = value.substr(2);
  448. return $.fn.bootstrapValidator.helpers.mod11And10(value);
  449. },
  450. /**
  451. * Validate Danish VAT number
  452. * Example:
  453. * - Valid: DK13585628
  454. * - Invalid: DK13585627
  455. *
  456. * @param {String} value VAT number
  457. * @returns {Boolean}
  458. */
  459. _dk: function(value) {
  460. if (!/^DK[0-9]{8}$/.test(value)) {
  461. return false;
  462. }
  463. value = value.substr(2);
  464. var sum = 0,
  465. weight = [2, 7, 6, 5, 4, 3, 2, 1];
  466. for (var i = 0; i < 8; i++) {
  467. sum += parseInt(value.charAt(i), 10) * weight[i];
  468. }
  469. return (sum % 11 === 0);
  470. },
  471. /**
  472. * Validate Estonian VAT number
  473. * Examples:
  474. * - Valid: EE100931558, EE100594102
  475. * - Invalid: EE100594103
  476. *
  477. * @param {String} value VAT number
  478. * @returns {Boolean}
  479. */
  480. _ee: function(value) {
  481. if (!/^EE[0-9]{9}$/.test(value)) {
  482. return false;
  483. }
  484. value = value.substr(2);
  485. var sum = 0,
  486. weight = [3, 7, 1, 3, 7, 1, 3, 7, 1];
  487. for (var i = 0; i < 9; i++) {
  488. sum += parseInt(value.charAt(i), 10) * weight[i];
  489. }
  490. return (sum % 10 === 0);
  491. },
  492. /**
  493. * Validate Spanish VAT number (NIF - Número de Identificación Fiscal)
  494. * Can be:
  495. * i) DNI (Documento nacional de identidad), for Spaniards
  496. * ii) NIE (Número de Identificación de Extranjeros), for foreigners
  497. * iii) CIF (Certificado de Identificación Fiscal), for legal entities and others
  498. *
  499. * Examples:
  500. * - Valid: i) ES54362315K; ii) ESX2482300W, ESX5253868R; iii) ESM1234567L, ESJ99216582, ESB58378431, ESB64717838
  501. * - Invalid: i) ES54362315Z; ii) ESX2482300A; iii) ESJ99216583
  502. *
  503. * @param {String} value VAT number
  504. * @returns {Boolean}
  505. */
  506. _es: function(value) {
  507. if (!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {
  508. return false;
  509. }
  510. value = value.substr(2);
  511. var dni = function(value) {
  512. var check = parseInt(value.substr(0, 8), 10);
  513. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  514. return (check + '' === value.substr(8, 1));
  515. },
  516. nie = function(value) {
  517. var check = ['XYZ'.indexOf(value.charAt(0)), value.substr(1)].join('');
  518. check = parseInt(check, 10);
  519. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  520. return (check + '' === value.substr(8, 1));
  521. },
  522. cif = function(value) {
  523. var first = value.charAt(0), check;
  524. if ('KLM'.indexOf(first) !== -1) {
  525. // K: Spanish younger than 14 year old
  526. // L: Spanish living outside Spain without DNI
  527. // M: Granted the tax to foreigners who have no NIE
  528. check = parseInt(value.substr(1, 8), 10);
  529. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  530. return (check + '' === value.substr(8, 1));
  531. } else if ('ABCDEFGHJNPQRSUVW'.indexOf(first) !== -1) {
  532. var sum = 0,
  533. weight = [2, 1, 2, 1, 2, 1, 2],
  534. temp = 0;
  535. for (var i = 0; i < 7; i++) {
  536. temp = parseInt(value.charAt(i + 1), 10) * weight[i];
  537. if (temp > 9) {
  538. temp = Math.floor(temp / 10) + temp % 10;
  539. }
  540. sum += temp;
  541. }
  542. sum = 10 - sum % 10;
  543. return (sum + '' === value.substr(8, 1) || 'JABCDEFGHI'[sum] === value.substr(8, 1));
  544. }
  545. return false;
  546. };
  547. var first = value.charAt(0);
  548. if (/^[0-9]$/.test(first)) {
  549. return dni(value);
  550. } else if (/^[XYZ]$/.test(first)) {
  551. return nie(value);
  552. } else {
  553. return cif(value);
  554. }
  555. },
  556. /**
  557. * Validate Finnish VAT number
  558. * Examples:
  559. * - Valid: FI20774740
  560. * - Invalid: FI20774741
  561. *
  562. * @param {String} value VAT number
  563. * @returns {Boolean}
  564. */
  565. _fi: function(value) {
  566. if (!/^FI[0-9]{8}$/.test(value)) {
  567. return false;
  568. }
  569. value = value.substr(2);
  570. var sum = 0,
  571. weight = [7, 9, 10, 5, 8, 4, 2, 1];
  572. for (var i = 0; i < 8; i++) {
  573. sum += parseInt(value.charAt(i), 10) * weight[i];
  574. }
  575. return (sum % 11 === 0);
  576. },
  577. /**
  578. * Validate French VAT number (TVA - taxe sur la valeur ajoutée)
  579. * It's constructed by a SIREN number, prefixed by two characters.
  580. *
  581. * Examples:
  582. * - Valid: FR40303265045, FR23334175221, FRK7399859412, FR4Z123456782
  583. * - Invalid: FR84323140391
  584. *
  585. * @param {String} value VAT number
  586. * @returns {Boolean}
  587. */
  588. _fr: function(value) {
  589. if (!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(value)) {
  590. return false;
  591. }
  592. value = value.substr(2);
  593. if (!$.fn.bootstrapValidator.helpers.luhn(value.substr(2))) {
  594. return false;
  595. }
  596. if (/^[0-9]{2}$/.test(value.substr(0, 2))) {
  597. // First two characters are digits
  598. return value.substr(0, 2) === (parseInt(value.substr(2) + '12', 10) % 97 + '');
  599. } else {
  600. // The first characters cann't be O and I
  601. var alphabet = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ',
  602. check;
  603. // First one is digit
  604. if (/^[0-9]{1}$/.test(value.charAt(0))) {
  605. check = alphabet.indexOf(value.charAt(0)) * 24 + alphabet.indexOf(value.charAt(1)) - 10;
  606. } else {
  607. check = alphabet.indexOf(value.charAt(0)) * 34 + alphabet.indexOf(value.charAt(1)) - 100;
  608. }
  609. return ((parseInt(value.substr(2), 10) + 1 + Math.floor(check / 11)) % 11) === (check % 11);
  610. }
  611. },
  612. /**
  613. * Validate United Kingdom VAT number
  614. * Example:
  615. * - Valid: GB980780684
  616. * - Invalid: GB802311781
  617. *
  618. * @param {String} value VAT number
  619. * @returns {Boolean}
  620. */
  621. _gb: function(value) {
  622. if (!/^GB[0-9]{9}$/.test(value) /* Standard */
  623. && !/^GB[0-9]{12}$/.test(value) /* Branches */
  624. && !/^GBGD[0-9]{3}$/.test(value) /* Government department */
  625. && !/^GBHA[0-9]{3}$/.test(value) /* Health authority */
  626. && !/^GB(GD|HA)8888[0-9]{5}$/.test(value))
  627. {
  628. return false;
  629. }
  630. value = value.substr(2);
  631. var length = value.length;
  632. if (length === 5) {
  633. var firstTwo = value.substr(0, 2),
  634. lastThree = parseInt(value.substr(2), 10);
  635. return ('GD' === firstTwo && lastThree < 500) || ('HA' === firstTwo && lastThree >= 500);
  636. } else if (length === 11 && ('GD8888' === value.substr(0, 6) || 'HA8888' === value.substr(0, 6))) {
  637. if (('GD' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) >= 500)
  638. || ('HA' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) < 500))
  639. {
  640. return false;
  641. }
  642. return (parseInt(value.substr(6, 3), 10) % 97 === parseInt(value.substr(9, 2), 10));
  643. } else if (length === 9 || length === 12) {
  644. var sum = 0,
  645. weight = [8, 7, 6, 5, 4, 3, 2, 10, 1];
  646. for (var i = 0; i < 9; i++) {
  647. sum += parseInt(value.charAt(i), 10) * weight[i];
  648. }
  649. sum = sum % 97;
  650. if (parseInt(value.substr(0, 3), 10) >= 100) {
  651. return (sum === 0 || sum === 42 || sum === 55);
  652. } else {
  653. return (sum === 0);
  654. }
  655. }
  656. return true;
  657. },
  658. /**
  659. * Validate Greek VAT number
  660. * Examples:
  661. * - Valid: GR023456780, EL094259216
  662. * - Invalid: EL123456781
  663. *
  664. * @param {String} value VAT number
  665. * @returns {Boolean}
  666. */
  667. _gr: function(value) {
  668. if (!/^GR[0-9]{9}$/.test(value)) {
  669. return false;
  670. }
  671. value = value.substr(2);
  672. if (value.length === 8) {
  673. value = '0' + value;
  674. }
  675. var sum = 0,
  676. weight = [256, 128, 64, 32, 16, 8, 4, 2];
  677. for (var i = 0; i < 8; i++) {
  678. sum += parseInt(value.charAt(i), 10) * weight[i];
  679. }
  680. sum = (sum % 11) % 10;
  681. return (sum + '' === value.substr(8, 1));
  682. },
  683. // EL is traditionally prefix of Greek VAT numbers
  684. _el: function(value) {
  685. if (!/^EL[0-9]{9}$/.test(value)) {
  686. return false;
  687. }
  688. value = 'GR' + value.substr(2);
  689. return this._gr(value);
  690. },
  691. /**
  692. * Validate Hungarian VAT number
  693. * Examples:
  694. * - Valid: HU12892312
  695. * - Invalid: HU12892313
  696. *
  697. * @param {String} value VAT number
  698. * @returns {Boolean}
  699. */
  700. _hu: function(value) {
  701. if (!/^HU[0-9]{8}$/.test(value)) {
  702. return false;
  703. }
  704. value = value.substr(2);
  705. var sum = 0,
  706. weight = [9, 7, 3, 1, 9, 7, 3, 1];
  707. for (var i = 0; i < 8; i++) {
  708. sum += parseInt(value.charAt(i), 10) * weight[i];
  709. }
  710. return (sum % 10 === 0);
  711. },
  712. /**
  713. * Validate Croatian VAT number
  714. * Examples:
  715. * - Valid: HR33392005961
  716. * - Invalid: HR33392005962
  717. *
  718. * @param {String} value VAT number
  719. * @returns {Boolean}
  720. */
  721. _hr: function(value) {
  722. if (!/^HR[0-9]{11}$/.test(value)) {
  723. return false;
  724. }
  725. value = value.substr(2);
  726. return $.fn.bootstrapValidator.helpers.mod11And10(value);
  727. },
  728. /**
  729. * Validate Irish VAT number
  730. * Examples:
  731. * - Valid: IE6433435F, IE6433435OA, IE8D79739I
  732. * - Invalid: IE8D79738J
  733. *
  734. * @param {String} value VAT number
  735. * @returns {Boolean}
  736. */
  737. _ie: function(value) {
  738. if (!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {
  739. return false;
  740. }
  741. value = value.substr(2);
  742. var getCheckDigit = function(value) {
  743. while (value.length < 7) {
  744. value = '0' + value;
  745. }
  746. var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',
  747. sum = 0;
  748. for (var i = 0; i < 7; i++) {
  749. sum += parseInt(value.charAt(i), 10) * (8 - i);
  750. }
  751. sum += 9 * alphabet.indexOf(value.substr(7));
  752. return alphabet[sum % 23];
  753. };
  754. // The first 7 characters are digits
  755. if (/^[0-9]+$/.test(value.substr(0, 7))) {
  756. // New system
  757. return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');
  758. } else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ+*'.indexOf(value.charAt(1)) !== -1) {
  759. // Old system
  760. return value.charAt(7) === getCheckDigit(value.substr(2, 5) + value.substr(0, 1) + '');
  761. }
  762. return true;
  763. },
  764. /**
  765. * Validate Icelandic VAT (VSK) number
  766. * Examples:
  767. * - Valid: 12345, 123456
  768. * - Invalid: 1234567
  769. *
  770. * @params {String} value VAT number
  771. * @returns {Boolean}
  772. */
  773. _is: function(value) {
  774. return /^IS\d{5,6}$/.test(value);
  775. },
  776. /**
  777. * Validate Italian VAT number, which consists of 11 digits.
  778. * - First 7 digits are a company identifier
  779. * - Next 3 are the province of residence
  780. * - The last one is a check digit
  781. *
  782. * Examples:
  783. * - Valid: IT00743110157
  784. * - Invalid: IT00743110158
  785. *
  786. * @param {String} value VAT number
  787. * @returns {Boolean}
  788. */
  789. _it: function(value) {
  790. if (!/^IT[0-9]{11}$/.test(value)) {
  791. return false;
  792. }
  793. value = value.substr(2);
  794. if (parseInt(value.substr(0, 7), 10) === 0) {
  795. return false;
  796. }
  797. var lastThree = parseInt(value.substr(7, 3), 10);
  798. if ((lastThree < 1) || (lastThree > 201) && lastThree !== 999 && lastThree !== 888) {
  799. return false;
  800. }
  801. return $.fn.bootstrapValidator.helpers.luhn(value);
  802. },
  803. /**
  804. * Validate Lithuanian VAT number
  805. * It can be:
  806. * - 9 digits, for legal entities
  807. * - 12 digits, for temporarily registered taxpayers
  808. *
  809. * Examples:
  810. * - Valid: LT119511515, LT100001919017, LT100004801610
  811. * - Invalid: LT100001919018
  812. *
  813. * @param {String} value VAT number
  814. * @returns {Boolean}
  815. */
  816. _lt: function(value) {
  817. if (!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {
  818. return false;
  819. }
  820. value = value.substr(2);
  821. var length = value.length,
  822. sum = 0,
  823. i;
  824. for (i = 0; i < length - 1; i++) {
  825. sum += parseInt(value.charAt(i), 10) * (1 + i % 9);
  826. }
  827. var check = sum % 11;
  828. if (check === 10) {
  829. sum = 0;
  830. for (i = 0; i < length - 1; i++) {
  831. sum += parseInt(value.charAt(i), 10) * (1 + (i + 2) % 9);
  832. }
  833. }
  834. check = check % 11 % 10;
  835. return (check + '' === value.charAt(length - 1));
  836. },
  837. /**
  838. * Validate Luxembourg VAT number
  839. * Examples:
  840. * - Valid: LU15027442
  841. * - Invalid: LU15027443
  842. *
  843. * @param {String} value VAT number
  844. * @returns {Boolean}
  845. */
  846. _lu: function(value) {
  847. if (!/^LU[0-9]{8}$/.test(value)) {
  848. return false;
  849. }
  850. value = value.substr(2);
  851. return ((parseInt(value.substr(0, 6), 10) % 89) + '' === value.substr(6, 2));
  852. },
  853. /**
  854. * Validate Latvian VAT number
  855. * Examples:
  856. * - Valid: LV40003521600, LV16117519997
  857. * - Invalid: LV40003521601, LV16137519997
  858. *
  859. * @param {String} value VAT number
  860. * @returns {Boolean}
  861. */
  862. _lv: function(value) {
  863. if (!/^LV[0-9]{11}$/.test(value)) {
  864. return false;
  865. }
  866. value = value.substr(2);
  867. var first = parseInt(value.charAt(0), 10),
  868. sum = 0,
  869. weight = [],
  870. i,
  871. length = value.length;
  872. if (first > 3) {
  873. // Legal entity
  874. sum = 0;
  875. weight = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];
  876. for (i = 0; i < length; i++) {
  877. sum += parseInt(value.charAt(i), 10) * weight[i];
  878. }
  879. sum = sum % 11;
  880. return (sum === 3);
  881. } else {
  882. // Check birth date
  883. var day = parseInt(value.substr(0, 2), 10),
  884. month = parseInt(value.substr(2, 2), 10),
  885. year = parseInt(value.substr(4, 2), 10);
  886. year = year + 1800 + parseInt(value.charAt(6), 10) * 100;
  887. if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
  888. return false;
  889. }
  890. // Check personal code
  891. sum = 0;
  892. weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];
  893. for (i = 0; i < length - 1; i++) {
  894. sum += parseInt(value.charAt(i), 10) * weight[i];
  895. }
  896. sum = (sum + 1) % 11 % 10;
  897. return (sum + '' === value.charAt(length - 1));
  898. }
  899. },
  900. /**
  901. * Validate Maltese VAT number
  902. * Examples:
  903. * - Valid: MT11679112
  904. * - Invalid: MT11679113
  905. *
  906. * @param {String} value VAT number
  907. * @returns {Boolean}
  908. */
  909. _mt: function(value) {
  910. if (!/^MT[0-9]{8}$/.test(value)) {
  911. return false;
  912. }
  913. value = value.substr(2);
  914. var sum = 0,
  915. weight = [3, 4, 6, 7, 8, 9, 10, 1];
  916. for (var i = 0; i < 8; i++) {
  917. sum += parseInt(value.charAt(i), 10) * weight[i];
  918. }
  919. return (sum % 37 === 0);
  920. },
  921. /**
  922. * Validate Dutch VAT number
  923. * Examples:
  924. * - Valid: NL004495445B01
  925. * - Invalid: NL123456789B90
  926. *
  927. * @param {String} value VAT number
  928. * @returns {Boolean}
  929. */
  930. _nl: function(value) {
  931. if (!/^NL[0-9]{9}B[0-9]{2}$/.test(value)) {
  932. return false;
  933. }
  934. value = value.substr(2);
  935. var sum = 0,
  936. weight = [9, 8, 7, 6, 5, 4, 3, 2];
  937. for (var i = 0; i < 8; i++) {
  938. sum += parseInt(value.charAt(i), 10) * weight[i];
  939. }
  940. sum = sum % 11;
  941. if (sum > 9) {
  942. sum = 0;
  943. }
  944. return (sum + '' === value.substr(8, 1));
  945. },
  946. /**
  947. * Validate Norwegian VAT number
  948. *
  949. * @see http://www.brreg.no/english/coordination/number.html
  950. * @param {String} value VAT number
  951. * @returns {Boolean}
  952. */
  953. _no: function(value) {
  954. if (!/^NO[0-9]{9}$/.test(value)) {
  955. return false;
  956. }
  957. value = value.substr(2);
  958. var sum = 0,
  959. weight = [3, 2, 7, 6, 5, 4, 3, 2];
  960. for (var i = 0; i < 8; i++) {
  961. sum += parseInt(value.charAt(i), 10) * weight[i];
  962. }
  963. sum = 11 - sum % 11;
  964. if (sum === 11) {
  965. sum = 0;
  966. }
  967. return (sum + '' === value.substr(8, 1));
  968. },
  969. /**
  970. * Validate Polish VAT number
  971. * Examples:
  972. * - Valid: PL8567346215
  973. * - Invalid: PL8567346216
  974. *
  975. * @param {String} value VAT number
  976. * @returns {Boolean}
  977. */
  978. _pl: function(value) {
  979. if (!/^PL[0-9]{10}$/.test(value)) {
  980. return false;
  981. }
  982. value = value.substr(2);
  983. var sum = 0,
  984. weight = [6, 5, 7, 2, 3, 4, 5, 6, 7, -1];
  985. for (var i = 0; i < 10; i++) {
  986. sum += parseInt(value.charAt(i), 10) * weight[i];
  987. }
  988. return (sum % 11 === 0);
  989. },
  990. /**
  991. * Validate Portuguese VAT number
  992. * Examples:
  993. * - Valid: PT501964843
  994. * - Invalid: PT501964842
  995. *
  996. * @param {String} value VAT number
  997. * @returns {Boolean}
  998. */
  999. _pt: function(value) {
  1000. if (!/^PT[0-9]{9}$/.test(value)) {
  1001. return false;
  1002. }
  1003. value = value.substr(2);
  1004. var sum = 0,
  1005. weight = [9, 8, 7, 6, 5, 4, 3, 2];
  1006. for (var i = 0; i < 8; i++) {
  1007. sum += parseInt(value.charAt(i), 10) * weight[i];
  1008. }
  1009. sum = 11 - sum % 11;
  1010. if (sum > 9) {
  1011. sum = 0;
  1012. }
  1013. return (sum + '' === value.substr(8, 1));
  1014. },
  1015. /**
  1016. * Validate Romanian VAT number
  1017. * Examples:
  1018. * - Valid: RO18547290
  1019. * - Invalid: RO18547291
  1020. *
  1021. * @param {String} value VAT number
  1022. * @returns {Boolean}
  1023. */
  1024. _ro: function(value) {
  1025. if (!/^RO[1-9][0-9]{1,9}$/.test(value)) {
  1026. return false;
  1027. }
  1028. value = value.substr(2);
  1029. var length = value.length,
  1030. weight = [7, 5, 3, 2, 1, 7, 5, 3, 2].slice(10 - length),
  1031. sum = 0;
  1032. for (var i = 0; i < length - 1; i++) {
  1033. sum += parseInt(value.charAt(i), 10) * weight[i];
  1034. }
  1035. sum = (10 * sum) % 11 % 10;
  1036. return (sum + '' === value.substr(length - 1, 1));
  1037. },
  1038. /**
  1039. * Validate Russian VAT number (Taxpayer Identification Number - INN)
  1040. *
  1041. * @param {String} value VAT number
  1042. * @returns {Boolean}
  1043. */
  1044. _ru: function(value) {
  1045. if (!/^RU([0-9]{9}|[0-9]{12})$/.test(value)) {
  1046. return false;
  1047. }
  1048. value = value.substr(2);
  1049. var i = 0;
  1050. if (value.length === 10) {
  1051. var sum = 0,
  1052. weight = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
  1053. for (i = 0; i < 10; i++) {
  1054. sum += parseInt(value.charAt(i), 10) * weight[i];
  1055. }
  1056. sum = sum % 11;
  1057. if (sum > 9) {
  1058. sum = sum % 10;
  1059. }
  1060. return (sum + '' === value.substr(9, 1));
  1061. } else if (value.length === 12) {
  1062. var sum1 = 0,
  1063. weight1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],
  1064. sum2 = 0,
  1065. weight2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
  1066. for (i = 0; i < 11; i++) {
  1067. sum1 += parseInt(value.charAt(i), 10) * weight1[i];
  1068. sum2 += parseInt(value.charAt(i), 10) * weight2[i];
  1069. }
  1070. sum1 = sum1 % 11;
  1071. if (sum1 > 9) {
  1072. sum1 = sum1 % 10;
  1073. }
  1074. sum2 = sum2 % 11;
  1075. if (sum2 > 9) {
  1076. sum2 = sum2 % 10;
  1077. }
  1078. return (sum1 + '' === value.substr(10, 1) && sum2 + '' === value.substr(11, 1));
  1079. }
  1080. return false;
  1081. },
  1082. /**
  1083. * Validate Serbian VAT number
  1084. *
  1085. * @param {String} value VAT number
  1086. * @returns {Boolean}
  1087. */
  1088. _rs: function(value) {
  1089. if (!/^RS[0-9]{9}$/.test(value)) {
  1090. return false;
  1091. }
  1092. value = value.substr(2);
  1093. var sum = 10,
  1094. temp = 0;
  1095. for (var i = 0; i < 8; i++) {
  1096. temp = (parseInt(value.charAt(i), 10) + sum) % 10;
  1097. if (temp === 0) {
  1098. temp = 10;
  1099. }
  1100. sum = (2 * temp) % 11;
  1101. }
  1102. return ((sum + parseInt(value.substr(8, 1), 10)) % 10 === 1);
  1103. },
  1104. /**
  1105. * Validate Swedish VAT number
  1106. * Examples:
  1107. * - Valid: SE123456789701
  1108. * - Invalid: SE123456789101
  1109. *
  1110. * @param {String} value VAT number
  1111. * @returns {Boolean}
  1112. */
  1113. _se: function(value) {
  1114. if (!/^SE[0-9]{10}01$/.test(value)) {
  1115. return false;
  1116. }
  1117. value = value.substr(2, 10);
  1118. return $.fn.bootstrapValidator.helpers.luhn(value);
  1119. },
  1120. /**
  1121. * Validate Slovenian VAT number
  1122. * Examples:
  1123. * - Valid: SI50223054
  1124. * - Invalid: SI50223055
  1125. *
  1126. * @param {String} value VAT number
  1127. * @returns {Boolean}
  1128. */
  1129. _si: function(value) {
  1130. if (!/^SI[0-9]{8}$/.test(value)) {
  1131. return false;
  1132. }
  1133. value = value.substr(2);
  1134. var sum = 0,
  1135. weight = [8, 7, 6, 5, 4, 3, 2];
  1136. for (var i = 0; i < 7; i++) {
  1137. sum += parseInt(value.charAt(i), 10) * weight[i];
  1138. }
  1139. sum = 11 - sum % 11;
  1140. if (sum === 10) {
  1141. sum = 0;
  1142. }
  1143. return (sum + '' === value.substr(7, 1));
  1144. },
  1145. /**
  1146. * Validate Slovak VAT number
  1147. * Examples:
  1148. * - Valid: SK2022749619
  1149. * - Invalid: SK2022749618
  1150. *
  1151. * @param {String} value VAT number
  1152. * @returns {Boolean}
  1153. */
  1154. _sk: function(value) {
  1155. if (!/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {
  1156. return false;
  1157. }
  1158. return (parseInt(value.substr(2), 10) % 11 === 0);
  1159. },
  1160. /**
  1161. * Validate South African VAT number
  1162. * Examples:
  1163. * - Valid: 4012345678
  1164. * - Invalid: 40123456789, 3012345678
  1165. *
  1166. * @params {String} value VAT number
  1167. * @returns {Boolean}
  1168. */
  1169. _za: function(value) {
  1170. return /^ZA4\d{9}$/.test(value);
  1171. }
  1172. };
  1173. }(window.jQuery));