brcobranca 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +3 -2
  4. data/Gemfile.lock +13 -9
  5. data/README.md +5 -1
  6. data/brcobranca.gemspec +2 -0
  7. data/lib/brcobranca/arquivos/logos/sicoob.eps +209 -0
  8. data/lib/brcobranca/boleto/bradesco.rb +20 -0
  9. data/lib/brcobranca/boleto/sicoob.rb +80 -0
  10. data/lib/brcobranca/remessa/base.rb +1 -1
  11. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +7 -2
  12. data/lib/brcobranca/remessa/cnab240/base.rb +133 -134
  13. data/lib/brcobranca/remessa/cnab240/caixa.rb +6 -1
  14. data/lib/brcobranca/remessa/cnab240/sicoob.rb +128 -0
  15. data/lib/brcobranca/remessa/cnab400/base.rb +5 -5
  16. data/lib/brcobranca/remessa/cnab400/bradesco.rb +5 -3
  17. data/lib/brcobranca/remessa/cnab400/citibank.rb +140 -0
  18. data/lib/brcobranca/remessa/cnab400/itau.rb +4 -11
  19. data/lib/brcobranca/remessa/pagamento.rb +39 -5
  20. data/lib/brcobranca/retorno/base.rb +1 -0
  21. data/lib/brcobranca/retorno/cnab400/base.rb +40 -0
  22. data/lib/brcobranca/retorno/cnab400/bradesco.rb +117 -0
  23. data/lib/brcobranca/retorno/cnab400/itau.rb +136 -0
  24. data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -1
  25. data/lib/brcobranca/util/empresa.rb +29 -0
  26. data/lib/brcobranca/version.rb +1 -1
  27. data/lib/brcobranca.rb +19 -5
  28. data/spec/arquivos/CNAB400BRADESCO.RET +8 -0
  29. data/spec/arquivos/CNAB400ITAU.RET +54 -0
  30. data/spec/brcobranca/base_spec.rb +175 -179
  31. data/spec/brcobranca/{banco_bradesco_spec.rb → boleto/banco_bradesco_spec.rb} +80 -53
  32. data/spec/brcobranca/{banco_brasil_spec.rb → boleto/banco_brasil_spec.rb} +2 -2
  33. data/spec/brcobranca/{banco_caixa_spec.rb → boleto/banco_caixa_spec.rb} +1 -1
  34. data/spec/brcobranca/{banco_hsbc_spec.rb → boleto/banco_hsbc_spec.rb} +2 -2
  35. data/spec/brcobranca/{banco_itau_spec.rb → boleto/banco_itau_spec.rb} +2 -2
  36. data/spec/brcobranca/{banco_santander_spec.rb → boleto/banco_santander_spec.rb} +2 -2
  37. data/spec/brcobranca/boleto/banco_sicoob_spec.rb +132 -0
  38. data/spec/brcobranca/{banco_sicredi_spec.rb → boleto/banco_sicredi_spec.rb} +2 -2
  39. data/spec/brcobranca/boletos_em_lote_spec.rb +2 -2
  40. data/spec/brcobranca/core_ext_spec.rb +198 -199
  41. data/spec/brcobranca/currency_spec.rb +67 -71
  42. data/spec/brcobranca/remessa/base_spec.rb +1 -17
  43. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +22 -13
  44. data/spec/brcobranca/remessa/cnab240/base_spec.rb +28 -27
  45. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +13 -4
  46. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +155 -0
  47. data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -17
  48. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +15 -2
  49. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +117 -0
  50. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +15 -10
  51. data/spec/brcobranca/remessa/pagamento_spec.rb +6 -8
  52. data/spec/brcobranca/retorno/cnab400/base_spec.rb +35 -0
  53. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +55 -0
  54. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +55 -0
  55. data/spec/brcobranca/{retorno_cbr643_spec.rb → retorno/retorno_cbr643_spec.rb} +3 -3
  56. data/spec/brcobranca/{retorno_cnab400_spec.rb → retorno/retorno_cnab400_spec.rb} +3 -3
  57. data/spec/brcobranca/{retorno_cnab_240_spec.rb → retorno/retorno_cnab_240_spec.rb} +3 -3
  58. data/spec/brcobranca/rghost_spec.rb +2 -2
  59. data/spec/brcobranca/util/empresa_spec.rb +35 -0
  60. data/spec/brcobranca_spec.rb +25 -10
  61. data/spec/fixtures/remessa/.keep +0 -0
  62. data/spec/fixtures/remessa/remessa-bancoob.rem +6 -0
  63. data/spec/spec_helper.rb +23 -0
  64. data/spec/support/remessa_helpers.rb +12 -0
  65. data/spec/{shared_examples → support/shared_examples}/cnab240.rb +17 -15
  66. data/spec/{shared_examples → support/shared_examples}/cnab400.rb +11 -3
  67. metadata +72 -26
