Sha256: f98f87c54a065ec40fc3641eb3e83e975b61b6c4535dc3229ff117e3c4ca02e5

Contents?: true

Size: 1.82 KB

Versions: 4

Compression:

Stored size: 1.82 KB

Contents

# frozen_string_literal: true

class ValidatesIdentity
  module BrCpf
    class Validator
      VALIDATION_REGULAR_EXPRESSION = /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/.freeze
      FORMAT_REGULAR_EXPRESSION = /(\d{3})(\d{3})(\d{3})(\d{2})/.freeze

      attr_reader :value

      def initialize(value)
        @value = value
      end

      def valid?
        return true if value.blank?
        return false unless number
        return false if striped_value.length != 11
        return false if striped_value.scan(/\d/).uniq.length == 1

        verifier_digits == "#{first_digit_verifier}#{second_digit_verifier}"
      end

      def formatted
        return if number.nil?

        result = FORMAT_REGULAR_EXPRESSION.match(striped_value)
        "#{result[1]}.#{result[2]}.#{result[3]}-#{result[4]}"
      end

      private

      def result
        @result ||= VALIDATION_REGULAR_EXPRESSION.match(value)
      end

      def number
        return if result.nil?

        @number ||= result[1]
      end

      def striped_value
        return if number.nil?

        @striped_value ||= value.gsub(/[\.-]/, '')
      end

      def verifier_digits
        return if result.nil?

        @verifier_digits ||= result[2]
      end

      def first_digit_verifier
        sum = multiply_and_sum([10, 9, 8, 7, 6, 5, 4, 3, 2], number)
        digit_verifier(sum % 11).to_s
      end

      def second_digit_verifier
        sum = multiply_and_sum([11, 10, 9, 8, 7, 6, 5, 4, 3, 2], "#{number}#{first_digit_verifier}")
        digit_verifier(sum % 11).to_s
      end

      def multiply_and_sum(array, number)
        multiplied = []
        number.scan(/\d{1}/).each_with_index { |e, i| multiplied[i] = e.to_i * array[i] }
        multiplied.inject { |s, e| s + e }
      end

      def digit_verifier(rest)
        rest < 2 ? 0 : 11 - rest
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
validates_identity-br_cpf-1.0.0 lib/validates_identity/br_cpf/validator.rb
validates_identity-br_cpf-0.4.0 lib/validates_identity/br_cpf/validator.rb
validates_identity-br_cpf-0.3.0 lib/validates_identity/br_cpf/validator.rb
validates_identity-br_cpf-0.2.0 lib/validates_identity/br_cpf/validator.rb