Class: Brcobranca::Remessa::Cnab240::BaseCorrespondente

Inherits:
Base
  • Object
show all
Defined in:
lib/brcobranca/remessa/cnab240/base_correspondente.rb

Direct Known Subclasses

SicoobBancoBrasil

Instance Attribute Summary collapse

Attributes inherited from Base

#aceite, #agencia, #carteira, #conta_corrente, #digito_conta, #documento_cedente, #empresa_mae, #pagamentos, #sequencial_remessa

Instance Method Summary collapse

Methods inherited from Base

#quantidade_titulos_cobranca, #totaliza_valor_titulos, #valor_titulos_carteira

Methods included from Validations

#errors, included, #invalid?, #valid?

Constructor Details

#initialize(campos = {}) ⇒ BaseCorrespondente

Returns a new instance of BaseCorrespondente.


39
40
41
42
43
44
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 39

def initialize(campos = {})
  campos = { codigo_carteira: '1',
             forma_cadastramento: '1',
             tipo_documento: ' ' }.merge!(campos)
  super(campos)
end

Instance Attribute Details

#codigo_carteiraObject

codigo da carteira

opcoes:
  1 - cobranca simples
  2 - cobranca caucionada
  3 - cobranca descontada
  7 – modalidade Simples quando carteira 17 (apenas Banco do Brasil)

18
19
20
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 18

def codigo_carteira
  @codigo_carteira
end

#convenioObject

convenio do cedente


7
8
9
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 7

def convenio
  @convenio
end

#distribuicao_boletoObject

identificacao da distribuicao do boleto (verificar opcoes nas classes referentes aos bancos)


27
28
29
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 27

def distribuicao_boleto
  @distribuicao_boleto
end

#emissao_boletoObject

identificacao da emissao do boleto (verificar opcoes nas classes referentes aos bancos)


25
26
27
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 25

def emissao_boleto
  @emissao_boleto
end

#especie_tituloObject

especie do titulo (verificar o padrao nas classes referentes aos bancos)


29
30
31
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 29

def especie_titulo
  @especie_titulo
end

#forma_cadastramentoObject

forma de cadastramento dos titulos (campo nao tratado pelo Banco do Brasil)

opcoes:
  1 - com cadastramento (cobrança registrada)
  2 - sem cadastramento (cobrança sem registro)

23
24
25
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 23

def forma_cadastramento
  @forma_cadastramento
end

#mensagem_1Object

mensagem 1


9
10
11
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 9

def mensagem_1
  @mensagem_1
end

#mensagem_2Object

mensagem 2


11
12
13
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 11

def mensagem_2
  @mensagem_2
end

#tipo_documentoObject

tipo de documento (verificar o padrao nas classes referentes aos bancos)


31
32
33
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 31

def tipo_documento
  @tipo_documento
end

Instance Method Details

#cod_bancoObject

Codigo do banco

Este metodo deve ser sobrescrevido na classe do banco


270
271
272
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 270

def cod_banco
  raise Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando'
end

#codigo_convenioObject

Codigo do convenio

Este metodo deve ser sobrescrevido na classe do banco


286
287
288
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 286

def codigo_convenio
  raise Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando'
end

#codigo_protestoObject

Codigo para protesto

Sobreescreva caso necessário


293
294
295
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 293

def codigo_protesto
  "0"
end

#complemento_headerObject

Complemento do registro

Este metodo deve ser sobrescrevido na classe do banco


254
255
256
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 254

def complemento_header
  raise Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando'
end

#convenio_loteObject

Informacoes do convenio para o lote

Este metodo deve ser sobrescrevido na classe do banco


262
263
264
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 262

def convenio_lote
  raise Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando'
end

#data_geracaoString

Data de geracao do arquivo

Returns:

  • (String)

50
51
52
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 50

def data_geracao
  Date.current.strftime('%d%m%Y')
end

#formata_nosso_numero(nosso_numero) ⇒ String

Retorna o nosso numero

Returns:

  • (String)

169
170
171
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 169

def formata_nosso_numero(nosso_numero)
  "#{convenio.to_s.rjust(10, '0')}#{nosso_numero.to_s.rjust(7, '0')}"
end

#gera_arquivoString

Gera o arquivo remessa

Returns:

  • (String)

Raises:


236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 236