@@ -29,8 +29,11 @@ module Brcobranca
29
29
  attr_accessor :distribuicao_boleto
30
30
  # especie do titulo (verificar o padrao nas classes referentes aos bancos)
31
31
  attr_accessor :especie_titulo
32
+ # tipo de documento (verificar o padrao nas classes referentes aos bancos)
33
+ attr_accessor :tipo_documento
32
34
 
33
- validates_presence_of :documento_cedente, :convenio, message: 'não pode estar em branco.'
35
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
36
+ validates_presence_of :documento_cedente, message: 'não pode estar em branco.'
34
37
  validates_length_of :codigo_carteira, is: 1, message: 'deve ter 1 dígito.'
35
38
  validates_length_of :forma_cadastramento, is: 1, message: 'deve ter 1 dígito.'
36
39
  validates_length_of :emissao_boleto, is: 1, message: 'deve ter 1 dígito.'
@@ -38,19 +41,11 @@ module Brcobranca
38
41
 
39
42
  def initialize(campos = {})
40
43
  campos = { codigo_carteira: '1',
41
- forma_cadastramento: '1' }.merge!(campos)
44
+ forma_cadastramento: '1',
45
+ tipo_documento: ' '}.merge!(campos)
42
46
  super(campos)
43
47
  end
44
48
 
45
- # Tipo de inscricao do cedente
46
- # (pessoa fisica ou juridica)
47
- #
48
- # @return [String]
49
- #
50
- def tipo_inscricao
51
- documento_cedente.to_s.delete('./-').size <= 11 ? '1' : '2'
52
- end
53
-
54
49
  # Data de geracao do arquivo
55
50
  #
56
51
  # @return [String]
@@ -72,27 +67,27 @@ module Brcobranca
72
67
  # @return [String]
73
68
  #
74
69
  def monta_header_arquivo
75
- header_arquivo = '' # CAMPO TAMANHO
76
- header_arquivo << cod_banco # codigo do banco 3
77
- header_arquivo << '0000' # lote do servico 4
78
- header_arquivo << '0' # tipo de registro 1
79
- header_arquivo << ''.rjust(9, ' ') # uso exclusivo FEBRABAN 9
80
- header_arquivo << tipo_inscricao # tipo inscricao 1
81
- header_arquivo << documento_cedente.to_s.rjust(14, '0') # numero de inscricao 14
82
- header_arquivo << codigo_convenio # codigo do convenio no banco 20
83
- header_arquivo << info_conta # informacoes da conta 20
84
- header_arquivo << empresa_mae.format_size(30) # nome da empresa 30
85
- header_arquivo << nome_banco # nome do banco 30
86
- header_arquivo << ''.rjust(10, ' ') # uso exclusivo FEBRABAN 10
87
- header_arquivo << '1' # codigo remessa 1
88
- header_arquivo << data_geracao # data geracao 8
89
- header_arquivo << hora_geracao # hora geracao 6
90
- header_arquivo << sequencial_remessa.to_s.rjust(6, '0') # numero seq. arquivo 6
91
- header_arquivo << versao_layout # num. versao 3
92
- header_arquivo << ''.rjust(5, '0') # densidade gravacao 5
93
- header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
94
- header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
95
- header_arquivo << complemento_header # complemento do arquivo 29
70
+ header_arquivo = '' # CAMPO TAMANHO
71
+ header_arquivo << cod_banco # codigo do banco 3
72
+ header_arquivo << '0000' # lote do servico 4
73
+ header_arquivo << '0' # tipo de registro 1
74
+ header_arquivo << ''.rjust(9, ' ') # uso exclusivo FEBRABAN 9
75
+ header_arquivo << Brcobranca::Util::Empresa.new(documento_cedente, false).tipo # tipo inscricao 1
76
+ header_arquivo << documento_cedente.to_s.rjust(14, '0') # numero de inscricao 14
77
+ header_arquivo << codigo_convenio # codigo do convenio no banco 20
78
+ header_arquivo << info_conta # informacoes da conta 20
79
+ header_arquivo << empresa_mae.format_size(30) # nome da empresa 30
80
+ header_arquivo << nome_banco.format_size(30) # nome do banco 30
81
+ header_arquivo << ''.rjust(10, ' ') # uso exclusivo FEBRABAN 10
82
+ header_arquivo << '1' # codigo remessa 1
83
+ header_arquivo << data_geracao # data geracao 8
84
+ header_arquivo << hora_geracao # hora geracao 6
85
+ header_arquivo << sequencial_remessa.to_s.rjust(6, '0') # numero seq. arquivo 6
86
+ header_arquivo << versao_layout_arquivo # num. versao arquivo 3
87
+ header_arquivo << ''.rjust(5, '0') # densidade gravacao 5
88
+ header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
89
+ header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
90
+ header_arquivo << complemento_header # complemento do arquivo 29
96
91
  header_arquivo.upcase
