brazilian_documents 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +263 -15
- data/br_documents.gemspec +5 -5
- data/lib/br_documents.rb +3 -0
- data/lib/br_documents/documents/cnpj.rb +7 -10
- data/lib/br_documents/documents/cpf.rb +7 -10
- data/lib/br_documents/documents/ie.rb +43 -0
- data/lib/br_documents/documents/ie/ac.rb +15 -0
- data/lib/br_documents/documents/ie/al.rb +50 -0
- data/lib/br_documents/documents/ie/am.rb +12 -0
- data/lib/br_documents/documents/ie/ap.rb +61 -0
- data/lib/br_documents/documents/ie/ba.rb +84 -0
- data/lib/br_documents/documents/ie/ba/base.rb +37 -0
- data/lib/br_documents/documents/ie/ba/digits8/modulo_10.rb +12 -0
- data/lib/br_documents/documents/ie/ba/digits8/modulo_11.rb +12 -0
- data/lib/br_documents/documents/ie/ba/digits9/modulo_10.rb +19 -0
- data/lib/br_documents/documents/ie/ba/digits9/modulo_11.rb +20 -0
- data/lib/br_documents/documents/ie/ba/modulo_10.rb +19 -0
- data/lib/br_documents/documents/ie/ba/modulo_11.rb +18 -0
- data/lib/br_documents/documents/ie/base.rb +79 -0
- data/lib/br_documents/documents/ie/ce.rb +14 -0
- data/lib/br_documents/documents/ie/df.rb +16 -0
- data/lib/br_documents/documents/ie/es.rb +12 -0
- data/lib/br_documents/documents/ie/go.rb +14 -0
- data/lib/br_documents/documents/ie/ma.rb +14 -0
- data/lib/br_documents/documents/ie/mg.rb +66 -0
- data/lib/br_documents/documents/ie/ms.rb +14 -0
- data/lib/br_documents/documents/ie/mt.rb +14 -0
- data/lib/br_documents/documents/ie/pa.rb +14 -0
- data/lib/br_documents/documents/ie/pb.rb +14 -0
- data/lib/br_documents/documents/ie/pe.rb +38 -0
- data/lib/br_documents/documents/ie/pe/current.rb +13 -0
- data/lib/br_documents/documents/ie/pe/legacy.rb +12 -0
- data/lib/br_documents/documents/ie/pi.rb +14 -0
- data/lib/br_documents/documents/ie/pr.rb +13 -0
- data/lib/br_documents/documents/ie/rj.rb +25 -0
- data/lib/br_documents/documents/ie/rn.rb +14 -0
- data/lib/br_documents/documents/ie/ro.rb +44 -0
- data/lib/br_documents/documents/ie/ro/current.rb +24 -0
- data/lib/br_documents/documents/ie/ro/legacy.rb +13 -0
- data/lib/br_documents/documents/ie/rr.rb +19 -0
- data/lib/br_documents/documents/ie/rs.rb +12 -0
- data/lib/br_documents/documents/ie/sc.rb +12 -0
- data/lib/br_documents/documents/ie/se.rb +14 -0
- data/lib/br_documents/documents/ie/sp.rb +38 -0
- data/lib/br_documents/documents/ie/sp/industry.rb +22 -0
- data/lib/br_documents/documents/ie/sp/rural.rb +21 -0
- data/lib/br_documents/documents/ie/to.rb +14 -0
- data/lib/br_documents/version.rb +1 -1
- metadata +47 -5
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_CE.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::CE < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(06)[.-]?(\d{6})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [0, 6]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_DF.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::DF < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(4 3 2 9 8 7 6 5 4 3 2),
|
6
|
+
last: %w(5 4 3 2 9 8 7 6 5 4 3 2)
|
7
|
+
|
8
|
+
|
9
|
+
set_format_regexp %r{^(07)[-.]?(\d{3})[-.]?(\d{3})[\/-]?(\d{3})[-.]?(\d{2})}
|
10
|
+
|
11
|
+
set_pretty_format_mask %(%s.%s.%s.%s-%s)
|
12
|
+
|
13
|
+
set_fixed_digits [0, 7]
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_ES.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::ES < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(\d{3})[.-]?(\d{3})[.-]?(\d{2})[.-]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_GO.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::GO < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(10)[.-]?(\d{3})[.-]?(\d{3})[.-]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 0]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_MA.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::MA < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(12)(\d{3})[-.]?(\d{3})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 2]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_MG.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::MG < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(1 2 1 2 1 2 1 2 1 2 1 2),
|
6
|
+
last: %w(3 2 11 10 9 8 7 6 5 4 3 2)
|
7
|
+
|
8
|
+
|
9
|
+
set_format_regexp %r{^(\d{9})[-.]?(\d{2})[-.]?(\d{2})}
|
10
|
+
|
11
|
+
set_pretty_format_mask %(%s.%s-%s)
|
12
|
+
|
13
|
+
set_root_digits_count 11
|
14
|
+
|
15
|
+
def calculate_digits_data(number, weights)
|
16
|
+
# For the first digit, a very different approach is applied
|
17
|
+
if first_weight_mask?(weights)
|
18
|
+
return calculate_first_digit_data(number, weights)
|
19
|
+
end
|
20
|
+
|
21
|
+
super(number, weights)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def calculate_verify_digit(number, weights)
|
26
|
+
if first_weight_mask?(weights)
|
27
|
+
return calculate_digits_data(number, weights)[:digit]
|
28
|
+
end
|
29
|
+
|
30
|
+
super(number, weights)
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
def calculate_first_digit_data(number, weights)
|
35
|
+
number = normalized(number).insert(3, 0)
|
36
|
+
|
37
|
+
sum = calculate_first_digits_sum(number, weights)
|
38
|
+
quotient = (sum / get_division_modulo)
|
39
|
+
|
40
|
+
# calculate the difference from the immediate next ten(dezena)
|
41
|
+
verify_digit = next_dezen(sum)
|
42
|
+
|
43
|
+
{ sum: sum, quotient: quotient, rest: verify_digit, digit: verify_digit }
|
44
|
+
end
|
45
|
+
|
46
|
+
# sum EACH algarisms composing the number, not the entire product
|
47
|
+
# eg: 19 + 20 + 12 + 13
|
48
|
+
# 1 + 9 + 2 + 0 + 1 + 2 + 1 + 3 = 19
|
49
|
+
def calculate_first_digits_sum(number, weights)
|
50
|
+
normalized_number = normalized(number)
|
51
|
+
|
52
|
+
normalized_number.each_with_index.map {|n,i| n.to_i * weights[i].to_i }.reduce do |sum, num|
|
53
|
+
sum += num.to_s.split(//).map(&:to_i).reduce(:+)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def next_dezen(sum)
|
58
|
+
rest = (sum.to_i % 10)
|
59
|
+
rest == 0 ? 0 : 10 - rest
|
60
|
+
end
|
61
|
+
|
62
|
+
def first_weight_mask?(weights)
|
63
|
+
weights.size == 12 && weights.first.to_i == 1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_MS.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::MS < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(28)[-.]?(\d{3})[-.]?(\d{3})[\/-]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [2, 8]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_MT.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::MT < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(13)[-.]?(\d{3})[-.]?(\d{3})[\/-]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 3]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PA.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::PA < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(15)[.-]?(\d{3})[-.]?(\d{3})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 5]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PB.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::PB < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(16)[.-]?(\d{3})[-.]?(\d{3})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 6]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# This class is a wrapper/interface to glue all PE IE generators and validators
|
2
|
+
module BRDocuments
|
3
|
+
module IE::PE
|
4
|
+
class << self
|
5
|
+
|
6
|
+
# Delegate all methods to specific class
|
7
|
+
def method_missing(method, *args)
|
8
|
+
class_for_number(args[0]).public_send(method, *args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate(formatted = true, legacy = false)
|
12
|
+
class_for(legacy).generate(formatted)
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate_root_numbers(legacy = false)
|
16
|
+
class_for(legacy).generate_root_numbers
|
17
|
+
end
|
18
|
+
|
19
|
+
def legacy?(number)
|
20
|
+
[13,14].member?(number.to_s.gsub(/[^\d+]/, '').size)
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def class_for_number(number)
|
25
|
+
class_for(legacy?(number))
|
26
|
+
end
|
27
|
+
|
28
|
+
def class_for(legacy)
|
29
|
+
class_name = class_name_for(legacy)
|
30
|
+
IE::PE.const_get(class_name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def class_name_for(legacy = false)
|
34
|
+
legacy ? "Legacy" : "Current"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PE.html
|
2
|
+
module BRDocuments
|
3
|
+
module IE::PE
|
4
|
+
class Current < IE::Base
|
5
|
+
set_verify_digits_weights first: %w(8 7 6 5 4 3 2),
|
6
|
+
last: %w(9 8 7 6 5 4 3 2)
|
7
|
+
|
8
|
+
set_format_regexp %r{^(\d{7})[-.]?(\d{2})}
|
9
|
+
|
10
|
+
set_pretty_format_mask %(%s-%s)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PE.html
|
2
|
+
module BRDocuments
|
3
|
+
module IE::PE
|
4
|
+
class Legacy < IE::Base
|
5
|
+
set_verify_digits_weights first: %w(5 4 3 2 1 9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(\d{2})[-.]?(\d{1})[-.]?(\d{3})[-.]?(\d{7})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s.%s-%s)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PI.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::PI < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(19)[-.]?(\d{6})[-.]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [1, 9]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_PR.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::PR < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(3 2 7 6 5 4 3 2),
|
6
|
+
last: %w(4 3 2 7 6 5 4 3 2)
|
7
|
+
|
8
|
+
set_format_regexp %r{^(\d{8})[-.]?(\d{2})}
|
9
|
+
|
10
|
+
set_pretty_format_mask %(%s-%s)
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_RJ.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::RJ < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(2 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(\d{2})[-.]?(\d{3})[-.]?(\d{3})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s)
|
10
|
+
|
11
|
+
set_fixed_digits (80..90).to_a
|
12
|
+
|
13
|
+
def self.valid_fixed_digits?(number)
|
14
|
+
number = new(number).normalize
|
15
|
+
current = number[0..1].join.to_i
|
16
|
+
|
17
|
+
self.const_get('FIXED_INITIAL_NUMBERS').member?(current)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.fixed_digits
|
21
|
+
super.sample.to_s.split(//).map(&:to_i)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_RN.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::RN < IE::Base
|
4
|
+
|
5
|
+
set_verify_digits_weights first: %w(9 8 7 6 5 4 3 2)
|
6
|
+
|
7
|
+
set_format_regexp %r{^(20)[.-]?(\d{3})[.-]?(\d{3})[.-]?(\d{1})}
|
8
|
+
|
9
|
+
set_pretty_format_mask %(%s.%s.%s-%s)
|
10
|
+
|
11
|
+
set_fixed_digits [2, 0]
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This class is a wrapper/interface to glue all RO IE generators and validators
|
2
|
+
module BRDocuments
|
3
|
+
module IE::RO
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def convert_legacy(legacy_number)
|
7
|
+
klass = class_for(false)
|
8
|
+
|
9
|
+
new(legacy_number.gsub(/^(\d{3})/, '00000000')).pretty # remove city code
|
10
|
+
end
|
11
|
+
|
12
|
+
# Delegate all methods to specific class
|
13
|
+
def method_missing(method, *args)
|
14
|
+
class_for_number(args[0]).public_send(method, *args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate(formatted = true, legacy = false)
|
18
|
+
class_for(legacy).generate(formatted)
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_root_numbers(legacy = false)
|
22
|
+
class_for(legacy).generate_root_numbers
|
23
|
+
end
|
24
|
+
|
25
|
+
def legacy?(number)
|
26
|
+
[8, 9].member?(number.to_s.gsub(/[^\d+]/, '').size)
|
27
|
+
end
|
28
|
+
|
29
|
+
def class_for_number(number)
|
30
|
+
class_for(legacy?(number))
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
def class_for(legacy)
|
35
|
+
class_name = class_name_for(legacy)
|
36
|
+
IE::RO.const_get(class_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def class_name_for(legacy = false)
|
40
|
+
legacy ? "Legacy" : "Current"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_RO.html
|
2
|
+
module BRDocuments
|
3
|
+
module IE::RO
|
4
|
+
class Current < IE::Base
|
5
|
+
|
6
|
+
set_verify_digits_weights first: %w(6 5 4 3 2 9 8 7 6 5 4 3 2)
|
7
|
+
|
8
|
+
set_format_regexp %r{^(\d{13})[-.]?(\d{1})}
|
9
|
+
|
10
|
+
set_pretty_format_mask %(%s-%s)
|
11
|
+
|
12
|
+
set_fixed_digits [0,0,0,0,0,0,0]
|
13
|
+
|
14
|
+
def calc_verify_digit(quotient_rest)
|
15
|
+
rest = (get_division_modulo - quotient_rest).to_i
|
16
|
+
|
17
|
+
# if rest has two digits(checkdigit must be a single digit), force 0
|
18
|
+
return rest - 10 if rest >= 10
|
19
|
+
|
20
|
+
rest
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_RO.html
|
2
|
+
module BRDocuments
|
3
|
+
module IE::RO
|
4
|
+
class Legacy < IE::Base
|
5
|
+
|
6
|
+
set_verify_digits_weights first: %w(0 0 0 6 5 4 3 2)
|
7
|
+
|
8
|
+
set_format_regexp %r{^(\d{3})[-.]?(\d{5})[-.]?(\d{1})}
|
9
|
+
|
10
|
+
set_pretty_format_mask %(%s.%s-%s)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# http://www.sintegra.gov.br/Cad_Estados/cad_RR.html
|
2
|
+
module BRDocuments
|
3
|
+
class IE::RR < IE::Base
|
4
|
+
|
5
|
+
set_division_modulo 9
|
6
|
+
|
7
|
+
set_verify_digits_weights first: %w(1 2 3 4 5 6 7 8)
|
8
|
+
|
9
|
+
set_format_regexp %r{^(24)[-.]?(\d{6})[-.]?(\d{1})}
|
10
|
+
|
11
|
+
set_pretty_format_mask %(%s.%s-%s)
|
12
|
+
|
13
|
+
set_fixed_digits [2, 4]
|
14
|
+
|
15
|
+
def calc_verify_digit(quotient_rest)
|
16
|
+
quotient_rest.to_i
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|