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
@@ -0,0 +1,257 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ module Boleto
4
+ # Implementação de emissão de boleto bancário pela Caixa Econômica Federal.
5
+ #
6
+ # === Documentação Implementada
7
+ #
8
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
9
+ # 'documentacoes_dos_boletos/caixa' dentro dessa biblioteca.
10
+ # === Carteiras suportadas
11
+ #
12
+ # Segue abaixo as carteiras suportadas da Caixa Econômica Federal <b>seguindo a documentação</b>:
13
+ #
14
+ # ___________________________________________
15
+ # | Carteira | Descrição |
16
+ # | 14 | Cobrança Simples com registro |
17
+ # | 24 | Cobrança Simples sem registro |
18
+ # |__________________________________________|
19
+ # === Carteira/Modalidade:
20
+ #
21
+ # 1/4 = Registrada / Emissão do boleto(4-Beneficiário)
22
+ # 2/4 = Sem Registro / Emissão do boleto(4-Beneficiário)
23
+ #
24
+ #
25
+ class Caixa < Base
26
+ #Modalidades de cobranças válidas conforme a documentação
27
+ def self.modalidade_cobranca_validas
28
+ %w(1 2)
29
+ end
30
+
31
+ def deve_validar_modalidade_cobranca?
32
+ true
33
+ end
34
+
35
+ # Tamanho máximo de uma agência na Caixa Econômica Federal.
36
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
37
+ #
38
+ # @return [Fixnum] 4
39
+ #
40
+ def self.tamanho_maximo_agencia
41
+ 4
42
+ end
43
+
44
+ # Tamanho máximo do código do cedente emitido no Boleto.
45
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
46
+ #
47
+ # @return [Fixnum] 6
48
+ #
49
+ def self.tamanho_maximo_codigo_cedente
50
+ 6
51
+ end
52
+
53
+ # Tamanho máximo do numero do documento no Boleto.
54
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
55
+ #
56
+ # @return [Fixnum] 15
57
+ #
58
+ def self.tamanho_maximo_numero_documento
59
+ 15
60
+ end
61
+
62
+ # <b>Carteiras suportadas.</b>
63
+ #
64
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
65
+ #
66
+ # @return [Array]
67
+ #
68
+ def self.carteiras_suportadas
69
+ %w(14 24)
70
+ end
71
+
72
+ # Conforme descrito na documentação, o valor que deve constar em local do pagamento é
73
+ # "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE"
74
+ #
75
+ def default_values
76
+ super.merge({
77
+ :local_pagamento => 'PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE'
78
+ })
79
+ end
80
+
81
+ # Validações para os campos abaixo:
82
+ #
83
+ # * Agencia
84
+ # * Codigo Cedente
85
+ # * Número do documento
86
+ #
87
+ # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
88
+ # Basta você sobrescrever os métodos de validação:
89
+ #
90
+ # class Caixa < BrBoleto::Core::Caixa
91
+ # def self.tamanho_maximo_agencia
92
+ # 6
93
+ # end
94
+ #
95
+ # def self.tamanho_maximo_codigo_cedente
96
+ # 9
97
+ # end
98
+ #
99
+ # def self.tamanho_maximo_numero_documento
100
+ # 10
101
+ # end
102
+ # end
103
+ #
104
+ # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
105
+ # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
106
+ # sobreescritos também).
107
+ #
108
+ validates :agencia, :codigo_cedente, presence: true
109
+
110
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
111
+ validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
112
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
113
+
114
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
115
+
116
+ # @return [String] Código do Banco descrito na documentação.
117
+ #
118
+ def codigo_banco
119
+ '104'
120
+ end
121
+
122
+ # @return [String] Dígito do código do banco descrito na documentação.
123
+ #
124
+ def digito_codigo_banco
125
+ '0'
126
+ end
127
+
128
+ # Campo Agência / Código do Cedente
129
+ #
130
+ # @return [String]
131
+ #
132
+ def agencia_codigo_cedente
133
+ "#{agencia} / #{codigo_cedente}-#{digito_verificador_codigo_cedente}"
134
+ end
135
+
136
+ def digito_verificador_codigo_cedente
137
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
138
+ end
139
+ def digito_verificador_codigo_beneficiario
140
+ digito_verificador_codigo_cedente
141
+ end
142
+
143
+ def digito_verificador_nosso_numero
144
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
145
+ end
146
+
147
+ # Mostra o campo nosso número calculando o dígito verificador do nosso número.
148
+ #
149
+ # @return [String]
150
+ #
151
+ def nosso_numero
152
+ "#{carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
153
+ end
154
+
155
+
156
+ def nosso_numero_de_3_a_5
157
+ nosso_numero[2..4]
158
+ end
159
+
160
+ def nosso_numero_de_6_a_8
161
+ nosso_numero[5..7]
162
+ end
163
+
164
+ def nosso_numero_de_9_a_17
165
+ nosso_numero[8..16]
166
+ end
167
+
168
+ # O Tipo de cobrança é o 1° caracter da carteira
169
+ #
170
+ # @return [String]
171
+ #
172
+ def tipo_cobranca
173
+ carteira[0] if carteira.present?
174
+ end
175
+
176
+ # Modalidade de cobrança
177
+ # As vezes é chamado de modalidade de cobrança e as vezes é chamado de tipo de cobrança
178
+ # Por isso foi criado o metodo modalidade_cobrança que é a mesma coisa que o tipo_cobranca
179
+ #
180
+ # @return [String]
181
+ #
182
+ def modalidade_cobranca
183
+ tipo_cobranca
184
+ end
185
+
186
+ # O Identificado de Emissão é o 2° e ultimo caracter da carteira
187
+ # Normalmente é 4 onde significa que o Beneficiário emitiu o boleto.
188
+ #
189
+ # @return [String]
190
+ #
191
+ def identificador_de_emissao
192
+ carteira.last if carteira.present?
193
+ end
194
+
195
+ # Formata a carteira dependendo se ela é registrada ou não.
196
+ #
197
+ # Para cobrança COM registro usar: <b>RG</b>
198
+ # Para Cobrança SEM registro usar: <b>SR</b>
199
+ #
200
+ # @return [String]
201
+ #
202
+ def carteira_formatada
203
+ if carteira.in?(carteiras_com_registro)
204
+ 'RG'
205
+ else
206
+ 'SR'
207
+ end
208
+ end
209
+
210
+ # Retorna as carteiras com registro da Caixa Econômica Federal.
211
+ # <b>Você pode sobrescrever esse método na subclasse caso exista mais
212
+ # carteiras com registro na Caixa Econômica Federal.</b>
213
+ #
214
+ # @return [Array]
215
+ #
216
+ def carteiras_com_registro
217
+ %w(14)
218
+ end
219
+
220
+
221
+ # === Código de barras do banco
222
+ #
223
+ # ________________________________________________________________________________________
224
+ # | Posição | Tamanho | Descrição |
225
+ # |----------|---------|------------------------------------------------------------------|
226
+ # | 20 - 25 | 06 | Código do Beneficiário |
227
+ # | 26 - 26 | 01 | DV do Código do Beneficiário |
228
+ # | 27 – 29 | 03 | Nosso Número - 3ª a 5ª posição do Nosso Número |
229
+ # | 30 – 30 | 01 | Constante 1, tipo de cobrança (1-Registrada / 2-Sem Registro) |
230
+ # | 31 – 33 | 03 | Nosso Número - 6ª a 8ª posição do Nosso Número |
231
+ # | 34 – 34 | 01 | Constante 2, identificador de emissão do boleto (4-Beneficiário) |
232
+ # | 35 – 43 | 09 | Nosso Número - 9ª a 17ª posição do Nosso Número |
233
+ # | 44 – 44 | 01 | DV do Campo Livre |
234
+ # -----------------------------------------------------------------------------------------
235
+ #
236
+ # @return [String]
237
+ #
238
+ def codigo_de_barras_do_banco
239
+ @composicao_codigo_barras = nil
240
+ codigo_dv = Modulo11FatorDe2a9RestoZero.new(composicao_codigo_barras)
241
+ "#{composicao_codigo_barras}#{codigo_dv}"
242
+ end
243
+
244
+ def composicao_codigo_barras
245
+ return @composicao_codigo_barras if @composicao_codigo_barras
246
+ @composicao_codigo_barras = "#{codigo_beneficiario}"
247
+ @composicao_codigo_barras << "#{digito_verificador_codigo_beneficiario}"
248
+ @composicao_codigo_barras << "#{nosso_numero_de_3_a_5}"
249
+ @composicao_codigo_barras << "#{tipo_cobranca}"
250
+ @composicao_codigo_barras << "#{nosso_numero_de_6_a_8}"
251
+ @composicao_codigo_barras << "#{identificador_de_emissao}"
252
+ @composicao_codigo_barras << "#{nosso_numero_de_9_a_17}"
253
+ @composicao_codigo_barras
254
+ end
255
+ end
256
+ end
257
+ end
@@ -119,22 +119,10 @@ module BrBoleto
119
119
  validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