97
92
  end
98
93
 
@@ -104,26 +99,26 @@ module Brcobranca
104
99
  # @return [String]
105
100
  #
106
101
  def monta_header_lote(nro_lote)
107
- header_lote = '' # CAMPO TAMANHO
108
- header_lote << cod_banco # codigo banco 3
109
- header_lote << nro_lote.to_s.rjust(4, '0') # lote servico 4
110
- header_lote << '1' # tipo de registro 1
111
- header_lote << 'R' # tipo de operacao 1
112
- header_lote << '01' # tipo de servico 2
113
- header_lote << '00' # uso exclusivo 2
114
- header_lote << versao_layout # num.versao layout 3
115
- header_lote << ' ' # uso exclusivo 1
116
- header_lote << tipo_inscricao # tipo de inscricao 1
117
- header_lote << documento_cedente.to_s.rjust(15, '0') # inscricao cedente 15
118
- header_lote << convenio_lote # codigo do convenio 20
119
- header_lote << info_conta # informacoes conta 20
120
- header_lote << empresa_mae.ljust(30, ' ') # nome empresa 30
121
- header_lote << mensagem_1.to_s.format_size(40) # 1a mensagem 40
122
- header_lote << mensagem_2.to_s.format_size(40) # 2a mensagem 40
123
- header_lote << sequencial_remessa.to_s.rjust(8, '0') # numero remessa 8
124
- header_lote << data_geracao # data gravacao 8
125
- header_lote << ''.rjust(8, '0') # data do credito 8
126
- header_lote << ''.rjust(33, ' ') # complemento 33
102
+ header_lote = '' # CAMPO TAMANHO
103
+ header_lote << cod_banco # codigo banco 3
104
+ header_lote << nro_lote.to_s.rjust(4, '0') # lote servico 4
105
+ header_lote << '1' # tipo de registro 1
106
+ header_lote << 'R' # tipo de operacao 1
107
+ header_lote << '01' # tipo de servico 2
108
+ header_lote << ' ' # uso exclusivo 2
109
+ header_lote << versao_layout_lote # num.versao layout lote 3
110
+ header_lote << ' ' # uso exclusivo 1
111
+ header_lote << Brcobranca::Util::Empresa.new(documento_cedente, false).tipo # tipo de inscricao 1
112
+ header_lote << documento_cedente.to_s.rjust(15, '0') # inscricao cedente 15
113
+ header_lote << convenio_lote # codigo do convenio 20
114
+ header_lote << info_conta # informacoes conta 20
115
+ header_lote << empresa_mae.ljust(30, ' ') # nome empresa 30
116
+ header_lote << mensagem_1.to_s.format_size(40) # 1a mensagem 40
117
+ header_lote << mensagem_2.to_s.format_size(40) # 2a mensagem 40
118
+ header_lote << sequencial_remessa.to_s.rjust(8, '0') # numero remessa 8
119
+ header_lote << data_geracao # data gravacao 8
120
+ header_lote << ''.rjust(8, '0') # data do credito 8
121
+ header_lote << ''.rjust(33, ' ') # complemento 33
127
122
  header_lote.upcase
128
123
  end
129
124
 
@@ -141,46 +136,45 @@ module Brcobranca
141
136
  def monta_segmento_p(pagamento, nro_lote, sequencial)
142
137
  # campos com * na frente nao foram implementados
143
138
  # # DESCRICAO TAMANHO
