br_boleto 1.0.1 → 1.1.0
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/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +13 -0
- data/LICENSE +1 -1
- data/README.markdown +22 -7
- data/br_boleto.gemspec +9 -7
- data/lib/br_boleto/active_model_base.rb +28 -0
- data/lib/br_boleto/boleto/base.rb +666 -633
- data/lib/br_boleto/boleto/caixa.rb +257 -0
- data/lib/br_boleto/boleto/sicoob.rb +6 -18
- data/lib/br_boleto/helper/format_value.rb +18 -0
- data/lib/br_boleto/remessa/base.rb +1 -22
- data/lib/br_boleto/remessa/cnab240/base.rb +12 -9
- data/lib/br_boleto/remessa/cnab240/caixa.rb +201 -0
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +10 -1
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +7 -0
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +6 -6
- data/lib/br_boleto/remessa/lote.rb +1 -21
- data/lib/br_boleto/remessa/pagamento.rb +22 -36
- data/lib/br_boleto/retorno/base.rb +31 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +101 -0
- data/lib/br_boleto/retorno/cnab240/caixa.rb +30 -0
- data/lib/br_boleto/retorno/cnab240/sicoob.rb +35 -0
- data/lib/br_boleto/retorno/pagamento.rb +242 -0
- data/lib/br_boleto/version.rb +2 -2
- data/lib/br_boleto.rb +23 -11
- data/test/br_boleto/boleto/base_test.rb +6 -6
- data/test/br_boleto/boleto/caixa_test.rb +191 -0
- data/test/br_boleto/boleto/sicoob_test.rb +18 -11
- data/test/br_boleto/remessa/cnab240/base_test.rb +5 -5
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +271 -0
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +27 -27
- data/test/br_boleto/remessa/pagamento_test.rb +12 -2
- data/test/br_boleto/retorno/cnab240/base_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +217 -0
- data/test/br_boleto/retorno/pagamento_test.rb +179 -0
- data/test/factories/boleto/boleto_caixa.rb +25 -0
- data/test/factories/remessa/cnab240/caixa.rb +14 -0
- data/test/factories/remessa/pagamento.rb +1 -0
- data/test/factories/retorno/pagamento.rb +6 -0
- data/test/files/retorno/cnab240/caixa.ret +14 -0
- data/test/files/retorno/cnab240/padrao240.ret +14 -0
- metadata +51 -6
@@ -41,6 +41,13 @@ module BrBoleto
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# Tipo do registro -> Padrão 9
|
44
|
+
# Código adotado pela FEBRABAN para identificar o tipo de registro:
|
45
|
+
# 0 = Header de Arquivo
|
46
|
+
# 1 = Header de Lote
|
47
|
+
# 3 = Detalhe
|
48
|
+
# 5 = Trailer de Lote
|
49
|
+
# 9 = Trailer de Arquivo
|
50
|
+
#
|
44
51
|
# 1 posição
|
45
52
|
#
|
46
53
|
def trailer_arquivo_posicao_008_a_008
|
@@ -99,7 +99,7 @@ module BrBoleto
|
|
99
99
|
"#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta}".adjust_size_to(20)
|
100
100
|
end
|
101
101
|
|
102
|
-
def
|
102
|
+
def complemento_header_arquivo
|
103
103
|
''.rjust(29, ' ')
|
104
104
|
end
|
105
105
|
|
@@ -118,7 +118,7 @@ module BrBoleto
|
|
118
118
|
# Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
|
119
119
|
# É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
|
120
120
|
#
|
121
|
-
def
|
121
|
+
def tipo_cobranca_formatada
|
122
122
|
case "#{modalidade_carteira}".rjust(2, "0")
|
123
123
|
when '01', '02'
|
124
124
|
:simples
|
@@ -165,14 +165,14 @@ module BrBoleto
|
|
165
165
|
# 6 posições
|
166
166
|
#
|
167
167
|
def complemento_trailer_lote_posicao_024_a_029(lote)
|
168
|
-
|
168
|
+
tipo_cobranca_formatada == :simples ? lote.pagamentos.count.to_s.rjust(6, '0') : ''.rjust(6, '0')
|
169
169
|
end
|
170
170
|
|
171
171
|
# Valor total dos titulos de cobrança simples
|
172
172
|
# 17 posições
|
173
173
|
#
|
174
174
|
def complemento_trailer_lote_posicao_030_a_046(lote)
|
175
|
-
if
|
175
|
+
if tipo_cobranca_formatada == :simples
|
176
176
|
BrBoleto::Helper::Number.new(lote.pagamentos.map(&:valor_documento).sum).formata_valor_monetario(17)
|
177
177
|
else
|
178
178
|
''.rjust(17, '0')
|
@@ -198,14 +198,14 @@ module BrBoleto
|
|
198
198
|
# 6 posições
|
199
199
|
#
|
200
200
|
def complemento_trailer_lote_posicao_070_a_075(lote)
|
201
|
-
|
201
|
+
tipo_cobranca_formatada == :caucionada ? lote.pagamentos.count.to_s.rjust(6, '0') : ''.rjust(6, '0')
|
202
202
|
end
|
203
203
|
|
204
204
|
# Valor total dos titulos de cobrança Caucionada
|
205
205
|
# 17 posições
|
206
206
|
#
|
207
207
|
def complemento_trailer_lote_posicao_076_a_092(lote)
|
208
|
-
if
|
208
|
+
if tipo_cobranca_formatada == :caucionada
|
209
209
|
BrBoleto::Helper::Number.new(lote.pagamentos.map(&:valor_documento).sum).formata_valor_monetario(17)
|
210
210
|
else
|
211
211
|
''.rjust(17, '0')
|
@@ -1,14 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
module BrBoleto
|
3
3
|
module Remessa
|
4
|
-
class Lote
|
5
|
-
# Seguindo a interface do Active Model para:
|
6
|
-
# * Validações;
|
7
|
-
# * Internacionalização;
|
8
|
-
# * Nomes das classes para serem manipuladas;
|
9
|
-
#
|
10
|
-
include ActiveModel::Model
|
11
|
-
|
4
|
+
class Lote < BrBoleto::ActiveModelBase
|
12
5
|
# variavel que terá os pagamentos no qual será gerado o lote do arquivo de remessa
|
13
6
|
# Pode haver 1 ou vários pagamentos para o mesmo arquivo
|
14
7
|
attr_accessor :pagamentos
|
@@ -17,19 +10,6 @@ module BrBoleto
|
|
17
10
|
BrBoleto::Remessa::Pagamento
|
18
11
|
end
|
19
12
|
|
20
|
-
def initialize(attributes = {})
|
21
|
-
self.pagamentos = [] # Para poder utilizar o << para incrementar o array
|
22
|
-
assign_attributes(attributes)
|
23
|
-
yield self if block_given?
|
24
|
-
end
|
25
|
-
|
26
|
-
def assign_attributes(attributes)
|
27
|
-
attributes ||= {}
|
28
|
-
attributes.each do |name, value|
|
29
|
-
send("#{name}=", value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
13
|
validates_each :pagamentos do |record, attr, value|
|
34
14
|
record.errors.add(attr, 'não pode estar vazio.') if value.empty?
|
35
15
|
value.each do |pagamento|
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
module BrBoleto
|
3
3
|
module Remessa
|
4
|
-
class Pagamento
|
5
|
-
# Seguindo a interface do Active Model para:
|
6
|
-
# * Validações;
|
7
|
-
# * Internacionalização;
|
8
|
-
# * Nomes das classes para serem manipuladas;
|
9
|
-
#
|
10
|
-
include ActiveModel::Model
|
11
|
-
|
4
|
+
class Pagamento < BrBoleto::ActiveModelBase
|
12
5
|
# <b>REQUERIDO</b>: nosso numero
|
13
6
|
attr_accessor :nosso_numero
|
14
7
|
|
8
|
+
# <b>OPCIONAL</b>: Número do Documento de Cobrança - Número adotado e controlado pelo Cliente,
|
9
|
+
# para identificar o título de cobrança.
|
10
|
+
# Informação utilizada para referenciar a identificação do documento objeto de cobrança.
|
11
|
+
# Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice,
|
12
|
+
# no caso de cobrança de seguros, etc
|
13
|
+
attr_accessor :numero_documento
|
14
|
+
|
15
15
|
# <b>REQUERIDO</b>: data do vencimento do boleto
|
16
16
|
attr_accessor :data_vencimento
|
17
17
|
|
@@ -88,6 +88,13 @@ module BrBoleto
|
|
88
88
|
# <b>OPCIONAL</b>: Informações para multa
|
89
89
|
attr_accessor :codigo_multa, :data_multa, :valor_multa
|
90
90
|
|
91
|
+
def cep_sacado
|
92
|
+
"#{@cep_sacado}".gsub(/[^0-9]/, "")
|
93
|
+
end
|
94
|
+
|
95
|
+
def nosso_numero
|
96
|
+
"#{@nosso_numero}".gsub(/[^0-9]/, "")
|
97
|
+
end
|
91
98
|
|
92
99
|
validates :nosso_numero, :data_vencimento, :valor_documento, :documento_sacado, :nome_sacado,
|
93
100
|
:endereco_sacado, :cep_sacado, :cidade_sacado, :uf_sacado, :bairro_sacado, :tipo_impressao,
|
@@ -96,36 +103,15 @@ module BrBoleto
|
|
96
103
|
validates :cep_sacado, length: {is: 8, message: 'deve ter 8 dígitos.'}
|
97
104
|
validates :cod_desconto, length: {is: 1, message: 'deve ter 1 dígito.'}
|
98
105
|
|
99
|
-
# Nova instancia da classe Pagamento
|
100
|
-
#
|
101
|
-
# @param campos [Hash]
|
102
|
-
#
|
103
|
-
def initialize(attributes = {})
|
104
|
-
attributes = default_values.merge!(attributes)
|
105
|
-
assign_attributes(attributes)
|
106
|
-
yield self if block_given?
|
107
|
-
end
|
108
|
-
|
109
|
-
def assign_attributes(attributes={})
|
110
|
-
attributes ||= {}
|
111
|
-
attributes.each do |name, value|
|
112
|
-
send("#{name}=", value)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def nosso_numero
|
117
|
-
"#{@nosso_numero}".gsub(/[^0-9]/, "")
|
118
|
-
end
|
119
|
-
|
120
106
|
def default_values
|
121
107
|
{
|
122
|
-
data_emissao:
|
123
|
-
valor_mora:
|
124
|
-
valor_desconto:
|
125
|
-
valor_iof:
|
126
|
-
valor_abatimento:
|
127
|
-
nome_avalista:
|
128
|
-
cod_desconto:
|
108
|
+
data_emissao: Date.today,
|
109
|
+
valor_mora: 0.0,
|
110
|
+
valor_desconto: 0.0,
|
111
|
+
valor_iof: 0.0,
|
112
|
+
valor_abatimento: 0.0,
|
113
|
+
nome_avalista: '',
|
114
|
+
cod_desconto: '0',
|
129
115
|
desconto_2_codigo: '0',
|
130
116
|
desconto_2_valor: 0.0,
|
131
117
|
desconto_3_codigo: '0',
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Retorno
|
4
|
+
class Base < BrBoleto::ActiveModelBase
|
5
|
+
|
6
|
+
attr_accessor :pagamentos
|
7
|
+
attr_accessor :codigo_banco
|
8
|
+
|
9
|
+
def initialize(file)
|
10
|
+
self.pagamentos = []
|
11
|
+
@file = file
|
12
|
+
read_file!
|
13
|
+
end
|
14
|
+
|
15
|
+
# O atributo pagamentos sempre irá retornar um Array
|
16
|
+
def pagamentos
|
17
|
+
@pagamentos = [@pagamentos].flatten
|
18
|
+
end
|
19
|
+
|
20
|
+
def file
|
21
|
+
@file
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def read_file!
|
27
|
+
raise NotImplementedError.new('Sobreescreva este método na classe referente ao CNAB 240 ou 400')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Retorno
|
4
|
+
module Cnab240
|
5
|
+
class Base < BrBoleto::Retorno::Base
|
6
|
+
|
7
|
+
# Esta classe foi desenvolvida baseando-se no manual disponibilizado pela FEBRABAN
|
8
|
+
# Manual: Layout Padrão Febraban 240 posições v09.0
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# É feito um loop em todas as linhas do arquivo onde ignora se a linha não
|
13
|
+
# for do segmento T ou do segmento U.
|
14
|
+
# A cada loop é lido 2 linhas por vez, onde sempre terá o segmento T e U juntos.
|
15
|
+
# Cada loop representa um pagamento.
|
16
|
+
#
|
17
|
+
def read_file! #:doc:
|
18
|
+
File.readlines(file).reject{|l| l =~ /^((?!^.{7}3.{5}[T|U].*$).)*$/}.each_slice(2) do |line|
|
19
|
+
instnce_payment(line)
|
20
|
+
end
|
21
|
+
pagamentos
|
22
|
+
end
|
23
|
+
|
24
|
+
# Método utilizado para instanciar um novo Pagamento a partir das linhas dos
|
25
|
+
# Segmentos T e U do arquivo de retorno
|
26
|
+
#
|
27
|
+
def instnce_payment(lines) #:doc:
|
28
|
+
payment = BrBoleto::Retorno::Pagamento.new
|
29
|
+
lines.each do |line|
|
30
|
+
self.codigo_banco ||= line[0..2]
|
31
|
+
if line[13] == 'T'
|
32
|
+
set_values_for_segment_t(payment, line)
|
33
|
+
else # U
|
34
|
+
set_values_for_segment_u(payment, line)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
self.pagamentos << payment
|
38
|
+
end
|
39
|
+
|
40
|
+
def set_values_for_segment_u(payment, line) #:doc:
|
41
|
+
segmento_u_fields.each do |column, position |
|
42
|
+
payment.send("#{column}=", "_#{line}"[position].try(:strip))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def set_values_for_segment_t(payment, line) #:doc:
|
47
|
+
segmento_t_fields.each do |column, position |
|
48
|
+
payment.send("#{column}=", "_#{line}"[position].try(:strip))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def segmento_t_fields #:doc:
|
53
|
+
{ # ATRIBUTO POSIÇÃO DA LINHA
|
54
|
+
agencia_com_dv: 18..23,
|
55
|
+
agencia_sem_dv: 18..22,
|
56
|
+
numero_conta_com_dv: 24..36,
|
57
|
+
numero_conta_sem_dv: 24..35,
|
58
|
+
dv_conta_e_agencia: 37..37,
|
59
|
+
nosso_numero: 38..57,
|
60
|
+
carteira: 58..58,
|
61
|
+
numero_codumento: 59..73,
|
62
|
+
data_vencimento: 74..81,
|
63
|
+
valor_titulo: 82..96,
|
64
|
+
banco_recebedor: 97..99,
|
65
|
+
agencia_recebedora_com_dv: 100..105,
|
66
|
+
identificacao_titulo_empresa: 106..130,
|
67
|
+
codigo_moeda: 131..132,
|
68
|
+
sacado_tipo_documento: 133..133,
|
69
|
+
sacado_documento: 134..148,
|
70
|
+
sacado_nome: 149..188,
|
71
|
+
numero_contrato: 189..198,
|
72
|
+
valor_tarifa: 199..213,
|
73
|
+
motivo_ocorrencia: 214..223
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
def segmento_u_fields #:doc:
|
78
|
+
{ # ATRIBUTO POSIÇÃO DA LINHA
|
79
|
+
valor_juros_multa: 18..32,
|
80
|
+
valor_desconto: 33..47,
|
81
|
+
valor_abatimento: 48..62,
|
82
|
+
valor_iof: 63..77,
|
83
|
+
valor_pago: 78..92,
|
84
|
+
valor_liquido: 93..107,
|
85
|
+
valor_coutras_despesas: 108..122,
|
86
|
+
valor_coutros_creditos: 123..137,
|
87
|
+
data_ocorrencia: 138..145,
|
88
|
+
data_credito: 146..153,
|
89
|
+
codigo_ocorrencia_sacado: 154..157,
|
90
|
+
data_ocorrencia_sacado: 158..165,
|
91
|
+
valor_ocorrencia_sacado: 166..180,
|
92
|
+
complemento_ocorrencia_sacado: 181..210,
|
93
|
+
codigo_ocorrencia_banco_correspondente: 211..213,
|
94
|
+
nosso_numero_banco_correspondente: 214..133,
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Retorno
|
4
|
+
module Cnab240
|
5
|
+
class Caixa < BrBoleto::Retorno::Cnab240::Base
|
6
|
+
|
7
|
+
private
|
8
|
+
# O Banco da Caixa não tem a capacidade de seguir o padrão da FEBRABAN
|
9
|
+
# então tem algumas particularidades nas posições dos valores:
|
10
|
+
# - numero_conta (codigo cedente)
|
11
|
+
# - Modalidade
|
12
|
+
# - Nosso número
|
13
|
+
# - Número documento
|
14
|
+
#
|
15
|
+
def segmento_t_fields #:doc:
|
16
|
+
super.merge({
|
17
|
+
# ATRIBUTO POSIÇÃO DA LINHA
|
18
|
+
numero_conta_com_dv: 24..29, # Código do cedente
|
19
|
+
numero_conta_sem_dv: 24..29, # Código do cedente
|
20
|
+
dv_conta_e_agencia: 250, # Defino como 250 para setar nil ao atributo
|
21
|
+
modalidade: 40..41,
|
22
|
+
nosso_numero: 42..56,
|
23
|
+
# carteira: 58..58, # Cartéira segue o padrão da FEBRABAN
|
24
|
+
numero_codumento: 59..69,
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Retorno
|
4
|
+
module Cnab240
|
5
|
+
class Sicoob < BrBoleto::Retorno::Cnab240::Base
|
6
|
+
|
7
|
+
private
|
8
|
+
# O valor da posição que representa o nosso_numero está
|
9
|
+
# subdividido e várias partes para o sicoob.
|
10
|
+
#
|
11
|
+
# Pelo Layout da FEBRABAN o valor para a informação do nosso_numero
|
12
|
+
# Está localizado entre as posições 38 a 57 contendo 20 caracteres.
|
13
|
+
#
|
14
|
+
# Nosso Número:
|
15
|
+
# - NumTitulo - 10 posições (01 a 10)
|
16
|
+
# - Parcela - 02 posições (11 a 12) - "01" se parcela única
|
17
|
+
# - Modalidade - 02 posições (13 a 14) - vide planilha "Capa" deste arquivo
|
18
|
+
# - Tipo Formulário - 01 posição (15 a 15):
|
19
|
+
# - "1" = auto-copiativo
|
20
|
+
# - "3" = auto-envelopável
|
21
|
+
# - "4" = A4 sem envelopamento
|
22
|
+
# - "6" = A4 sem envelopamento 3 vias
|
23
|
+
# - Em branco - 05 posições (16 a 20)
|
24
|
+
#
|
25
|
+
def segmento_t_fields #:doc:
|
26
|
+
super.merge({
|
27
|
+
# ATRIBUTO POSIÇÃO DA LINHA
|
28
|
+
nosso_numero: 38..47,
|
29
|
+
modalidade: 50..51
|
30
|
+
})
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Retorno
|
4
|
+
class Pagamento < BrBoleto::ActiveModelBase
|
5
|
+
|
6
|
+
#############################################################################################
|
7
|
+
############################# VALORES ENCONTRADOS NO SEGMENTO T #############################
|
8
|
+
#############################################################################################
|
9
|
+
# AGÊNCIA
|
10
|
+
attr_accessor :agencia_com_dv # tamanho = 6
|
11
|
+
attr_accessor :agencia_sem_dv # tamanho = 5
|
12
|
+
|
13
|
+
# NÚMERO DA CONTA CORRENTE/CEDENTE
|
14
|
+
attr_accessor :numero_conta_com_dv # tamanho = 13
|
15
|
+
attr_accessor :numero_conta_sem_dv # tamanho = 12
|
16
|
+
alias_attribute :codigo_cedente, :numero_conta_sem_dv
|
17
|
+
alias_attribute :numero_conta, :numero_conta_sem_dv
|
18
|
+
|
19
|
+
# IDENTIFICAÇÃO DO TÍTULO
|
20
|
+
# Tamanho Posição
|
21
|
+
# 1 37-37
|
22
|
+
attr_accessor :dv_conta_e_agencia
|
23
|
+
|
24
|
+
# IDENTIFICAÇÃO DO TÍTULO
|
25
|
+
# Tamanho Posição
|
26
|
+
# 20 38-57
|
27
|
+
attr_accessor :nosso_numero
|
28
|
+
|
29
|
+
# CÓDIGO DA CARTEIRA
|
30
|
+
# Tamanho Posição
|
31
|
+
# 1 58-58
|
32
|
+
attr_accessor :carteira
|
33
|
+
|
34
|
+
# NÚMERO DO DOCUMENTO
|
35
|
+
# Tamanho Posição
|
36
|
+
# 15 59-73
|
37
|
+
attr_accessor :numero_codumento
|
38
|
+
|
39
|
+
# DATA DE VENCIMENTO
|
40
|
+
# Tamanho Posição
|
41
|
+
# 8 74-81
|
42
|
+
attr_accessor :data_vencimento
|
43
|
+
|
44
|
+
# VALRO DO TÍTULO
|
45
|
+
# Tamanho Posição
|
46
|
+
# 15 82-96
|
47
|
+
attr_accessor :valor_titulo
|
48
|
+
|
49
|
+
# CÓDIGO DO BANCO RECEBEDOR DO TÚTULO
|
50
|
+
# Tamanho Posição
|
51
|
+
# 3 97-99
|
52
|
+
attr_accessor :banco_recebedor
|
53
|
+
|
54
|
+
# AGÊNCIA(com dv) DO BANCO RECEBEDOR DO TÚTULO
|
55
|
+
# Tamanho Posição
|
56
|
+
# 6 100-105
|
57
|
+
attr_accessor :agencia_recebedora_com_dv
|
58
|
+
|
59
|
+
# IDENTIFICAÇÃO/DESCRIÇÃO DO TÍTULO DA EMPRESA
|
60
|
+
# Tamanho Posição
|
61
|
+
# 25 106-130
|
62
|
+
attr_accessor :identificacao_titulo_empresa
|
63
|
+
|
64
|
+
# CÓDIGO DA MOEDA
|
65
|
+
# Tamanho Posição
|
66
|
+
# 2 131-132
|
67
|
+
attr_accessor :codigo_moeda
|
68
|
+
|
69
|
+
# SACADO TIPO DE INSCRIÇÃO
|
70
|
+
# '0' = Isento / Não Informado
|
71
|
+
# '1' = CPF
|
72
|
+
# '2' = CGC / CNPJ
|
73
|
+
# '3' = PIS / PASEP
|
74
|
+
# '9' = Outros
|
75
|
+
# Tamanho Posição
|
76
|
+
# 1 133-133
|
77
|
+
attr_accessor :sacado_tipo_documento
|
78
|
+
|
79
|
+
# NÚMEDO DO DOCUMENTO DO SACADO (CPF/CNPJ)
|
80
|
+
# Tamanho Posição
|
81
|
+
# 15 134-148
|
82
|
+
attr_accessor :sacado_documento
|
83
|
+
|
84
|
+
# NOME DO SACADO
|
85
|
+
# Tamanho Posição
|
86
|
+
# 40 149-188
|
87
|
+
attr_accessor :sacado_nome
|
88
|
+
|
89
|
+
# NÚMERO DO CONTRATO DA OPERAÇÃO DE CRÉDITO
|
90
|
+
# Tamanho Posição
|
91
|
+
# 10 189-198
|
92
|
+
attr_accessor :numero_contrato
|
93
|
+
|
94
|
+
# VALOR DA TARIFA
|
95
|
+
# Tamanho Posição
|
96
|
+
# 15 199-213
|
97
|
+
attr_accessor :valor_tarifa
|
98
|
+
|
99
|
+
# IDENTIFICAÇÃO PARA REJEIÇÕES, TARIFAS, CUSTOS, LIQUIDAÇÃO E BAIXAS
|
100
|
+
# Tamanho Posição
|
101
|
+
# 10 214-223
|
102
|
+
attr_accessor :motivo_ocorrencia
|
103
|
+
|
104
|
+
#############################################################################################
|
105
|
+
############################# VALORES ENCONTRADOS NO SEGMENTO U #############################
|
106
|
+
#############################################################################################
|
107
|
+
# ACRÉSCIMOS COM JUROS E MULTAS
|
108
|
+
# Tamanho Posição
|
109
|
+
# 15 18-32
|
110
|
+
attr_accessor :valor_juros_multa
|
111
|
+
|
112
|
+
# VALOR DO DESCONTO
|
113
|
+
# Tamanho Posição
|
114
|
+
# 15 33-47
|
115
|
+
attr_accessor :valor_desconto
|
116
|
+
|
117
|
+
# VALOR DO ABATIMENTO CONCEDIDO/CENCELADO
|
118
|
+
# Tamanho Posição
|
119
|
+
# 15 48-62
|
120
|
+
attr_accessor :valor_abatimento
|
121
|
+
|
122
|
+
# VALOR DO IOF
|
123
|
+
# Tamanho Posição
|
124
|
+
# 15 63-77
|
125
|
+
attr_accessor :valor_iof
|
126
|
+
|
127
|
+
# VALOR PAGO PELO SACADO
|
128
|
+
# Tamanho Posição
|
129
|
+
# 15 78-92
|
130
|
+
attr_accessor :valor_pago
|
131
|
+
|
132
|
+
# VALOR LIQUIDO
|
133
|
+
# Tamanho Posição
|
134
|
+
# 15 93-107
|
135
|
+
attr_accessor :valor_liquido
|
136
|
+
|
137
|
+
# VALRO COM COUTRAS DESPESAS
|
138
|
+
# Tamanho Posição
|
139
|
+
# 15 108-122
|
140
|
+
attr_accessor :valor_coutras_despesas
|
141
|
+
|
142
|
+
# VALRO COM COUTROS CRÉDITOS
|
143
|
+
# Tamanho Posição
|
144
|
+
# 15 123-137
|
145
|
+
attr_accessor :valor_coutros_creditos
|
146
|
+
|
147
|
+
# DATA OCORRÊNCIA
|
148
|
+
# Tamanho Posição
|
149
|
+
# 8 138-145
|
150
|
+
attr_accessor :data_ocorrencia
|
151
|
+
|
152
|
+
# DATA DA EFETIVAÇÃO DO CRÉDITO
|
153
|
+
# Tamanho Posição
|
154
|
+
# 8 146-153
|
155
|
+
attr_accessor :data_credito
|
156
|
+
|
157
|
+
# CÓDIGO DA OCORRÊNCIA DO SACADO
|
158
|
+
# Tamanho Posição
|
159
|
+
# 4 154-157
|
160
|
+
attr_accessor :codigo_ocorrencia_sacado
|
161
|
+
|
162
|
+
# DATA DA OCORRÊNCIA DO SACADO
|
163
|
+
# Tamanho Posição
|
164
|
+
# 8 158-165
|
165
|
+
attr_accessor :data_ocorrencia_sacado
|
166
|
+
|
167
|
+
# VALOR DA OCORRÊNCIA DO SACADO
|
168
|
+
# Tamanho Posição
|
169
|
+
# 15 166-180
|
170
|
+
attr_accessor :valor_ocorrencia_sacado
|
171
|
+
|
172
|
+
# COMPLEMENTO DA OCORRÊNCIA DO SACADO
|
173
|
+
# Tamanho Posição
|
174
|
+
# 30 181-210
|
175
|
+
attr_accessor :complemento_ocorrencia_sacado
|
176
|
+
|
177
|
+
# CÓDIGO DA OCORRÊNCIA DO BANCO CORRESPONDETNTE
|
178
|
+
# Tamanho Posição
|
179
|
+
# 3 211-213
|
180
|
+
attr_accessor :codigo_ocorrencia_banco_correspondente
|
181
|
+
|
182
|
+
# CÓDIGO DA OCORRÊNCIA DO BANCO CORRESPONDETNTE
|
183
|
+
# Tamanho Posição
|
184
|
+
# 3 211-213
|
185
|
+
attr_accessor :nosso_numero_banco_correspondente
|
186
|
+
|
187
|
+
# MODALIDADE
|
188
|
+
# O Padrão da FEBRABAN não prevê este valor, porém na maioria dos bancos
|
189
|
+
# este valor está incluso junto com a posição do nosso_numero
|
190
|
+
# É implementado apenas para os bancos que não conseguem seguir um padrão estabelecido
|
191
|
+
attr_accessor :modalidade
|
192
|
+
|
193
|
+
def initialize(attributes = {})
|
194
|
+
define_formatted_methods!
|
195
|
+
super
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.formatted_values
|
199
|
+
{
|
200
|
+
data_vencimento: {type: :date},
|
201
|
+
data_ocorrencia: {type: :date},
|
202
|
+
data_credito: {type: :date},
|
203
|
+
data_ocorrencia_sacado: {type: :date},
|
204
|
+
valor_titulo: {type: :float},
|
205
|
+
valor_tarifa: {type: :float},
|
206
|
+
valor_juros_multa: {type: :float},
|
207
|
+
valor_desconto: {type: :float},
|
208
|
+
valor_abatimento: {type: :float},
|
209
|
+
valor_iof: {type: :float},
|
210
|
+
valor_pago: {type: :float},
|
211
|
+
valor_liquido: {type: :float},
|
212
|
+
valor_coutras_despesas: {type: :float},
|
213
|
+
valor_coutros_creditos: {type: :float},
|
214
|
+
valor_ocorrencia_sacado: {type: :float},
|
215
|
+
}
|
216
|
+
end
|
217
|
+
|
218
|
+
def define_formatted_methods!
|
219
|
+
self.class.formatted_values.each do |attr_name, options|
|
220
|
+
case options[:type]
|
221
|
+
when :date
|
222
|
+
define_date_attribute(attr_name)
|
223
|
+
when :float
|
224
|
+
define_float_attribute(attr_name)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def define_float_attribute(attr_name)
|
230
|
+
define_singleton_method "#{attr_name}=" do |value|
|
231
|
+
self.instance_variable_set("@#{attr_name}", BrBoleto::Helper::FormatValue.string_to_float(value) )
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def define_date_attribute(attr_name)
|
236
|
+
define_singleton_method "#{attr_name}=" do |value|
|
237
|
+
self.instance_variable_set("@#{attr_name}", BrBoleto::Helper::FormatValue.string_to_date(value) )
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
data/lib/br_boleto/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module BrBoleto
|
2
2
|
module Version
|
3
3
|
MAJOR = 1 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
|
4
|
-
MINOR =
|
5
|
-
PATCH =
|
4
|
+
MINOR = 1 #inclui novas funcionalidades, sem quebrar APIs existentes
|
5
|
+
PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
|
6
6
|
CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
7
7
|
end
|
8
8
|
end
|