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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +263 -15
  4. data/br_documents.gemspec +5 -5
  5. data/lib/br_documents.rb +3 -0
  6. data/lib/br_documents/documents/cnpj.rb +7 -10
  7. data/lib/br_documents/documents/cpf.rb +7 -10
  8. data/lib/br_documents/documents/ie.rb +43 -0
  9. data/lib/br_documents/documents/ie/ac.rb +15 -0
  10. data/lib/br_documents/documents/ie/al.rb +50 -0
  11. data/lib/br_documents/documents/ie/am.rb +12 -0
  12. data/lib/br_documents/documents/ie/ap.rb +61 -0
  13. data/lib/br_documents/documents/ie/ba.rb +84 -0
  14. data/lib/br_documents/documents/ie/ba/base.rb +37 -0
  15. data/lib/br_documents/documents/ie/ba/digits8/modulo_10.rb +12 -0
  16. data/lib/br_documents/documents/ie/ba/digits8/modulo_11.rb +12 -0
  17. data/lib/br_documents/documents/ie/ba/digits9/modulo_10.rb +19 -0
  18. data/lib/br_documents/documents/ie/ba/digits9/modulo_11.rb +20 -0
  19. data/lib/br_documents/documents/ie/ba/modulo_10.rb +19 -0
  20. data/lib/br_documents/documents/ie/ba/modulo_11.rb +18 -0
  21. data/lib/br_documents/documents/ie/base.rb +79 -0
  22. data/lib/br_documents/documents/ie/ce.rb +14 -0
  23. data/lib/br_documents/documents/ie/df.rb +16 -0
  24. data/lib/br_documents/documents/ie/es.rb +12 -0
  25. data/lib/br_documents/documents/ie/go.rb +14 -0
  26. data/lib/br_documents/documents/ie/ma.rb +14 -0
  27. data/lib/br_documents/documents/ie/mg.rb +66 -0
  28. data/lib/br_documents/documents/ie/ms.rb +14 -0
  29. data/lib/br_documents/documents/ie/mt.rb +14 -0
  30. data/lib/br_documents/documents/ie/pa.rb +14 -0
  31. data/lib/br_documents/documents/ie/pb.rb +14 -0
  32. data/lib/br_documents/documents/ie/pe.rb +38 -0
  33. data/lib/br_documents/documents/ie/pe/current.rb +13 -0
  34. data/lib/br_documents/documents/ie/pe/legacy.rb +12 -0
  35. data/lib/br_documents/documents/ie/pi.rb +14 -0
  36. data/lib/br_documents/documents/ie/pr.rb +13 -0
  37. data/lib/br_documents/documents/ie/rj.rb +25 -0
  38. data/lib/br_documents/documents/ie/rn.rb +14 -0
  39. data/lib/br_documents/documents/ie/ro.rb +44 -0
  40. data/lib/br_documents/documents/ie/ro/current.rb +24 -0
  41. data/lib/br_documents/documents/ie/ro/legacy.rb +13 -0
  42. data/lib/br_documents/documents/ie/rr.rb +19 -0
  43. data/lib/br_documents/documents/ie/rs.rb +12 -0
  44. data/lib/br_documents/documents/ie/sc.rb +12 -0
  45. data/lib/br_documents/documents/ie/se.rb +14 -0
  46. data/lib/br_documents/documents/ie/sp.rb +38 -0
  47. data/lib/br_documents/documents/ie/sp/industry.rb +22 -0
  48. data/lib/br_documents/documents/ie/sp/rural.rb +21 -0
  49. data/lib/br_documents/documents/ie/to.rb +14 -0
  50. data/lib/br_documents/version.rb +1 -1
  51. 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