brazilian_documents 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|