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.
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