conectiva-boleto_bancario 0.0.2.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
|