Browse Source

#465: Refactoring vat validator

phuoc 11 years ago
parent
commit
763f37a592

+ 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.0-dev, built on 2014-07-06 9:18:35 AM
+ * @version     v0.5.0-dev, built on 2014-07-06 9:34:22 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 34 - 25
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.0-dev, built on 2014-07-06 9:18:35 AM
+ * @version     v0.5.0-dev, built on 2014-07-06 9:34:22 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -2963,6 +2963,7 @@
             country: 'country'
         },
 
+        // Supported country codes
         COUNTRY_CODES: [
             'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
             'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'
@@ -4990,23 +4991,6 @@
             SE: 'Swedish',
             SI: 'Slovenian',
             SK: 'Slovak'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country,
-                    method  = ['_', country.toLowerCase()].join('');
-                if ($.fn.bootstrapValidator.validators.vat[method] === undefined) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, options.country);
-                }
-
-                country = country.toUpperCase();
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -5016,6 +5000,12 @@
             country: 'country'
         },
 
+        // Supported country codes
+        COUNTRY_CODES: [
+            'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'EL', 'HU', 'IE', 'IT',
+            'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB'
+        ],
+
         /**
          * Validate an European VAT number
          *
@@ -5023,8 +5013,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Consist of key:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - One of country code defined in COUNTRY_CODES
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -5032,13 +5026,28 @@
                 return true;
             }
 
-            var country = options.country || value.substr(0, 2),
-                method  = ['_', country.toLowerCase()].join('');
-            if (this[method] && 'function' === typeof this[method]) {
-                return this[method](value);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
             }
 
-            return false;
+            if ($.inArray(country, this.COUNTRY_CODES) === -1) {
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.countryNotSupported, country)
+                };
+            }
+
+            var method  = ['_', country.toLowerCase()].join('');
+            return this[method](value)
+                ? true
+                : {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.country, $.fn.bootstrapValidator.i18n.vat.countries[country.toUpperCase()])
+                };
         },
 
         // VAT validators

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


+ 1 - 0
src/js/validator/id.js

@@ -38,6 +38,7 @@
             country: 'country'
         },
 
+        // Supported country codes
         COUNTRY_CODES: [
             'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
             'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'

+ 32 - 24
src/js/validator/vat.js

@@ -37,23 +37,6 @@
             SE: 'Swedish',
             SI: 'Slovenian',
             SK: 'Slovak'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country,
-                    method  = ['_', country.toLowerCase()].join('');
-                if ($.fn.bootstrapValidator.validators.vat[method] === undefined) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, options.country);
-                }
-
-                country = country.toUpperCase();
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -63,6 +46,12 @@
             country: 'country'
         },
 
+        // Supported country codes
+        COUNTRY_CODES: [
+            'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'EL', 'HU', 'IE', 'IT',
+            'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB'
+        ],
+
         /**
          * Validate an European VAT number
          *
@@ -70,8 +59,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Consist of key:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - One of country code defined in COUNTRY_CODES
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -79,13 +72,28 @@
                 return true;
             }
 
-            var country = options.country || value.substr(0, 2),
-                method  = ['_', country.toLowerCase()].join('');
-            if (this[method] && 'function' === typeof this[method]) {
-                return this[method](value);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
             }
 
-            return false;
+            if ($.inArray(country, this.COUNTRY_CODES) === -1) {
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.countryNotSupported, country)
+                };
+            }
+
+            var method  = ['_', country.toLowerCase()].join('');
+            return this[method](value)
+                ? true
+                : {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.country, $.fn.bootstrapValidator.i18n.vat.countries[country.toUpperCase()])
+                };
         },
 
         // VAT validators

+ 62 - 2
test/spec.js

@@ -3307,6 +3307,42 @@ describe('vat', function() {
         $([
             '<form class="form-horizontal" id="vatForm">',
                 '<div class="form-group">',
+                    '<select class="form-control" name="country">',
+                        '<option value="AT">Austria</option>',
+                        '<option value="BE">Belgium</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="CY">Cyprus</option>',
+                        '<option value="CZ">Czech Republic</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="FR">France</option>',
+                        '<option value="DE">Germany</option>',
+                        '<option value="GR">Greece</option>',
+                        '<option value="HU">Hungary</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IT">Italy</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LU">Luxembourg</option>',
+                        '<option value="MT">Malta</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="NO">Norway</option>',
+                        '<option value="PL">Poland</option>',
+                        '<option value="PT">Portugal</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RU">Russia</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SI">Slovenia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="GB">United Kingdom</option>',
+                    '</select>',
+                '</div>',
+                '<div class="form-group">',
                     '<input type="text" name="vat" data-bv-vat />',
                 '</div>',
             '</form>',
@@ -3317,14 +3353,38 @@ describe('vat', function() {
         /**
          * @type {BootstrapValidator}
          */
-        this.bv   = $('#vatForm').data('bootstrapValidator');
-        this.$vat = this.bv.getFieldElements('vat');
+        this.bv       = $('#vatForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$vat     = this.bv.getFieldElements('vat');
     });
 
     afterEach(function() {
         $('#vatForm').bootstrapValidator('destroy').remove();
     });
 
+    it('dynamic country', function() {
+        this.$vat.attr('data-bv-vat-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#vatForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('AT');
+        this.$vat.val('ATU13585627');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BG');
+        this.$vat.val('BE0428759497');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+
+        this.bv.resetForm();
+        this.$country.val('BE');
+        this.$vat.val('BE431150351');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Austrian VAT number', function () {
         // Valid samples
         var validSamples = ['ATU13585627'];

+ 62 - 2
test/spec/validator/vat.js

@@ -3,6 +3,42 @@ describe('vat', function() {
         $([
             '<form class="form-horizontal" id="vatForm">',
                 '<div class="form-group">',
+                    '<select class="form-control" name="country">',
+                        '<option value="AT">Austria</option>',
+                        '<option value="BE">Belgium</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="CY">Cyprus</option>',
+                        '<option value="CZ">Czech Republic</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="FR">France</option>',
+                        '<option value="DE">Germany</option>',
+                        '<option value="GR">Greece</option>',
+                        '<option value="HU">Hungary</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IT">Italy</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LU">Luxembourg</option>',
+                        '<option value="MT">Malta</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="NO">Norway</option>',
+                        '<option value="PL">Poland</option>',
+                        '<option value="PT">Portugal</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RU">Russia</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SI">Slovenia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="GB">United Kingdom</option>',
+                    '</select>',
+                '</div>',
+                '<div class="form-group">',
                     '<input type="text" name="vat" data-bv-vat />',
                 '</div>',
             '</form>',
@@ -13,14 +49,38 @@ describe('vat', function() {
         /**
          * @type {BootstrapValidator}
          */
-        this.bv   = $('#vatForm').data('bootstrapValidator');
-        this.$vat = this.bv.getFieldElements('vat');
+        this.bv       = $('#vatForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$vat     = this.bv.getFieldElements('vat');
     });
 
     afterEach(function() {
         $('#vatForm').bootstrapValidator('destroy').remove();
     });
 
+    it('dynamic country', function() {
+        this.$vat.attr('data-bv-vat-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#vatForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('AT');
+        this.$vat.val('ATU13585627');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BG');
+        this.$vat.val('BE0428759497');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+
+        this.bv.resetForm();
+        this.$country.val('BE');
+        this.$vat.val('BE431150351');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Austrian VAT number', function () {
         // Valid samples
         var validSamples = ['ATU13585627'];