Class: Brcobranca::Remessa::Cnab240::BancoBrasil

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

Instance Attribute Summary collapse

Attributes inherited from Base

#codigo_baixa, #codigo_carteira, #convenio, #dias_baixa, #distribuicao_boleto, #emissao_boleto, #especie_titulo, #forma_cadastramento, #mensagem_1, #mensagem_2, #tipo_documento

Attributes inherited from Base

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

Instance Method Summary collapse

Methods inherited from Base

#codigo_desconto, #complemento_r, #data_geracao, #data_mora, #data_multa, #densidade_gravacao, #dv_agencia_cobradora, #exclusivo_servico, #gera_arquivo, #hora_geracao, #identificacao_titulo_empresa, #monta_header_arquivo, #monta_header_lote, #monta_lote, #monta_segmento_q, #monta_segmento_r, #monta_trailer_arquivo, #monta_trailer_lote, #numero, #total_segmentos, #uso_exclusivo_banco, #uso_exclusivo_empresa

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 = {}) ⇒ BancoBrasil

Returns a new instance of BancoBrasil.



23
24
25
26
27
28
29
30
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 23

def initialize(campos = {})
  campos = { emissao_boleto: '0',
             distribuicao_boleto: '0',
             especie_titulo: '02',
             codigo_baixa: '00',
             codigo_carteira: '7' }.merge!(campos)
  super(campos)
end

Instance Attribute Details

#variacaoObject

variacao da carteira



8
9
10
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 8

def variacao
  @variacao
end

Instance Method Details

#cod_bancoObject



32
33
34
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 32

def cod_banco
  '001'
end

#codigo_convenioObject Also known as: convenio_lote



60
61
62
63
64
65
66
67
68
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 60

def codigo_convenio
  # CAMPO                TAMANHO
  # num. convenio        9
  # cobranca cedente     4
  # carteira             2
  # variacao carteira    3
  # campo reservado      2
  "#{convenio.rjust(9, '0')}0014#{carteira}#{variacao}  "
end

#complemento_headerObject



82
83
84
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 82

def complemento_header
  ''.rjust(29, ' ')
end

#complemento_p(pagamento) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 90

def complemento_p(pagamento)
  # CAMPO                   TAMANHO
  # conta corrente          12
  # digito conta            1
  # digito agencia/conta    1
  # ident. titulo no banco  20
  "#{conta_corrente.rjust(12, '0')}#{digito_conta} #{identificador_titulo(pagamento.nosso_numero)}"
end

#complemento_trailerObject



86
87
88
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 86

def complemento_trailer
  ''.rjust(217, '0')
end

#digito_agenciaObject



48
49
50
51
52
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 48

def digito_agencia
  # utilizando a agencia com 4 digitos
  # para calcular o digito
  agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
end

#digito_contaObject



54
55
56
57
58
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 54

def digito_conta
  # utilizando a conta corrente com 5 digitos
  # para calcular o digito
  conta_corrente.modulo11(mapeamento: { 10 => 'X' }).to_s
end

#formata_nosso_numero(nosso_numero) ⇒ String

Retorna o nosso numero mais o digito verificador

Returns:

  • (String)


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 103

def formata_nosso_numero(nosso_numero)
  quantidade = case convenio.to_s.size
                 # convenio de 4 posicoes com nosso numero de 7
               when 4
                 7
                 # convenio de 6 posicoes com nosso numero de 5
               when 6
                 5
                 # convenio de 7 posicoes com nosso numero de 10
               when 7
                 10
               else
                 raise Brcobranca::NaoImplementado, 'Tipo de convênio não implementado.'
               end
  nosso_numero = nosso_numero.to_s.rjust(quantidade, '0')

  # calcula o digito do nosso numero (menos para quando nosso numero tiver 10 posicoes)
  digito = "#{convenio}#{nosso_numero}".modulo11(mapeamento: { 10 => 'X' }) unless quantidade == 10
  "#{nosso_numero}#{digito}"
end

#identificador_titulo(nosso_numero) ⇒ Object



124
125
126
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 124

def identificador_titulo(nosso_numero)
  "#{convenio}#{formata_nosso_numero(nosso_numero)}".ljust(20, ' ')
end

#info_contaObject



72
73
74
75
76
77
78
79
80
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 72

def info_conta
  # CAMPO                  TAMANHO
  # agencia                5
  # digito agencia         1
  # conta corrente         12
  # digito conta           1
  # digito agencia/conta   1
  "#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta} "
end

#monta_segmento_p(pagamento, nro_lote, sequencial) ⇒ String

Monta o registro segmento P do arquivo

Parameters:

  • pagamento (Brcobranca::Remessa::Pagamento)

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

  • nro_lote (Integer)

    numero do lote que o segmento esta inserido

  • sequencial (Integer)

    numero sequencial do registro no lote

Returns:

  • (String)


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 139

