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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +13 -0
  5. data/LICENSE +1 -1
  6. data/README.markdown +22 -7
  7. data/br_boleto.gemspec +9 -7
  8. data/lib/br_boleto/active_model_base.rb +28 -0
  9. data/lib/br_boleto/boleto/base.rb +666 -633
  10. data/lib/br_boleto/boleto/caixa.rb +257 -0
  11. data/lib/br_boleto/boleto/sicoob.rb +6 -18
  12. data/lib/br_boleto/helper/format_value.rb +18 -0
  13. data/lib/br_boleto/remessa/base.rb +1 -22
  14. data/lib/br_boleto/remessa/cnab240/base.rb +12 -9
  15. data/lib/br_boleto/remessa/cnab240/caixa.rb +201 -0
  16. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +2 -2
  17. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +10 -1
  18. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +2 -2
  19. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +2 -2
  20. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +7 -0
  21. data/lib/br_boleto/remessa/cnab240/sicoob.rb +6 -6
  22. data/lib/br_boleto/remessa/lote.rb +1 -21
  23. data/lib/br_boleto/remessa/pagamento.rb +22 -36
  24. data/lib/br_boleto/retorno/base.rb +31 -0
  25. data/lib/br_boleto/retorno/cnab240/base.rb +101 -0
  26. data/lib/br_boleto/retorno/cnab240/caixa.rb +30 -0
  27. data/lib/br_boleto/retorno/cnab240/sicoob.rb +35 -0
  28. data/lib/br_boleto/retorno/pagamento.rb +242 -0
  29. data/lib/br_boleto/version.rb +2 -2
  30. data/lib/br_boleto.rb +23 -11
  31. data/test/br_boleto/boleto/base_test.rb +6 -6
  32. data/test/br_boleto/boleto/caixa_test.rb +191 -0
  33. data/test/br_boleto/boleto/sicoob_test.rb +18 -11
  34. data/test/br_boleto/remessa/cnab240/base_test.rb +5 -5
  35. data/test/br_boleto/remessa/cnab240/caixa_test.rb +271 -0
  36. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +2 -2
  37. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +1 -1
  38. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +27 -27
  39. data/test/br_boleto/remessa/pagamento_test.rb +12 -2
  40. data/test/br_boleto/retorno/cnab240/base_test.rb +217 -0
  41. data/test/br_boleto/retorno/cnab240/caixa_test.rb +217 -0
  42. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +217 -0
  43. data/test/br_boleto/retorno/pagamento_test.rb +179 -0
  44. data/test/factories/boleto/boleto_caixa.rb +25 -0
  45. data/test/factories/remessa/cnab240/caixa.rb +14 -0
  46. data/test/factories/remessa/pagamento.rb +1 -0
  47. data/test/factories/retorno/pagamento.rb +6 -0
  48. data/test/files/retorno/cnab240/caixa.ret +14 -0
  49. data/test/files/retorno/cnab240/padrao240.ret +14 -0
  50. 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 complemento_header
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 tipo_cobranca
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
- tipo_cobranca == :simples ? lote.pagamentos.count.to_s.rjust(6, '0') : ''.rjust(6, '0')
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 tipo_cobranca == :simples
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
- tipo_cobranca == :caucionada ? lote.pagamentos.count.to_s.rjust(6, '0') : ''.rjust(6, '0')
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 tipo_cobranca == :caucionada
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: Date.today,
123
- valor_mora: 0.0,
124
- valor_desconto: 0.0,
125
- valor_iof: 0.0,
126
- valor_abatimento: 0.0,
127
- nome_avalista: '',
128
- cod_desconto: '0',
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
@@ -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 = 0 #inclui novas funcionalidades, sem quebrar APIs existentes
5
- PATCH = 1 #corrige bugs ou traz melhorias em implementações já existentes
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