Sha256: d6d68fbe5ac8b548195562ee92d9f33d979abb3f613f7ba97b486a097e614afd

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

require_relative '../commons/mod11'

# rubocop:disable Style/ClassAndModuleChildren
class BrDocuments::Suframa
  include BrDocuments::Commons::Mod11

  def initialize(number)
    @number = number
  end

  def formatted
    valid? ? format_number : ''
  end

  def valid?
    valid_pattern? &&
      !sequence_of_equal_numbers? &&
      valid_check_digit? &&
      valid_activity_sector? &&
      valid_administrative_unit?
  end

  private

  def valid_pattern?
    /^(\d{2}\.\d{4}\.\d{3})$|^(\d{9})$/.match(@number).present?
  end

  def sequence_of_equal_numbers?
    number_without_mask.split('').uniq.length == 1
  end

  def number_without_mask
    @number_without_mask ||= @number.gsub('.', '')
  end

  def valid_check_digit?
    weights = [9, 8, 7, 6, 5, 4, 3, 2]

    check_digit = generate_check_digit(number_without_mask, weights)
    number_without_mask[8] == check_digit.to_s
  end

  def valid_activity_sector?
    activity_sector = number_without_mask[0] + number_without_mask[1]

    ['01', '02', '10', '11', '20', '60'].include?(activity_sector)
  end

  def valid_administrative_unit?
    administrative_unit = number_without_mask[6] + number_without_mask[7]

    ['01', '10', '30'].include?(administrative_unit)
  end

  def format_number
    @number.sub(/(\d{2})(\d{4})(\d{3})/, '\\1.\\2.\\3')
  end
end
# rubocop:enable Style/ClassAndModuleChildren

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
br_documents-0.2.0 lib/br_documents/suframa/suframa.rb