vat.js 37 KB

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