144
- segmento_p = cod_banco # codigo banco 3
145
- segmento_p << nro_lote.to_s.rjust(4, '0') # lote de servico 4
146
- segmento_p << '3' # tipo de registro 1
147
- segmento_p << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
148
- segmento_p << 'P' # cod. segmento 1
149
- segmento_p << ' ' # uso exclusivo 1
150
- segmento_p << '01' # cod. movimento remessa 2
151
- segmento_p << agencia.to_s.rjust(5, '0') # agencia 5
152
- segmento_p << digito_agencia.to_s # dv agencia 1
153
- segmento_p << complemento_p(pagamento) # informacoes da conta 34
154
- segmento_p << codigo_carteira # codigo da carteira 1
155
- segmento_p << forma_cadastramento # forma de cadastro do titulo 1
156
- segmento_p << '2' # tipo de documento 1
157
- segmento_p << emissao_boleto # identificaco emissao 1
158
- segmento_p << distribuicao_boleto # indentificacao entrega 1
159
- segmento_p << pagamento.nosso_numero.to_s.rjust(11, '0') # numro do documento 11
160
- segmento_p << ''.rjust(4, ' ') # uso exclusivo 4
161
- segmento_p << pagamento.data_vencimento.strftime('%d%m%Y') # data de venc. 8
162
- segmento_p << pagamento.formata_valor(15) # valor documento 15
163
- segmento_p << ''.rjust(5, '0') # agencia cobradora 5
164
- segmento_p << '0' # dv agencia cobradora 1
165
- segmento_p << especie_titulo # especie do titulo 2
166
- segmento_p << aceite # aceite 1
167
- segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
168
- segmento_p << '0' # cod. do juros 1 *
169
- segmento_p << ''.rjust(8, '0') # data juros 8 *
170
- segmento_p << ''.rjust(15, '0') # valor juros 15 *
171
- segmento_p << pagamento.cod_desconto # cod. do desconto 1
172
- segmento_p << pagamento.formata_data_desconto('%d%m%Y') # data desconto 8
173
- segmento_p << pagamento.formata_valor_desconto(15) # valor desconto 15
174
- segmento_p << pagamento.formata_valor_iof(15) # valor IOF 15
175
- segmento_p << pagamento.formata_valor_abatimento(15) # valor abatimento 15
176
- segmento_p << ''.rjust(25, ' ') # identificacao titulo empresa 25 *
177
- segmento_p << '0' # cod. para protesto 1 *
178
- segmento_p << '00' # dias para protesto 2 *
179
- segmento_p << '0' # cod. para baixa 1 *
180
- segmento_p << '000' # dias para baixa 2 *
181
- segmento_p << '09' # cod. da moeda 2
182
- segmento_p << ''.rjust(10, '0') # uso exclusivo 10
183
- segmento_p << ' ' # uso exclusivo 1
139
+ segmento_p = cod_banco # codigo banco 3
140
+ segmento_p << nro_lote.to_s.rjust(4, '0') # lote de servico 4
141
+ segmento_p << '3' # tipo de registro 1
142
+ segmento_p << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
143
+ segmento_p << 'P' # cod. segmento 1
144
+ segmento_p << ' ' # uso exclusivo 1
145
+ segmento_p << '01' # cod. movimento remessa 2
146
+ segmento_p << agencia.to_s.rjust(5, '0') # agencia 5
147
+ segmento_p << digito_agencia.to_s # dv agencia 1
148
+ segmento_p << complemento_p(pagamento) # informacoes da conta 34
149
+ segmento_p << codigo_carteira # codigo da carteira 1
150
+ segmento_p << forma_cadastramento # forma de cadastro do titulo 1
151
+ segmento_p << tipo_documento # tipo de documento 1
152
+ segmento_p << emissao_boleto # identificaco emissao 1
153
+ segmento_p << distribuicao_boleto # indentificacao entrega 1
154
+ segmento_p << pagamento.numero_documento.to_s.rjust(15, '0') # uso exclusivo 4
155
+ segmento_p << pagamento.data_vencimento.strftime('%d%m%Y') # data de venc. 8
156
+ segmento_p << pagamento.formata_valor(15) # valor documento 15
157
+ segmento_p << ''.rjust(5, '0') # agencia cobradora 5
158
+ segmento_p << '0' # dv agencia cobradora 1
159
+ segmento_p << especie_titulo # especie do titulo 2
160
+ segmento_p << aceite # aceite 1
161
+ segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
162
+ segmento_p << '0' # cod. do juros 1 *
163
+ segmento_p << ''.rjust(8, '0') # data juros 8 *
164
+ segmento_p << ''.rjust(15, '0') # valor juros 15 *
165
+ segmento_p << pagamento.cod_desconto # cod. do desconto 1
166
+ segmento_p << pagamento.formata_data_desconto('%d%m%Y') # data desconto 8
167
+ segmento_p << pagamento.formata_valor_desconto(15) # valor desconto 15
168
+ segmento_p << pagamento.formata_valor_iof(15) # valor IOF 15
169
+ segmento_p << pagamento.formata_valor_abatimento(15) # valor abatimento 15
170
+ segmento_p << ''.rjust(25, ' ') # identificacao titulo empresa 25 *
171
+ segmento_p << '0' # cod. para protesto 1 *
172
+ segmento_p << '00' # dias para protesto 2 *
173
+ segmento_p << '0' # cod. para baixa 1 *
174
+ segmento_p << '000' # dias para baixa 2 *
175
+ segmento_p << '09' # cod. da moeda 2
176
+ segmento_p << ''.rjust(10, '0') # uso exclusivo 10
177
+ segmento_p << ' ' # uso exclusivo 1
184
178
  segmento_p.upcase