120
120
  validates :modalidade_cobranca, inclusion: { in: ->(object) { object.class.modalidade_cobranca_validas } }, if: :deve_validar_modalidade_cobranca?
121
121
 
122
- # @return [String] 4 caracteres
123
- #
124
- def agencia
125
- @agencia.to_s.rjust(4, '0') if @agencia.present?
126
- end
127
-
128
- # @return [String] 7 caracteres
129
- # O Código do cedente é o mesmo que o codigo do beneficiário
130
- def codigo_cedente
131
- @codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
132
- end
133
-
134
- # @return [String] 6 caracteres
135
- #
136
- def numero_documento
137
- @numero_documento.to_s.rjust(7, '0') if @numero_documento.present?
122
+ def default_values
123
+ super.merge({
124
+ local_pagamento: "PREFERENCIALMENTE COOPERATIVAS DA REDE SICOOB"
125
+ })
138
126
  end
139
127
 
140
128
  # @return [String] Código do Banco descrito na documentação.
@@ -172,14 +160,14 @@ module BrBoleto
172
160
  # Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
173
161
  # É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
174
162
  #
175
- def tipo_cobranca
163
+ def tipo_cobranca_formatada
176
164
  case "#{modalidade_cobranca}".rjust(2, "0")
177
165
  when '01'
