Browse Source

#724: Add Venezuelan VAT number (RIF) validator, thanks to @paquitodev

Phuoc Nguyen 11 years ago
parent
commit
2adba0da88
57 changed files with 182 additions and 85 deletions
  1. 1 0
      CHANGELOG.md
  2. 1 0
      CONTRIBUTORS.md
  3. 1 1
      dist/css/bootstrapValidator.min.css
  4. 42 2
      dist/js/bootstrapValidator.js
  5. 2 2
      dist/js/bootstrapValidator.min.js
  6. 1 0
      dist/js/language/ar_MA.js
  7. 1 0
      dist/js/language/be_FR.js
  8. 1 0
      dist/js/language/be_NL.js
  9. 1 0
      dist/js/language/bg_BG.js
  10. 1 0
      dist/js/language/cs_CZ.js
  11. 1 0
      dist/js/language/da_DK.js
  12. 1 0
      dist/js/language/de_DE.js
  13. 1 0
      dist/js/language/en_US.js
  14. 1 0
      dist/js/language/es_CL.js
  15. 1 0
      dist/js/language/es_ES.js
  16. 1 0
      dist/js/language/fa_IR.js
  17. 1 0
      dist/js/language/fr_FR.js
  18. 1 0
      dist/js/language/gr_EL.js
  19. 1 0
      dist/js/language/hu_HU.js
  20. 1 0
      dist/js/language/it_IT.js
  21. 1 0
      dist/js/language/ja_JP.js
  22. 1 0
      dist/js/language/nl_NL.js
  23. 1 0
      dist/js/language/pl_PL.js
  24. 1 0
      dist/js/language/pt_BR.js
  25. 1 0
      dist/js/language/sv_SE.js
  26. 1 0
      dist/js/language/tr_TR.js
  27. 1 0
      dist/js/language/vi_VN.js
  28. 1 0
      dist/js/language/zh_CN.js
  29. 1 0
      dist/js/language/zh_TW.js
  30. 1 0
      src/js/language/ar_MA.js
  31. 1 0
      src/js/language/be_FR.js
  32. 1 0
      src/js/language/be_NL.js
  33. 1 0
      src/js/language/bg_BG.js
  34. 1 0
      src/js/language/cs_CZ.js
  35. 1 0
      src/js/language/da_DK.js
  36. 1 0
      src/js/language/de_DE.js
  37. 1 0
      src/js/language/en_US.js
  38. 1 0
      src/js/language/es_CL.js
  39. 1 3
      src/js/language/es_ES.js
  40. 1 0
      src/js/language/fa_IR.js
  41. 1 0
      src/js/language/fr_FR.js
  42. 1 0
      src/js/language/gr_EL.js
  43. 1 0
      src/js/language/hu_HU.js
  44. 1 0
      src/js/language/it_IT.js
  45. 1 0
      src/js/language/ja_JP.js
  46. 1 0
      src/js/language/nl_NL.js
  47. 1 0
      src/js/language/pl_PL.js
  48. 1 0
      src/js/language/pt_BR.js
  49. 1 0
      src/js/language/sv_SE.js
  50. 1 0
      src/js/language/tr_TR.js
  51. 1 0
      src/js/language/vi_VN.js
  52. 1 0
      src/js/language/zh_CN.js
  53. 1 0
      src/js/language/zh_TW.js
  54. 0 76
      src/js/validator/rif.js
  55. 41 1
      src/js/validator/vat.js
  56. 23 0
      test/spec.js
  57. 23 0
      test/spec/validator/vat.js

+ 1 - 0
CHANGELOG.md

