conectiva-boleto_bancario 0.0.2.beta
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 +7 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Changelog.markdown +10 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/Planning.markdown +137 -0
- data/README.markdown +215 -0
- data/Rakefile +9 -0
- data/TODO.markdown +11 -0
- data/boleto_bancario.gemspec +25 -0
- data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
- data/lib/boleto_bancario.rb +85 -0
- data/lib/boleto_bancario/calculos/digitos.rb +35 -0
- data/lib/boleto_bancario/calculos/fator_vencimento.rb +87 -0
- data/lib/boleto_bancario/calculos/fatores_de_multiplicacao.rb +67 -0
- data/lib/boleto_bancario/calculos/linha_digitavel.rb +158 -0
- data/lib/boleto_bancario/calculos/modulo10.rb +83 -0
- data/lib/boleto_bancario/calculos/modulo11.rb +54 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a7.rb +97 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a9.rb +83 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +101 -0
- data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
- data/lib/boleto_bancario/core/banco_brasil.rb +532 -0
- data/lib/boleto_bancario/core/banrisul.rb +182 -0
- data/lib/boleto_bancario/core/boleto.rb +559 -0
- data/lib/boleto_bancario/core/bradesco.rb +285 -0
- data/lib/boleto_bancario/core/itau.rb +455 -0
- data/lib/boleto_bancario/core/santander.rb +273 -0
- data/lib/boleto_bancario/version.rb +4 -0
- data/spec/boleto_bancario/calculos/digitos_spec.rb +19 -0
- data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +59 -0
- data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +69 -0
- data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +57 -0
- data/spec/boleto_bancario/calculos/modulo10_spec.rb +53 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +43 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +39 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +67 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +37 -0
- data/spec/boleto_bancario/calculos/modulo11_spec.rb +19 -0
- data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
- data/spec/boleto_bancario/core/banco_brasil_spec.rb +383 -0
- data/spec/boleto_bancario/core/banrisul_spec.rb +130 -0
- data/spec/boleto_bancario/core/boleto_spec.rb +161 -0
- data/spec/boleto_bancario/core/bradesco_spec.rb +170 -0
- data/spec/boleto_bancario/core/itau_spec.rb +336 -0
- data/spec/boleto_bancario/core/santander_spec.rb +135 -0
- data/spec/shared_examples/boleto_bancario_shared_example.rb +157 -0
- data/spec/spec_helper.rb +14 -0
- metadata +211 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/boleto_bancario/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Tomas D'Stefano", "Conectiva Consultoria"]
|
6
|
+
gem.email = ["code@conectivaconsultoria.com.br"]
|
7
|
+
gem.description = %q{Emissão de Boletos Bancários em Ruby}
|
8
|
+
gem.summary = %q{Emissão de Boletos Bancários em Ruby}
|
9
|
+
gem.homepage = "https://github.com/conectiva/boleto_bancario"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\).reject { |f| File.extname(f) == '.pdf' }
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "conectiva-boleto_bancario"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = BoletoBancario::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "activesupport", "~> 4"
|
19
|
+
gem.add_dependency "activemodel", "~> 4"
|
20
|
+
gem.add_development_dependency "rspec", "~> 2"
|
21
|
+
gem.add_development_dependency "valid_attribute", "~> 1.3"
|
22
|
+
gem.add_development_dependency "pry", "~> 0.9"
|
23
|
+
gem.add_development_dependency "simplecov", "~> 0.2"
|
24
|
+
gem.add_development_dependency "simplecov-html", "~> 0.7"
|
25
|
+
end
|
Binary file
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'boleto_bancario/version'
|
3
|
+
require 'active_model'
|
4
|
+
require 'active_support/core_ext/class'
|
5
|
+
require 'active_support/core_ext/enumerable'
|
6
|
+
require 'active_support/core_ext/object'
|
7
|
+
require 'active_support/core_ext/string'
|
8
|
+
|
9
|
+
# Copyright (C) 2012 Tomás D'Stefano <http://successoft.com>
|
10
|
+
#
|
11
|
+
# @author Tomás D'Stefano <tomas_stefano@successoft.com>
|
12
|
+
#
|
13
|
+
# == Boleto Bancário
|
14
|
+
#
|
15
|
+
# Emissão de Boletos Bancários em Ruby. Simples e principalmente, flexível.
|
16
|
+
#
|
17
|
+
# Essa biblioteca é baseada em outras <b>ótimas</b> bibliotecas.
|
18
|
+
# Recomendo analisar muito bem cada solução!
|
19
|
+
#
|
20
|
+
# * Novo Gateway de Pagamentos da Locaweb: http://www.locaweb.com.br/produtos/gateway-pagamento.html
|
21
|
+
# * Brcobranca: https://github.com/kivanio/brcobranca
|
22
|
+
# * Boleto Php: http://boletophp.com.br
|
23
|
+
# * Stella Caelum: http://stella.caelum.com.br
|
24
|
+
#
|
25
|
+
# === Coreuições
|
26
|
+
#
|
27
|
+
# Você pode contribuir de N formas. Seguem elas:
|
28
|
+
#
|
29
|
+
# * Homologando os boletos junto aos bancos (Super importante!!! :] ).
|
30
|
+
# * Fornecendo documentações mais atualizadas dos Bancos.
|
31
|
+
# * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
|
32
|
+
# * Refatorando código!! (Sempre bem vindo!)
|
33
|
+
# * Fornecendo Feedback construtivo! (Sempre bem vindo!)
|
34
|
+
#
|
35
|
+
# === Instalação via Rubygems
|
36
|
+
#
|
37
|
+
# gem install boleto_bancario
|
38
|
+
#
|
39
|
+
# === Instalar via Bundler
|
40
|
+
#
|
41
|
+
# Coloque no Gemfile:
|
42
|
+
#
|
43
|
+
# gem 'boleto_bancario'
|
44
|
+
#
|
45
|
+
# Depois de colocar no Gemfile:
|
46
|
+
#
|
47
|
+
# bundle install
|
48
|
+
#
|
49
|
+
module BoletoBancario
|
50
|
+
# Modulo responsável por guardar todas as regras dos campos de
|
51
|
+
# todos os Boletos Bancários. <b>Contribuicões com novas documentações dos
|
52
|
+
# bancos e homologação dos boletos são extremamente bem vindas!</b>
|
53
|
+
#
|
54
|
+
# Esse módulo também é responsável por guardar todas as regras de validação dos boletos e
|
55
|
+
# contém a forma de chamar os objetos necessários para renderização
|
56
|
+
# dos formatos (pdf, html, etc) e internacionalização dos boletos (caso
|
57
|
+
# você precise mudar os nomes dos campos nos boletos)
|
58
|
+
#
|
59
|
+
module Core
|
60
|
+
autoload :Boleto, 'boleto_bancario/core/boleto'
|
61
|
+
autoload :BancoBrasil, 'boleto_bancario/core/banco_brasil'
|
62
|
+
autoload :Banrisul, 'boleto_bancario/core/banrisul'
|
63
|
+
autoload :Bradesco, 'boleto_bancario/core/bradesco'
|
64
|
+
autoload :Itau, 'boleto_bancario/core/itau'
|
65
|
+
autoload :Santander, 'boleto_bancario/core/santander'
|
66
|
+
end
|
67
|
+
|
68
|
+
# Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
|
69
|
+
#
|
70
|
+
module Calculos
|
71
|
+
autoload :FatorVencimento, 'boleto_bancario/calculos/fator_vencimento'
|
72
|
+
autoload :FatoresDeMultiplicacao, 'boleto_bancario/calculos/fatores_de_multiplicacao'
|
73
|
+
autoload :LinhaDigitavel, 'boleto_bancario/calculos/linha_digitavel'
|
74
|
+
autoload :Modulo10, 'boleto_bancario/calculos/modulo10'
|
75
|
+
autoload :Modulo11, 'boleto_bancario/calculos/modulo11'
|
76
|
+
autoload :Modulo11FatorDe2a9, 'boleto_bancario/calculos/modulo11_fator_de2a9'
|
77
|
+
autoload :Modulo11FatorDe2a9RestoZero, 'boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero'
|
78
|
+
autoload :Modulo11FatorDe2a7, 'boleto_bancario/calculos/modulo11_fator_de2a7'
|
79
|
+
autoload :Modulo11FatorDe9a2RestoX, 'boleto_bancario/calculos/modulo11_fator_de9a2_resto_x'
|
80
|
+
autoload :ModuloNumeroDeControle, 'boleto_bancario/calculos/modulo_numero_de_controle'
|
81
|
+
autoload :Digitos, 'boleto_bancario/calculos/digitos'
|
82
|
+
end
|
83
|
+
|
84
|
+
include Core
|
85
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'active_support/core_ext/enumerable'
|
3
|
+
|
4
|
+
module BoletoBancario
|
5
|
+
module Calculos
|
6
|
+
# Classe responsável por lidar com os dígitos dos módulos.
|
7
|
+
#
|
8
|
+
class Digitos
|
9
|
+
# @param [Integer] number Número que servirá para os cálculo com os dígitos desse número.
|
10
|
+
#
|
11
|
+
def initialize(number)
|
12
|
+
@number = number
|
13
|
+
end
|
14
|
+
|
15
|
+
# Soma cada dígito do número passado no #initialize.
|
16
|
+
# Alguns bancos requerem esse tipo estranho de cálculo em alguns módulos.
|
17
|
+
# @return [Fixnum] Resultado da soma de cada dígito.
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
#
|
21
|
+
# Digitos.new(12).sum
|
22
|
+
# # => 3
|
23
|
+
#
|
24
|
+
# Digitos.new(2244).sum
|
25
|
+
# # => 12
|
26
|
+
#
|
27
|
+
# Digitos.new(90123451).sum
|
28
|
+
# # => 25
|
29
|
+
#
|
30
|
+
def sum
|
31
|
+
@number.to_s.split('').collect { |number| number.to_i }.sum
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BoletoBancario
|
3
|
+
module Calculos
|
4
|
+
# Classe responsável pelo cálculo de Fator de Vencimento do boleto bancário.
|
5
|
+
#
|
6
|
+
# === Descricão
|
7
|
+
#
|
8
|
+
# Conforme Carta-circular 002926 do Banco Central do Brasil, de 24/07/2000, recomenda-se a indicação do Fator de Vencimento no Código de Barras.
|
9
|
+
# A partir de 02/04/2001, o Banco acolhedor/recebedor não será mais responsável por eventuais diferenças de recebimento de BOLETOs fora do prazo,
|
10
|
+
# ou sem a indicação do fator de vencimento.
|
11
|
+
#
|
12
|
+
# === Forma para obtenção do Fator de Vencimento
|
13
|
+
#
|
14
|
+
# Calcula-se <b>o número de dias corridos</b> entre a data base (<b>“Fixada” em 07/10/1997</b>) e a do vencimento desejado:
|
15
|
+
#
|
16
|
+
# Vencimento desejado: 04/07/2000
|
17
|
+
# Data base : - 07/10/1997
|
18
|
+
# # => 1001
|
19
|
+
#
|
20
|
+
# === Atenção
|
21
|
+
#
|
22
|
+
# Caso ocorra divergência entre a data impressa no campo “data de vencimento” e a constante no código de barras,
|
23
|
+
# o recebimento se dará da seguinte forma:
|
24
|
+
#
|
25
|
+
# * Quando pago por sistemas eletrônicos (Home-Banking, Auto-Atendimento, Internet, SISPAG, telefone, etc.), prevalecerá à representada no “código de barras”;
|
26
|
+
# * Quando quitado na rede de agências, diretamente no caixa, será considerada a data impressa no campo “vencimento” do BOLETO.
|
27
|
+
#
|
28
|
+
# @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
|
29
|
+
#
|
30
|
+
# @example
|
31
|
+
#
|
32
|
+
# FatorVencimento.new(Date.parse("2012-12-02"))
|
33
|
+
# #=> "5535"
|
34
|
+
#
|
35
|
+
# FatorVencimento.new(Date.parse("1997-10-08"))
|
36
|
+
# #=> "0001"
|
37
|
+
#
|
38
|
+
# FatorVencimento.new(Date.parse("2012-12-16"))
|
39
|
+
# #=> "5549"
|
40
|
+
#
|
41
|
+
# FatorVencimento.new(Date.parse("2014-12-15"))
|
42
|
+
# #=> "6278"
|
43
|
+
#
|
44
|
+
class FatorVencimento < String
|
45
|
+
attr_reader :base_date
|
46
|
+
# @param [Date] expiration_date
|
47
|
+
# @param [Date] base_date
|
48
|
+
# @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
|
49
|
+
# @example
|
50
|
+
# FatorVencimento.new(Date.parse("2012-09-02"))
|
51
|
+
# #=> "5444"
|
52
|
+
#
|
53
|
+
# FatorVencimento.new(Date.parse("1999-10-01"))
|
54
|
+
# #=> "0724"
|
55
|
+
#
|
56
|
+
# FatorVencimento.new(Date.parse("2022-12-16"))
|
57
|
+
# #=> "9201"
|
58
|
+
#
|
59
|
+
def initialize(expiration_date, base_date = Date.new(1997, 10, 7))
|
60
|
+
@base_date = base_date
|
61
|
+
@expiration_date = expiration_date
|
62
|
+
|
63
|
+
if @expiration_date.present?
|
64
|
+
super(calculate)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Cálculo da data de vencimento com a data base.
|
69
|
+
#
|
70
|
+
# @return [String] exatamente 4 dígitos
|
71
|
+
#
|
72
|
+
def calculate
|
73
|
+
expiration_date_minus_base_date.to_s.rjust(4, '0')
|
74
|
+
end
|
75
|
+
|
76
|
+
# @api private
|
77
|
+
#
|
78
|
+
# Cálculo da data de vencimento com a data base.
|
79
|
+
# Chamando #to_i para não retornar um Float.
|
80
|
+
# @return [Integer] diff between this two dates.
|
81
|
+
#
|
82
|
+
def expiration_date_minus_base_date
|
83
|
+
(@expiration_date - @base_date).to_i
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BoletoBancario
|
3
|
+
module Calculos
|
4
|
+
# Classe responsável por multiplicar cada dígito pelos fatores de multiplicação passado como argumento.
|
5
|
+
#
|
6
|
+
# Imagine que temos o número <b>'2468'</b> e os fatores de multiplicação <b>[2, 1]</b>.
|
7
|
+
#
|
8
|
+
# Será calculado da seguinte maneira:
|
9
|
+
#
|
10
|
+
# 2 4 6 8
|
11
|
+
# * * * * ===> Multiplicação
|
12
|
+
# 1 2 1 2
|
13
|
+
#
|
14
|
+
# #=> [2, 8, 6, 16]
|
15
|
+
#
|
16
|
+
# Você pode passar outros fatores de multiplicação se você precisar.
|
17
|
+
# Por exemplo, dado o número '1234567890' e os fatores de multiplicação: <b>[2, 3, 4, 5, 6, 7, 8, 9]</b>.
|
18
|
+
# Será calculado da seguinte maneira:
|
19
|
+
#
|
20
|
+
# 1 2 3 4 5 6 7 8 9 0
|
21
|
+
# * * * * * * * * * *
|
22
|
+
# 3 2 9 8 7 6 5 4 3 2
|
23
|
+
#
|
24
|
+
# #=> [3, 4, 27, 32, 35, 36, 35, 32, 27, 0]
|
25
|
+
#
|
26
|
+
# @param [String] O número que será usado para multiplicar cada dígito.
|
27
|
+
# @param [Hash] Os fatores de multiplicação que irão ser calculados na ordem reversa.
|
28
|
+
#
|
29
|
+
# @example Calculo
|
30
|
+
#
|
31
|
+
# BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 1])
|
32
|
+
# # => [1, 2, 6]
|
33
|
+
#
|
34
|
+
# BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
|
35
|
+
# # => [4, 6, 6]
|
36
|
+
#
|
37
|
+
# BoletoBancario::Calculos::FatoresDeMultiplicacao.new(809070608090, fatores: [9, 8, 7, 6, 5, 4, 3, 2])
|
38
|
+
# # => [48, 0, 72, 0, 14, 0, 24, 0, 48, 0, 72, 0]
|
39
|
+
#
|
40
|
+
class FatoresDeMultiplicacao < Array
|
41
|
+
# @param [String || Integer] number
|
42
|
+
# @param [Hash] options
|
43
|
+
# @option options [Array] :fatores
|
44
|
+
# @return [Array]
|
45
|
+
# @example
|
46
|
+
#
|
47
|
+
# FatoresDeMultiplicacao.new(12, fatores: [2, 1])
|
48
|
+
# # => [1, 4]
|
49
|
+
#
|
50
|
+
# FatoresDeMultiplicacao.new(1864, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
|
51
|
+
# # => [5, 32, 18, 8]
|
52
|
+
#
|
53
|
+
def initialize(number, options)
|
54
|
+
@number = number.to_s.reverse.split('')
|
55
|
+
@factors = options.fetch(:fatores).cycle.take(@number.size)
|
56
|
+
super(calculate)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Para cada número realiza a multiplicação para cada dígito.
|
60
|
+
# @return [Array]
|
61
|
+
#
|
62
|
+
def calculate
|
63
|
+
@number.collect.each_with_index { |n, index| n.to_i * @factors[index] }.reverse
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'active_support/core_ext/object'
|
3
|
+
|
4
|
+
module BoletoBancario
|
5
|
+
module Calculos
|
6
|
+
# Representação numérica do código de barras, mais conhecida como linha digitável! :p
|
7
|
+
#
|
8
|
+
# A representação numérica do código de barras é composta, por cinco campos.
|
9
|
+
# Sendo os três primeiros campos, amarrados por DAC's (dígitos verificadores),
|
10
|
+
# todos calculados pelo módulo 10.
|
11
|
+
#
|
12
|
+
# <b>OBS.:</b> Para mais detalhes deste cálculo, veja a descrição em Modulo10.
|
13
|
+
#
|
14
|
+
# === Linha Digitável
|
15
|
+
#
|
16
|
+
# A linha digitável contêm exatamente 47 posições nessa sequência:
|
17
|
+
#
|
18
|
+
# _____________________________________________________________________________________________________________
|
19
|
+
# |Campo | Posição | Tamanho | Descrição |
|
20
|
+
# |------|----------|---------|--------------------------------------------------------------------------------|
|
21
|
+
# | 1º | 01-03 | 03 | Código do banco (posições 1 a 3 do código de barras) |
|
22
|
+
# | | 04 | 01 | Código da moeda (posição 4 do código de barras) |
|
23
|
+
# | | 05-09 | 5 | Cinco primeiras posições do campo livre (posições 20 a 24 do código de barras) |
|
24
|
+
# | | 10 | 1 | Dígito verificador do primeiro campo (Módulo10) |
|
25
|
+
# |------------------------------------------------------------------------------------------------------------|
|
26
|
+
# | 2º | 11-20 | 10 | 6º a 15º posições do campo livre (posições 25 a 34 do código de barras) |
|
27
|
+
# | | 21 | 01 | Dígito verificador do segundo campo (Módulo10) |
|
28
|
+
# |------------------------------------------------------------------------------------------------------------|
|
29
|
+
# | 3º | 22-31 | 10 | 16º a 25º posições do campo livre (posições 35 a 44 do código de barras) |
|
30
|
+
# | | 32 | 01 | Dígito verificador do terceiro campo (Módulo10) |
|
31
|
+
# |------------------------------------------------------------------------------------------------------------|
|
32
|
+
# | 4º | 33 | 01 | Dígito verificador do código de barras (posição 5 do código de barras) |
|
33
|
+
# |------------------------------------------------------------------------------------------------------------|
|
34
|
+
# | 5ª | 34-37 | 04 | Fator de vencimento (posições 6 a 9 do código de barras) |
|
35
|
+
# | | 38-47 | 10 | Valor nominal do documento (posições 10 a 19 do código de barras) |
|
36
|
+
# -------------------------------------------------------------------------------------------------------------|
|
37
|
+
#
|
38
|
+
# @return [String] Contêm a representação numérica do código de barras formatado com pontos e espaços.
|
39
|
+
#
|
40
|
+
# @example
|
41
|
+
#
|
42
|
+
# LinhaDigitavel.new('34196166700000123451091234567880057123457000')
|
43
|
+
# # => '34191.09123 34567.880058 71234.570001 6 16670000012345'
|
44
|
+
#
|
45
|
+
# LinhaDigitavel.new('99991101200000350007772130530150081897500000')
|
46
|
+
# # => '99997.77213 30530.150082 18975.000003 1 10120000035000'
|
47
|
+
#
|
48
|
+
# LinhaDigitavel.new('39998100100000311551111122222500546666666001')
|
49
|
+
# # => '39991.11119 22222.500542 66666.660015 8 10010000031155'
|
50
|
+
#
|
51
|
+
class LinhaDigitavel < String
|
52
|
+
attr_reader :codigo_de_barras
|
53
|
+
# @param [String] codigo_de_barras Código de Barras de 44 posições
|
54
|
+
# @return [String]
|
55
|
+
#
|
56
|
+
# Representação numérica do código de barras
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
#
|
60
|
+
# LinhaDigitavel.new('34196166700000123451091234567880057123457000')
|
61
|
+
# # => '34191.09123 34567.880058 71234.570001 6 16670000012345'
|
62
|
+
#
|
63
|
+
# LinhaDigitavel.new('99991101200000350007772130530150081897500000')
|
64
|
+
# # => '99997.77213 30530.150082 18975.000003 1 10120000035000'
|
65
|
+
#
|
66
|
+
# LinhaDigitavel.new('39998100100000311551111122222500546666666001')
|
67
|
+
# # => '39991.11119 22222.500542 66666.660015 8 10010000031155'
|
68
|
+
#
|
69
|
+
# # Retorna uma String vazia caso o código de barras esteja vazio.
|
70
|
+
# LinhaDigitavel.new('')
|
71
|
+
# # => ''
|
72
|
+
#
|
73
|
+
# # Retorna uma String vazia caso o código de barras esteja vazio.
|
74
|
+
# LinhaDigitavel.new(nil)
|
75
|
+
# # => ''
|
76
|
+
#
|
77
|
+
# # Retorna uma String vazia caso o código de barras seja menor que 44 posições.
|
78
|
+
# LinhaDigitavel.new('123456789')
|
79
|
+
# # => ''
|
80
|
+
#
|
81
|
+
# # Retorna uma String vazia caso o código de barras seja maior que 44 posições.
|
82
|
+
# LinhaDigitavel.new('12345678901234567890123456789012345678901234567890')
|
83
|
+
# # => ''
|
84
|
+
#
|
85
|
+
def initialize(codigo_de_barras)
|
86
|
+
@codigo_de_barras = codigo_de_barras.to_s
|
87
|
+
|
88
|
+
if @codigo_de_barras.present? and @codigo_de_barras.size == 44
|
89
|
+
super(representacao_numerica_do_codigo_de_barras)
|
90
|
+
else
|
91
|
+
super('')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# @return [String] Retorna todos os campos da linha digitável pegando as posições exatas do código de barras.
|
96
|
+
#
|
97
|
+
def representacao_numerica_do_codigo_de_barras
|
98
|
+
"#{primeiro_campo} #{segundo_campo} #{terceiro_campo} #{quarto_campo} #{quinto_campo}"
|
99
|
+
end
|
100
|
+
|
101
|
+
# @api private
|
102
|
+
#
|
103
|
+
# Retorna o primeiro campo da linha digitável com seu respectivo dígito verificador.
|
104
|
+
#
|
105
|
+
# @return [String]
|
106
|
+
#
|
107
|
+
def primeiro_campo
|
108
|
+
primeiro_campo_sem_digito = "#{codigo_de_barras[0..3]}#{codigo_de_barras[19..23]}"
|
109
|
+
digito_verificador = Modulo10.new(primeiro_campo_sem_digito)
|
110
|
+
"#{primeiro_campo_sem_digito}#{digito_verificador}".gsub(/^(.{5})(.{5})/, '\1.\2')
|
111
|
+
end
|
112
|
+
|
113
|
+
# @api private
|
114
|
+
#
|
115
|
+
# Retorna o segundo campo da linha digitável com seu respectivo dígito verificador.
|
116
|
+
#
|
117
|
+
# @return [String]
|
118
|
+
#
|
119
|
+
def segundo_campo
|
120
|
+
segundo_campo_sem_digito = "#{codigo_de_barras[24..33]}"
|
121
|
+
digito_verificador = Modulo10.new(segundo_campo_sem_digito)
|
122
|
+
"#{segundo_campo_sem_digito}#{digito_verificador}".gsub(/(.{5})(.{6})/, '\1.\2')
|
123
|
+
end
|
124
|
+
|
125
|
+
# @api private
|
126
|
+
#
|
127
|
+
# Retorna o terceiro campo da linha digitável com seu respectivo dígito verificador.
|
128
|
+
#
|
129
|
+
# @return [String]
|
130
|
+
#
|
131
|
+
def terceiro_campo
|
132
|
+
terceiro_campo_sem_digito = "#{codigo_de_barras[34..46]}"
|
133
|
+
digito_verificador = Modulo10.new(terceiro_campo_sem_digito)
|
134
|
+
"#{terceiro_campo_sem_digito}#{digito_verificador}".gsub(/(.{5})(.{6})/, '\1.\2')
|
135
|
+
end
|
136
|
+
|
137
|
+
# @api private
|
138
|
+
#
|
139
|
+
# Retorna o dígito verificador do código de barras (posição 5 do código de barras)
|
140
|
+
#
|
141
|
+
# @return [String]
|
142
|
+
#
|
143
|
+
def quarto_campo
|
144
|
+
"#{codigo_de_barras[4]}"
|
145
|
+
end
|
146
|
+
|
147
|
+
# @api private
|
148
|
+
#
|
149
|
+
# Retorna o quinto e último campo da linha digitável.
|
150
|
+
#
|
151
|
+
# @return [String]
|
152
|
+
#
|
153
|
+
def quinto_campo
|
154
|
+
"#{codigo_de_barras[5..8]}#{codigo_de_barras[9..18]}"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|