178
166
  :com_registro
179
167
  when '02'
180
168
  :sem_registro
181
169
  when '03'
182
- :garantia_caucionada
170
+ :caucionada
183
171
  end
184
172
  end
185
173
 
@@ -0,0 +1,18 @@
1
+ module BrBoleto
2
+ module Helper
3
+ module FormatValue
4
+ extend self
5
+
6
+ def string_to_float(value)
7
+ return 0 if value.blank?
8
+ return value if value.is_a?(Numeric)
9
+ value.insert(value.size-2, '.').to_f
10
+ end
11
+
12
+ def string_to_date(value, format = "%d%m%Y")
13
+ return value if value.is_a?(Date)
14
+ begin Date.strptime(value, format) rescue nil end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,13 +1,6 @@
1
1
  module BrBoleto
2
2
  module Remessa
3
- class Base
4
- # Seguindo a interface do Active Model para:
5
- # * Validações;
6
- # * Internacionalização;
7
- # * Nomes das classes para serem manipuladas;
8
- #
9
- include ActiveModel::Model
10
-
3
+ class Base < BrBoleto::ActiveModelBase
11
4
  # variavel que terá os lotes no qual será gerado o arquivo de remessa
12
5
  # um lote deve conter no minimo 1 pagamento
13
6
  # Pode haver 1 ou vários lotes para o mesmo arquivo
