vat.js 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  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. return $.fn.bootstrapValidator.helpers.mod_11_10(value);
  333. },
  334. /**
  335. * Validate Danish VAT number
  336. * Example:
  337. * - Valid: DK13585628
  338. * - Invalid: DK13585627
  339. *
  340. * @param {String} value VAT number
  341. * @returns {Boolean}
  342. */
  343. _dk: function(value) {
  344. if (!/^DK[0-9]{8}$/.test(value)) {
  345. return false;
  346. }
  347. value = value.substr(2);
  348. var sum = 0,
  349. weight = [2, 7, 6, 5, 4, 3, 2, 1];
  350. for (var i = 0; i < 8; i++) {
  351. sum += parseInt(value.charAt(i), 10) * weight[i];
  352. }
  353. return (sum % 11 == 0);
  354. },
  355. /**
  356. * Validate Estonian VAT number
  357. * Examples:
  358. * - Valid: EE100931558, EE100594102
  359. * - Invalid: EE100594103
  360. *
  361. * @param {String} value VAT number
  362. * @returns {Boolean}
  363. */
  364. _ee: function(value) {
  365. if (!/^EE[0-9]{9}$/.test(value)) {
  366. return false;
  367. }
  368. value = value.substr(2);
  369. var sum = 0,
  370. weight = [3, 7, 1, 3, 7, 1, 3, 7, 1];
  371. for (var i = 0; i < 9; i++) {
  372. sum += parseInt(value.charAt(i)) * weight[i];
  373. }
  374. return (sum % 10 == 0);
  375. },
  376. /**
  377. * Validate Spanish VAT number (NIF - Número de Identificación Fiscal)
  378. * Can be:
  379. * i) DNI (Documento nacional de identidad), for Spaniards
  380. * ii) NIE (Número de Identificación de Extranjeros), for foreigners
  381. * iii) CIF (Certificado de Identificación Fiscal), for legal entities and others
  382. *
  383. * Examples:
  384. * - Valid: i) ES54362315K; ii) ESX2482300W, ESX5253868R; iii) ESM1234567L, ESJ99216582, ESB58378431, ESB64717838
  385. * - Invalid: i) ES54362315Z; ii) ESX2482300A; iii) ESJ99216583
  386. *
  387. * @param {String} value VAT number
  388. * @returns {Boolean}
  389. */
  390. _es: function(value) {
  391. if (!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {
  392. return false;
  393. }
  394. value = value.substr(2);
  395. var dni = function(value) {
  396. var check = parseInt(value.substr(0, 8), 10);
  397. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  398. return (check == value.substr(8, 1));
  399. },
  400. nie = function(value) {
  401. var check = ['XYZ'.indexOf(value.charAt(0)), value.substr(1)].join('');
  402. check = parseInt(check, 10);
  403. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  404. return (check == value.substr(8, 1));
  405. },
  406. cif = function(value) {
  407. var first = value.charAt(0), check;
  408. if ('KLM'.indexOf(first) != -1) {
  409. // K: Spanish younger than 14 year old
  410. // L: Spanish living outside Spain without DNI
  411. // M: Granted the tax to foreigners who have no NIE
  412. check = parseInt(value.substr(1, 8), 10);
  413. check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
  414. return (check == value.substr(8, 1));
  415. } else if ('ABCDEFGHJNPQRSUVW'.indexOf(first) != -1) {
  416. var sum = 0,
  417. weight = [2, 1, 2, 1, 2, 1, 2],
  418. temp = 0;
  419. for (var i = 0; i < 7; i++) {
  420. temp = parseInt(value.charAt(i + 1)) * weight[i];
  421. if (temp > 9) {
  422. temp = Math.floor(temp / 10) + temp % 10;
  423. }
  424. sum += temp;
  425. }
  426. sum = 10 - sum % 10;
  427. return (sum == value.substr(8, 1) || 'JABCDEFGHI'[sum] == value.substr(8, 1));
  428. }
  429. return false;
  430. };
  431. var first = value.charAt(0);
  432. if (/^[0-9]$/.test(first)) {
  433. return dni(value);
  434. } else if (/^[XYZ]$/.test(first)) {
  435. return nie(value);
  436. } else {
  437. return cif(value);
  438. }
  439. },
  440. /**
  441. * Validate Finnish VAT number
  442. * Examples:
  443. * - Valid: FI20774740
  444. * - Invalid: FI20774741
  445. *
  446. * @param {String} value VAT number
  447. * @returns {Boolean}
  448. */
  449. _fi: function(value) {
  450. if (!/^FI[0-9]{8}$/.test(value)) {
  451. return false;
  452. }
  453. value = value.substr(2);
  454. var sum = 0,
  455. weight = [7, 9, 10, 5, 8, 4, 2, 1];
  456. for (var i = 0; i < 8; i++) {
  457. sum += parseInt(value.charAt(i)) * weight[i];
  458. }
  459. return (sum % 11 == 0);
  460. },
  461. /**
  462. * Validate French VAT number (TVA - taxe sur la valeur ajoutée)
  463. * It's constructed by a SIREN number, prefixed by two characters.
  464. *
  465. * Examples:
  466. * - Valid: FR40303265045, FR23334175221, FRK7399859412, FR4Z123456782
  467. * - Invalid: FR84323140391
  468. *
  469. * @param {String} value VAT number
  470. * @returns {Boolean}
  471. */
  472. _fr: function(value) {
  473. if (!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(value)) {
  474. return false;
  475. }
  476. value = value.substr(2);
  477. if (!$.fn.bootstrapValidator.helpers.luhn(value.substr(2))) {
  478. return false;
  479. }
  480. if (/^[0-9]{2}$/.test(value.substr(0, 2))) {
  481. // First two characters are digits
  482. return value.substr(0, 2) == (parseInt(value.substr(2) + '12', 10) % 97);
  483. } else {
  484. // The first characters cann't be O and I
  485. var alphabet = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ',
  486. check;
  487. // First one is digit
  488. if (/^[0-9]{1}$/.test(value.charAt(0))) {
  489. check = alphabet.indexOf(value.charAt(0)) * 24 + alphabet.indexOf(value.charAt(1)) - 10;
  490. } else {
  491. check = alphabet.indexOf(value.charAt(0)) * 34 + alphabet.indexOf(value.charAt(1)) - 100;
  492. }
  493. return ((parseInt(value.substr(2), 10) + 1 + Math.floor(check / 11)) % 11) == (check % 11);
  494. }
  495. },
  496. /**
  497. * Validate United Kingdom VAT number
  498. * Example:
  499. * - Valid: GB980780684
  500. * - Invalid: GB802311781
  501. *
  502. * @param {String} value VAT number
  503. * @returns {Boolean}
  504. */
  505. _gb: function(value) {
  506. if (!/^GB[0-9]{9}$/.test(value) // Standard
  507. && !/^GB[0-9]{12}$/.test(value) // Branches
  508. && !/^GBGD[0-9]{3}$/.test(value) // Government department
  509. && !/^GBHA[0-9]{3}$/.test(value) // Health authority
  510. && !/^GB(GD|HA)8888[0-9]{5}$/.test(value))
  511. {
  512. return false;
  513. }
  514. value = value.substr(2);
  515. var length = value.length;
  516. if (length == 5) {
  517. var firstTwo = value.substr(0, 2),
  518. lastThree = parseInt(value.substr(2));
  519. return ('GD' == firstTwo && lastThree < 500) || ('HA' == firstTwo && lastThree >= 500);
  520. } else if (length == 11 && ('GD8888' == value.substr(0, 6) || 'HA8888' == value.substr(0, 6))) {
  521. if (('GD' == value.substr(0, 2) && parseInt(value.substr(6, 3)) >= 500)
  522. || ('HA' == value.substr(0, 2) && parseInt(value.substr(6, 3)) < 500))
  523. {
  524. return false;
  525. }
  526. return (parseInt(value.substr(6, 3)) % 97 == parseInt(value.substr(9, 2)));
  527. } else if (length == 9 || length == 12) {
  528. var sum = 0,
  529. weight = [8, 7, 6, 5, 4, 3, 2, 10, 1];
  530. for (var i = 0; i < 9; i++) {
  531. sum += parseInt(value.charAt(i)) * weight[i];
  532. }
  533. sum = sum % 97;
  534. if (parseInt(value.substr(0, 3)) >= 100) {
  535. return (sum == 0 || sum == 42 || sum == 55);
  536. } else {
  537. return (sum == 0);
  538. }
  539. }
  540. return true;
  541. },
  542. /**
  543. * Validate Greek VAT number
  544. * Examples:
  545. * - Valid: GR023456780, EL094259216
  546. * - Invalid: EL123456781
  547. *
  548. * @param {String} value VAT number
  549. * @returns {Boolean}
  550. */
  551. _gr: function(value) {
  552. if (!/^GR[0-9]{9}$/.test(value)) {
  553. return false;
  554. }
  555. value = value.substr(2);
  556. if (value.length == 8) {
  557. value = '0' + value;
  558. }
  559. var sum = 0,
  560. weight = [256, 128, 64, 32, 16, 8, 4, 2];
  561. for (var i = 0; i < 8; i++) {
  562. sum += parseInt(value.charAt(i)) * weight[i];
  563. }
  564. sum = (sum % 11) % 10;
  565. return (sum == value.substr(8, 1));
  566. },
  567. // EL is traditionally prefix of Greek VAT numbers
  568. _el: function(value) {
  569. if (!/^EL[0-9]{9}$/.test(value)) {
  570. return false;
  571. }
  572. value = 'GR' + value.substr(2);
  573. return this._gr(value);
  574. },
  575. /**
  576. * Validate Hungarian VAT number
  577. * Examples:
  578. * - Valid: HU12892312
  579. * - Invalid: HU12892313
  580. *
  581. * @param {String} value VAT number
  582. * @returns {Boolean}
  583. */
  584. _hu: function(value) {
  585. if (!/^HU[0-9]{8}$/.test(value)) {
  586. return false;
  587. }
  588. value = value.substr(2);
  589. var sum = 0,
  590. weight = [9, 7, 3, 1, 9, 7, 3, 1];
  591. for (var i = 0; i < 8; i++) {
  592. sum += parseInt(value.charAt(i)) * weight[i];
  593. }
  594. return (sum % 10 == 0);
  595. },
  596. /**
  597. * Validate Croatian VAT number
  598. * Examples:
  599. * - Valid: HR33392005961
  600. * - Invalid: HR33392005962
  601. *
  602. * @param {String} value VAT number
  603. * @returns {Boolean}
  604. */
  605. _hr: function(value) {
  606. if (!/^HR[0-9]{11}$/.test(value)) {
  607. return false;
  608. }
  609. value = value.substr(2);
  610. return $.fn.bootstrapValidator.helpers.mod_11_10(value);
  611. },
  612. /**
  613. * Validate Irish VAT number
  614. * Examples:
  615. * - Valid: IE6433435F, IE6433435OA, IE8D79739I
  616. * - Invalid: IE8D79738J
  617. *
  618. * @param {String} value VAT number
  619. * @returns {Boolean}
  620. */
  621. _ie: function(value) {
  622. if (!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {
  623. return false;
  624. }
  625. value = value.substr(2);
  626. var getCheckDigit = function(value) {
  627. while (value.length < 7) {
  628. value = '0' + value;
  629. }
  630. var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',
  631. sum = 0;
  632. for (var i = 0; i < 7; i++) {
  633. sum += parseInt(value.charAt(i)) * (8 - i);
  634. }
  635. sum += 9 * alphabet.indexOf(value.substr(7));
  636. return alphabet[sum % 23];
  637. };
  638. // The first 7 characters are digits
  639. if (/^[0-9]+$/.test(value.substr(0, 7))) {
  640. // New system
  641. return value.charAt(7) == getCheckDigit(value.substr(0, 7) + value.substr(8) + '');
  642. } else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ+*'.indexOf(value.charAt(1)) != -1) {
  643. // Old system
  644. return value.charAt(7) == getCheckDigit(value.substr(2, 5) + value.substr(0, 1) + '');
  645. }
  646. return true;
  647. },
  648. /**
  649. * Validate Italian VAT number, which consists of 11 digits.
  650. * - First 7 digits are a company identifier
  651. * - Next 3 are the province of residence
  652. * - The last one is a check digit
  653. *
  654. * Examples:
  655. * - Valid: IT00743110157
  656. * - Invalid: IT00743110158
  657. *
  658. * @param {String} value VAT number
  659. * @returns {Boolean}
  660. */
  661. _it: function(value) {
  662. if (!/^IT[0-9]{11}$/.test(value)) {
  663. return false;
  664. }
  665. value = value.substr(2);
  666. if (parseInt(value.substr(0, 7)) == 0) {
  667. return false;
  668. }
  669. var lastThree = parseInt(value.substr(7, 3));
  670. if ((lastThree < 1) || (lastThree > 201) && lastThree != 999 && lastThree != 888) {
  671. return false;
  672. }
  673. return $.fn.bootstrapValidator.helpers.luhn(value);
  674. },
  675. /**
  676. * Validate Lithuanian VAT number
  677. * It can be:
  678. * - 9 digits, for legal entities
  679. * - 12 digits, for temporarily registered taxpayers
  680. *
  681. * Examples:
  682. * - Valid: LT119511515, LT100001919017, LT100004801610
  683. * - Invalid: LT100001919018
  684. *
  685. * @param {String} value VAT number
  686. * @returns {Boolean}
  687. */
  688. _lt: function(value) {
  689. if (!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {
  690. return false;
  691. }
  692. value = value.substr(2);
  693. var length = value.length,
  694. sum = 0;
  695. for (var i = 0; i < length - 1; i++) {
  696. sum += parseInt(value.charAt(i)) * (1 + i % 9);
  697. }
  698. var check = sum % 11;
  699. if (check == 10) {
  700. sum = 0;
  701. for (var i = 0; i < length - 1; i++) {
  702. sum += parseInt(value.charAt(i)) * (1 + (i + 2) % 9);
  703. }
  704. }
  705. check = check % 11 % 10;
  706. return (check == value.charAt(length - 1));
  707. },
  708. /**
  709. * Validate Luxembourg VAT number
  710. * Examples:
  711. * - Valid: LU15027442
  712. * - Invalid: LU15027443
  713. *
  714. * @param {String} value VAT number
  715. * @returns {Boolean}
  716. */
  717. _lu: function(value) {
  718. if (!/^LU[0-9]{8}$/.test(value)) {
  719. return false;
  720. }
  721. value = value.substr(2);
  722. return (value.substr(0, 6) % 89 == value.substr(6, 2));
  723. },
  724. /**
  725. * Validate Latvian VAT number
  726. * Examples:
  727. * - Valid: LV40003521600, LV16117519997
  728. * - Invalid: LV40003521601, LV16137519997
  729. *
  730. * @param {String} value VAT number
  731. * @returns {Boolean}
  732. */
  733. _lv: function(value) {
  734. if (!/^LV[0-9]{11}$/.test(value)) {
  735. return false;
  736. }
  737. value = value.substr(2);
  738. var first = parseInt(value.charAt(0)),
  739. sum = 0,
  740. weight = [],
  741. i = 0,
  742. length = value.length;
  743. if (first > 3) {
  744. // Legal entity
  745. sum = 0;
  746. weight = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];
  747. for (i = 0; i < length; i++) {
  748. sum += parseInt(value.charAt(i)) * weight[i];
  749. }
  750. sum = sum % 11;
  751. return (sum == 3);
  752. } else {
  753. // Check birth date
  754. var day = parseInt(value.substr(0, 2)),
  755. month = parseInt(value.substr(2, 2)),
  756. year = parseInt(value.substr(4, 2));
  757. year = year + 1800 + parseInt(value.charAt(6)) * 100;
  758. try {
  759. var d = new Date(year, month, day);
  760. } catch (ex) {
  761. return false;
  762. }
  763. // Check personal code
  764. sum = 0;
  765. weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];
  766. for (i = 0; i < length - 1; i++) {
  767. sum += parseInt(value.charAt(i)) * weight[i];
  768. }
  769. sum = (sum + 1) % 11 % 10;
  770. return (sum == value.charAt(length - 1));
  771. }
  772. return true;
  773. },
  774. /**
  775. * Validate Maltese VAT number
  776. * Examples:
  777. * - Valid: MT11679112
  778. * - Invalid: MT11679113
  779. *
  780. * @param {String} value VAT number
  781. * @returns {Boolean}
  782. */
  783. _mt: function(value) {
  784. if (!/^MT[0-9]{8}$/.test(value)) {
  785. return false;
  786. }
  787. value = value.substr(2);
  788. var sum = 0,
  789. weight = [3, 4, 6, 7, 8, 9, 10, 1];
  790. for (var i = 0; i < 8; i++) {
  791. sum += parseInt(value.charAt(i)) * weight[i];
  792. }
  793. return (sum % 37 == 0);
  794. },
  795. /**
  796. * Validate Dutch VAT number
  797. * Examples:
  798. * - Valid: NL004495445B01
  799. * - Invalid: NL123456789B90
  800. *
  801. * @param {String} value VAT number
  802. * @returns {Boolean}
  803. */
  804. _nl: function(value) {
  805. if (!/^NL[0-9]{9}B[0-9]{2}$/.test(value)) {
  806. return false;
  807. }
  808. value = value.substr(2);
  809. var sum = 0,
  810. weight = [9, 8, 7, 6, 5, 4, 3, 2];
  811. for (var i = 0; i < 8; i++) {
  812. sum += parseInt(value.charAt(i)) * weight[i];
  813. }
  814. sum = sum % 11;
  815. if (sum > 9) {
  816. sum = 0;
  817. }
  818. return (sum == value.substr(8, 1));
  819. },
  820. /**
  821. * Validate Norwegian VAT number
  822. *
  823. * @see http://www.brreg.no/english/coordination/number.html
  824. * @param {String} value VAT number
  825. * @returns {Boolean}
  826. */
  827. _no: function(value) {
  828. if (!/^NO[0-9]{9}$/.test(value)) {
  829. return false;
  830. }
  831. value = value.substr(2);
  832. var sum = 0,
  833. weight = [3, 2, 7, 6, 5, 4, 3, 2];
  834. for (var i = 0; i < 8; i++) {
  835. sum += parseInt(value.charAt(i)) * weight[i];
  836. }
  837. sum = 11 - sum % 11;
  838. if (sum == 11) {
  839. sum = 0;
  840. }
  841. return (sum == value.substr(8, 1));
  842. },
  843. /**
  844. * Validate Polish VAT number
  845. * Examples:
  846. * - Valid: PL8567346215
  847. * - Invalid: PL8567346216
  848. *
  849. * @param {String} value VAT number
  850. * @returns {Boolean}
  851. */
  852. _pl: function(value) {
  853. if (!/^PL[0-9]{10}$/.test(value)) {
  854. return false;
  855. }
  856. value = value.substr(2);
  857. var sum = 0,
  858. weight = [6, 5, 7, 2, 3, 4, 5, 6, 7, -1];
  859. for (var i = 0; i < 10; i++) {
  860. sum += parseInt(value.charAt(i)) * weight[i];
  861. }
  862. return (sum % 11 == 0);
  863. },
  864. /**
  865. * Validate Portuguese VAT number
  866. * Examples:
  867. * - Valid: PT501964843
  868. * - Invalid: PT501964842
  869. *
  870. * @param {String} value VAT number
  871. * @returns {Boolean}
  872. */
  873. _pt: function(value) {
  874. if (!/^PT[0-9]{9}$/.test(value)) {
  875. return false;
  876. }
  877. value = value.substr(2);
  878. var sum = 0,
  879. weight = [9, 8, 7, 6, 5, 4, 3, 2];
  880. for (var i = 0; i < 8; i++) {
  881. sum += parseInt(value.charAt(i)) * weight[i];
  882. }
  883. sum = 11 - sum % 11;
  884. if (sum > 9) {
  885. sum = 0;
  886. }
  887. return (sum == value.substr(8, 1));
  888. },
  889. /**
  890. * Validate Romanian VAT number
  891. * Examples:
  892. * - Valid: RO18547290
  893. * - Invalid: RO18547291
  894. *
  895. * @param {String} value VAT number
  896. * @returns {Boolean}
  897. */
  898. _ro: function(value) {
  899. if (!/^RO[1-9][0-9]{1,9}$/.test(value)) {
  900. return false;
  901. }
  902. value = value.substr(2);
  903. var length = value.length,
  904. weight = [7, 5, 3, 2, 1, 7, 5, 3, 2].slice(10 - length),
  905. sum = 0;
  906. for (var i = 0; i < length - 1; i++) {
  907. sum += parseInt(value.charAt(i)) * weight[i];
  908. }
  909. sum = (10 * sum) % 11 % 10;
  910. return (sum == value.substr(length - 1, 1));
  911. },
  912. /**
  913. * Validate Russian VAT number (Taxpayer Identification Number - INN)
  914. *
  915. * @param {String} value VAT number
  916. * @returns {Boolean}
  917. */
  918. _ru: function(value) {
  919. if (!/^RU([0-9]{9}|[0-9]{12})$/.test(value)) {
  920. return false;
  921. }
  922. value = value.substr(2);
  923. if (value.length == 10) {
  924. var sum = 0,
  925. weight = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
  926. for (var i = 0; i < 10; i++) {
  927. sum += parseInt(value.charAt(i)) * weight[i];
  928. }
  929. sum = sum % 11;
  930. if (sum > 9) {
  931. sum = sum % 10;
  932. }
  933. return (sum == value.substr(9, 1));
  934. } else if (value.length == 12) {
  935. var sum1 = 0,
  936. weight1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],
  937. sum2 = 0,
  938. weight2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
  939. for (var i = 0; i < 11; i++) {
  940. sum1 += parseInt(value.charAt(i)) * weight1[i];
  941. sum2 += parseInt(value.charAt(i)) * weight2[i];
  942. }
  943. sum1 = sum1 % 11;
  944. if (sum1 > 9) {
  945. sum1 = sum1 % 10;
  946. }
  947. sum2 = sum2 % 11;
  948. if (sum2 > 9) {
  949. sum2 = sum2 % 10;
  950. }
  951. return (sum1 == value.substr(10, 1) && sum2 == value.substr(11, 1));
  952. }
  953. return false;
  954. },
  955. /**
  956. * Validate Serbian VAT number
  957. *
  958. * @param {String} value VAT number
  959. * @returns {Boolean}
  960. */
  961. _rs: function(value) {
  962. if (!/^RS[0-9]{9}$/.test(value)) {
  963. return false;
  964. }
  965. value = value.substr(2);
  966. var sum = 10,
  967. temp = 0;
  968. for (var i = 0; i < 8; i++) {
  969. temp = (parseInt(value.charAt(i)) + sum) % 10;
  970. if (temp == 0) {
  971. temp = 10;
  972. }
  973. sum = (2 * temp) % 11;
  974. }
  975. return ((sum + parseInt(value.substr(8, 1))) % 10 == 1);
  976. },
  977. /**
  978. * Validate Swedish VAT number
  979. * Examples:
  980. * - Valid: SE123456789701
  981. * - Invalid: SE123456789101
  982. *
  983. * @param {String} value VAT number
  984. * @returns {Boolean}
  985. */
  986. _se: function(value) {
  987. if (!/^SE[0-9]{10}01$/.test(value)) {
  988. return false;
  989. }
  990. value = value.substr(2, 10);
  991. return $.fn.bootstrapValidator.helpers.luhn(value);
  992. },
  993. /**
  994. * Validate Slovenian VAT number
  995. * Examples:
  996. * - Valid: SI50223054
  997. * - Invalid: SI50223055
  998. *
  999. * @param {String} value VAT number
  1000. * @returns {Boolean}
  1001. */
  1002. _si: function(value) {
  1003. if (!/^SI[0-9]{8}$/.test(value)) {
  1004. return false;
  1005. }
  1006. value = value.substr(2);
  1007. var sum = 0,
  1008. weight = [8, 7, 6, 5, 4, 3, 2];
  1009. for (var i = 0; i < 7; i++) {
  1010. sum += parseInt(value.charAt(i)) * weight[i];
  1011. }
  1012. sum = 11 - sum % 11;
  1013. if (sum == 10) {
  1014. sum = 0;
  1015. }
  1016. return (sum == value.substr(7, 1));
  1017. },
  1018. /**
  1019. * Validate Slovak VAT number
  1020. * Examples:
  1021. * - Valid: SK2022749619
  1022. * - Invalid: SK2022749618
  1023. *
  1024. * @param {String} value VAT number
  1025. * @returns {Boolean}
  1026. */
  1027. _sk: function(value) {
  1028. if (!/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {
  1029. return false;
  1030. }
  1031. value = value.substr(2);
  1032. return (value % 11 == 0);
  1033. }
  1034. };
  1035. }(window.jQuery));