Sha256: 9d80465c2ceab2b5d0aed5cbde9d95c1c5d1546ee6d07fe649aaaf330bd261fc
Contents?: true
Size: 1.58 KB
Versions: 1
Compression:
Stored size: 1.58 KB
Contents
module ActiveModel module Validations class CodiceFiscaleFormatValidator < ActiveModel::EachValidator REGEX=Regexp.compile("^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$") DISPARI=[1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23] def validate_each(object, attribute, value) if value.blank? object.errors[attribute] << I18n.translate("activerecord.errors.codice_fiscale.empty") return end unless value.match(REGEX) object.errors[attribute] << I18n.translate("activerecord.errors.codice_fiscale.invalid_format") return end unless control_code_valid?(value) object.errors[attribute] << I18n.translate("activerecord.errors.codice_fiscale.invalid_format") return end end private def control_code_valid?(value) odds, evens = [], [] value[0..14].split('').each_with_index {|e,i| (i+1).odd? ? odds << e : evens << e} odd = odds.inject(0) { |sum, current_char| sum + DISPARI[(current_char.ord < 65 ? current_char.to_i : ((current_char.ord - 54)-1))] } even = evens.inject(0) { |sum, current_char| sum + (current_char.ord < 65 ? current_char.to_i : current_char.ord - 65) } ( ((odd + even) % 26) + 65).chr == value[15].chr end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
italian_job-0.0.2 | lib/italian_job/validators/codice_fiscale_format.rb |