@@ -38,20 +31,6 @@ module BrBoleto
38
31
  # aceite (A = ACEITO/N = NAO ACEITO)
39
32
  attr_accessor :aceite
40
33
 
41
- def initialize(attributes = {})
42
- self.lotes = [] # Para poder utilizar o << para adicionar lote
43
- attributes = default_values.merge!(attributes)
44
- assign_attributes(attributes)
45
- yield self if block_given?
46
- end
47
-
48
- def assign_attributes(attributes)
49
- attributes ||= {}
50
- attributes.each do |name, value|
51
- send("#{name}=", value)
52
- end
53
- end
54
-
55
34
  validates :nome_empresa, presence: true
56
35
  validates :aceite, inclusion: { in: %w(A a n N), message: "valor deve ser A(aceito) ou N(não ceito)" }
57
36
 
@@ -52,12 +52,11 @@ module BrBoleto
52
52
  # Data e hora da geração do arquivo
53
53
  attr_accessor :data_hora_arquivo
54
54
 
55
- # codigo da carteira
55
+ # modalidade da carteira
56
56
  # opcoes:
57
- # 1 - cobranca simples
58
- # 2 - cobranca caucionada
59
- # 3 - cobranca descontada
60
- # 7 – modalidade Simples quando carteira 17 (apenas Banco do Brasil)
57
+ # 11: título Registrado emissão CAIXA
58
+ # 14: título Registrado emissão Cedente
59
+ # 21: título Sem Registro emissão CAIXA
61
60
  attr_accessor :codigo_carteira
62
61
 
63
62
  # forma de cadastramento dos titulos (campo nao tratado pelo Banco do Brasil)
@@ -145,7 +144,7 @@ module BrBoleto
145
144
  def data_hora_arquivo
146
145
  @data_hora_arquivo.to_time
147
146
  rescue
148
- return Time.now
147
+ return Time.current
149
148
  end
150
149
 
151
150
  # Monta um lote para o arquivo
@@ -226,18 +225,22 @@ module BrBoleto
226
225
 
227
226
  # Número do Documento de Cobrança
228
227
  # Cada banco tem sua maneira de identificar esse número, mas o padrão é o
229
- # Valor que se encontra no nosso numero
228
+ # Valor que se encontra no numero_documento ou então em nosso numero
230
229
  # 15 posições
231
230
  #
232
231
  def segmento_p_numero_do_documento(pagamento)
233
- pagamento.nosso_numero.to_s.rjust(15, '0')
232
+ if pagamento.numero_documento.present?
233
+ pagamento.numero_documento.to_s.rjust(15, '0')
234
+ else
235
+ pagamento.nosso_numero.to_s.rjust(15, '0')
236
+ end
234
237
  end
235
238
 
236
239
  # Complemento do registro
237
240
  #
238
241
  # Este metodo deve ser sobrescrevido na classe do banco
239
242
  #
240
- def complemento_header
243
+ def complemento_header_arquivo
241
244
  raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
242
245
  end
243
246
 