@@ -5,6 +5,7 @@
 __New Features__
 * [#542](https://github.com/nghuuphuoc/bootstrapvalidator/issues/542), [#666](https://github.com/nghuuphuoc/bootstrapvalidator/pull/666): Add blank validator, thanks to [@bermo](https://github.com/bermo)
 * [#617](https://github.com/nghuuphuoc/bootstrapvalidator/issues/617): Add ```init``` and ```destroy``` methods to validator
+* [#724](https://github.com/nghuuphuoc/bootstrapvalidator/pull/724): Add Venezuelan VAT number (RIF) validator, thanks to [@paquitodev](https://github.com/paquitodev)
 
 __Improvements__
 * [#249](https://github.com/nghuuphuoc/bootstrapvalidator/pull/249), [#574](https://github.com/nghuuphuoc/bootstrapvalidator/issues/574), [#669](https://github.com/nghuuphuoc/bootstrapvalidator/issues/669): Add ```delay``` option to the [remote](http://bootstrapvalidator.com/validators/remote/) validator, thanks to [@q-state](https://github.com/q-state)

+ 1 - 0
CONTRIBUTORS.md

@@ -56,6 +56,7 @@ I would like to give big thanks to the following contributors:
 * [@narutosanjiv](https://github.com/narutosanjiv)
 * [@nathanrosspowell](https://github.com/nathanrosspowell)
 * [@neilime](https://github.com/neilime)
+* [@paquitodev](https://github.com/paquitodev)
 * [@patmoore](https://github.com/patmoore)
 * [@phillprice](https://github.com/phillprice)
 * [@pRieStaKos](https://github.com/pRieStaKos)

+ 1 - 1
dist/css/bootstrapValidator.min.css

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.2-dev, built on 2014-08-29 10:24:34 AM
+ * @version     v0.5.2-dev, built on 2014-08-29 11:08:35 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 42 - 2
dist/js/bootstrapValidator.js

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.2-dev, built on 2014-08-29 10:24:34 AM
+ * @version     v0.5.2-dev, built on 2014-08-29 11:08:35 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -5489,6 +5489,7 @@
             SE: 'Swedish',
             SI: 'Slovenian',
             SK: 'Slovak',
+            VE: 'Venezuelan',
             ZA: 'South African'
         }
     });
@@ -5502,7 +5503,8 @@
         // Supported country codes
         COUNTRY_CODES: [
             'AT', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU',
-            'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'ZA'
+            'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'VE',
+            'ZA'
         ],
 
         /**
@@ -6808,6 +6810,44 @@
         },
 
         /**
+         * Validate Venezuelan VAT number (RIF)
+         * Examples:
+         * - Valid: VEJ309272292, VEV242818101, VEJ000126518, VEJ000458324, J309272292, V242818101, J000126518, J000458324
+         * - Invalid: VEJ309272293, VEV242818100, J000126519, J000458323
+         *
+         * @param {String} value VAT number
+         * @returns {Boolean}
+         */
+        _ve: function(value) {
+            if (/^VE[VEJPG][0-9]{9}$/.test(value)) {
+                value = value.substr(2);
+            }
+            if (!/^[VEJPG][0-9]{9}$/.test(value)) {
+                return false;
+            }
+
+            var types  = {
+                    'V': 4,
+                    'E': 8,
+                    'J': 12,
+                    'P': 16,
+                    'G': 20
+                },
+                sum    = types[value.charAt(0)],
+                weight = [3, 2, 7, 6, 5, 4, 3, 2];
+
+            for (var i = 0; i < 8; i++) {
+                sum += parseInt(value.charAt(i + 1), 10) * weight[i];
+            }
+
+            sum = 11 - sum % 11;
+            if (sum === 11 || sum === 10) {
+                sum = 0;
+            }
+            return (sum + '' === value.substr(9, 1));
+        },
+
+        /**
          * Validate South African VAT number
          * Examples:
          * - Valid: 4012345678

File diff suppressed because it is too large
+ 2 - 2
dist/js/bootstrapValidator.min.js


+ 1 - 0
dist/js/language/ar_MA.js

@@ -315,6 +315,7 @@
                 SE: 'السويد',
                 SI: 'سلوفينيا',
                 SK: 'سلوفاكيا',
+                VE: 'الفنزويلي',
                 ZA: 'جنوب أفريقيا'
             }
         },

+ 1 - 0
dist/js/language/be_FR.js

@@ -315,6 +315,7 @@
                 SE: 'suédois',
                 SI: 'slovène',
                 SK: 'slovaque',
+                VE: 'vénézuélien',
                 ZA: 'sud-africain'
             }
         },

+ 1 - 0
dist/js/language/be_NL.js

@@ -315,6 +315,7 @@
                 SE: 'Zweeds',
                 SI: 'Sloveens',
                 SK: 'Slovaaks',
+                VE: 'Venezolaans',
                 ZA: 'Zuid-Afrikaans'
             }
         },

+ 1 - 0
dist/js/language/bg_BG.js

@@ -315,6 +315,7 @@
                 SE: 'Шведски',
                 SI: 'Словенски',
                 SK: 'Словакия',
+                VE: 'венецуелският',
                 ZA: 'Южна Африка'
             }
         },

+ 1 - 0
dist/js/language/cs_CZ.js

@@ -315,6 +315,7 @@
                 SE: 'Švédsko',
                 SI: 'Slovinsko',
                 SK: 'Slovensko',
+                VE: 'Venezuelský',
                 ZA: 'Jižní Afriku'
             }
         },

+ 1 - 0
dist/js/language/da_DK.js

@@ -315,6 +315,7 @@
                 SE: 'svensk',
                 SI: 'slovensk',
                 SK: 'slovakisk',
+                VE: 'venezuelansk',
                 ZA: 'sydafrikansk'
             }
         },

+ 1 - 0
dist/js/language/de_DE.js

@@ -315,6 +315,7 @@
                 SE: 'Schwedisch',
                 SI: 'Slowenisch',
                 SK: 'Slowakisch',
+                VE: 'Venezolanisch',
                 ZA: 'Süd Afrikanisch'
             }
         },

+ 1 - 0
dist/js/language/en_US.js

@@ -315,6 +315,7 @@
                 SE: 'Swedish',
                 SI: 'Slovenian',
                 SK: 'Slovak',
+                VE: 'Venezuelan',
                 ZA: 'South African'
             }
         },

+ 1 - 0
dist/js/language/es_CL.js

@@ -315,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'Esloveno',
                 SK: 'Eslovaco',
+                VE: 'Venezolano',
                 ZA: 'Sudafricano'
             }
         },

+ 1 - 0
dist/js/language/es_ES.js

@@ -315,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'Esloveno',
                 SK: 'Eslovaco',
+                VE: 'Venezolano',
                 ZA: 'Sudafricano'
             }
         },

+ 1 - 0
dist/js/language/fa_IR.js

@@ -315,6 +315,7 @@
                 SE: 'سوئد',
                 SI: 'اسلوونی',
                 SK: 'اسلواکی',
+                VE: 'ونزوئلا',
                 ZA: 'آفریقای جنوبی'
             }
         },

+ 1 - 0
dist/js/language/fr_FR.js

@@ -315,6 +315,7 @@
                 SE: 'suédois',
                 SI: 'slovène',
                 SK: 'slovaque',
+                VE: 'vénézuélien',
                 ZA: 'sud-africain'
             }
         },

+ 1 - 0
dist/js/language/gr_EL.js

@@ -315,6 +315,7 @@
                 SE: 'Σουηδίας',
                 SI: 'Σλοβενίας',
                 SK: 'Σλοβακίας',
+                VE: 'Βενεζουέλας',
                 ZA: 'Νότιας Αφρικής'
             }
         },

+ 1 - 0
dist/js/language/hu_HU.js

@@ -315,6 +315,7 @@
                 SE: 'svéd',
                 SI: 'szlovén',
                 SK: 'szlovák',
+                VE: 'venezuelai',
                 ZA: 'dél afrikai'
             }
         },

+ 1 - 0
dist/js/language/it_IT.js

@@ -315,6 +315,7 @@
                 SE: 'Svezia',
                 SI: 'Slovenia',
                 SK: 'Slovacchia',
+                VE: 'Venezuelano',
                 ZA: 'Sud Africano'
             }
         },

+ 1 - 0
dist/js/language/ja_JP.js

@@ -315,6 +315,7 @@
                 SE: 'スウェーデン',
                 SI: 'スロベニア',
                 SK: 'スロバキア',
+                VE: 'ベネズエラ',
                 ZA: '南アフリカ'
             }
         },

+ 1 - 0
dist/js/language/nl_NL.js

@@ -315,6 +315,7 @@
                 SE: 'Zweeds',
                 SI: 'Sloveens',
                 SK: 'Slovaaks',
+                VE: 'Venezolaans',
                 ZA: 'Zuid-Afrikaans'
             }
         },

+ 1 - 0
dist/js/language/pl_PL.js

@@ -315,6 +315,7 @@
                 SE: 'szwedzki',
                 SI: 'słoweński',
                 SK: 'słowacki',
+                VE: 'wenezuelski',
                 ZA: 'południowo Afrykański'
             }
         },

+ 1 - 0
dist/js/language/pt_BR.js

@@ -315,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'esloveno',
                 SK: 'Eslovaca',
+                VE: 'Venezuelano',
                 ZA: 'Sul-Africano'
             }
         },

+ 1 - 0
dist/js/language/sv_SE.js

@@ -315,6 +315,7 @@
                 SE: 'Svenskt',
                 SI: 'Slovenskt',
                 SK: 'Slovakiskt',
+                VE: 'Venezuelansk',
                 ZA: 'Sydafrikanskt'
             }
         },

+ 1 - 0
dist/js/language/tr_TR.js

@@ -315,6 +315,7 @@
                 SE: 'İsveç',
                 SI: 'Sloven',
                 SK: 'Slovak',
+                VE: 'Venezüella',
                 ZA: 'Kuzey Afrikalı'
             }
         },

+ 1 - 0
dist/js/language/vi_VN.js

@@ -315,6 +315,7 @@
                 SE: 'Thuỵ Điển',
                 SI: 'Slovenia',
                 SK: 'Slovakia',
+                VE: 'Venezuela',
                 ZA: 'Nam Phi'
             }
         },

+ 1 - 0
dist/js/language/zh_CN.js

@@ -315,6 +315,7 @@
                 SE: '瑞典',
                 SI: '斯洛文尼亚',
                 SK: '斯洛伐克',
+                VE: '委內瑞',
                 ZA: '南非'
             }
         },

+ 1 - 0
dist/js/language/zh_TW.js

@@ -315,6 +315,7 @@
                 SE: '瑞典',
                 SI: '斯洛文尼亞',
                 SK: '斯洛伐克',
+                VE: '委内瑞拉',
                 ZA: '南非'
             }
         },

+ 1 - 0
src/js/language/ar_MA.js

@@ -315,6 +315,7 @@
                 SE: 'السويد',
                 SI: 'سلوفينيا',
                 SK: 'سلوفاكيا',
+                VE: 'الفنزويلي',
                 ZA: 'جنوب أفريقيا'
             }
         },

+ 1 - 0
src/js/language/be_FR.js

@@ -315,6 +315,7 @@
                 SE: 'suédois',
                 SI: 'slovène',
                 SK: 'slovaque',
+                VE: 'vénézuélien',
                 ZA: 'sud-africain'
             }
         },

+ 1 - 0
src/js/language/be_NL.js

@@ -315,6 +315,7 @@
                 SE: 'Zweeds',
                 SI: 'Sloveens',
                 SK: 'Slovaaks',
+                VE: 'Venezolaans',
                 ZA: 'Zuid-Afrikaans'
             }
         },

+ 1 - 0
src/js/language/bg_BG.js

@@ -315,6 +315,7 @@
                 SE: 'Шведски',
                 SI: 'Словенски',
                 SK: 'Словакия',
+                VE: 'венецуелският',
                 ZA: 'Южна Африка'
             }
         },

+ 1 - 0
src/js/language/cs_CZ.js

@@ -315,6 +315,7 @@
                 SE: 'Švédsko',
                 SI: 'Slovinsko',
                 SK: 'Slovensko',
+                VE: 'Venezuelský',
                 ZA: 'Jižní Afriku'
             }
         },

+ 1 - 0
src/js/language/da_DK.js

@@ -315,6 +315,7 @@
                 SE: 'svensk',
                 SI: 'slovensk',
                 SK: 'slovakisk',
+                VE: 'venezuelansk',
                 ZA: 'sydafrikansk'
             }
         },

+ 1 - 0
src/js/language/de_DE.js

@@ -315,6 +315,7 @@
                 SE: 'Schwedisch',
                 SI: 'Slowenisch',
                 SK: 'Slowakisch',
+                VE: 'Venezolanisch',
                 ZA: 'Süd Afrikanisch'
             }
         },

+ 1 - 0
src/js/language/en_US.js

@@ -315,6 +315,7 @@
                 SE: 'Swedish',
                 SI: 'Slovenian',
                 SK: 'Slovak',
+                VE: 'Venezuelan',
                 ZA: 'South African'
             }
         },

+ 1 - 0
src/js/language/es_CL.js

@@ -315,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'Esloveno',
                 SK: 'Eslovaco',
+                VE: 'Venezolano',
                 ZA: 'Sudafricano'
             }
         },

+ 1 - 3
src/js/language/es_ES.js

@@ -246,9 +246,6 @@
         rtn: {
             'default': 'Por favor introduce un número RTN válido'
         },
-        rif: {
-            'default': 'Por favor introduce un número RIF válido'
-        },
         sedol: {
             'default': 'Por favor introduce un número SEDOL válido'
         },
@@ -318,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'Esloveno',
                 SK: 'Eslovaco',
+                VE: 'Venezolano',
                 ZA: 'Sudafricano'
             }
         },

+ 1 - 0
src/js/language/fa_IR.js

@@ -315,6 +315,7 @@
                 SE: 'سوئد',
                 SI: 'اسلوونی',
                 SK: 'اسلواکی',
+                VE: 'ونزوئلا',
                 ZA: 'آفریقای جنوبی'
             }
         },

+ 1 - 0
src/js/language/fr_FR.js

@@ -315,6 +315,7 @@
                 SE: 'suédois',
                 SI: 'slovène',
                 SK: 'slovaque',
+                VE: 'vénézuélien',
                 ZA: 'sud-africain'
             }
         },

+ 1 - 0
src/js/language/gr_EL.js

@@ -315,6 +315,7 @@
                 SE: 'Σουηδίας',
                 SI: 'Σλοβενίας',
                 SK: 'Σλοβακίας',
+                VE: 'Βενεζουέλας',
                 ZA: 'Νότιας Αφρικής'
             }
         },

+ 1 - 0
src/js/language/hu_HU.js

@@ -315,6 +315,7 @@
                 SE: 'svéd',
                 SI: 'szlovén',
                 SK: 'szlovák',
+                VE: 'venezuelai',
                 ZA: 'dél afrikai'
             }
         },

+ 1 - 0
src/js/language/it_IT.js

@@ -315,6 +315,7 @@
                 SE: 'Svezia',
                 SI: 'Slovenia',
                 SK: 'Slovacchia',
+                VE: 'Venezuelano',
                 ZA: 'Sud Africano'
             }
         },

+ 1 - 0
src/js/language/ja_JP.js

@@ -315,6 +315,7 @@
                 SE: 'スウェーデン',
                 SI: 'スロベニア',
                 SK: 'スロバキア',
+                VE: 'ベネズエラ',
                 ZA: '南アフリカ'
             }
         },

+ 1 - 0
src/js/language/nl_NL.js

@@ -315,6 +315,7 @@
                 SE: 'Zweeds',
                 SI: 'Sloveens',
                 SK: 'Slovaaks',
+                VE: 'Venezolaans',
                 ZA: 'Zuid-Afrikaans'
             }
         },

+ 1 - 0
src/js/language/pl_PL.js

@@ -315,6 +315,7 @@
                 SE: 'szwedzki',
                 SI: 'słoweński',
                 SK: 'słowacki',
+                VE: 'wenezuelski',
                 ZA: 'południowo Afrykański'
             }
         },

+ 1 - 0
src/js/language/pt_BR.js

@@ -315,6 +315,7 @@
                 SE: 'Sueco',
                 SI: 'esloveno',
                 SK: 'Eslovaca',
+                VE: 'Venezuelano',
                 ZA: 'Sul-Africano'
             }
         },

+ 1 - 0
src/js/language/sv_SE.js

@@ -315,6 +315,7 @@
                 SE: 'Svenskt',
                 SI: 'Slovenskt',
                 SK: 'Slovakiskt',
+                VE: 'Venezuelansk',
                 ZA: 'Sydafrikanskt'
             }
         },

+ 1 - 0
src/js/language/tr_TR.js

@@ -315,6 +315,7 @@
                 SE: 'İsveç',
                 SI: 'Sloven',
                 SK: 'Slovak',
+                VE: 'Venezüella',
                 ZA: 'Kuzey Afrikalı'
             }
         },

+ 1 - 0
src/js/language/vi_VN.js

@@ -315,6 +315,7 @@
                 SE: 'Thuỵ Điển',
                 SI: 'Slovenia',
                 SK: 'Slovakia',
+                VE: 'Venezuela',
                 ZA: 'Nam Phi'
             }
         },

+ 1 - 0
src/js/language/zh_CN.js

@@ -315,6 +315,7 @@
                 SE: '瑞典',
                 SI: '斯洛文尼亚',
                 SK: '斯洛伐克',
+                VE: '委內瑞',
                 ZA: '南非'
             }
         },

+ 1 - 0
src/js/language/zh_TW.js

@@ -315,6 +315,7 @@
                 SE: '瑞典',
                 SI: '斯洛文尼亞',
                 SK: '斯洛伐克',
+                VE: '委内瑞拉',
                 ZA: '南非'
             }
         },

+ 0 - 76
src/js/validator/rif.js

@@ -1,76 +0,0 @@
-(function($) {
-    $.fn.bootstrapValidator.i18n.rif = $.extend($.fn.bootstrapValidator.i18n.rif || {}, {
-        'default': 'Please enter a valid RIF'
-    });
-
-    $.fn.bootstrapValidator.validators.rif = {
-        html5Attributes: {
-            message: 'message',
-            type: 'type'
-        },
-        /**
-         * Return true if the input value is a valid RIF.
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * - type: The type of RIF field. It can be V, E, J, P or G or the name of element which its value is the type
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field;
-
-            if (value === '') {
-                return true;
-            }
-
-            var $rif = value.val();
-            var $rif_type = validator.getFieldElements(options.type).val().toUpperCase();
-            var $last_number = $rif.substr($rif.length - 1);
-            var $number = $rif.substr(0, 8);
-
-            $valid = /^([VEJPG]{1})([0-9]{9}$)/.test($rif_type + $rif);
-
-            if ($valid) {
-                if ($rif_type == "V") {
-                    $sum = 1 * 4;
-                } else if ($rif_type == "E") {
-                    $sum = 2 * 4;
-                } else if ($rif_type == "J") {
-                    $sum = 3 * 4;
-                } else if ($rif_type == "P") {
-                    $sum = 4 * 4;
-                } else if ($rif_type == "G") {
-                    $sum = 5 * 4;
-                }
-
-                $n0 = $number.charAt(0) * 3;
-                $n1 = $number.charAt(1) * 2;
-                $n2 = $number.charAt(2) * 7;
-                $n3 = $number.charAt(3) * 6;
-                $n4 = $number.charAt(4) * 5;
-                $n5 = $number.charAt(5) * 4;
-                $n6 = $number.charAt(6) * 3;
-                $n7 = $number.charAt(7) * 2;
-
-                $sum += $n0 + $n1 + $n2 + $n3 + $n4 + $n5 + $n6 + $n7;
-
-                $mod = $sum % 11;
-                $last_val = 11 - $mod;
-
-                if ($last_val == 11 || $last_val == 10) {
-                    $last_val = 0;
-                }
-
-                if ($last_number == $last_val) {
-                    return true;
-                } else {
-                    return false;
-                }
-            }
-
-            return false;
-        }
-    };
-}(window.jQuery));

+ 41 - 1
src/js/validator/vat.js

@@ -39,6 +39,7 @@
             SE: 'Swedish',
             SI: 'Slovenian',
             SK: 'Slovak',
+            VE: 'Venezuelan',
             ZA: 'South African'
         }
     });
@@ -52,7 +53,8 @@
         // Supported country codes
         COUNTRY_CODES: [
             'AT', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU',
-            'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'ZA'
+            'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'VE',
+            'ZA'
         ],
 
         /**
@@ -1358,6 +1360,44 @@
         },
 
         /**
+         * Validate Venezuelan VAT number (RIF)
+         * Examples:
+         * - Valid: VEJ309272292, VEV242818101, VEJ000126518, VEJ000458324, J309272292, V242818101, J000126518, J000458324
+         * - Invalid: VEJ309272293, VEV242818100, J000126519, J000458323
+         *
+         * @param {String} value VAT number
+         * @returns {Boolean}
+         */
+        _ve: function(value) {
+            if (/^VE[VEJPG][0-9]{9}$/.test(value)) {
+                value = value.substr(2);
+            }
+            if (!/^[VEJPG][0-9]{9}$/.test(value)) {
+                return false;
+            }
+
+            var types  = {
+                    'V': 4,
+                    'E': 8,
+                    'J': 12,
+                    'P': 16,
+                    'G': 20
+                },
+                sum    = types[value.charAt(0)],
+                weight = [3, 2, 7, 6, 5, 4, 3, 2];
+
+            for (var i = 0; i < 8; i++) {
+                sum += parseInt(value.charAt(i + 1), 10) * weight[i];
+            }
+
+            sum = 11 - sum % 11;
+            if (sum === 11 || sum === 10) {
+                sum = 0;
+            }
+            return (sum + '' === value.substr(9, 1));
+        },
+
+        /**
          * Validate South African VAT number
          * Examples:
          * - Valid: 4012345678

+ 23 - 0
test/spec.js

@@ -4531,6 +4531,7 @@ describe('vat', function() {
                         '<option value="SE">Sweden</option>',
                         '<option value="CH">Switzerland</option>',
                         '<option value="GB">United Kingdom</option>',
+                        '<option value="VE">Venezuela</option>',
                         '<option value="ZA">South Africa</option>',
                     '</select>',
                 '</div>',
@@ -5236,6 +5237,28 @@ describe('vat', function() {
             expect(this.bv.isValid()).toEqual(false);
         }
     });
+
+    it('Venezuelan VAT number (RIF)', function() {
+        this.bv.updateOption('vat', 'vat', 'country', 'VE');
+
+        // Valid samples
+        var validSamples = ['VEJ309272292', 'VEV242818101', 'VEJ000126518', 'VEJ000458324', 'J309272292', 'V242818101', 'J000126518', 'J000458324'];
+        for (var i in validSamples) {
+            this.bv.resetForm();
+            this.$vat.val(validSamples[i]);
+            this.bv.validate();
+            expect(this.bv.isValid()).toBeTruthy();
+        }
+
+        // Invalid samples
+        var invalidSamples = ['VEJ309272293', 'VEV242818100', 'J000126519', 'J000458323'];
+        for (i in invalidSamples) {
+            this.bv.resetForm();
+            this.$vat.val(invalidSamples[i]);
+            this.bv.validate();
+            expect(this.bv.isValid()).toEqual(false);
+        }
+    });
 });
 
 function getCountryCode(value, validator, $field) {

+ 23 - 0
test/spec/validator/vat.js

@@ -37,6 +37,7 @@ describe('vat', function() {
                         '<option value="SE">Sweden</option>',
                         '<option value="CH">Switzerland</option>',
                         '<option value="GB">United Kingdom</option>',
+                        '<option value="VE">Venezuela</option>',
                         '<option value="ZA">South Africa</option>',
                     '</select>',
                 '</div>',
@@ -742,4 +743,26 @@ describe('vat', function() {
             expect(this.bv.isValid()).toEqual(false);
         }
     });
+
+    it('Venezuelan VAT number (RIF)', function() {
+        this.bv.updateOption('vat', 'vat', 'country', 'VE');
+
+        // Valid samples
+        var validSamples = ['VEJ309272292', 'VEV242818101', 'VEJ000126518', 'VEJ000458324', 'J309272292', 'V242818101', 'J000126518', 'J000458324'];
+        for (var i in validSamples) {
+            this.bv.resetForm();
+            this.$vat.val(validSamples[i]);
+            this.bv.validate();
+            expect(this.bv.isValid()).toBeTruthy();
+        }
+
+        // Invalid samples
+        var invalidSamples = ['VEJ309272293', 'VEV242818100', 'J000126519', 'J000458323'];
+        for (i in invalidSamples) {
+            this.bv.resetForm();
+            this.$vat.val(invalidSamples[i]);
+            this.bv.validate();
+            expect(this.bv.isValid()).toEqual(false);
+        }
+    });
 });