185
179
  end
186
180
 
@@ -196,29 +190,29 @@ module Brcobranca
196
190
  # @return [String]
197
191
  #
198
192
  def monta_segmento_q(pagamento, nro_lote, sequencial)
199
- segmento_q = '' # CAMPO TAMANHO
200
- segmento_q << cod_banco # codigo banco 3
201
- segmento_q << nro_lote.to_s.rjust(4, '0') # lote de servico 4
202
- segmento_q << '3' # tipo de registro 1
203
- segmento_q << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
204
- segmento_q << 'Q' # cod. segmento 1
205
- segmento_q << ' ' # uso exclusivo 1
206
- segmento_q << '01' # cod. movimento remessa 2
207
- segmento_q << pagamento.identificacao_sacado(1) # tipo insc. sacado 1
208
- segmento_q << pagamento.documento_sacado.to_s.rjust(15, '0') # documento sacado 14
209
- segmento_q << pagamento.nome_sacado.format_size(40) # nome cliente 40
210
- segmento_q << pagamento.endereco_sacado.format_size(40) # endereco cliente 40
211
- segmento_q << pagamento.bairro_sacado.format_size(15) # bairro 15
212
- segmento_q << pagamento.cep_sacado[0..4] # cep 5
213
- segmento_q << pagamento.cep_sacado[5..7] # sufixo cep 3
214
- segmento_q << pagamento.cidade_sacado.format_size(15) # cidade 15
215
- segmento_q << pagamento.uf_sacado # uf 2
216
- segmento_q << pagamento.identificacao_avalista(1) # identificacao do sacador 1
217
- segmento_q << pagamento.documento_avalista.to_s.rjust(15, '0') # documento sacador 15
218
- segmento_q << pagamento.nome_avalista.format_size(40) # nome avalista 40
219
- segmento_q << ''.rjust(3, '0') # cod. banco correspondente 3
220
- segmento_q << ''.rjust(20, ' ') # nosso numero banco correspondente 20
221
- segmento_q << ''.rjust(8, ' ') # uso exclusivo 8
193
+ segmento_q = '' # CAMPO TAMANHO
194
+ segmento_q << cod_banco # codigo banco 3
195
+ segmento_q << nro_lote.to_s.rjust(4, '0') # lote de servico 4
196
+ segmento_q << '3' # tipo de registro 1
197
+ segmento_q << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
198
+ segmento_q << 'Q' # cod. segmento 1
199
+ segmento_q << ' ' # uso exclusivo 1
200
+ segmento_q << '01' # cod. movimento remessa 2
201
+ segmento_q << pagamento.identificacao_sacado(false) # tipo insc. sacado 1
202
+ segmento_q << pagamento.documento_sacado.to_s.rjust(15, '0') # documento sacado 14
203
+ segmento_q << pagamento.nome_sacado.format_size(40) # nome cliente 40
204
+ segmento_q << pagamento.endereco_sacado.format_size(40) # endereco cliente 40
205
+ segmento_q << pagamento.bairro_sacado.format_size(15) # bairro 15
206
+ segmento_q << pagamento.cep_sacado[0..4] # cep 5
207
+ segmento_q << pagamento.cep_sacado[5..7] # sufixo cep 3
208
+ segmento_q << pagamento.cidade_sacado.format_size(15) # cidade 15
209
+ segmento_q << pagamento.uf_sacado # uf 2
210
+ segmento_q << pagamento.identificacao_avalista(false) # identificacao do sacador 1
211
+ segmento_q << pagamento.documento_avalista.to_s.rjust(15, '0') # documento sacador 15
212
+ segmento_q << pagamento.nome_avalista.format_size(40) # nome avalista 40
213
+ segmento_q << ''.rjust(3, '0') # cod. banco correspondente 3
214
+ segmento_q << ''.rjust(20, ' ') # nosso numero banco correspondente 20
215
+ segmento_q << ''.rjust(8, ' ') # uso exclusivo 8
222
216
  segmento_q.upcase
223
217
  end
224
218
 
@@ -233,13 +227,13 @@ module Brcobranca
233
227
  # @return [String]
234
228
  #
235
229
  def monta_trailer_lote(nro_lote, nro_registros)
