Module: Kontact::Brazil

Defined in:
lib/kontact/brazil.rb

Constant Summary collapse

DDD =
%w[
  11 12 13 14 15 16 17 18 19
  21 22 24
  27 28
  31 32 33 34 35 37 38
  41 42 43 44 45 46
  47 48 49
  51 53 54 55
  61 62 63 64
  65 66 67
  68 69
  71 73 74 75 77
  79
  81 82 83 84 85 86 87 88 89
  91 92 93 94 95 96 97 98 99
].freeze
PATTERN =
[
  /\A\+55 \((\d{2})\) 9\d{4}-\d{4}\z/,
  /\A\((\d{2})\) 9\d{4}-\d{4}\z/,
  /\A\+55 \((\d{2})\) [2-5]\d{3}-\d{4}\z/,
  /\A\((\d{2})\) [2-5]\d{3}-\d{4}\z/,
  /\A\+55(\d{2})9\d{8}\z/,
  /\A55(\d{2})9\d{8}\z/,
  /\A\+55(\d{2})[2-5]\d{7}\z/
].freeze

Class Method Summary collapse

Class Method Details

.generate(type: :mobile, formatted: false, international_prefix: false) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/kontact/brazil.rb', line 30

def self.generate(type: :mobile, formatted: false, international_prefix: false)
  ddd = DDD.sample
  number = case type
           when :mobile
             "9#{rand(1000..9999)}#{formatted ? "-" : ""}#{rand(1000..9999)}"
           when :landline
             "#{rand(2000..5999)}#{formatted ? "-" : ""}#{rand(1000..9999)}"
           else
             raise ArgumentError, "Invalid type: #{type}"
           end
  n = formatted ? "55 (#{ddd}) #{number}" : "55#{ddd}#{number}"
  international_prefix ? "+#{n}" : n
end

.valid?(number) ⇒ Boolean

Raises:

Returns:



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/kontact/brazil.rb', line 44

def self.valid?(number)
  raise ArgumentError, "Number can not empty or blank" unless number

  number = number.strip

  PATTERN.any? do |regex|
    match = number.match(regex)
    match && DDD.include?(match[1])
  end

  digits = number.gsub(/\D/, "")
  digits = digits[2..] if digits.start_with?("55")
  return false unless [10, 11].include?(digits.length)

  ddd = digits[0..1]
  prefix = digits[2..-5]

  return false unless DDD.include?(ddd)

  if digits.length == 11
    prefix.start_with?("9")
  elsif digits.length == 10
    prefix[0].to_i.between?(2, 5)
  else
    false
  end
end