br_boleto 1.0.1 → 1.1.0

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