236
- trailer_lote = '' # CAMPO # TAMANHO
237
- trailer_lote << cod_banco # codigo banco 3
238
- trailer_lote << nro_lote.to_s.rjust(4, '0') # lote de servico 4
239
- trailer_lote << '5' # tipo de servico 1
240
- trailer_lote << ''.rjust(9, ' ') # uso exclusivo 9
241
- trailer_lote << nro_registros.to_s.rjust(6, '0') # qtde de registros lote 6
242
- trailer_lote << complemento_trailer # uso exclusivo 217
230
+ trailer_lote = '' # CAMPO # TAMANHO
231
+ trailer_lote << cod_banco # codigo banco 3
232
+ trailer_lote << nro_lote.to_s.rjust(4, '0') # lote de servico 4
233
+ trailer_lote << '5' # tipo de servico 1
234
+ trailer_lote << ''.rjust(9, ' ') # uso exclusivo 9
235
+ trailer_lote << nro_registros.to_s.rjust(6, '0') # qtde de registros lote 6
236
+ trailer_lote << complemento_trailer # uso exclusivo 217
243
237
  end
244
238
 
245
239
  # Monta o registro trailer do arquivo
@@ -280,13 +274,12 @@ module Brcobranca
280
274
  contador = 1
281
275
 
282
276
  lote = [monta_header_lote(nro_lote)]
283
- contador += 1
284
277
 
285
278
  lote << monta_segmento_p(pagamento, nro_lote, contador)
286
279
  contador += 1
287
280
 
288
281
  lote << monta_segmento_q(pagamento, nro_lote, contador)
289
- contador += 1
282
+ contador += 2 #header + trailer
290
283
 
291
284
  lote << monta_trailer_lote(nro_lote, contador)
292
285
 
@@ -300,22 +293,20 @@ module Brcobranca
300
293
  def gera_arquivo
301
294
  fail Brcobranca::RemessaInvalida.new(self) if self.invalid?
302
295
 
303
- # contador dos registros do lote
296
+ # contador de do lotes
304
297
  contador = 1
305
298
 
306
299
  arquivo = [monta_header_arquivo]
307
- contador += 1
308
300
 
309
- pagamentos.each_with_index do |pagamento, index|
310
- novo_lote = monta_lote(pagamento, (index + 1))
301
+ pagamentos.each do |pagamento|
302
+ novo_lote = monta_lote(pagamento, contador)
311
303
  arquivo.push novo_lote
312
- novo_lote.each { |_lote| contador += 1 }
313
304
  end
314
305
 
315
- arquivo << monta_trailer_arquivo(pagamentos.count, contador)
306
+ arquivo << monta_trailer_arquivo(contador, (arquivo.size + (pagamentos.size * 4)))
316
307
 
317
- retorno = arquivo.join("\n")
318
- retorno
308
+ remessa = arquivo.join("\n")
309
+ remessa
319
310
  end
320
311
 
321
312
  # Complemento do registro
@@ -326,11 +317,19 @@ module Brcobranca
326
317
  fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
327
318
  end
328
319
 
329
- # Numero da versao do layout
320
+ # Numero da versao do layout do arquivo
321
+ #
322
+ # Este metodo deve ser sobrescrevido na classe do banco
323
+ #
324
+ def versao_layout_arquivo
325
+ fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
326
+ end
327
+
328
+ # Numero da versao do layout do lote
330
329
  #
331
330
  # Este metodo deve ser sobrescrevido na classe do banco
332
331
  #
333
- def versao_layout
332
+ def versao_layout_lote
334
333
  fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
335
334
  end
336
335
 
@@ -29,6 +29,7 @@ module Brcobranca
29
29
  # ‘4’ = Sacado via SMS
30
30
 
31
31
  validates_presence_of :versao_aplicativo, :digito_agencia, message: 'não pode estar em branco.'
32
+ validates_presence_of :convenio, message: 'não pode estar em branco.'
32
33
  validates_length_of :convenio, maximum: 6, message: 'não deve ter mais de 6 dígitos.'
33
34
  validates_length_of :versao_aplicativo, maximum: 4, message: 'não deve ter mais de 4 dígitos.'
34
35
  validates_length_of :digito_agencia, is: 1, message: 'deve ter 1 dígito.'
@@ -59,10 +60,14 @@ module Brcobranca
59
60
  'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
60
61
  end
61
62
 
62
- def versao_layout
63
+ def versao_layout_arquivo
63
64
  '050'
64
65
  end
65
66
 
67
+ def versao_layout_lote
68
+ '030'
69
+ end
70
+
66
71
  def codigo_convenio
67
72
  ''.rjust(20, '0')
68
73
  end
