verificador_boleto_br 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +15 -2
- data/lib/verificador_boleto_br/slip/arrecadation/code_assembly.rb +45 -0
- data/lib/verificador_boleto_br/slip/arrecadation/validity.rb +134 -0
- data/lib/verificador_boleto_br/slip/bank/code_assembly.rb +23 -0
- data/lib/verificador_boleto_br/slip/bank/validity.rb +113 -0
- data/lib/verificador_boleto_br/version.rb +1 -1
- data/lib/verificador_boleto_br.rb +21 -7
- metadata +6 -4
- data/lib/verificador_boleto_br/arrecadation_slip.rb +0 -129
- data/lib/verificador_boleto_br/bank_slip.rb +0 -108
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bdcfc77a1579acbf0ba65b3df459cff54c511bc9a34dc923ad2899ef3198c6f
|
4
|
+
data.tar.gz: 7cd07fa4cc00d5013bdb19a89dd56cc744a767d34d2ca96b96cf7a65bb6acd30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1897917e8a3d383238210d4087ad20459a20bb411fa4a58ba1b2ca6e85119d13bad83ab91a15bd3d51c77613bcaeae96f7ebe2ab0a3bef5cbae622a57d02f06f
|
7
|
+
data.tar.gz: f6073471392c4ee31d9743a0f01b537f9272b526158a6dc8fbdae0cf5bb9e6946d5734932d0fc1d482e819fc52bf371325676d3af02389d01c951c7d205b7964
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -34,7 +34,7 @@ Or install it yourself as:
|
|
34
34
|
````ruby
|
35
35
|
require './lib/verificador_boleto_br'
|
36
36
|
>> slip = VerificadorBoletoBr.check('34191 75801 03928 662935 80573 180009 4 67700000007388')
|
37
|
-
=> #<VerificadorBoletoBr::
|
37
|
+
=> #<VerificadorBoletoBr::Slip::Bank::Validity:0x00007f9f820c7a00 @digitable_line="34191 75801 03928 662935 80573 180009 4 67700000007388", @kind=:bank_slip>
|
38
38
|
````
|
39
39
|
It will return the respective slip class with its methods:
|
40
40
|
|
@@ -47,6 +47,8 @@ It will return the respective slip class with its methods:
|
|
47
47
|
=> 341
|
48
48
|
>> slip.currency_code
|
49
49
|
=> 9
|
50
|
+
>> slip.kind
|
51
|
+
=> :bank_slip
|
50
52
|
>> slip.value_in_cents
|
51
53
|
=> 7388
|
52
54
|
>> slip.value
|
@@ -59,9 +61,11 @@ It will return the respective slip class with its methods:
|
|
59
61
|
|
60
62
|
````ruby
|
61
63
|
>> slip = VerificadorBoletoBr.check('858900000018 097802702000 323858108001 011520190292')
|
62
|
-
=> #<VerificadorBoletoBr::
|
64
|
+
=> #<VerificadorBoletoBr::Slip::Arrecadation::Validity:0x00007f9f821bbd08 @digitable_line="858900000018 097802702000 323858108001 011520190292", @errors=[], @kind=:arrecadation_slip>
|
63
65
|
>> slip.valid?
|
64
66
|
=> true
|
67
|
+
>> slip.kind
|
68
|
+
=> :arrecadation_slip
|
65
69
|
>> slip.value_in_cents
|
66
70
|
=> 10978
|
67
71
|
>> slip.value
|
@@ -76,6 +80,15 @@ It will return the respective slip class with its methods:
|
|
76
80
|
|
77
81
|
You can access the slip classes directly if you want.
|
78
82
|
|
83
|
+
## Assembling Digitable Line from BarCode
|
84
|
+
|
85
|
+
````ruby
|
86
|
+
slip = VerificadorBoletoBr.translate_barcode('34196773300001455851090806185172938349558000')
|
87
|
+
=> #<VerificadorBoletoBr::Slip::Bank::CodeAssembly:0x00007f9f84810990 @code="34196773300001455851090806185172938349558000">
|
88
|
+
>> slip.digitable_line
|
89
|
+
=> "34191090810618517293683495580009677330000145585"
|
90
|
+
````
|
91
|
+
|
79
92
|
## Special Feature
|
80
93
|
Some bank slips do not validate the global digit well (anybody, feel free to explain me if my theory is correct) for example credit card slips (eg: NuBank). It may be because credit card bills can be paid with any value and global verification ensures that the value is also correct. This method allows to validate bank slips without global digit validation:
|
81
94
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module VerificadorBoletoBr
|
2
|
+
module Slip
|
3
|
+
module Arrecadation
|
4
|
+
class CodeAssembly
|
5
|
+
|
6
|
+
include VerificadorBoletoBr::Calculus::Module10
|
7
|
+
include VerificadorBoletoBr::Calculus::Module11
|
8
|
+
|
9
|
+
def initialize(code)
|
10
|
+
@code = code
|
11
|
+
end
|
12
|
+
|
13
|
+
def treated_group
|
14
|
+
@code.scan(/.{1,11}/m)
|
15
|
+
end
|
16
|
+
|
17
|
+
def treated_code
|
18
|
+
treated_group.map {|partial| partial << "0" }.join
|
19
|
+
end
|
20
|
+
|
21
|
+
def digitable_line
|
22
|
+
result = ""
|
23
|
+
treated_group.each do |group|
|
24
|
+
result += group + send(bacen_module, group).to_s
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
def bacen_module
|
30
|
+
case treated_code[2]
|
31
|
+
when '6'
|
32
|
+
'modulo10'
|
33
|
+
when '7'
|
34
|
+
'modulo10'
|
35
|
+
when '8'
|
36
|
+
'modulo11'
|
37
|
+
when '9'
|
38
|
+
'modulo11'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module VerificadorBoletoBr
|
4
|
+
module Slip
|
5
|
+
module Arrecadation
|
6
|
+
class Validity
|
7
|
+
|
8
|
+
include VerificadorBoletoBr::Operationals
|
9
|
+
include VerificadorBoletoBr::Calculus::Module10
|
10
|
+
include VerificadorBoletoBr::Calculus::Module11
|
11
|
+
|
12
|
+
attr_accessor :digitable_line, :kind, :errors
|
13
|
+
|
14
|
+
def initialize(cod)
|
15
|
+
@digitable_line = cod
|
16
|
+
raise ArgumentError, 'Expected String' unless @digitable_line.class.eql?(String)
|
17
|
+
raise ArgumentError, 'Invalid Digitable Line' unless clean_digitable_line.size == 48
|
18
|
+
raise ArgumentError, 'Boleto Não é de Arrecadação' unless @digitable_line[0] == '8'
|
19
|
+
|
20
|
+
@errors = []
|
21
|
+
@kind = :arrecadation_slip
|
22
|
+
end
|
23
|
+
|
24
|
+
def clean_digitable_line
|
25
|
+
clean_masks(@digitable_line)
|
26
|
+
end
|
27
|
+
|
28
|
+
def verification_digit
|
29
|
+
clean_digitable_line[3].to_i
|
30
|
+
end
|
31
|
+
|
32
|
+
def value_in_cents
|
33
|
+
return nil unless valid?
|
34
|
+
digitable_line_without_dvs[4..14].to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def value
|
38
|
+
return nil unless valid?
|
39
|
+
value_in_cents.to_f / 100
|
40
|
+
end
|
41
|
+
|
42
|
+
def due_date
|
43
|
+
begin
|
44
|
+
Date.parse(digitable_line_without_dvs[-6..-1])
|
45
|
+
rescue
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def segment
|
51
|
+
case clean_digitable_line[1]
|
52
|
+
when '1'
|
53
|
+
'Prefeitura'
|
54
|
+
when '2'
|
55
|
+
'Saneamento'
|
56
|
+
when '3'
|
57
|
+
'Energia Elétrica e Gás'
|
58
|
+
when '4'
|
59
|
+
'Telefonia'
|
60
|
+
when '5'
|
61
|
+
'Órgãos Governamentais'
|
62
|
+
when '6'
|
63
|
+
'Empresas / Órgãos com CNPJ.'
|
64
|
+
when '7'
|
65
|
+
'Multa de trânsito'
|
66
|
+
when '9'
|
67
|
+
'Uso exclusivo do banco'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def identification
|
72
|
+
begin
|
73
|
+
JSON.parse(File.read('lib/verificador_boleto_br/data/Dealerships.json'))
|
74
|
+
.select { |d| d['code'] == clean_digitable_line[15..18] && d['segment'] == clean_digitable_line[1].to_i }[0]["dealership"]
|
75
|
+
rescue
|
76
|
+
"Boleto de #{segment}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def bacen_module
|
81
|
+
case clean_digitable_line[2]
|
82
|
+
when '6'
|
83
|
+
'modulo10'
|
84
|
+
when '7'
|
85
|
+
'modulo10'
|
86
|
+
when '8'
|
87
|
+
'modulo11'
|
88
|
+
when '9'
|
89
|
+
'modulo11'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def valid?
|
94
|
+
global_validity && !groups_validity.map { |group| group[:valid] }.include?(false)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Duplicate just for mantaining module methods
|
98
|
+
def valid_without_global?
|
99
|
+
valid?
|
100
|
+
end
|
101
|
+
|
102
|
+
def groups_validity
|
103
|
+
grouped_digitable_line.map do |group|
|
104
|
+
dv = send(bacen_module, group[:num]).to_s
|
105
|
+
valid = dv.eql?(group[:dv])
|
106
|
+
errors << "Campo #{group[:group]}" unless valid
|
107
|
+
{
|
108
|
+
group: group[:group],
|
109
|
+
valid: valid
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def global_validity
|
115
|
+
send(bacen_module, digitable_line_without_dvs[0..2] + digitable_line_without_dvs[4..-1]) == verification_digit
|
116
|
+
end
|
117
|
+
|
118
|
+
def grouped_digitable_line
|
119
|
+
clean_digitable_line.scan(/.{1,12}/).each_with_index.map do |group, index|
|
120
|
+
{
|
121
|
+
group: index,
|
122
|
+
num: group[0..-2],
|
123
|
+
dv: group[-1]
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def digitable_line_without_dvs
|
129
|
+
grouped_digitable_line.map { |group| group[:num] }.join
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module VerificadorBoletoBr
|
2
|
+
module Slip
|
3
|
+
module Bank
|
4
|
+
class CodeAssembly
|
5
|
+
include VerificadorBoletoBr::Calculus::Module10
|
6
|
+
include VerificadorBoletoBr::Calculus::Module11
|
7
|
+
|
8
|
+
attr_accessor :code
|
9
|
+
|
10
|
+
def initialize(code)
|
11
|
+
@code = code
|
12
|
+
end
|
13
|
+
|
14
|
+
def digitable_line
|
15
|
+
block_1 = code[0..3] + code[19..23] + modulo10(code[0..3] + code[19..23]).to_s
|
16
|
+
block_2 = code[24..33] + modulo10(code[24..33]).to_s
|
17
|
+
block_3 = code[34..-1] + modulo10(code[34..-1]).to_s
|
18
|
+
block_1 + block_2 + block_3 + code[4..18]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module VerificadorBoletoBr
|
2
|
+
module Slip
|
3
|
+
module Bank
|
4
|
+
class Validity
|
5
|
+
include VerificadorBoletoBr::Operationals
|
6
|
+
include VerificadorBoletoBr::Calculus::Module10
|
7
|
+
include VerificadorBoletoBr::Calculus::Module11
|
8
|
+
|
9
|
+
attr_accessor :digitable_line, :kind, :errors
|
10
|
+
|
11
|
+
def initialize(cod)
|
12
|
+
@digitable_line = cod
|
13
|
+
raise ArgumentError, 'Expected String' unless @digitable_line.class.eql?(String)
|
14
|
+
raise ArgumentError, 'Invalid Digitable Line' unless clean_digitable_line.size == 47
|
15
|
+
|
16
|
+
@kind = :bank_slip
|
17
|
+
end
|
18
|
+
|
19
|
+
def clean_digitable_line
|
20
|
+
clean_masks(@digitable_line)
|
21
|
+
end
|
22
|
+
|
23
|
+
def bank_code
|
24
|
+
clean_digitable_line[0..2].to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
def currency_code
|
28
|
+
clean_digitable_line[3].to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
def verification_digit
|
32
|
+
clean_digitable_line[32].to_i
|
33
|
+
end
|
34
|
+
|
35
|
+
def value_in_cents
|
36
|
+
return nil unless valid?
|
37
|
+
clean_digitable_line[37..-1].to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
def value
|
41
|
+
return nil unless valid?
|
42
|
+
value_in_cents.to_f / 100
|
43
|
+
end
|
44
|
+
|
45
|
+
def block_1_validity
|
46
|
+
modulo10(clean_digitable_line[0..8]).eql?clean_digitable_line[9].to_i
|
47
|
+
end
|
48
|
+
|
49
|
+
def block_2_validity
|
50
|
+
modulo10(clean_digitable_line[10..19]).eql?clean_digitable_line[20].to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def block_3_validity
|
54
|
+
modulo10(clean_digitable_line[21..30]).eql?clean_digitable_line[31].to_i
|
55
|
+
end
|
56
|
+
|
57
|
+
def global_validity
|
58
|
+
str = ""
|
59
|
+
str += clean_digitable_line[0..2]
|
60
|
+
str += clean_digitable_line[3..3]
|
61
|
+
str += clean_digitable_line[32..32]
|
62
|
+
str += clean_digitable_line[33..36]
|
63
|
+
str += clean_digitable_line[37..46]
|
64
|
+
str += clean_digitable_line[4..8]
|
65
|
+
str += clean_digitable_line[10..19]
|
66
|
+
str += clean_digitable_line[21..30]
|
67
|
+
modulo11(str[0..3] + str[5..-1]).eql?(verification_digit)
|
68
|
+
end
|
69
|
+
|
70
|
+
def due_date
|
71
|
+
begin
|
72
|
+
bank_epoque(clean_digitable_line[33..36].to_i)
|
73
|
+
rescue
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def valid?
|
79
|
+
valid_without_global? && global_validity
|
80
|
+
end
|
81
|
+
|
82
|
+
def valid_without_global?
|
83
|
+
block_1_validity && block_2_validity && block_3_validity
|
84
|
+
end
|
85
|
+
|
86
|
+
def grouped_digitable_line
|
87
|
+
[
|
88
|
+
{
|
89
|
+
group: 0,
|
90
|
+
valid: block_1_validity
|
91
|
+
},
|
92
|
+
{
|
93
|
+
group: 1,
|
94
|
+
valid: block_2_validity
|
95
|
+
},
|
96
|
+
{
|
97
|
+
group: 2,
|
98
|
+
valid: block_2_validity
|
99
|
+
},
|
100
|
+
]
|
101
|
+
end
|
102
|
+
|
103
|
+
def segment
|
104
|
+
'Boleto Bancário'
|
105
|
+
end
|
106
|
+
|
107
|
+
def identification
|
108
|
+
'Boleto Bancário'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -2,20 +2,34 @@ require_relative "./verificador_boleto_br/version"
|
|
2
2
|
require_relative "./verificador_boleto_br/operationals"
|
3
3
|
require_relative "./verificador_boleto_br/calculus/module10"
|
4
4
|
require_relative "./verificador_boleto_br/calculus/module11"
|
5
|
-
require_relative "./verificador_boleto_br/
|
6
|
-
require_relative "./verificador_boleto_br/
|
5
|
+
require_relative "./verificador_boleto_br/slip/arrecadation/code_assembly"
|
6
|
+
require_relative "./verificador_boleto_br/slip/arrecadation/validity"
|
7
|
+
require_relative "./verificador_boleto_br/slip/bank/code_assembly"
|
8
|
+
require_relative "./verificador_boleto_br/slip/bank/validity"
|
7
9
|
|
8
10
|
require 'date'
|
9
11
|
|
10
12
|
module VerificadorBoletoBr
|
11
13
|
include Operationals
|
12
|
-
def self.check(
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def self.check(code)
|
15
|
+
clean_code = code.gsub(/( |\.|-)/, '')
|
16
|
+
if clean_code.size.eql?(47)
|
17
|
+
VerificadorBoletoBr::Slip::Bank::Validity.new(code)
|
18
|
+
elsif clean_code.size.eql?(48)
|
19
|
+
VerificadorBoletoBr::Slip::Arrecadation::Validity.new(code)
|
17
20
|
else
|
18
21
|
raise ArgumentError, 'Invalid Digitable Line'
|
19
22
|
end
|
20
23
|
end
|
24
|
+
|
25
|
+
def self.translate_barcode(code)
|
26
|
+
clean_code = code.gsub(/( |\.|-)/, '')
|
27
|
+
if clean_code.size.eql?(44) && clean_code[0] != '8'
|
28
|
+
VerificadorBoletoBr::Slip::Bank::CodeAssembly.new(code)
|
29
|
+
elsif clean_code.size.eql?(44) && clean_code[0] == '8'
|
30
|
+
VerificadorBoletoBr::Slip::Arrecadation::CodeAssembly.new(code)
|
31
|
+
else
|
32
|
+
raise ArgumentError, 'Invalid Barcode'
|
33
|
+
end
|
34
|
+
end
|
21
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: verificador_boleto_br
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Hamdan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,13 +71,15 @@ files:
|
|
71
71
|
- bin/console
|
72
72
|
- bin/setup
|
73
73
|
- lib/verificador_boleto_br.rb
|
74
|
-
- lib/verificador_boleto_br/arrecadation_slip.rb
|
75
|
-
- lib/verificador_boleto_br/bank_slip.rb
|
76
74
|
- lib/verificador_boleto_br/calculus/module10.rb
|
77
75
|
- lib/verificador_boleto_br/calculus/module11.rb
|
78
76
|
- lib/verificador_boleto_br/data/Banks.json
|
79
77
|
- lib/verificador_boleto_br/data/Dealerships.json
|
80
78
|
- lib/verificador_boleto_br/operationals.rb
|
79
|
+
- lib/verificador_boleto_br/slip/arrecadation/code_assembly.rb
|
80
|
+
- lib/verificador_boleto_br/slip/arrecadation/validity.rb
|
81
|
+
- lib/verificador_boleto_br/slip/bank/code_assembly.rb
|
82
|
+
- lib/verificador_boleto_br/slip/bank/validity.rb
|
81
83
|
- lib/verificador_boleto_br/version.rb
|
82
84
|
- verificador_boleto_br.gemspec
|
83
85
|
homepage: https://github.com/Hamdan85/VerificadorBoletoBr
|
@@ -1,129 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module VerificadorBoletoBr
|
4
|
-
class ArrecadationSlip
|
5
|
-
|
6
|
-
include VerificadorBoletoBr::Operationals
|
7
|
-
include VerificadorBoletoBr::Calculus::Module10
|
8
|
-
include VerificadorBoletoBr::Calculus::Module11
|
9
|
-
|
10
|
-
attr_accessor :digitable_line, :errors
|
11
|
-
|
12
|
-
def initialize(cod)
|
13
|
-
@digitable_line = cod
|
14
|
-
raise ArgumentError, 'Expected String' unless @digitable_line.class.eql?(String)
|
15
|
-
raise ArgumentError, 'Invalid Digitable Line' unless clean_digitable_line.size == 48
|
16
|
-
raise ArgumentError, 'Boleto Não é de Arrecadação' unless @digitable_line[0] == '8'
|
17
|
-
|
18
|
-
@errors = []
|
19
|
-
end
|
20
|
-
|
21
|
-
def clean_digitable_line
|
22
|
-
clean_masks(@digitable_line)
|
23
|
-
end
|
24
|
-
|
25
|
-
def verification_digit
|
26
|
-
clean_digitable_line[3].to_i
|
27
|
-
end
|
28
|
-
|
29
|
-
def value_in_cents
|
30
|
-
return nil unless valid?
|
31
|
-
digitable_line_without_dvs[4..14].to_i
|
32
|
-
end
|
33
|
-
|
34
|
-
def value
|
35
|
-
return nil unless valid?
|
36
|
-
value_in_cents.to_f / 100
|
37
|
-
end
|
38
|
-
|
39
|
-
def due_date
|
40
|
-
begin
|
41
|
-
Date.parse(digitable_line_without_dvs[-6..-1])
|
42
|
-
rescue
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def segment
|
48
|
-
case clean_digitable_line[1]
|
49
|
-
when '1'
|
50
|
-
'Prefeitura'
|
51
|
-
when '2'
|
52
|
-
'Saneamento'
|
53
|
-
when '3'
|
54
|
-
'Energia Elétrica e Gás'
|
55
|
-
when '4'
|
56
|
-
'Telefonia'
|
57
|
-
when '5'
|
58
|
-
'Órgãos Governamentais'
|
59
|
-
when '6'
|
60
|
-
'Empresas / Órgãos com CNPJ.'
|
61
|
-
when '7'
|
62
|
-
'Multa de trânsito'
|
63
|
-
when '9'
|
64
|
-
'Uso exclusivo do banco'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def identification
|
69
|
-
begin
|
70
|
-
JSON.parse(File.read('lib/verificador_boleto_br/data/Dealerships.json'))
|
71
|
-
.select { |d| d['code'] == clean_digitable_line[15..18] && d['segment'] == clean_digitable_line[1].to_i }[0]["dealership"]
|
72
|
-
rescue
|
73
|
-
"Boleto de #{segment}"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def bacen_module
|
78
|
-
case clean_digitable_line[2]
|
79
|
-
when '6'
|
80
|
-
'modulo10'
|
81
|
-
when '7'
|
82
|
-
'modulo10'
|
83
|
-
when '8'
|
84
|
-
'modulo11'
|
85
|
-
when '9'
|
86
|
-
'modulo11'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def valid?
|
91
|
-
global_validity && !groups_validity.map { |group| group[:valid] }.include?(false)
|
92
|
-
end
|
93
|
-
|
94
|
-
# Duplicate just for mantaining module methods
|
95
|
-
def valid_without_global?
|
96
|
-
valid?
|
97
|
-
end
|
98
|
-
|
99
|
-
def groups_validity
|
100
|
-
grouped_digitable_line.map do |group|
|
101
|
-
dv = send(bacen_module, group[:num]).to_s
|
102
|
-
valid = dv.eql?(group[:dv])
|
103
|
-
errors << "Campo #{group[:group]}" unless valid
|
104
|
-
{
|
105
|
-
group: group[:group],
|
106
|
-
valid: valid
|
107
|
-
}
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def global_validity
|
112
|
-
send(bacen_module, digitable_line_without_dvs[0..2] + digitable_line_without_dvs[4..-1]) == verification_digit
|
113
|
-
end
|
114
|
-
|
115
|
-
def grouped_digitable_line
|
116
|
-
clean_digitable_line.scan(/.{1,12}/).each_with_index.map do |group, index|
|
117
|
-
{
|
118
|
-
group: index,
|
119
|
-
num: group[0..-2],
|
120
|
-
dv: group[-1]
|
121
|
-
}
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def digitable_line_without_dvs
|
126
|
-
grouped_digitable_line.map { |group| group[:num] }.join
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
@@ -1,108 +0,0 @@
|
|
1
|
-
module VerificadorBoletoBr
|
2
|
-
class BankSlip
|
3
|
-
include VerificadorBoletoBr::Operationals
|
4
|
-
include VerificadorBoletoBr::Calculus::Module10
|
5
|
-
include VerificadorBoletoBr::Calculus::Module11
|
6
|
-
|
7
|
-
attr_accessor :digitable_line, :errors
|
8
|
-
|
9
|
-
def initialize(cod)
|
10
|
-
@digitable_line = cod
|
11
|
-
raise ArgumentError, 'Expected String' unless @digitable_line.class.eql?(String)
|
12
|
-
raise ArgumentError, 'Invalid Digitable Line' unless clean_digitable_line.size == 47
|
13
|
-
end
|
14
|
-
|
15
|
-
def clean_digitable_line
|
16
|
-
clean_masks(@digitable_line)
|
17
|
-
end
|
18
|
-
|
19
|
-
def bank_code
|
20
|
-
clean_digitable_line[0..2].to_i
|
21
|
-
end
|
22
|
-
|
23
|
-
def currency_code
|
24
|
-
clean_digitable_line[3].to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
def verification_digit
|
28
|
-
clean_digitable_line[32].to_i
|
29
|
-
end
|
30
|
-
|
31
|
-
def value_in_cents
|
32
|
-
return nil unless valid?
|
33
|
-
clean_digitable_line[37..-1].to_i
|
34
|
-
end
|
35
|
-
|
36
|
-
def value
|
37
|
-
return nil unless valid?
|
38
|
-
value_in_cents.to_f / 100
|
39
|
-
end
|
40
|
-
|
41
|
-
def block_1_validity
|
42
|
-
modulo10(clean_digitable_line[0..8]).eql?clean_digitable_line[9].to_i
|
43
|
-
end
|
44
|
-
|
45
|
-
def block_2_validity
|
46
|
-
modulo10(clean_digitable_line[10..19]).eql?clean_digitable_line[20].to_i
|
47
|
-
end
|
48
|
-
|
49
|
-
def block_3_validity
|
50
|
-
modulo10(clean_digitable_line[21..30]).eql?clean_digitable_line[31].to_i
|
51
|
-
end
|
52
|
-
|
53
|
-
def global_validity
|
54
|
-
str = ""
|
55
|
-
str += clean_digitable_line[0..2]
|
56
|
-
str += clean_digitable_line[3..3]
|
57
|
-
str += clean_digitable_line[32..32]
|
58
|
-
str += clean_digitable_line[33..36]
|
59
|
-
str += clean_digitable_line[37..46]
|
60
|
-
str += clean_digitable_line[4..8]
|
61
|
-
str += clean_digitable_line[10..19]
|
62
|
-
str += clean_digitable_line[21..30]
|
63
|
-
|
64
|
-
modulo11(str[0..3] + str[5..-1]).eql?(verification_digit)
|
65
|
-
end
|
66
|
-
|
67
|
-
def due_date
|
68
|
-
begin
|
69
|
-
bank_epoque(clean_digitable_line[33..36].to_i)
|
70
|
-
rescue
|
71
|
-
nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def valid?
|
76
|
-
valid_without_global? && global_validity
|
77
|
-
end
|
78
|
-
|
79
|
-
def valid_without_global?
|
80
|
-
block_1_validity && block_2_validity && block_3_validity
|
81
|
-
end
|
82
|
-
|
83
|
-
def grouped_digitable_line
|
84
|
-
[
|
85
|
-
{
|
86
|
-
group: 0,
|
87
|
-
valid: block_1_validity
|
88
|
-
},
|
89
|
-
{
|
90
|
-
group: 1,
|
91
|
-
valid: block_2_validity
|
92
|
-
},
|
93
|
-
{
|
94
|
-
group: 2,
|
95
|
-
valid: block_2_validity
|
96
|
-
},
|
97
|
-
]
|
98
|
-
end
|
99
|
-
|
100
|
-
def segment
|
101
|
-
'Boleto Bancário'
|
102
|
-
end
|
103
|
-
|
104
|
-
def identification
|
105
|
-
'Boleto Bancário'
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|