br_documents 0.1.3 → 0.2.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/.github/workflows/config.yml +40 -0
- data/.rubocop.yml +73 -0
- data/.tool-versions +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +79 -42
- data/README.md +33 -0
- data/Rakefile +4 -4
- data/br_documents.gemspec +26 -19
- data/lib/br_documents/cnpj_cpf/cnpj.rb +2 -2
- data/lib/br_documents/cnpj_cpf/cpf.rb +2 -2
- data/lib/br_documents/cnpj_cpf/document.rb +9 -9
- data/lib/br_documents/cnpj_validator.rb +4 -4
- data/lib/br_documents/commons/mod11.rb +1 -2
- data/lib/br_documents/commons/mod14.rb +1 -2
- data/lib/br_documents/cpf_validator.rb +4 -4
- data/lib/br_documents/{gtin/gtin.rb → gtin.rb} +3 -3
- data/lib/br_documents/gtin_validator.rb +6 -6
- data/lib/br_documents/ie/ac.rb +3 -2
- data/lib/br_documents/ie/al.rb +2 -1
- data/lib/br_documents/ie/am.rb +3 -2
- data/lib/br_documents/ie/ap.rb +20 -16
- data/lib/br_documents/ie/ba.rb +28 -25
- data/lib/br_documents/ie/base.rb +1 -1
- data/lib/br_documents/ie/ce.rb +3 -2
- data/lib/br_documents/ie/df.rb +3 -2
- data/lib/br_documents/ie/es.rb +2 -1
- data/lib/br_documents/ie/factory.rb +3 -3
- data/lib/br_documents/ie/go.rb +3 -2
- data/lib/br_documents/ie/ma.rb +2 -1
- data/lib/br_documents/ie/mg.rb +14 -17
- data/lib/br_documents/ie/ms.rb +2 -1
- data/lib/br_documents/ie/mt.rb +6 -5
- data/lib/br_documents/ie/pa.rb +3 -2
- data/lib/br_documents/ie/pattern1.rb +10 -7
- data/lib/br_documents/ie/pattern2.rb +9 -8
- data/lib/br_documents/ie/pb.rb +3 -2
- data/lib/br_documents/ie/pe.rb +10 -10
- data/lib/br_documents/ie/pi.rb +2 -1
- data/lib/br_documents/ie/pr.rb +3 -2
- data/lib/br_documents/ie/rj.rb +3 -2
- data/lib/br_documents/ie/rn.rb +19 -16
- data/lib/br_documents/ie/ro.rb +16 -13
- data/lib/br_documents/ie/rr.rb +4 -3
- data/lib/br_documents/ie/rs.rb +3 -2
- data/lib/br_documents/ie/sc.rb +3 -2
- data/lib/br_documents/ie/se.rb +3 -2
- data/lib/br_documents/ie/sp.rb +17 -14
- data/lib/br_documents/ie/to.rb +6 -5
- data/lib/br_documents/ie_validator.rb +7 -7
- data/lib/br_documents/suframa.rb +46 -0
- data/lib/br_documents/suframa_validator.rb +8 -0
- data/lib/br_documents/version.rb +1 -1
- data/lib/br_documents.rb +3 -3
- data/spec/br_documents/cnpj_cpf/cnpj_spec.rb +59 -0
- data/spec/br_documents/cnpj_cpf/cpf_spec.rb +59 -0
- data/spec/br_documents/cnpj_validator_spec.rb +36 -0
- data/spec/br_documents/cpf_validator_spec.rb +36 -0
- data/spec/{gtin → br_documents}/gtin_spec.rb +4 -4
- data/spec/{gtin_validator_spec.rb → br_documents/gtin_validator_spec.rb} +14 -14
- data/spec/br_documents/ie/ac_spec.rb +43 -0
- data/spec/br_documents/ie/al_spec.rb +36 -0
- data/spec/br_documents/ie/am_spec.rb +43 -0
- data/spec/br_documents/ie/ap_spec.rb +36 -0
- data/spec/br_documents/ie/ba_spec.rb +69 -0
- data/spec/br_documents/ie/ce_spec.rb +16 -0
- data/spec/br_documents/ie/df_spec.rb +43 -0
- data/spec/br_documents/ie/es_spec.rb +16 -0
- data/spec/br_documents/ie/factory_spec.rb +202 -0
- data/spec/br_documents/ie/go_spec.rb +43 -0
- data/spec/br_documents/ie/ma_spec.rb +16 -0
- data/spec/br_documents/ie/mg_spec.rb +43 -0
- data/spec/br_documents/ie/ms_spec.rb +16 -0
- data/spec/br_documents/ie/mt_spec.rb +49 -0
- data/spec/br_documents/ie/pa_spec.rb +43 -0
- data/spec/br_documents/ie/pb_spec.rb +16 -0
- data/spec/br_documents/ie/pe_spec.rb +62 -0
- data/spec/br_documents/ie/pi_spec.rb +16 -0
- data/spec/br_documents/ie/pr_spec.rb +36 -0
- data/spec/br_documents/ie/rj_spec.rb +43 -0
- data/spec/br_documents/ie/rn_spec.rb +62 -0
- data/spec/br_documents/ie/ro_spec.rb +62 -0
- data/spec/br_documents/ie/rr_spec.rb +43 -0
- data/spec/br_documents/ie/rs_spec.rb +41 -0
- data/spec/br_documents/ie/sc_spec.rb +43 -0
- data/spec/br_documents/ie/se_spec.rb +16 -0
- data/spec/br_documents/ie/shared_examples_for_pattern1.rb +33 -0
- data/spec/br_documents/ie/shared_examples_for_to_remove_all_masks.rb +16 -0
- data/spec/br_documents/ie/sp_spec.rb +45 -0
- data/spec/br_documents/ie/to_spec.rb +100 -0
- data/spec/{ie_validator_spec.rb → br_documents/ie_validator_spec.rb} +12 -9
- data/spec/br_documents/suframa_spec.rb +73 -0
- data/spec/br_documents/suframa_validator_spec.rb +36 -0
- data/spec/spec_helper.rb +6 -6
- data/spec/support/utilities.rb +2 -2
- metadata +177 -99
- data/.circleci/config.yml +0 -42
- data/spec/cnpj_cpf/cnpj_spec.rb +0 -59
- data/spec/cnpj_cpf/cpf_spec.rb +0 -59
- data/spec/cnpj_validator_spec.rb +0 -36
- data/spec/cpf_validator_spec.rb +0 -36
- data/spec/ie/ac_spec.rb +0 -43
- data/spec/ie/al_spec.rb +0 -36
- data/spec/ie/am_spec.rb +0 -43
- data/spec/ie/ap_spec.rb +0 -36
- data/spec/ie/ba_spec.rb +0 -69
- data/spec/ie/ce_spec.rb +0 -16
- data/spec/ie/df_spec.rb +0 -43
- data/spec/ie/es_spec.rb +0 -16
- data/spec/ie/factory_spec.rb +0 -203
- data/spec/ie/go_spec.rb +0 -43
- data/spec/ie/ma_spec.rb +0 -16
- data/spec/ie/mg_spec.rb +0 -43
- data/spec/ie/ms_spec.rb +0 -16
- data/spec/ie/mt_spec.rb +0 -44
- data/spec/ie/pa_spec.rb +0 -43
- data/spec/ie/pb_spec.rb +0 -16
- data/spec/ie/pe_spec.rb +0 -62
- data/spec/ie/pi_spec.rb +0 -16
- data/spec/ie/pr_spec.rb +0 -36
- data/spec/ie/rj_spec.rb +0 -43
- data/spec/ie/rn_spec.rb +0 -62
- data/spec/ie/ro_spec.rb +0 -62
- data/spec/ie/rr_spec.rb +0 -43
- data/spec/ie/rs_spec.rb +0 -41
- data/spec/ie/sc_spec.rb +0 -43
- data/spec/ie/se_spec.rb +0 -16
- data/spec/ie/shared_examples_for_pattern1.rb +0 -33
- data/spec/ie/shared_examples_for_to_remove_all_masks.rb +0 -17
- data/spec/ie/sp_spec.rb +0 -45
- data/spec/ie/to_spec.rb +0 -100
data/lib/br_documents/ie/ro.rb
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
require_relative
|
|
2
|
-
require_relative
|
|
1
|
+
require_relative 'base'
|
|
2
|
+
require_relative '../commons/mod14'
|
|
3
3
|
|
|
4
4
|
module BrDocuments
|
|
5
5
|
module IE
|
|
6
6
|
class RO < Base
|
|
7
7
|
include Commons::Mod14
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
protected
|
|
10
|
+
|
|
10
11
|
def format_ie(number)
|
|
11
|
-
if number.gsub(/(\.)|(\-)/,
|
|
12
|
-
number.sub(/(\d{3})(\d{5})(\d{1})/,
|
|
12
|
+
if number.gsub(/(\.)|(\-)/, '').length == 9
|
|
13
|
+
number.sub(/(\d{3})(\d{5})(\d{1})/, '\\1.\\2-\\3')
|
|
13
14
|
else
|
|
14
|
-
number.sub(/(\d{13})(\d{1})/,
|
|
15
|
+
number.sub(/(\d{13})(\d{1})/, '\\1-\\2')
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
|
|
@@ -19,6 +20,12 @@ module BrDocuments
|
|
|
19
20
|
valid_old_format or valid_new_format
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
def valid_check_digit?
|
|
24
|
+
valid_old_digital_check or valid_new_digital_check
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
22
29
|
def valid_old_format
|
|
23
30
|
regex = /^(\d{3}\.\d{5}\-\d{1})$|^(\d{9})$/
|
|
24
31
|
regex.match(@number).present?
|
|
@@ -29,24 +36,20 @@ module BrDocuments
|
|
|
29
36
|
regex.match(@number).present?
|
|
30
37
|
end
|
|
31
38
|
|
|
32
|
-
def valid_digital_check?
|
|
33
|
-
valid_old_digital_check or valid_new_digital_check
|
|
34
|
-
end
|
|
35
|
-
|
|
36
39
|
def valid_old_digital_check
|
|
37
40
|
weight = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
|
38
41
|
remove_mask!
|
|
39
|
-
@number[-1]
|
|
42
|
+
@number[-1] == generate_check_digit(@number[-6, 6], weight).to_s
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
def valid_new_digital_check
|
|
43
46
|
weight = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
|
44
47
|
remove_mask!
|
|
45
|
-
@number[-1]
|
|
48
|
+
@number[-1] == generate_check_digit(@number, weight).to_s
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def remove_mask!
|
|
49
|
-
@number.gsub!(/[\.\/-]/,
|
|
52
|
+
@number.gsub!(/[\.\/-]/, '')
|
|
50
53
|
end
|
|
51
54
|
end
|
|
52
55
|
end
|
data/lib/br_documents/ie/rr.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative 'pattern1'
|
|
2
2
|
|
|
3
3
|
module BrDocuments
|
|
4
4
|
module IE
|
|
@@ -10,11 +10,12 @@ module BrDocuments
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
private
|
|
13
|
+
|
|
13
14
|
def format_ie(number)
|
|
14
|
-
number.sub(/(\d{8})(\d{1})/,
|
|
15
|
+
number.sub(/(\d{8})(\d{1})/, '\\1-\\2')
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
def
|
|
18
|
+
def generate_check_digit(values, weights)
|
|
18
19
|
sum = reduce_weights(values, weights)
|
|
19
20
|
sum % 9
|
|
20
21
|
end
|
data/lib/br_documents/ie/rs.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative 'pattern1'
|
|
2
2
|
|
|
3
3
|
module BrDocuments
|
|
4
4
|
module IE
|
|
@@ -10,8 +10,9 @@ module BrDocuments
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
private
|
|
13
|
+
|
|
13
14
|
def format_ie(number)
|
|
14
|
-
number.sub(/(\d{3})(\d{7})/,
|
|
15
|
+
number.sub(/(\d{3})(\d{7})/, '\\1/\\2')
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
end
|
data/lib/br_documents/ie/sc.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative 'pattern1'
|
|
2
2
|
|
|
3
3
|
module BrDocuments
|
|
4
4
|
module IE
|
|
@@ -9,8 +9,9 @@ module BrDocuments
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
private
|
|
12
|
+
|
|
12
13
|
def format_ie(number)
|
|
13
|
-
number.sub(/(\d{3})(\d{3})(\d{3})/,
|
|
14
|
+
number.sub(/(\d{3})(\d{3})(\d{3})/, '\\1.\\2.\\3')
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
end
|
data/lib/br_documents/ie/se.rb
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative 'pattern1'
|
|
2
2
|
|
|
3
3
|
module BrDocuments
|
|
4
4
|
module IE
|
|
5
5
|
class SE < Pattern1
|
|
6
6
|
private
|
|
7
|
+
|
|
7
8
|
def format_ie(number)
|
|
8
|
-
number.sub(/(\d{8})(\d{1})/,
|
|
9
|
+
number.sub(/(\d{8})(\d{1})/, '\\1-\\2')
|
|
9
10
|
end
|
|
10
11
|
end
|
|
11
12
|
end
|
data/lib/br_documents/ie/sp.rb
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
require_relative
|
|
2
|
-
require_relative
|
|
1
|
+
require_relative 'base'
|
|
2
|
+
require_relative '../commons/mod11'
|
|
3
3
|
|
|
4
4
|
module BrDocuments
|
|
5
5
|
module IE
|
|
6
6
|
class SP < Base
|
|
7
7
|
include Commons::Mod11
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
protected
|
|
10
|
+
|
|
10
11
|
def format_ie(number)
|
|
11
|
-
if number.gsub(/(\-)|(\.)|(\/)/,
|
|
12
|
-
number.sub(/(\w{1})(\d{8})(\d{1})(\d{3})/,
|
|
12
|
+
if number.gsub(/(\-)|(\.)|(\/)/, '').length == 13
|
|
13
|
+
number.sub(/(\w{1})(\d{8})(\d{1})(\d{3})/, '\\1-\\2.\\3/\\4')
|
|
13
14
|
else
|
|
14
|
-
number.sub(/(\d{3})(\d{3})(\d{3})(\d{3})/,
|
|
15
|
+
number.sub(/(\d{3})(\d{3})(\d{3})(\d{3})/, '\\1.\\2.\\3.\\4')
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
|
|
@@ -20,33 +21,35 @@ module BrDocuments
|
|
|
20
21
|
regex.match(@number).present?
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
def
|
|
24
|
-
if @number[0]
|
|
24
|
+
def valid_check_digit?
|
|
25
|
+
if @number[0] == 'P'
|
|
25
26
|
valid_rural_producer_digital_check?
|
|
26
27
|
else
|
|
27
28
|
valid_standard_digital_check?
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
|
|
32
|
+
private
|
|
33
|
+
|
|
31
34
|
def valid_standard_digital_check?
|
|
32
|
-
@number.gsub!(/[\.\/P-]/,
|
|
35
|
+
@number.gsub!(/[\.\/P-]/, '')
|
|
33
36
|
|
|
34
37
|
weight1 = [1, 3, 4, 5, 6, 7, 8, 10]
|
|
35
38
|
weight2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]
|
|
36
39
|
|
|
37
|
-
dc1 =
|
|
38
|
-
dc2 =
|
|
40
|
+
dc1 = generate_check_digit(weight1)
|
|
41
|
+
dc2 = generate_check_digit(weight2)
|
|
39
42
|
|
|
40
43
|
(@number[8] == dc1) and (@number[11] == dc2)
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
def valid_rural_producer_digital_check?
|
|
44
|
-
@number.gsub!(/[\.\/P-]/,
|
|
47
|
+
@number.gsub!(/[\.\/P-]/, '')
|
|
45
48
|
weight9 = [1, 3, 4, 5, 6, 7, 8, 10]
|
|
46
|
-
@number[8] ==
|
|
49
|
+
@number[8] == generate_check_digit(weight9)
|
|
47
50
|
end
|
|
48
51
|
|
|
49
|
-
def
|
|
52
|
+
def generate_check_digit(weights)
|
|
50
53
|
sum = reduce_weights(@number, weights)
|
|
51
54
|
mod = sum % 11
|
|
52
55
|
mod.to_s[-1]
|
data/lib/br_documents/ie/to.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative 'pattern1'
|
|
2
2
|
|
|
3
3
|
module BrDocuments
|
|
4
4
|
module IE
|
|
5
5
|
class TO < Pattern1
|
|
6
6
|
def initialize(number)
|
|
7
7
|
super
|
|
8
|
-
if number.gsub(/(\.)|(\-)/,
|
|
8
|
+
if number.gsub(/(\.)|(\-)/, '').length == 9
|
|
9
9
|
@mask = /^(\d{2}\.\d{6}\-\d{1})$|^(\d{9})$/
|
|
10
10
|
@weight = [9, 8, 7, 6, 5, 4, 3, 2]
|
|
11
11
|
else
|
|
@@ -15,11 +15,12 @@ module BrDocuments
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
private
|
|
18
|
+
|
|
18
19
|
def format_ie(number)
|
|
19
|
-
if number.gsub(/(\.)|(\-)/,
|
|
20
|
-
number.sub(/(\d{2})(\d{6})(\d{1})/,
|
|
20
|
+
if number.gsub(/(\.)|(\-)/, '').length == 9
|
|
21
|
+
number.sub(/(\d{2})(\d{6})(\d{1})/, '\\1.\\2-\\3')
|
|
21
22
|
else
|
|
22
|
-
number.sub(/(\d{2})(\d{2})(\d{6})(\d{1})/,
|
|
23
|
+
number.sub(/(\d{2})(\d{2})(\d{6})(\d{1})/, '\\1.\\2.\\3-\\4')
|
|
23
24
|
end
|
|
24
25
|
end
|
|
25
26
|
end
|
|
@@ -7,13 +7,13 @@ class IeValidator < ActiveModel::EachValidator
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
private
|
|
10
|
+
|
|
10
11
|
def ie_present?(value)
|
|
11
12
|
value.present?
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def attribute_uf_was_configured_at_validator?(record)
|
|
15
|
-
record.errors.add(:base,
|
|
16
|
-
I18n.t("validator.ie.uf.no_configured")) unless options[:uf].present?
|
|
16
|
+
record.errors.add(:base, I18n.t('validator.ie.uf.no_configured')) if options[:uf].blank?
|
|
17
17
|
|
|
18
18
|
options[:uf].present?
|
|
19
19
|
end
|
|
@@ -22,8 +22,8 @@ class IeValidator < ActiveModel::EachValidator
|
|
|
22
22
|
begin
|
|
23
23
|
uf = read_uf(record)
|
|
24
24
|
rescue NoMethodError
|
|
25
|
-
record.errors.add(
|
|
26
|
-
uf: options[:uf])
|
|
25
|
+
record.errors.add(
|
|
26
|
+
:base, I18n.t('validator.ie.uf.no_present', uf: options[:uf])
|
|
27
27
|
)
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -33,8 +33,8 @@ class IeValidator < ActiveModel::EachValidator
|
|
|
33
33
|
def ie_valid?(record, attribute, value)
|
|
34
34
|
begin
|
|
35
35
|
record.errors.add(attribute, :invalid) unless number_valid?(record, value)
|
|
36
|
-
rescue ArgumentError =>
|
|
37
|
-
record.errors.add(attribute,
|
|
36
|
+
rescue ArgumentError => e
|
|
37
|
+
record.errors.add(attribute, e.message)
|
|
38
38
|
end
|
|
39
39
|
record.errors.messages.empty?
|
|
40
40
|
end
|
|
@@ -47,7 +47,7 @@ class IeValidator < ActiveModel::EachValidator
|
|
|
47
47
|
|
|
48
48
|
def read_uf(record)
|
|
49
49
|
attribute = record
|
|
50
|
-
options[:uf].split(
|
|
50
|
+
options[:uf].split('#').each do |field|
|
|
51
51
|
attribute = attribute.send(field)
|
|
52
52
|
end
|
|
53
53
|
attribute
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require_relative './commons/mod11'
|
|
2
|
+
|
|
3
|
+
module BrDocuments
|
|
4
|
+
class Suframa
|
|
5
|
+
include BrDocuments::Commons::Mod11
|
|
6
|
+
|
|
7
|
+
def initialize(number)
|
|
8
|
+
@number = number
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def formatted
|
|
12
|
+
valid? ? format_number : ''
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def valid?
|
|
16
|
+
valid_pattern? &&
|
|
17
|
+
!sequence_of_equal_numbers? &&
|
|
18
|
+
valid_check_digit?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def valid_pattern?
|
|
24
|
+
/^(\d{2}\.\d{4}\.\d{3})$|^(\d{9})$/.match(@number).present?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sequence_of_equal_numbers?
|
|
28
|
+
number_without_mask.chars.uniq.length == 1
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def number_without_mask
|
|
32
|
+
@number_without_mask ||= @number.delete('.')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def valid_check_digit?
|
|
36
|
+
weights = [9, 8, 7, 6, 5, 4, 3, 2]
|
|
37
|
+
|
|
38
|
+
check_digit = generate_check_digit(number_without_mask, weights)
|
|
39
|
+
number_without_mask[8] == check_digit.to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def format_number
|
|
43
|
+
@number.sub(/(\d{2})(\d{4})(\d{3})/, '\\1.\\2.\\3')
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/br_documents/version.rb
CHANGED
data/lib/br_documents.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'active_model'
|
|
2
2
|
|
|
3
|
-
Dir[File.dirname(__FILE__)
|
|
3
|
+
Dir["#{File.dirname(__FILE__)}/**/*.rb"].sort.each { |f| require f }
|
|
4
4
|
|
|
5
|
-
I18n.load_path << File.expand_path(
|
|
5
|
+
I18n.load_path << File.expand_path('../config/locales/pt-BR.yml', __dir__)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe BrDocuments::CnpjCpf::Cnpj do
|
|
4
|
+
describe '#formatted' do
|
|
5
|
+
it 'returns a formatted number' do
|
|
6
|
+
cnpj = described_class.new('04001155000101')
|
|
7
|
+
expect(cnpj.formatted).to eq '04.001.155/0001-01'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context 'when is invalid' do
|
|
11
|
+
it 'returns an empty string' do
|
|
12
|
+
cnpj = described_class.new('123')
|
|
13
|
+
expect(cnpj.formatted).to eq ''
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'is invalid with malformed number' do
|
|
19
|
+
['242.2818/50001-54', '35.611.011/000192'].each do |number|
|
|
20
|
+
cnpj = described_class.new(number)
|
|
21
|
+
expect(cnpj).not_to be_valid
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'is invalid with a number longer than 14' do
|
|
26
|
+
['24.228.185/0001-544', '936710360001881'].each do |number|
|
|
27
|
+
cnpj = described_class.new(number)
|
|
28
|
+
expect(cnpj).not_to be_valid
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'is invalid with a number shorter than 14' do
|
|
33
|
+
['24.228.185/0001-5', '9367103600018'].each do |number|
|
|
34
|
+
cnpj = described_class.new(number)
|
|
35
|
+
expect(cnpj).not_to be_valid
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'is invalid with a sequence of the same number' do
|
|
40
|
+
['11.111.111/1111-11', '22222222222222'].each do |number|
|
|
41
|
+
cnpj = described_class.new(number)
|
|
42
|
+
expect(cnpj).not_to be_valid
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'is invalid with invalid check number' do
|
|
47
|
+
['04.001.155/0001-03', '85961757000101'].each do |number|
|
|
48
|
+
cnpj = described_class.new(number)
|
|
49
|
+
expect(cnpj).not_to be_valid
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'is valid with correct number' do
|
|
54
|
+
['04.001.155/0001-01', '85961757000102'].each do |number|
|
|
55
|
+
cnpj = described_class.new(number)
|
|
56
|
+
expect(cnpj).to be_valid
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe BrDocuments::CnpjCpf::Cpf do
|
|
4
|
+
describe '#formatted' do
|
|
5
|
+
it 'returns a formatted number' do
|
|
6
|
+
cpf = described_class.new('11144477735')
|
|
7
|
+
expect(cpf.formatted).to eq '111.444.777-35'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context 'when is invalid' do
|
|
11
|
+
it 'returns an empty string' do
|
|
12
|
+
cpf = described_class.new('123')
|
|
13
|
+
expect(cpf.formatted).to eq ''
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'is invalid with malformed number' do
|
|
19
|
+
['111.126.491.07', '482.261.15-663', '111444.777-35'].each do |number|
|
|
20
|
+
cpf = described_class.new(number)
|
|
21
|
+
expect(cpf).not_to be_valid
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'is invalid with a number longer than 11' do
|
|
26
|
+
['045.769.421-150', '308514217766'].each do |number|
|
|
27
|
+
cpf = described_class.new(number)
|
|
28
|
+
expect(cpf).not_to be_valid
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'is invalid with a number shorter than 11' do
|
|
33
|
+
['111.444.777-3', '1234567890'].each do |number|
|
|
34
|
+
cpf = described_class.new(number)
|
|
35
|
+
expect(cpf).not_to be_valid
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'is invalid with a sequence of the same number' do
|
|
40
|
+
['111.111.111-11', '22222222222'].each do |number|
|
|
41
|
+
cpf = described_class.new(number)
|
|
42
|
+
expect(cpf).not_to be_valid
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'is invalid with invalid check number' do
|
|
47
|
+
['111.111.111-22', '2222222233'].each do |number|
|
|
48
|
+
cpf = described_class.new(number)
|
|
49
|
+
expect(cpf).not_to be_valid
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'is valid with correct number' do
|
|
54
|
+
['111.444.777-35', '01233254120'].each do |number|
|
|
55
|
+
cpf = described_class.new(number)
|
|
56
|
+
expect(cpf).to be_valid
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe CnpjValidator do
|
|
4
|
+
subject { described_class.new(attributes: 'cnpj') }
|
|
5
|
+
|
|
6
|
+
let(:mock) { instance_double('model') }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
allow(mock).to receive(:errors).and_return([])
|
|
10
|
+
allow(mock.errors).to receive(:messages).and_return({})
|
|
11
|
+
allow(mock.errors).to receive(:add) do |attribute, error|
|
|
12
|
+
mock.errors.messages[attribute] = [error]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'when Cnpj is valid' do
|
|
17
|
+
it "doesn't add errors in model" do
|
|
18
|
+
subject.validate_each(mock, 'cnpj', '85961757000102')
|
|
19
|
+
expect(mock.errors.messages).to be_empty
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context 'when Cnpj is blank' do
|
|
24
|
+
it "doesn't add errors in model" do
|
|
25
|
+
subject.validate_each(mock, 'cnpj', '')
|
|
26
|
+
expect(mock.errors.messages).to be_empty
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'when Cnpj is invalid' do
|
|
31
|
+
it 'adds errors in model' do
|
|
32
|
+
subject.validate_each(mock, 'cnpj', '85961757000103')
|
|
33
|
+
expect(mock.errors.messages).not_to be_empty
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe CpfValidator do
|
|
4
|
+
subject { described_class.new(attributes: 'cpf') }
|
|
5
|
+
|
|
6
|
+
let(:mock) { instance_double('model') }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
allow(mock).to receive(:errors).and_return([])
|
|
10
|
+
allow(mock.errors).to receive(:messages).and_return({})
|
|
11
|
+
allow(mock.errors).to receive(:add) do |attribute, error|
|
|
12
|
+
mock.errors.messages[attribute] = [error]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'when Cpf is valid' do
|
|
17
|
+
it "doesn't add errors in model" do
|
|
18
|
+
subject.validate_each(mock, 'cpf', '01233254120')
|
|
19
|
+
expect(mock.errors.messages).to be_empty
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context 'when Cpf is blank' do
|
|
24
|
+
it "doesn't add errors in model" do
|
|
25
|
+
subject.validate_each(mock, 'cpf', '')
|
|
26
|
+
expect(mock.errors.messages).to be_empty
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'when Cpf is invalid' do
|
|
31
|
+
it 'adds errors in model' do
|
|
32
|
+
subject.validate_each(mock, 'cpf', '01233254121')
|
|
33
|
+
expect(mock.errors.messages).not_to be_empty
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe BrDocuments::Gtin do
|
|
4
|
-
describe
|
|
4
|
+
describe '#valid?' do
|
|
5
5
|
context 'when the checksum is valid' do
|
|
6
6
|
context 'when the GTIN has 8 digits' do
|
|
7
7
|
subject { described_class.new('12345618') }
|
|
@@ -36,14 +36,14 @@ describe BrDocuments::Gtin do
|
|
|
36
36
|
context 'when the number of digits is different of 8, 13 or 14' do
|
|
37
37
|
subject { described_class.new('12345678901234560') }
|
|
38
38
|
|
|
39
|
-
it { is_expected.
|
|
39
|
+
it { is_expected.not_to be_valid }
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
context 'when the checksum is invald' do
|
|
44
44
|
subject { described_class.new('1145678548712') }
|
|
45
45
|
|
|
46
|
-
it { is_expected.
|
|
46
|
+
it { is_expected.not_to be_valid }
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe GtinValidator do
|
|
4
|
-
|
|
4
|
+
subject { described_class.new(attributes: 'gtin') }
|
|
5
|
+
|
|
6
|
+
let(:record) { instance_double('model') }
|
|
5
7
|
|
|
6
8
|
before do
|
|
7
9
|
allow(record).to receive(:errors).and_return([])
|
|
8
10
|
allow(record.errors).to receive(:messages).and_return({})
|
|
9
|
-
allow(record.errors).to receive(:add) do |
|
|
11
|
+
allow(record.errors).to receive(:add) do |attribute, error|
|
|
10
12
|
record.errors.messages[attribute] = [error]
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
context "when GTIN code is valid" do
|
|
17
|
-
before { subject.validate_each(record, "gtin", "1243658721548") }
|
|
16
|
+
context 'when GTIN code is valid' do
|
|
17
|
+
before { subject.validate_each(record, 'gtin', '1243658721548') }
|
|
18
18
|
|
|
19
19
|
it "doesn't add errors in model" do
|
|
20
20
|
expect(record.errors.messages).to be_empty
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
context
|
|
25
|
-
before { subject.validate_each(record,
|
|
24
|
+
context 'when GTIN is blank' do
|
|
25
|
+
before { subject.validate_each(record, 'gtin', '') }
|
|
26
26
|
|
|
27
27
|
it "doesn't add errors in model" do
|
|
28
28
|
expect(record.errors.messages).to be_empty
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
context
|
|
33
|
-
before { subject.validate_each(record,
|
|
32
|
+
context 'when GTIN is nil' do
|
|
33
|
+
before { subject.validate_each(record, 'gtin', nil) }
|
|
34
34
|
|
|
35
35
|
it "doesn't add errors in model" do
|
|
36
36
|
expect(record.errors.messages).to be_empty
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
context
|
|
41
|
-
before { subject.validate_each(record,
|
|
40
|
+
context 'when GTIN is invalid' do
|
|
41
|
+
before { subject.validate_each(record, 'gtin', '253667853') }
|
|
42
42
|
|
|
43
|
-
it
|
|
43
|
+
it 'adds errors in model' do
|
|
44
44
|
expect(record.errors.messages).to include 'gtin' => [:invalid]
|
|
45
45
|
end
|
|
46
46
|
end
|