@@ -0,0 +1,201 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module BrBoleto
3
+ module Remessa
4
+ module Cnab240
5
+ class Caixa < BrBoleto::Remessa::Cnab240::Base
6
+
7
+ # modalidade da carteira
8
+ # opcoes:
9
+ # 11: título Registrado emissão CAIXA
10
+ # 14: título Registrado emissão Cedente
11
+ # 21: título Sem Registro emissão CAIXA
12
+ attr_accessor :modalidade_carteira
13
+
14
+ # versão do aplicativo da caixa
15
+ attr_accessor :versao_aplicativo
16
+
17
+ validates :modalidade_carteira, :agencia, :versao_aplicativo, presence: true
18
+ validates :convenio, length: {maximum: 6, message: 'deve ter no máximo 6 dígitos.'}
19
+ validates :versao_aplicativo, length: {maximum: 4, message: 'deve ter no máximo 4 dígitos.'}
20
+ validates :agencia, length: {maximum: 5, message: 'deve ter no máximo 5 dígitos.'}
21
+ validates :modalidade_carteira, length: {is: 2, message: 'deve ter 2 dígitos.'}
22
+
23
+ def default_values
24
+ super.merge({
25
+ emissao_boleto: '2',
26
+ distribuicao_boleto: '2',
27
+ especie_titulo: '02', # 02 = DM Duplicata mercantil
28
+ modalidade_carteira: '14',
29
+ forma_cadastramento: '0',
30
+ versao_aplicativo: '0'
31
+ })
32
+ end
33
+
34
+ def codigo_banco
35
+ '104'
36
+ end
37
+
38
+ def nome_banco
39
+ 'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
40
+ end
41
+
42
+ def versao_layout_arquivo
43
+ '050'
44
+ end
45
+
46
+ def versao_layout_lote
47
+ '030'
48
+ end
49
+
50
+ def versao_aplicativo
51
+ "#{@versao_aplicativo}".rjust(4, '0') if @versao_aplicativo.present?
52
+ end
53
+
54
+ def digito_agencia
55
+ # utilizando a agencia com 5 digitos
56
+ # para calcular o digito
57
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
58
+ end
59
+
60
+
61
+ # Uso exclusivo caixa
62
+ # CAMPO TAMANHO
63
+ # ---------------------------------------------------------
64
+ # num. convenio 20 Zeros
65
+ #
66
+ # TOTAL = 20 posições
67
+ #
68
+ def codigo_convenio
69
+ ''.rjust(20, '0')
70
+ end
71
+
72
+ # Convênio do Lote
73
+ # DESCRIÇÃO TAMANHO POSIÇÃO
74
+ # ---------------------------------------------------------
75
+ # Cód. Cedente (convênio) 06 34-39
76
+ # Uso CAIXA 14 40-53
77
+ #
78
+ # TOTAL = 20 posições
79
+ #
80
+ def convenio_lote(lote)
81
+ conv_lote = convenio.to_s.rjust(6, '0')
82
+ conv_lote << ''.to_s.rjust(14, '0') #Padrão '0'
83
+ conv_lote
84
+ end
85
+
86
+ # Informação da conta
87
+ # DESCRIÇÃO TAMANHO POSIÇÃO
88
+ # ---------------------------------------------------------
89
+ # agencia 05 54 - 58
90
+ # digito Verif. agencia 01 59 - 59
91
+ # código convenio 06 60 - 65
92
+ # código modelo pers. 07 66 - 72
93
+ # uso exclusivo CAIXA 01 73 - 73
94
+ #
95
+ # TOTAL = 20 posições
96
+ #
97
+ def informacoes_da_conta
98
+ informacoes = agencia.rjust(5, '0')
99
+ informacoes << digito_agencia
100
+ informacoes << "#{convenio}".rjust(6, '0')
101
+ informacoes << ''.rjust(7, '0')
102
+ informacoes << '0'
103
+ informacoes
104
+ end
105
+
106
+ # Complemento do header do arquivo - Chamado em header_arquivo_posicao_212_a_240
107
+ # DESCRIÇÃO TAMANHO POSIÇÃO
108
+ # ---------------------------------------------------------
109
+ # Versão aplicativo CAIXA 04 212 - 215
110
+ # USO FEBRABAN 25 216 - 240
111
+ #
112
+ # TOTAL = 29 posições
113
+ #
114
+ def complemento_header_arquivo
115
+ complemento = "#{versao_aplicativo}".rjust(4, '0') # 04 digitos já ajustado no método
116
+ complemento << ''.rjust(25, ' ')
117
+ complemento
118
+ end
119
+
120
+ # segmento_p_posicao_024_a_057
121
+ # DESCRIÇÃO TAMANHO POSIÇÃO
122
+ # ---------------------------------------------------------
123
+ # codigo cedente 06 24 - 29
124
+ # Uso Caixa 11 30 - 40
125
+ # Modalidade carteira 02 41 - 42
126
+ # nosso_numero 15 43 - 57
127
+ #
128
+ # TOTAL = 34 posições
129
+ #
130
+ def complemento_p(pagamento)
131
+ complemento = "#{convenio}".rjust(6, '0')
132
+ complemento << ''.rjust(11, '0')
133
+ complemento << modalidade_carteira
134
+ complemento << pagamento.nosso_numero.rjust(15, '0')
135
+ complemento
136
+ end
137
+
138
+ # Segmento P para numero do documento
139
+ # DESCRIÇÃO TAMANHO POSIÇÃO
140
+ # ---------------------------------------------------------
141
+ # Nr Doc. cobrança 11 63 - 73
142
+ # Uso da CAIXA 04 74 - 77
143
+ #
144
+ # TOTAL = 15 posições
145
+ #
146
+ def segmento_p_numero_do_documento(pagamento)
147
+ complemento = pagamento.numero_documento.to_s.rjust(11, '0')
148
+ complemento << ''.rjust(4, ' ')
149
+ complemento
150
+ end
151
+
152
+ # Digito verificador da agência
153
+ # Segundo a documentação nessa posição vai o valor '0'
154
+ #
155
+ # TOTAL = 01 posição
156
+ #
157
+ def segmento_p_posicao_106_a_106
158
+ '0'
159
+ end
160
+
161
+ # Identificação do Título na Empresa
162
+ # Campo destinado para uso da Empresa Cedente para identificação do Título.
163
+ # Informar o Número do Documento - Seu Número (mesmo das posições 63-73 do Segmento P)
164
+ #
165
+ # TOTAL = 25 posições
166
+ #
167
+ def segmento_p_posicao_196_a_220(pagamento)
168
+ pagamento.numero_documento.to_s.rjust(25, '0')
169
+ end
170
+
171
+ def segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2(pagamento)
172
+ '00'
173
+ end
174
+ def segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2(pagamento)
175
+ '00'
176
+ end
177
+
178
+ # trailer_lote_posicao_024_a_240(lote, nr_lote)
179
+ # DESCRIÇÃO TAMANHO POSIÇÃO
180
+ # ---------------------------------------------------------
181
+ # Qtd. cobr. Simples 06 24 - 29 _
182
+ # Val. Tot Cobr. Simples 17 30 - 46 \
183
+ # Qtd. cobr. Caucionada 06 47 - 52 \
184
+ # Val. Tot Cobr. Caucionada 17 53 - 69 > VALORES UTILIZADOS APENAS PARA ARQUIVO DE RETORNO
185
+ # Qtd. cobr. Descontada 06 70 - 75 /
186
+ # Val. Tot Cobr. Descontada 17 76 - 92 _/
187
+ # Uso FEBRABAN 148 93 - 240
188
+ #
189
+ # TOTAL = 217 posições
190
+ #
191
+ def complemento_trailer_lote(lote, nr_lote)
192
+ complemento = ''
193
+ complemento << ''.rjust(69, '0') # VALORES UTILIZADOS APENAS PARA ARQUIVO DE RETORNO
194
+ complemento << ''.rjust(148, ' ') # USO EXCLUSIVO FEBRABAN
195
+ complemento
196
+ end
197
+
198
+ end
199
+ end
200
+ end
201
+ end
@@ -71,7 +71,7 @@ module BrBoleto
71
71
  # 14 Posições