def monta_segmento_p(pagamento, nro_lote, sequencial)
  # campos com * na frente nao foram implementados
  segmento_p = ''
  #                                                             # DESCRICAO                             TAMANHO
  segmento_p += cod_banco # codigo banco                          3
  segmento_p << nro_lote.to_s.rjust(4, '0')                     # lote de servico                       4
  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
  # Códigos de Movimento para Remessa tratados pelo Banco do Brasil:
  # 01 – Entrada de títulos,
  # 02 – Pedido de baixa,
  # 04 – Concessão de Abatimento,
  # 05 – Cancelamento de Abatimento,
  # 06 – Alteração de Vencimento,
  # 07 – Concessão de Desconto,
  # 08 – Cancelamento de Desconto,
  # 09 – Protestar,
  # 10 – Cancela/Sustação da Instrução de protesto,
  # 30 – Recusa da Alegação do Sacado,
  # 31 – Alteração de Outros Dados,
  # 40 – Alteração de Modalidade.
  segmento_p << pagamento.identificacao_ocorrencia              # cod. movimento remessa                2
  segmento_p << agencia.to_s.rjust(5, '0')                      # agencia                               5
  segmento_p << digito_agencia.to_s                             # dv agencia                            1
  segmento_p << complemento_p(pagamento)                        # informacoes da conta                  34
  # Informar:
  # 1 – para carteira 11/12 na modalidade Simples;
  # 2 ou 3 – para carteira 11/17 modalidade Vinculada/Caucionada e carteira 31;
  # 4 – para carteira 11/17 modalidade Descontada e carteira 51;
  # e 7 – para carteira 17 modalidade Simples.
  segmento_p << codigo_carteira                                 # codigo da carteira                    1
  segmento_p << forma_cadastramento                             # forma de cadastro do titulo           1
  segmento_p << tipo_documento                                  # tipo de documento                     1
  segmento_p << emissao_boleto                                  # identificaco emissao                  1
  segmento_p << distribuicao_boleto                             # indentificacao entrega                1
  segmento_p << numero(pagamento)                               # uso exclusivo                         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(5, '0')                                # agencia cobradora                     5
  segmento_p << ' '                                             # dv agencia cobradora                  1
  # Para carteira 11 e 17 modalidade Simples, pode ser usado:
  # 01 – Cheque, 02 – Duplicata Mercantil,
  # 04 – Duplicata de Serviço,
  # 06 – Duplicata Rural,
  # 07 – Letra de Câmbio,
  # 12 – Nota Promissória,
  # 17 - Recibo,
  # 19 – Nota de Debito,
  # 26 – Warrant,
  # 27 – Dívida Ativa de Estado,
  # 28 – Divida Ativa de Município e
  # 29 – Dívida Ativa União.
  # Para carteira 12 (moeda variável) pode ser usado:
  # 02 – Duplicata Mercantil,
  # 04 – Duplicata de Serviço,
  # 07 – Letra de Câmbio,
  # 12 – Nota Promissória,
  # 17 – Recibo e
  # 19 – Nota de Débito.
  # Para carteira 15 (prêmio de seguro) pode ser usado:
  # 16 – Nota de Seguro e
  # 20 – Apólice de Seguro.
  # Para carteira 11/17 modalidade Vinculada e carteira 31, pode ser usado:
  # 02 – Duplicata Mercantil e
  # 04 – Duplicata de Serviço.
  # Para carteira 11/17 modalidade Descontada e carteira 51, pode ser usado:
  # 02 – Duplicata Mercantil,
  # 04 – Duplicata de Serviço, e
  # 07 – Letra de Câmbio.
  # Obs.: O Banco do Brasil encaminha para protesto os seguintes títulos:
  # Duplicata Mercantil, Rural e de Serviço, Letra de Câmbio, e
  # Certidão de Dívida Ativa da União, dos Estados e do Município.
  segmento_p << especie_titulo                                  # especie do titulo                     2
  segmento_p << aceite                                          # aceite                                1
  segmento_p << pagamento.data_emissao.strftime('%d%m%Y')       # data de emissao titulo                8
  segmento_p << pagamento.tipo_mora                             # cod. do juros                         1
  segmento_p << data_mora(pagamento)                            # data juros                            8
  segmento_p << pagamento.formata_valor_mora(15)                # valor juros                           15
  segmento_p << pagamento.cod_desconto                          # cod. do desconto                      1
  segmento_p << pagamento.formata_data_desconto('%d%m%Y')       # data desconto                         8
  segmento_p << pagamento.formata_valor_desconto(15)            # valor desconto                        15
  segmento_p << pagamento.formata_valor_iof(15)                 # valor IOF                             15
  segmento_p << pagamento.formata_valor_abatimento(15)          # valor abatimento                      15
  segmento_p << identificacao_titulo_empresa(pagamento)         # identificacao documento empresa       25

  # O Banco do Brasil trata somente os códigos
  # '1' – Protestar dias corridos,
  # '2' – Protestar dias úteis, e
  # '3' – Não protestar.
  # No caso de carteira 31 ou carteira 11/17 modalidade Vinculada,
  # se não informado nenhum código,
  # o sistema assume automaticamente Protesto em 3 dias úteis.
  segmento_p << pagamento.codigo_protesto # cod. para protesto                    1
  # Preencher de acordo com o código informado na posição 221.
  # Para código '1' – é possível, de 6 a 29 dias, 35o, 40o, dia corrido.
  # Para código '2' – é possível, 3o, 4o ou 5o dia útil.
  # Para código '3' preencher com Zeros.
  segmento_p << pagamento.dias_protesto.to_s.rjust(2, '0')      # dias para protesto                    2
  segmento_p << '0'                                             # cod. para baixa                       1   *'1' = Protestar Dias Corridos, '2' = Protestar Dias Úteis, '3' = Não Protestar
  segmento_p << '000'                                           # dias para baixa                       2   *
  segmento_p << '09'                                            # cod. da moeda                         2
  segmento_p << ''.rjust(10, '0')                               # uso exclusivo                         10
  segmento_p << ' '                                             # uso exclusivo                         1
  segmento_p
end

#nome_bancoObject



36
37
38
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 36

def nome_banco
  'BANCO DO BRASIL S.A.'.ljust(30, ' ')
end

#versao_layout_arquivoObject



40
41
42
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 40

def versao_layout_arquivo
  '083'
end

#versao_layout_loteObject



44
45
46
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 44

def versao_layout_lote
  '042'
end