Browse Source

#650: Add Brazilian VAT number validator (CNPJ), thanks to @fhferreira

phuoc 11 years ago
parent
commit
2a8318fc93

+ 1 - 0
CHANGELOG.md

@@ -14,6 +14,7 @@ __New features__
 * [#637](https://github.com/nghuuphuoc/bootstrapvalidator/pull/637): Add South African [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@evilchili](https://github.com/evilchili)
 * [#638](https://github.com/nghuuphuoc/bootstrapvalidator/pull/638), [#647](https://github.com/nghuuphuoc/bootstrapvalidator/pull/647): Add Brazilian [phone number](http://bootstrapvalidator.com/validators/phone/) and [postal code](http://bootstrapvalidator.com/validators/zipCode/) validator, thanks to [@fhferreira](https://github.com/fhferreira)
 * [#643](https://github.com/nghuuphuoc/bootstrapvalidator/pull/643): Add [zipCode](http://bootstrapvalidator.com/validators/zipCode/), [iban](http://bootstrapvalidator.com/validators/iban/) and [phone number](http://bootstrapvalidator.com/validators/phone/) validators for Morocco, thanks to [@Arkni](https://github.com/Arkni)
+* [#650](https://github.com/nghuuphuoc/bootstrapvalidator/pull/650): Add Brazilian [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@fhferreira](https://github.com/fhferreira)
 
 __Improvements__
 

+ 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.1-dev, built on 2014-08-11 8:39:16 PM
+ * @version     v0.5.1-dev, built on 2014-08-11 10:00:10 PM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 61 - 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.1-dev, built on 2014-08-11 8:39:16 PM
+ * @version     v0.5.1-dev, built on 2014-08-11 10:00:10 PM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -5252,6 +5252,7 @@
             AT: 'Austrian',
             BE: 'Belgian',
             BG: 'Bulgarian',
+            BR: 'Brazilian',
             CH: 'Swiss',
             CY: 'Cypriot',
             CZ: 'Czech',
@@ -5295,7 +5296,7 @@
 
         // Supported country codes
         COUNTRY_CODES: [
-            'AT', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU',
+            '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'
         ],
 
@@ -5501,6 +5502,64 @@
 
             return false;
         },
+        
+        /**
+         * Validate Brazilian VAT number (CNPJ)
+         *
+         * @param {String} value VAT number
+         * @returns {Boolean}
+         */
+        _br: function(value) {
+            if (value === '') {
+                return true;
+            }
+            var cnpj = value.replace(/[^\d]+/g, '');
+            if (cnpj === '' || cnpj.length !== 14) {
+                return false;
+            }
+
+            // Remove invalids CNPJs
+            if (cnpj === '00000000000000' || cnpj === '11111111111111' || cnpj === '22222222222222' ||
+                cnpj === '33333333333333' || cnpj === '44444444444444' || cnpj === '55555555555555' ||
+                cnpj === '66666666666666' || cnpj === '77777777777777' || cnpj === '88888888888888' ||
+                cnpj === '99999999999999')
+            {
+                return false;
+            }
+
+            // Validate verification digits
+            var length  = cnpj.length - 2,
+                numbers = cnpj.substring(0, length),
+                digits  = cnpj.substring(length),
+                sum     = 0,
+                pos     = length - 7;
+
+            for (var i = length; i >= 1; i--) {
+                sum += parseInt(numbers.charAt(length - i), 10) * pos--;
+                if (pos < 2) {
+                    pos = 9;
+                }
+            }
+
+            var result = sum % 11 < 2 ? 0 : 11 - sum % 11;
+            if (result !== parseInt(digits.charAt(0), 10)) {
+                return false;
+            }
+
+            length  = length + 1;
+            numbers = cnpj.substring(0, length);
+            sum     = 0;
+            pos     = length - 7;
+            for (i = length; i >= 1; i--) {
+                sum += parseInt(numbers.charAt(length - i), 10) * pos--;
+                if (pos < 2) {
+                    pos = 9;
+                }
+            }
+
+            result = sum % 11 < 2 ? 0 : 11 - sum % 11;
+            return (result === parseInt(digits.charAt(1), 10));
+        },
 
         /**
          * Validate Swiss VAT number

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


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

@@ -284,6 +284,7 @@
                 AT: 'Oostenrijks',
                 BE: 'Belgisch',
                 BG: 'Bulgaars',
+                BR: 'Braziliaans',
                 CH: 'Zwitsers',
                 CY: 'Cypriotisch',
                 CZ: 'Tsjechisch',

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

@@ -284,6 +284,7 @@
                 AT: 'Австрийски',
                 BE: 'Белгийската',
                 BG: 'Български',
+                BR: 'Бразилска',
                 СН: 'Швейцарски',
                 CY: 'Кипърска',
                 CZ: 'Чехия',

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

@@ -284,6 +284,7 @@
                 AT: 'Rakousko',
                 BE: 'Belgii',
                 BG: 'Bulharsko',
+                BR: 'Brazílii',
                 CH: 'Švýcarsko',
                 CY: 'Kypr',
                 CZ: 'Čechy',

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

@@ -284,6 +284,7 @@
                 AT: 'østrigsk',
                 BE: 'belgisk',
                 BG: 'bulgarsk',
+                BR: 'brasiliansk',
                 CH: 'schweizisk',
                 CY: 'cypriotisk',
                 CZ: 'tjekkisk',

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

@@ -284,6 +284,7 @@
                 AT: 'Österreich',
                 BE: 'Belgisch',
                 BG: 'Bulgarisch',
+                BR: 'Brasilianisch',
                 CH: 'Schweiz',
                 CY: 'Zypriotisch',
                 CZ: 'Tschechisch',

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

@@ -284,6 +284,7 @@
                 AT: 'Austrian',
                 BE: 'Belgian',
                 BG: 'Bulgarian',
+                BR: 'Brazilian',
                 CH: 'Swiss',
                 CY: 'Cypriot',
                 CZ: 'Czech',

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

@@ -284,6 +284,7 @@
                 AT: 'Austriaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileño',
                 CH: 'Suizo',
                 CY: 'Chipriota',
                 CZ: 'Checo',

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

@@ -284,6 +284,7 @@
                 AT: 'Austriaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileño',
                 CH: 'Suizo',
                 CY: 'Chipriota',
                 CZ: 'Checo',

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

@@ -284,6 +284,7 @@
                 AT: 'autrichien',
                 BE: 'belge',
                 BG: 'bulgare',
+                BR: 'brésilien',
                 CH: 'suisse',
                 CY: 'chypriote',
                 CZ: 'tchèque',

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

@@ -284,6 +284,7 @@
                 AT: 'Αυστρίας',
                 BE: 'Βελγίου',
                 BG: 'Βουλγαρίας',
+                BR: 'Βραζιλίας',
                 CH: 'Ελβετίας',
                 CY: 'Κύπρου',
                 CZ: 'Τσεχίας',

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

@@ -284,6 +284,7 @@
                 AT: 'osztrák',
                 BE: 'belga',
                 BG: 'bulgár',
+                BR: 'brazil',
                 CH: 'svájci',
                 CY: 'ciprusi',
                 CZ: 'cseh',

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

@@ -284,6 +284,7 @@
                 AT: 'Austria',
                 BE: 'Belgio',
                 BG: 'Bulgaria',
+                BR: 'Brasiliano',
                 CH: 'Svizzera',
                 CY: 'Cipro',
                 CZ: 'Repubblica Ceca',

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

@@ -284,6 +284,7 @@
                 AT: 'austryjacki',
                 BE: 'belgijski',
                 BG: 'bułgarski',
+                BR: 'brazylijski',
                 CH: 'szwecki',
                 CY: 'cypryjski',
                 CZ: 'czeski',

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

@@ -284,6 +284,7 @@
                 AT: 'Austríaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileiro',
                 CH: 'Suíça',
                 CY: 'cipriota',
                 CZ: 'Checa',

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

@@ -284,6 +284,7 @@
                 AT: 'Avustralyalı',
                 BE: 'Belçikalı',
                 BG: 'Bulgar',
+                BR: 'Brezilyalı',
                 CH: 'İsviçreli',
                 CY: 'Kıbrıslı',
                 CZ: 'Çek',

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

@@ -284,6 +284,7 @@
                 AT: 'Áo',
                 BE: 'Bỉ',
                 BG: 'Bulgari',
+                BR: 'Brazil',
                 CH: 'Thuỵ Sĩ',
                 CY: 'Síp',
                 CZ: 'Séc',

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

@@ -284,6 +284,7 @@
                 AT: '奥地利',
                 BE: '比利时',
                 BG: '保加利亚',
+                BR: '巴西',
                 CH: '瑞士',
                 CY: '塞浦路斯',
                 CZ: '捷克',

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

@@ -284,6 +284,7 @@
                 AT: '奧地利',
                 BE: '比利時',
                 BG: '保加利亞',
+                BR: '巴西',
                 CH: '瑞士',
                 CY: '塞浦路斯',
                 CZ: '捷克',

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

@@ -284,6 +284,7 @@
                 AT: 'Oostenrijks',
                 BE: 'Belgisch',
                 BG: 'Bulgaars',
+                BR: 'Braziliaans',
                 CH: 'Zwitsers',
                 CY: 'Cypriotisch',
                 CZ: 'Tsjechisch',

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

@@ -284,6 +284,7 @@
                 AT: 'Австрийски',
                 BE: 'Белгийската',
                 BG: 'Български',
+                BR: 'Бразилска',
                 СН: 'Швейцарски',
                 CY: 'Кипърска',
                 CZ: 'Чехия',

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

@@ -284,6 +284,7 @@
                 AT: 'Rakousko',
                 BE: 'Belgii',
                 BG: 'Bulharsko',
+                BR: 'Brazílii',
                 CH: 'Švýcarsko',
                 CY: 'Kypr',
                 CZ: 'Čechy',

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

@@ -284,6 +284,7 @@
                 AT: 'østrigsk',
                 BE: 'belgisk',
                 BG: 'bulgarsk',
+                BR: 'brasiliansk',
                 CH: 'schweizisk',
                 CY: 'cypriotisk',
                 CZ: 'tjekkisk',

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

@@ -284,6 +284,7 @@
                 AT: 'Österreich',
                 BE: 'Belgisch',
                 BG: 'Bulgarisch',
+                BR: 'Brasilianisch',
                 CH: 'Schweiz',
                 CY: 'Zypriotisch',
                 CZ: 'Tschechisch',

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

@@ -284,6 +284,7 @@
                 AT: 'Austrian',
                 BE: 'Belgian',
                 BG: 'Bulgarian',
+                BR: 'Brazilian',
                 CH: 'Swiss',
                 CY: 'Cypriot',
                 CZ: 'Czech',

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

@@ -284,6 +284,7 @@
                 AT: 'Austriaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileño',
                 CH: 'Suizo',
                 CY: 'Chipriota',
                 CZ: 'Checo',

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

@@ -284,6 +284,7 @@
                 AT: 'Austriaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileño',
                 CH: 'Suizo',
                 CY: 'Chipriota',
                 CZ: 'Checo',

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

@@ -284,6 +284,7 @@
                 AT: 'autrichien',
                 BE: 'belge',
                 BG: 'bulgare',
+                BR: 'brésilien',
                 CH: 'suisse',
                 CY: 'chypriote',
                 CZ: 'tchèque',

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

@@ -284,6 +284,7 @@
                 AT: 'Αυστρίας',
                 BE: 'Βελγίου',
                 BG: 'Βουλγαρίας',
+                BR: 'Βραζιλίας',
                 CH: 'Ελβετίας',
                 CY: 'Κύπρου',
                 CZ: 'Τσεχίας',

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

@@ -284,6 +284,7 @@
                 AT: 'osztrák',
                 BE: 'belga',
                 BG: 'bulgár',
+                BR: 'brazil',
                 CH: 'svájci',
                 CY: 'ciprusi',
                 CZ: 'cseh',

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

@@ -284,6 +284,7 @@
                 AT: 'Austria',
                 BE: 'Belgio',
                 BG: 'Bulgaria',
+                BR: 'Brasiliano',
                 CH: 'Svizzera',
                 CY: 'Cipro',
                 CZ: 'Repubblica Ceca',

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

@@ -284,6 +284,7 @@
                 AT: 'austryjacki',
                 BE: 'belgijski',
                 BG: 'bułgarski',
+                BR: 'brazylijski',
                 CH: 'szwecki',
                 CY: 'cypryjski',
                 CZ: 'czeski',

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

@@ -284,6 +284,7 @@
                 AT: 'Austríaco',
                 BE: 'Belga',
                 BG: 'Búlgaro',
+                BR: 'Brasileiro',
                 CH: 'Suíça',
                 CY: 'cipriota',
                 CZ: 'Checa',

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

@@ -284,6 +284,7 @@
                 AT: 'Avustralyalı',
                 BE: 'Belçikalı',
                 BG: 'Bulgar',
+                BR: 'Brezilyalı',
                 CH: 'İsviçreli',
                 CY: 'Kıbrıslı',
                 CZ: 'Çek',

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

@@ -284,6 +284,7 @@
                 AT: 'Áo',
                 BE: 'Bỉ',
                 BG: 'Bulgari',
+                BR: 'Brazil',
                 CH: 'Thuỵ Sĩ',
                 CY: 'Síp',
                 CZ: 'Séc',

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

@@ -284,6 +284,7 @@
                 AT: '奥地利',
                 BE: '比利时',
                 BG: '保加利亚',
+                BR: '巴西',
                 CH: '瑞士',
                 CY: '塞浦路斯',
                 CZ: '捷克',

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

@@ -284,6 +284,7 @@
                 AT: '奧地利',
                 BE: '比利時',
                 BG: '保加利亞',
+                BR: '巴西',
                 CH: '瑞士',
                 CY: '塞浦路斯',
                 CZ: '捷克',

+ 33 - 37
src/js/validator/vat.js

@@ -7,7 +7,7 @@
             AT: 'Austrian',
             BE: 'Belgian',
             BG: 'Bulgarian',
-            BR: 'Brazil',
+            BR: 'Brazilian',
             CH: 'Swiss',
             CY: 'Cypriot',
             CZ: 'Czech',
@@ -268,57 +268,53 @@
             if (value === '') {
                 return true;
             }
-            cnpj = value.replace(/[^\d]+/g, '');
-
-            if (cnpj == '') return false;
-
-            if (cnpj.length != 14)
+            var cnpj = value.replace(/[^\d]+/g, '');
+            if (cnpj === '' || cnpj.length !== 14) {
                 return false;
+            }
 
-            // Remove invalids CNPJs 
-            if (cnpj == "00000000000000" ||
-                cnpj == "11111111111111" ||
-                cnpj == "22222222222222" ||
-                cnpj == "33333333333333" ||
-                cnpj == "44444444444444" ||
-                cnpj == "55555555555555" ||
-                cnpj == "66666666666666" ||
-                cnpj == "77777777777777" ||
-                cnpj == "88888888888888" ||
-                cnpj == "99999999999999")
+            // Remove invalids CNPJs
+            if (cnpj === '00000000000000' || cnpj === '11111111111111' || cnpj === '22222222222222' ||
+                cnpj === '33333333333333' || cnpj === '44444444444444' || cnpj === '55555555555555' ||
+                cnpj === '66666666666666' || cnpj === '77777777777777' || cnpj === '88888888888888' ||
+                cnpj === '99999999999999')
+            {
                 return false;
+            }
 
             // Validate verification digits
-            length = cnpj.length - 2
-            numbers = cnpj.substring(0, length);
-            digits = cnpj.substring(length);
-            sum = 0;
-            pos = length - 7;
-            for (i = length; i >= 1; i--) {
-                sum += numbers.charAt(length - i) * pos--;
-                if (pos < 2)
+            var length  = cnpj.length - 2,
+                numbers = cnpj.substring(0, length),
+                digits  = cnpj.substring(length),
+                sum     = 0,
+                pos     = length - 7;
+
+            for (var i = length; i >= 1; i--) {
+                sum += parseInt(numbers.charAt(length - i), 10) * pos--;
+                if (pos < 2) {
                     pos = 9;
+                }
             }
-            result = sum % 11 < 2 ? 0 : 11 - sum % 11;
-            if (result != digits.charAt(0))
+
+            var result = sum % 11 < 2 ? 0 : 11 - sum % 11;
+            if (result !== parseInt(digits.charAt(0), 10)) {
                 return false;
+            }
 
-            length = length + 1;
+            length  = length + 1;
             numbers = cnpj.substring(0, length);
-            sum = 0;
-            pos = length - 7;
+            sum     = 0;
+            pos     = length - 7;
             for (i = length; i >= 1; i--) {
-                sum += numbers.charAt(length - i) * pos--;
-                if (pos < 2)
+                sum += parseInt(numbers.charAt(length - i), 10) * pos--;
+                if (pos < 2) {
                     pos = 9;
+                }
             }
-            result = sum % 11 < 2 ? 0 : 11 - sum % 11;
-            if (result != digits.charAt(1))
-                return false;
 
-            return true;
+            result = sum % 11 < 2 ? 0 : 11 - sum % 11;
+            return (result === parseInt(digits.charAt(1), 10));
         },
-        
 
         /**
          * Validate Swiss VAT number