def gera_arquivo
  raise Brcobranca::RemessaInvalida, self if invalid?

  arquivo = [monta_header_arquivo]

  # contador de do lotes
  contador = 1
  arquivo.push monta_lote(contador)

  arquivo << monta_trailer_arquivo(contador, ((pagamentos.size * 2) + (contador * 2) + 2))

  arquivo.join("\r\n").to_ascii.upcase
end

#hora_geracaoString

Hora de geracao do arquivo

Returns:

  • (String)

58
59
60
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 58

def hora_geracao
  (Time.respond_to?(:current) ? Time.current : Time.now).strftime('%H%M%S')
end

#identificacao_avalista(pagamento) ⇒ Object


177
178
179
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 177

def identificacao_avalista(pagamento)
  "0#{pagamento.identificacao_avalista(false)}"
end

#identificacao_sacado(pagamento) ⇒ Object


173
174
175
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 173

def identificacao_sacado(pagamento)
  "0#{pagamento.identificacao_sacado(false)}"
end

#info_contaObject

Informacoes da conta do cedente

Este metodo deve ser sobrescrevido na classe do banco


278
279
280
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 278

def info_conta
  raise Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando'
end

#monta_header_arquivoString

Monta o registro header do arquivo

Returns:

  • (String)

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 66

def monta_header_arquivo
  header_arquivo = ''                                   # CAMPO                         TAMANHO
  header_arquivo << cod_banco                           # codigo do banco               3
  header_arquivo << '0000'                              # zeros                         4
  header_arquivo << '1'                                 # registro header do lote       1
  header_arquivo << 'R'                                 # tipo operacao: R-remessa      1
  header_arquivo << ''.rjust(7, '0')                    # zeros                         7
  header_arquivo << ''.rjust(2, ' ')                    # brancos                       2
  header_arquivo << info_conta                          # informacoes da conta          22
  header_arquivo << ''.rjust(30, ' ')                   # brancos                       30
  header_arquivo << empresa_mae.format_size(30)         # nome da empresa               30
  header_arquivo << ''.rjust(80, ' ')                   # brancos                       80
  header_arquivo << sequencial_remessa.to_s.rjust(8, '0') # numero seq. arquivo         8
  header_arquivo << data_geracao                        # data geracao                  8
  header_arquivo << complemento_header                  # complemento do arquivo        44
  header_arquivo
end

#monta_lote(nro_lote) ⇒ Array

Monta um lote para o arquivo

numero do lote no arquivo

Parameters:

Returns:

  • (Array)

213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 213

def monta_lote(nro_lote)
  # contador dos registros do lote
  contador = 1 #header

  lote = []

  pagamentos.each do |pagamento|
    raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?

    lote << monta_segmento_p(pagamento, contador)
    contador += 1
    lote << monta_segmento_q(pagamento, contador)
    contador += 1
  end
  contador += 1 #trailer

  lote
end

#monta_segmento_p(pagamento, sequencial) ⇒ String

Monta o registro segmento P do arquivo

Parameters:

  • pagamento (Brcobranca::Remessa::Pagamento)

    objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)

  • sequencial (Integer)

    numero sequencial do registro no lote

Returns:

  • (String)

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 93