72
72
  #
73
73
  def header_arquivo_posicao_019_a_032
74
- documento_cedente.to_s.rjust(14, '0')
74
+ BrBoleto::Helper::CpfCnpj.new(documento_cedente).sem_formatacao.rjust(14, '0')
75
75
  end
76
76
 
77
77
  # Código do Convênio no Banco
@@ -177,7 +177,7 @@ module BrBoleto
177
177
  # 29 posições
178
178
  #
179
179
  def header_arquivo_posicao_212_a_240
180
- complemento_header
180
+ complemento_header_arquivo
181
181
  end
182
182
  end
183
183
  end
@@ -56,6 +56,10 @@ module BrBoleto
56
56
 
57
57
  # Tipo da Operação
58
58
  # 1 posição
59
+ #
60
+ # 'R' = Arquivo Remessa
61
+ # 'T' = Arquivo Retorno
62
+ #
59
63
  #
60
64
  def header_lote_posicao_009_a_009
61
65
  'R'
@@ -64,6 +68,11 @@ module BrBoleto
64
68
  # Tipo do Serviço
65
69
  # 2 posições
66
70
  #
71
+ # '01' = Cobrança Registrada
72
+ # '02' = Cobrança Sem Registro / Serviços
73
+ # '03' = Desconto de Títulos
74
+ # '04' = Caução de Títulos
75
+ #
67
76
  def header_lote_posicao_010_a_011