@@ -0,0 +1,128 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Brcobranca
3
+ module Remessa
4
+ module Cnab240
5
+ class Sicoob < Brcobranca::Remessa::Cnab240::Base
6
+
7
+ attr_accessor :modalidade_carteira
8
+ # identificacao da emissao do boleto (attr na classe base)
9
+ # opcoes:
10
+ # ‘1’ = Banco Emite
11
+ # ‘2’ = Cliente Emite
12
+ #
13
+ # identificacao da distribuicao do boleto (attr na classe base)
14
+ # opcoes:
15
+ # ‘1’ = Banco distribui
16
+ # ‘2’ = Cliente distribui
17
+
18
+ attr_accessor :tipo_formulario
19
+ # Tipo Formulário - 01 posição (15 a 15):
20
+ # "1" -auto-copiativo
21
+ # "3" -auto-envelopável
22
+ # "4" -A4 sem envelopamento
23
+ # "6" -A4 sem envelopamento 3 vias
24
+
25
+ attr_accessor :parcela
26
+ # Parcela - 02 posições (11 a 12) - "01" se parcela única
27
+
28
+ validates_presence_of :modalidade_carteira, :tipo_formulario, :parcela, message: 'não pode estar em branco.'
29
+ validates_length_of :conta_corrente, is: 5, message: 'deve ter 5 dígitos.'
30
+ validates_length_of :agencia, is: 4, message: 'deve ter 4 dígitos.'
31
+ validates_length_of :modalidade_carteira, is: 2, message: 'deve ter 2 dígitos.'
32
+
33
+ def initialize(campos = {})
34
+ campos = { emissao_boleto: '2',
35
+ distribuicao_boleto: '2',
36
+ especie_titulo: '02',
37
+ tipo_formulario: '4',
38
+ parcela: '01',
39
+ modalidade_carteira: '01',
40
+ forma_cadastramento: '0'}.merge!(campos)
41
+ super(campos)
42
+ end
43
+
44
+ def cod_banco
45
+ '756'
46
+ end
47
+
48
+ def nome_banco
49
+ 'SICOOB'.ljust(30, ' ')
50
+ end
51
+
52
+ def versao_layout_arquivo
53
+ '081'
54
+ end
55
+
56
+ def versao_layout_lote
57
+ '040'
58
+ end
59
+
60
+ def digito_agencia
61
+ # utilizando a agencia com 4 digitos
62
+ # para calcular o digito
63
+ agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
64
+ end
65
+
66
+ def digito_conta
67
+ # utilizando a conta corrente com 5 digitos
68
+ # para calcular o digito
69
+ conta_corrente.modulo11(mapeamento: { 10 => 'X' }).to_s
70
+ end
71
+
72
+ def codigo_convenio
73
+ # CAMPO TAMANHO
74
+ # num. convenio 20 BRANCOS
75
+ ''.rjust(20, ' ')
76
+ end
77
+
78
+ alias_method :convenio_lote, :codigo_convenio
79
+
80
+ def info_conta
81
+ # CAMPO TAMANHO
82
+ # agencia 5
83
+ # digito agencia 1
84
+ # conta corrente 12
85
+ # digito conta 1
86
+ # digito agencia/conta 1
87
+ "#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta} "
88
+ end
89
+
90
+ def complemento_header
91
+ ''.rjust(29, ' ')
92
+ end
93
+
94
+ def complemento_trailer
95
+ ''.rjust(217, ' ')
96
+ end
97
+
98
+ def complemento_p(pagamento)
99
+ # CAMPO TAMANHO
100
+ # conta corrente 12
101
+ # digito conta 1
102
+ # digito agencia/conta 1
103
+ # ident. titulo no banco 20
104
+ "#{conta_corrente.rjust(12, '0')}#{digito_conta} #{formata_nosso_numero(pagamento.nosso_numero)}"
105
+ end
106
+
107
+ # Retorna o nosso numero
108
+ #
109
+ # @return [String]
110
+ #
111
+ # Nosso Número:
112
+ # - Se emissão a cargo do Cedente (vide planilha "Capa" deste arquivo):
113
+ # NumTitulo - 10 posições (1 a 10)
114
+ # Parcela - 02 posições (11 a 12) - "01" se parcela única
115
+ # Modalidade - 02 posições (13 a 14) - vide planilha "Capa" deste arquivo
116
+ # Tipo Formulário - 01 posição (15 a 15):
117
+ # "1" -auto-copiativo
118
+ # "3" -auto-envelopável
119
+ # "4" -A4 sem envelopamento
120
+ # "6" -A4 sem envelopamento 3 vias
121
+ # Em branco - 05 posições (16 a 20)
122
+ def formata_nosso_numero(nosso_numero)
123
+ "#{nosso_numero.to_s.rjust(10, '0')}#{parcela}#{modalidade_carteira}#{tipo_formulario} "
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -3,8 +3,8 @@ module Brcobranca
3
3
  module Remessa
