vat.js 36 KB

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