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