4
4
  module Cnab400
5
5
  class Base < Brcobranca::Remessa::Base
6
- validates_presence_of :carteira, :digito_conta, message: 'não pode estar em branco.'
7
- validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
6
+ require "unidecoder"
7
+ validates_presence_of :carteira, message: 'não pode estar em branco.'
8
8
 
9
9
  # Data da geracao do arquivo seguindo o padrao DDMMAA
10
10
  #
@@ -20,7 +20,7 @@ module Brcobranca
20
20
  #
21
21
  def monta_header
22
22
  # CAMPO TAMANHO VALOR
23
- # tipo do registro [1] 1
23
+ # tipo do registro [1] 0
24
24
  # operacao [1] 1
25
25
  # literal remessa [7] REMESSA
26
26
  # cod. servico [15] COBRANCA
@@ -31,7 +31,7 @@ module Brcobranca
31
31
  # data geracao [6] formato DDMMAA
32
32
  # complemento registro [294]
33
33
  # num. sequencial [6] 000001
34
- "11REMESSA01COBRANCA #{info_conta}#{empresa_mae.to_s.ljust(30, ' ')}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
34
+ "01REMESSA01COBRANCA #{info_conta}#{empresa_mae.to_s.ljust(30, ' ')}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
35
35
  end
36
36
 
37
37
  # Trailer do arquivo remessa
@@ -72,7 +72,7 @@ module Brcobranca
72
72
  end
73
73
  ret << monta_trailer(contador + 1)
74
74
  retorno = ret.join("\n")
75
- retorno
75
+ retorno.to_ascii.upcase
76
76
  end
77
77
 
78
78
  # Informacoes referentes a conta do cedente
@@ -6,6 +6,7 @@ module Brcobranca
6
6
  # codigo da empresa (informado pelo Bradesco no cadastramento)
7
7
  attr_accessor :codigo_empresa
8
8
 
9
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
9
10
  validates_presence_of :codigo_empresa, :sequencial_remessa,
10
11
  :digito_conta, message: 'não pode estar em branco.'
11
12
  validates_length_of :codigo_empresa, maximum: 20, message: 'deve ser menor ou igual a 20 dígitos.'
@@ -13,6 +14,7 @@ module Brcobranca
13
14
  validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
14
15
  validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
15
16
  validates_length_of :carteira, maximum: 2, message: 'deve ter no máximo 2 dígitos.'
17
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
16
18
 
17
19
  def agencia=(valor)
18
20
  @agencia = valor.to_s.rjust(5, '0') if valor
@@ -83,17 +85,17 @@ module Brcobranca
83
85
  detalhe << ''.rjust(1, '0') # digito da conta corrente (op) X[01] 020 a 020
84
86
  detalhe << identificacao_empresa # identficacao da empresa X[17] 021 a 037
85
87
  detalhe << ''.rjust(25, ' ') # num. controle X[25] 038 a 062
86
- detalhe << cod_banco # codigo do banco 9[03] 063 a 065
88
+ detalhe << ''.rjust(3, '0') # codigo do banco (debito automatico apenas) 9[03] 063 a 065
87
89
  detalhe << ''.rjust(1, '0') # campo da multa 9[01] 066 a 066 *
88
90
  detalhe << ''.rjust(4, '0') # percentual multa 9[04] 067 a 070 *
89
91
  detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 071 a 081
90
- detalhe << digito_nosso_numero(pagamento.nosso_numero) # digito de conferencia do nosso numero (dv) X[01] 082 a 082
92
+ detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # digito de conferencia do nosso numero (dv) X[01] 082 a 082
91
93
  detalhe << ''.rjust(10, '0') # desconto por dia 9[10] 083 a 092
92
94
  detalhe << '2' # condicao emissao boleto (2 = cliente) 9[01] 093 a 093
93
95
  detalhe << 'N' # emite boleto para debito X[01] 094 a 094
94
96
  detalhe << ''.rjust(10, ' ') # operacao no banco (brancos) X[10] 095 a 104
95
97
  detalhe << ' ' # indicador rateio X[01] 105 a 105
96
- detalhe << ' ' # endereco para aviso debito (op) 9[01] 106 a 106
98
+ detalhe << '2' # endereco para aviso debito (op 2 = ignora) 9[01] 106 a 106
97
99
  detalhe << ''.rjust(2, ' ') # brancos X[02] 107 a 108
98
100
  detalhe << '01' # identif. da ocorrencia 9[02] 109 a 110
99
101
  detalhe << pagamento.nosso_numero.to_s.rjust(10, ' ') # numero do documento alfanum. X[10] 111 a 120