Greece T.R.N - Α.Φ.Μ Validation

T.R.N (Α.Φ.Μ) Validation Method based on jQuery

by Valentinos Galanos

HTML

<p>
Αυτός ο αλγόριθμος τσεκάρει αν ένα 9ψήφιο νούμερο μπορεί να είναι ΑΦΜ και όχι την ύπαρξή του ή όχι.</p>
<p>Είναι έλεγχος ορθότητας και όχι έλεγχος υπαρκτότητας.</p>
<p><small>Αν έχει δοθεί σε κάποιο φυσικό πρόσωπο ή εταιρία και είναι σε χρήση, μόνο η Εφορία το γνωρίζει και δεν βρίσκεται μέσω αλγορίθμου αυτό.</small></p>

<input type="text" placeholder="Α.Φ.Μ." data-validate-afm>

CSS

input,
input:focus 
{
  padding: 8px 4px;
  border: solid 1px #aaa;
  width: 300px;
  color: #333;
  border-radius: 4px;
  transition: all 1s ease;
}

input.valid-afm {
  border: 1px solid green;
}
input.invalid-afm {
  border: 1px solid red;
}

JavaScript

(function(w, undefined) {
	const $ = w.jQuery;
  const $afm_input = $('[data-validate-afm]');
  
  $afm_input.on('change', function(ev) {
  	const value = $(this).val();
    
    if(value.length == 9 && value.match(/\d+/)) {
    	// First Remove Last Digit
      const last_digit = value.substr(value.length - 1, 1);
      // Reverse The Less Digits
      const less_digits = value
      	.substr(0, value.length - 1).split('').reverse().join('');
        
      var index = 1, digit, multiple=0, sum=0, mod1, mod2;
      // Calculate The Sum
    	for(var i in less_digits) {
      		digit = less_digits[i];
          multiple = digit * w.Math.pow(2, index);
          sum += multiple;
      		index++;
      }
      // Modulus with 11
      mod1 = sum % 11;
      // Modulus with 10
      mod2 = mod1 % 10;
      
      w.console.log('AFM Validation', 
      	last_digit, less_digits, sum, mod1, mod2
      );
      
      if(mod2 == last_digit) {
      		$(this)
          	.removeClass('invalid-afm')
          	.addClass('valid-afm');
      } else {
      		$(this)
          	.removeClass('valid-afm')
          	.addClass('invalid-afm');
      }
    } else {
    	$(this).removeClass('invalid-afm').removeClass('valid-afm').val(null);
    }
    
  });
  
})(window);