class DockCheck::Inn

Public Class Methods

check(document) click to toggle source
# File lib/dockcheck/inn.rb, line 10
def self.check(document)
  inn = DockHelper.numberize_document(document[:content])

  case inn.count
  when 10
    document[:correct] = ten_digit_inn_valid?(inn)
  when 12
    document[:correct] = twelve_digit_inn_valid?(inn)
  else
    document[:error] = 'Incorrect inn numbers count!'
  end

  document
end
name() click to toggle source
# File lib/dockcheck/inn.rb, line 25
def self.name
  :inn
end

Private Class Methods

control_sum_calc(inn, coefficients) click to toggle source
# File lib/dockcheck/inn.rb, line 31
def self.control_sum_calc(inn, coefficients)
  inn
    .zip(coefficients)
    .filter { |(a, b)| !b.nil? }
    .reduce(0) { |acc, (a, b)| a * b + acc }
end
sum_div(number) click to toggle source
# File lib/dockcheck/inn.rb, line 38
def self.sum_div(number)
  number % 11 % 10
end
ten_digit_inn_valid?(inn) click to toggle source
# File lib/dockcheck/inn.rb, line 42
def self.ten_digit_inn_valid?(inn)
  last_number = inn.last
  control_sum = control_sum_calc(inn, @@ten_digits_map)
  last_number == sum_div(control_sum)
end
twelve_digit_inn_valid?(inn) click to toggle source
# File lib/dockcheck/inn.rb, line 48
def self.twelve_digit_inn_valid?(inn)
  last_number = inn.last
  penult_number = inn.fetch(10)

  first_sum = control_sum_calc(inn, @@twelve_digits_first_map)
  second_sum = control_sum_calc(inn, @@twelve_digits_second_map)

  penult_number == sum_div(first_sum) && last_number == sum_div(second_sum)
end