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.


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

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


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

def variacao
  @variacao
end

Instance Method Details

#cod_bancoObject


30
31
32
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 30

def cod_banco
  '001'
end

#codigo_convenioObject Also known as: convenio_lote


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

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


80
81
82
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 80

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

#complemento_p(pagamento) ⇒ Object


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

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


84
85
86
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 84

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

#digito_agenciaObject


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

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

#digito_contaObject


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

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)

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

def formata_nosso_numero(nosso_numero)
  quantidade = case convenio.to_s.size
                 # convenio de 4 posicoes com nosso numero de 7
               when 4 then
                 7
                 # convenio de 6 posicoes com nosso numero de 5
               when 6 then
                 5
                 # convenio de 7 posicoes com nosso numero de 10
               when 7 then
                 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


122
123
124
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 122

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

#info_contaObject


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

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)

137
138
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
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 137

def monta_segmento_p(pagamento, nro_lote, sequencial)
  # campos com * na frente nao foram implementados
  #                                                             # 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


34
35
36
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 34

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

#versao_layout_arquivoObject


38
39
40
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 38

def versao_layout_arquivo
  '083'
end

#versao_layout_loteObject


42
43
44
# File 'lib/brcobranca/remessa/cnab240/banco_brasil.rb', line 42

def versao_layout_lote
  '042'
end