mtarnovan/romanianvalidators

View on GitHub
lib/romanianvalidators/cnp.rb

Summary

Maintainability
A
25 mins
Test Coverage
module RomanianValidators
  module Cnp
    TEST_KEY = '279146358279'.each_char.map(&:to_i)

    module_function

    def valid?(cnp)
      return false unless well_formed?(cnp) && valid_birthdate?(cnp)
      control = (0..11).reduce(0) { |acc, elem| acc + TEST_KEY[elem] * cnp[elem].chr.to_i } % 11
      control = 1 if control == 10
      control == cnp[12].chr.to_i
    end

    def well_formed?(cnp)
      (cnp =~ /[^0-9]/).nil? && cnp.size == 13
    end

    def valid_birthdate?(cnp)
      year_code = cnp[0].chr.to_i
      year =
        case year_code
        when 1..2 then '19'
        when 3..4 then '18'
        when 5..6 then '20'
        when 9    then '19' # oare se sare peste un an bisect intre 1800-2099 ?
        else return false
        end
      year = (year + cnp[1..2]).to_i
      Date.valid_civil?(year, cnp[3..4].to_i, cnp[5..6].to_i) ? true : false
    rescue ArgumentError
      return false
    end
  end
end