68
77
  '01'
69
78
  end
@@ -100,7 +109,7 @@ module BrBoleto
100
109
  # 15 posições
101
110
  #
102
111
  def header_lote_posicao_019_a_033
103
- documento_cedente.to_s.rjust(15, '0')
112
+ BrBoleto::Helper::CpfCnpj.new(documento_cedente).sem_formatacao.rjust(15, '0')
104
113
  end
105
114
 
106
115
  # Convenio -> Código do Cedente no Banco
@@ -49,7 +49,7 @@ module BrBoleto
49
49
  segmento_p << segmento_p_posicao_151_a_165(pagamento) # valor desconto 15
50
50
  segmento_p << segmento_p_posicao_166_a_180(pagamento) # valor IOF 15
51
51
  segmento_p << segmento_p_posicao_181_a_195(pagamento) # valor abatimento 15
52
- segmento_p << segmento_p_posicao_196_a_220 # identificacao titulo empresa 25 *
52
+ segmento_p << segmento_p_posicao_196_a_220(pagamento) # identificacao titulo empresa 25 *
53
53
  segmento_p << segmento_p_posicao_221_a_221 # cod. para protesto 1 *
54
54
  segmento_p << segmento_p_posicao_222_a_223 # dias para protesto 2 *
55
55
  segmento_p << segmento_p_posicao_224_a_224 # cod. para baixa 1 *
@@ -289,7 +289,7 @@ module BrBoleto
289
289
  # Identificação do Título na Empresa
290
290
  # 25 posições
291
291
  #
292
- def segmento_p_posicao_196_a_220
292
+ def segmento_p_posicao_196_a_220(pagamento)
293
293
  ''.rjust(25, ' ')
294
294
  end
295
295
 
@@ -105,7 +105,7 @@ module BrBoleto
105
105
  # 15 posições
106
106
  #
107
107
  def segmento_q_posicao_019_a_033(pagamento)
108
- pagamento.documento_sacado.to_s.rjust(15, '0')
108
+ BrBoleto::Helper::CpfCnpj.new(pagamento.documento_sacado).sem_formatacao.rjust(15, '0')
109
109
  end
110
110
 
111
111
  # Nome do sacado
@@ -168,7 +168,7 @@ module BrBoleto
168
168
  # 15 posições
169
169
  #
170
170
  def segmento_q_posicao_155_a_169(pagamento)
171
- "#{pagamento.documento_avalista}".rjust(15, '0')
171
+ BrBoleto::Helper::CpfCnpj.new("#{pagamento.documento_avalista}").sem_formatacao.rjust(15, '0')
172
172
  end
173
173
 
174
174
  # Nome do avalista