Sha256: 4dbc9e3be961ea57d70b2f62a86c1bf0d295212c6fd9fcba6c1b3c0fb085f76f

Contents?: true

Size: 1.52 KB

Versions: 33

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

module EacRailsUtils
  class CpfValidator < ActiveModel::EachValidator
    def validate_each(record, attribute, value)
      return if Cpf.new(value).valid?

      record.errors[attribute] << (options[:message] ||
          'CPF inválido (9 caracteres, somente dígitos)')
    end

    class Cpf
      def initialize(input)
        @input = input
      end

      def valid?
        return false if input_invalid?

        digito_verificador1_calculo == values[9] && digito_verificador2_calculo == values[10]
      end

      private

      attr_reader :input

      def input_invalid?
        input.nil? || digits.length != 11 || digits.length != input.length || null?
      end

      def null?
        %w[12345678909 11111111111 22222222222 33333333333 44444444444 55555555555
           66666666666 77777777777 88888888888 99999999999 00000000000].member?(digits.join)
      end

      def digits
        @digits ||= input.scan(/[0-9]/)
      end

      def values
        @values ||= digits.collect(&:to_i)
      end

      def digito_verificador1_calculo
        digito_verificador_calculo(9, 10)
      end

      def digito_verificador2_calculo
        digito_verificador_calculo(10, 11)
      end

      def digito_verificador_calculo(valores_count, coeficiente_inicial)
        s = 0
        c = coeficiente_inicial
        (0..valores_count - 1).each do |i|
          s += values[i] * c
          c -= 1
        end
        s -= (11 * (s / 11))
        [0, 1].include?(s) ? 0 : 11 - s
      end
    end
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
eac_rails_utils-0.22.2 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.22.1 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.22.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.21.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.20.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.19.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.18.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.17.2 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.17.1 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.17.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.16.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.15.2 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.15.1 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.15.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.14.1 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.14.0 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.13.5 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.13.4 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.13.3 app/validators/eac_rails_utils/cpf_validator.rb
eac_rails_utils-0.13.2 app/validators/eac_rails_utils/cpf_validator.rb