def monta_segmento_p(pagamento, sequencial)
  #                                                             # DESCRICAO                             TAMANHO
  segmento_p = ''.rjust(7, '0')                                 # codigo banco                          7
  segmento_p << '3'                                             # tipo de registro                      1
  segmento_p << sequencial.to_s.rjust(5, '0')                   # num. sequencial do registro no lote   5
  segmento_p << 'P'                                             # cod. segmento                         1
  segmento_p << ' '                                             # uso exclusivo                         1
  segmento_p << '01'                                            # cod. movimento remessa                2
  segmento_p << ''.rjust(23, ' ')                               # brancos                               23
  segmento_p << formata_nosso_numero(pagamento.nosso_numero)    # uso exclusivo                         17
  segmento_p << codigo_carteira                                 # codigo da carteira                    1
  segmento_p << tipo_documento                                  # tipo de documento                     2
  segmento_p << emissao_boleto                                  # identificaco emissao                  1
  segmento_p << ' '                                             # branco                                1
  segmento_p << complemento_p(pagamento)                        # informacoes da conta                  15
  segmento_p << pagamento.data_vencimento.strftime('%d%m%Y')    # data de venc.                         8
  segmento_p << pagamento.formata_valor(15)                     # valor documento                       15
  segmento_p << ''.rjust(6, '0')                                # zeros                                 6
  segmento_p << aceite                                          # aceite                                1
  segmento_p << '  '                                            # brancos                               2
  segmento_p << pagamento.data_emissao.strftime('%d%m%Y')       # data de emissao titulo                8
  segmento_p << '1'                                             # tipo da mora                          1
  segmento_p << pagamento.formata_valor_mora(15).to_s           # valor da mora                         15
  segmento_p << ''.rjust(9, '0')                                # zeros                                 9
  segmento_p << pagamento.formata_data_desconto('%d%m%Y')       # data desconto                         8
  segmento_p << pagamento.formata_valor_desconto(15)            # valor desconto                        15
  segmento_p << ''.rjust(15, ' ')                               # filler                                15
  segmento_p << pagamento.formata_valor_abatimento(15)          # valor abatimento                      15
  segmento_p << ''.rjust(25, ' ')                               # identificacao titulo empresa          25
  segmento_p << codigo_protesto                                 # cod. para protesto                    1
  segmento_p << '00'                                            # dias para protesto                    2
  segmento_p << ''.rjust(4, '0')                                # zero                                  4
  segmento_p << '09'                                            # cod. da moeda                         2
  segmento_p << ''.rjust(10, '0')                               # uso exclusivo                         10
  segmento_p << '0'                                             # zero                                  1
  segmento_p
end

#monta_segmento_q(pagamento, sequencial) ⇒ String

Monta o registro segmento Q do arquivo

Parameters:

  • pagamento (Brcobranca::Remessa::Pagamento)

    objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)

  • sequencial (Integer)

    numero sequencial do registro no lote

Returns:

  • (String)

141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 141

def monta_segmento_q(pagamento, sequencial)
  segmento_q = ''                                               # CAMPO                         TAMANHO
  segmento_q << ''.rjust(7, '0')                                # zeros                         3
  segmento_q << '3'                                             # registro detalhe              1
  segmento_q << sequencial.to_s.rjust(5, '0')                   # lote de servico               5
  segmento_q << 'Q'                                             # cod. segmento                 1
  segmento_q << ' '                                             # brancos                       1
  segmento_q << '01'                                            # cod. movimento remessa        2
  segmento_q << identificacao_sacado(pagamento)                 # tipo insc. sacado             2
  segmento_q << pagamento.documento_sacado.to_s.rjust(14, '0')  # documento sacado              14
  segmento_q << pagamento.nome_sacado.format_size(40)           # nome cliente                  40
  segmento_q << pagamento.endereco_sacado.format_size(40)       # endereco cliente              40
  segmento_q << pagamento.bairro_sacado.format_size(15)         # bairro                        15
  segmento_q << pagamento.cep_sacado[0..4]                      # cep                           5
  segmento_q << pagamento.cep_sacado[5..7]                      # sufixo cep                    3
  segmento_q << pagamento.cidade_sacado.format_size(15)         # cidade                        15
  segmento_q << pagamento.uf_sacado                             # uf                            2
  segmento_q << identificacao_avalista(pagamento)               # identificacao do sacador      2
  segmento_q << pagamento.documento_avalista.to_s.rjust(14, '0') # documento sacador            15
  segmento_q << pagamento.nome_avalista.format_size(40)         # nome avalista                 40
  segmento_q << ''.rjust(31, ' ')                               # zeros                         0
  segmento_q
end

#monta_trailer_arquivo(nro_lotes, sequencial) ⇒ String

Monta o registro trailer do arquivo

Parameters:

  • nro_lotes (Integer)

    numero de lotes no arquivo

  • sequencial (Integer)

    numero de registros(linhas) no arquivo

Returns:

  • (String)

191
192
193
194
195
196
197
198
199
200
201
# File 'lib/brcobranca/remessa/cnab240/base_correspondente.rb', line 191

def monta_trailer_arquivo(nro_lotes, sequencial)
  # CAMPO                     TAMANHO
  # codigo banco              3
  # lote de servico           4
  # tipo de registro          1
  # uso FEBRABAN              9
  # nro de lotes              6
  # nro de registros(linhas)  6
  # uso FEBRABAN              211
  "#{cod_banco}99999#{''.rjust(9, ' ')}#{nro_lotes.to_s.rjust(6, '0')}#{sequencial.to_s.rjust(6, '0')}#{''.rjust(211, ' ')}"
end