brcobranca 5.0.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +13 -9
- data/README.md +5 -1
- data/brcobranca.gemspec +2 -0
- data/lib/brcobranca/arquivos/logos/sicoob.eps +209 -0
- data/lib/brcobranca/boleto/bradesco.rb +20 -0
- data/lib/brcobranca/boleto/sicoob.rb +80 -0
- data/lib/brcobranca/remessa/base.rb +1 -1
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +7 -2
- data/lib/brcobranca/remessa/cnab240/base.rb +133 -134
- data/lib/brcobranca/remessa/cnab240/caixa.rb +6 -1
- data/lib/brcobranca/remessa/cnab240/sicoob.rb +128 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +5 -5
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +5 -3
- data/lib/brcobranca/remessa/cnab400/citibank.rb +140 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +4 -11
- data/lib/brcobranca/remessa/pagamento.rb +39 -5
- data/lib/brcobranca/retorno/base.rb +1 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +40 -0
- data/lib/brcobranca/retorno/cnab400/bradesco.rb +117 -0
- data/lib/brcobranca/retorno/cnab400/itau.rb +136 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -1
- data/lib/brcobranca/util/empresa.rb +29 -0
- data/lib/brcobranca/version.rb +1 -1
- data/lib/brcobranca.rb +19 -5
- data/spec/arquivos/CNAB400BRADESCO.RET +8 -0
- data/spec/arquivos/CNAB400ITAU.RET +54 -0
- data/spec/brcobranca/base_spec.rb +175 -179
- data/spec/brcobranca/{banco_bradesco_spec.rb → boleto/banco_bradesco_spec.rb} +80 -53
- data/spec/brcobranca/{banco_brasil_spec.rb → boleto/banco_brasil_spec.rb} +2 -2
- data/spec/brcobranca/{banco_caixa_spec.rb → boleto/banco_caixa_spec.rb} +1 -1
- data/spec/brcobranca/{banco_hsbc_spec.rb → boleto/banco_hsbc_spec.rb} +2 -2
- data/spec/brcobranca/{banco_itau_spec.rb → boleto/banco_itau_spec.rb} +2 -2
- data/spec/brcobranca/{banco_santander_spec.rb → boleto/banco_santander_spec.rb} +2 -2
- data/spec/brcobranca/boleto/banco_sicoob_spec.rb +132 -0
- data/spec/brcobranca/{banco_sicredi_spec.rb → boleto/banco_sicredi_spec.rb} +2 -2
- data/spec/brcobranca/boletos_em_lote_spec.rb +2 -2
- data/spec/brcobranca/core_ext_spec.rb +198 -199
- data/spec/brcobranca/currency_spec.rb +67 -71
- data/spec/brcobranca/remessa/base_spec.rb +1 -17
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +22 -13
- data/spec/brcobranca/remessa/cnab240/base_spec.rb +28 -27
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +13 -4
- data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +155 -0
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -17
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +15 -2
- data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +117 -0
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +15 -10
- data/spec/brcobranca/remessa/pagamento_spec.rb +6 -8
- data/spec/brcobranca/retorno/cnab400/base_spec.rb +35 -0
- data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +55 -0
- data/spec/brcobranca/retorno/cnab400/itau_spec.rb +55 -0
- data/spec/brcobranca/{retorno_cbr643_spec.rb → retorno/retorno_cbr643_spec.rb} +3 -3
- data/spec/brcobranca/{retorno_cnab400_spec.rb → retorno/retorno_cnab400_spec.rb} +3 -3
- data/spec/brcobranca/{retorno_cnab_240_spec.rb → retorno/retorno_cnab_240_spec.rb} +3 -3
- data/spec/brcobranca/rghost_spec.rb +2 -2
- data/spec/brcobranca/util/empresa_spec.rb +35 -0
- data/spec/brcobranca_spec.rb +25 -10
- data/spec/fixtures/remessa/.keep +0 -0
- data/spec/fixtures/remessa/remessa-bancoob.rem +6 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/remessa_helpers.rb +12 -0
- data/spec/{shared_examples → support/shared_examples}/cnab240.rb +17 -15
- data/spec/{shared_examples → support/shared_examples}/cnab400.rb +11 -3
- metadata +72 -26
@@ -0,0 +1,140 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab400
|
5
|
+
class Citibank < Brcobranca::Remessa::Cnab400::Base
|
6
|
+
# documento do cedente
|
7
|
+
attr_accessor :documento_cedente
|
8
|
+
# Identificação do portfolio.
|
9
|
+
# Necessário consultar o Citibank para informações referentes à conta cobrança e carteira do cliente.
|
10
|
+
attr_accessor :portfolio
|
11
|
+
|
12
|
+
validates_presence_of :documento_cedente, :portfolio, message: 'não pode estar em branco.'
|
13
|
+
validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
|
14
|
+
validates_length_of :carteira, maximum: 1, message: 'deve ter no máximo 1 dígito.'
|
15
|
+
validates_length_of :portfolio, maximum: 20, message: 'deve ter no máximo 20 dígitos.'
|
16
|
+
|
17
|
+
# Nova instancia do Citibank
|
18
|
+
def initialize(campos = {})
|
19
|
+
campos = { aceite: 'N', carteira: '1' }.merge!(campos)
|
20
|
+
super(campos)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cod_banco
|
24
|
+
'745'
|
25
|
+
end
|
26
|
+
|
27
|
+
def nome_banco
|
28
|
+
'CITIBANK'.ljust(15, ' ')
|
29
|
+
end
|
30
|
+
|
31
|
+
# Informacoes da conta corrente do cedente
|
32
|
+
#
|
33
|
+
# @return [String]
|
34
|
+
#
|
35
|
+
def info_conta
|
36
|
+
# CAMPO TAMANHO
|
37
|
+
# portfolio 20
|
38
|
+
portfolio.rjust(20, ' ')
|
39
|
+
end
|
40
|
+
|
41
|
+
# Complemento do header
|
42
|
+
# (no caso do Citibank, sao apenas espacos em branco)
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
#
|
46
|
+
def complemento
|
47
|
+
# CAMPO TAMANHO
|
48
|
+
# Densidade de gravação 5
|
49
|
+
# Unidade de densidade de gravação 3
|
50
|
+
'01600BPI'.rjust(294, ' ')
|
51
|
+
end
|
52
|
+
|
53
|
+
# Detalhe do arquivo
|
54
|
+
#
|
55
|
+
# @param pagamento [PagamentoCnab400]
|
56
|
+
# objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
|
57
|
+
# @param sequencial
|
58
|
+
# num. sequencial do registro no arquivo
|
59
|
+
#
|
60
|
+
# @return [String]
|
61
|
+
#
|
62
|
+
def monta_detalhe(pagamento, sequencial)
|
63
|
+
fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
|
64
|
+
|
65
|
+
detalhe = '1' # identificacao transacao 9[01]
|
66
|
+
detalhe << Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
|
67
|
+
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
|
68
|
+
detalhe << portfolio # portfolio X[20]
|
69
|
+
detalhe << ''.rjust(25, ' ') # identificacao do tit. na empresa X[25]
|
70
|
+
detalhe << '02' # espécie do título 9[02] - 00 = DMI – Duplicata Mercantil por Indicação, 02 = DM – Duplicata Mercantil
|
71
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(12, '0') # nosso numero 9[12]
|
72
|
+
detalhe << ''.rjust(6, ' ') # brancos X[06]
|
73
|
+
detalhe << pagamento.formata_data_segundo_desconto # data limite para o segundo desconto 9[06]
|
74
|
+
detalhe << pagamento.formata_valor_segundo_desconto # valor do segundo desconto 9[13]
|
75
|
+
detalhe << '000' # carne 9[03] - Válido apenas quando o campo 148/149 for igual a 03
|
76
|
+
detalhe << '000' # parcela 9[03] - Só preencher se o banco for imprimir e enviar e for um carnê
|
77
|
+
detalhe << carteira # codigo da carteira X[01] - Código 1 = Cobrança Simples, Código 2 = Cobrança Caucionada
|
78
|
+
detalhe << '01' # identificacao ocorrencia (remessa) 9[02]
|
79
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(10, '0') # numero do documento X[10]
|
80
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
|
81
|
+
detalhe << pagamento.formata_valor # valor do documento 9[13]
|
82
|
+
detalhe << cod_banco # codigo banco 9[03]
|
83
|
+
detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
|
84
|
+
|
85
|
+
# 01 = Banco imprime (apenas boletos simples não personalizados) 03 = Banco imprime de forma personalizada (boletos simples, personalizados e carnês)
|
86
|
+
# 07 = Banco não imprime
|
87
|
+
# 08 = Impressão via WEB (boleto por e-mail) sem impressão banco 09 = Impressão via WEB (boleto por e-mail) com impressão banco Observações:
|
88
|
+
# - Quando código 03, o cliente deverá entrar em contato com o banco, antes de enviar o arquivo, para definir a personalização do boleto.
|
89
|
+
# - Quando código 07, o campo 065/076, deverá ter o NOSSO NÚMERO atribuído pelo cliente.
|
90
|
+
# Se o portfolio do cliente for cobrança flexível:
|
91
|
+
# 04 = Título flex com boleto impresso via web (boleto por e-mail), aceita pagamento parcial
|
92
|
+
# 06 = Título flex com boleto impresso via web (boleto por e-mail), não aceita pagamento parcial
|
93
|
+
# (No caso de Cobrança Flexível, o campo 065/076 – NOSSO NÚMERO, no arquivo remessa, deve ser preenchido pelo cliente,
|
94
|
+
# ou será preenchido no banco após a entrada do arquivo no sistema de cobrança, visto que os códigos utilizados serão 04 ou 06 no campo Tipo de Emissão.)
|
95
|
+
# (Para a modalidade de Cobrança Flexível, a opção de envio por e- mail deverá ser um parâmetro cadastral.)
|
96
|
+
detalhe << '07' # Tipo de Emissão X[02]
|
97
|
+
detalhe << aceite # aceite (A/N) X[01]
|
98
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
|
99
|
+
|
100
|
+
# 00 = SEM INSTRUÇÂO: após o vencimento, o título sofrerá a instrução presente no cadastro do cliente. Não havendo instruções no cadastro do cliente, o título será baixado automaticamente após 60 dias e o pagamento, após vencimento, poderá ser restrito ao Citibank
|
101
|
+
# 06 = PROTESTAR: quando esta instrução for dada também deverá ser preenchida a posição 159/160
|
102
|
+
# 07 = NEGATIVAR: instrução utilizada para envio de título para negativação na Serasa. Quando esta for informada, também deverá ser preenchida as posições 159/160.
|
103
|
+
# IMPORTANTE: essa instrução somente poderá ser utilizada após assinatura de contrato específico para o produto.
|
104
|
+
# 09 = DEVOLVER: esta é a instrução de BAIXA quando esta instrução for dada também deverá ser preenchida a posição 159/160
|
105
|
+
# 10 = SUSTAR PROTESTO: instrução utilizada para títulos que NÃO estejam em cartório
|
106
|
+
detalhe << '00' # Instrução para o título 9[02]
|
107
|
+
|
108
|
+
# Quando posição 157/158 (Instrução para título) conter instrução 06 ou 09,
|
109
|
+
# este campo deverá conter a quantidade de dias válidos para execução da instrução.
|
110
|
+
detalhe << '00' # Número de dias válidos para instrução 9[02]
|
111
|
+
detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
|
112
|
+
detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
|
113
|
+
detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
|
114
|
+
detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
|
115
|
+
detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
|
116
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
|
117
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
|
118
|
+
detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
|
119
|
+
detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
|
120
|
+
detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
|
121
|
+
detalhe << pagamento.cep_sacado # cep do pagador 9[08]
|
122
|
+
detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
|
123
|
+
detalhe << pagamento.uf_sacado # uf do pagador X[02]
|
124
|
+
|
125
|
+
# Este campo tem 3 finalidades:
|
126
|
+
# a) mensagem da empresa impressa no boleto pelo banco
|
127
|
+
# (para isto na primeira posição deve haver um
|
128
|
+
# asterisco);
|
129
|
+
# b) sem o asterisco, este campo será o nome do Sacador/Avalista, quando preenchido;
|
130
|
+
# c) Se posição 148/149 (Tipo de Emissão) estiver com código 08 ou 09, este campo será o e-mail do sacado.
|
131
|
+
detalhe << pagamento.nome_avalista.rjust(40, ' ') # Sacador/Mensagens X[40]
|
132
|
+
detalhe << ''.rjust(2, ' ') # Brancos X[06]
|
133
|
+
detalhe << '9' # moeda 9[01] - Código 9 = REAIS Código 5 = Dólar
|
134
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
|
135
|
+
detalhe.upcase
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -6,11 +6,13 @@ module Brcobranca
|
|
6
6
|
# documento do cedente
|
7
7
|
attr_accessor :documento_cedente
|
8
8
|
|
9
|
-
validates_presence_of :agencia, :conta_corrente,
|
9
|
+
validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
|
10
|
+
validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
|
10
11
|
validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
|
11
12
|
validates_length_of :conta_corrente, maximum: 5, message: 'deve ter 5 dígitos.'
|
12
13
|
validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
|
13
14
|
validates_length_of :carteira, maximum: 3, message: 'deve ter no máximo 3 dígitos.'
|
15
|
+
validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
|
14
16
|
|
15
17
|
# Nova instancia do Itau
|
16
18
|
def initialize(campos = {})
|
@@ -61,15 +63,6 @@ module Brcobranca
|
|
61
63
|
''.rjust(294, ' ')
|
62
64
|
end
|
63
65
|
|
64
|
-
# Tipo de empresa (fisica ou juridica)
|
65
|
-
# de acordo com o documento (CPF/CNPJ)
|
66
|
-
#
|
67
|
-
# @author Isabella Santos
|
68
|
-
#
|
69
|
-
def tipo_empresa
|
70
|
-
documento_cedente.size < 14 ? '01' : '02'
|
71
|
-
end
|
72
|
-
|
73
66
|
# Codigo da carteira de acordo com a documentacao o Itau
|
74
67
|
# se a carteira nao forem as testadas (150, 191 e 147)
|
75
68
|
# retorna 'I' que é o codigo das carteiras restantes na documentacao
|
@@ -96,7 +89,7 @@ module Brcobranca
|
|
96
89
|
fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
|
97
90
|
|
98
91
|
detalhe = '1' # identificacao transacao 9[01]
|
99
|
-
detalhe <<
|
92
|
+
detalhe << Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
|
100
93
|
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
|
101
94
|
detalhe << agencia # agencia 9[04]
|
102
95
|
detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
|
@@ -47,6 +47,16 @@ module Brcobranca
|
|
47
47
|
attr_accessor :valor_iof
|
48
48
|
# <b>OPCIONAL</b>: valor do abatimento
|
49
49
|
attr_accessor :valor_abatimento
|
50
|
+
# <b>OPCIONAL</b>: Número do Documento de Cobrança - Número adotado e controlado pelo Cliente,
|
51
|
+
# para identificar o título de cobrança.
|
52
|
+
# Informação utilizada para referenciar a identificação do documento objeto de cobrança.
|
53
|
+
# Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice,
|
54
|
+
# no caso de cobrança de seguros, etc
|
55
|
+
attr_accessor :numero_documento
|
56
|
+
# <b>OPCIONAL</b>: data limite para o desconto
|
57
|
+
attr_accessor :data_segundo_desconto
|
58
|
+
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
59
|
+
attr_accessor :valor_segundo_desconto
|
50
60
|
|
51
61
|
validates_presence_of :nosso_numero, :data_vencimento, :valor,
|
52
62
|
:documento_sacado, :nome_sacado, :endereco_sacado,
|
@@ -63,6 +73,7 @@ module Brcobranca
|
|
63
73
|
data_emissao: Date.today,
|
64
74
|
valor_mora: 0.0,
|
65
75
|
valor_desconto: 0.0,
|
76
|
+
valor_segundo_desconto: 0.0,
|
66
77
|
valor_iof: 0.0,
|
67
78
|
valor_abatimento: 0.0,
|
68
79
|
nome_avalista: '',
|
@@ -91,6 +102,20 @@ module Brcobranca
|
|
91
102
|
end
|
92
103
|
end
|
93
104
|
|
105
|
+
# Formata a data de segundo desconto de acordo com o formato passado
|
106
|
+
#
|
107
|
+
# @return [String]
|
108
|
+
#
|
109
|
+
def formata_data_segundo_desconto(formato = '%d%m%y')
|
110
|
+
data_segundo_desconto.strftime(formato)
|
111
|
+
rescue
|
112
|
+
if formato == '%d%m%y'
|
113
|
+
'000000'
|
114
|
+
else
|
115
|
+
'00000000'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
94
119
|
# Formata o campo valor
|
95
120
|
# referentes as casas decimais
|
96
121
|
# exe. R$199,90 => 0000000019990
|
@@ -120,6 +145,15 @@ module Brcobranca
|
|
120
145
|
sprintf('%.2f', valor_desconto).delete('.').rjust(tamanho, '0')
|
121
146
|
end
|
122
147
|
|
148
|
+
# Formata o campo valor do segundo desconto
|
149
|
+
#
|
150
|
+
# @param tamanho [Integer]
|
151
|
+
# quantidade de caracteres a ser retornado
|
152
|
+
#
|
153
|
+
def formata_valor_segundo_desconto(tamanho = 13)
|
154
|
+
sprintf('%.2f', valor_segundo_desconto).delete('.').rjust(tamanho, '0')
|
155
|
+
end
|
156
|
+
|
123
157
|
# Formata o campo valor do IOF
|
124
158
|
#
|
125
159
|
# @param tamanho [Integer]
|
@@ -142,17 +176,17 @@ module Brcobranca
|
|
142
176
|
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
143
177
|
# Se for juridica (CNPJ com 14 digitos) é 2
|
144
178
|
#
|
145
|
-
def identificacao_sacado(
|
146
|
-
|
179
|
+
def identificacao_sacado(zero = true)
|
180
|
+
Brcobranca::Util::Empresa.new(documento_sacado, zero).tipo
|
147
181
|
end
|
148
182
|
|
149
183
|
# Retorna a identificacao do avalista
|
150
184
|
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
151
185
|
# Se for juridica (CNPJ com 14 digitos) é 2
|
152
186
|
#
|
153
|
-
def identificacao_avalista(
|
154
|
-
return 0 if documento_avalista.nil?
|
155
|
-
|
187
|
+
def identificacao_avalista(zero = true)
|
188
|
+
return '0' if documento_avalista.nil?
|
189
|
+
Brcobranca::Util::Empresa.new(documento_avalista, zero).tipo
|
156
190
|
end
|
157
191
|
end
|
158
192
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'parseline'
|
3
|
+
|
4
|
+
module Brcobranca
|
5
|
+
module Retorno
|
6
|
+
module Cnab400
|
7
|
+
class Base < Brcobranca::Retorno::Base
|
8
|
+
|
9
|
+
# Load lines
|
10
|
+
def self.load_lines(file, options={})
|
11
|
+
return nil if file.blank?
|
12
|
+
|
13
|
+
codigo_banco = codigo_banco_do_arquivo(file)
|
14
|
+
|
15
|
+
case codigo_banco
|
16
|
+
when "237"
|
17
|
+
Brcobranca::Retorno::Cnab400::Bradesco.load_lines(file, options)
|
18
|
+
|
19
|
+
when "341"
|
20
|
+
Brcobranca::Retorno::Cnab400::Itau.load_lines(file, options)
|
21
|
+
|
22
|
+
else
|
23
|
+
Brcobranca::Retorno::RetornoCnab400.load_lines(file, options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Codigo do banco lido do arquivo.
|
28
|
+
# Registro Header [76..78]
|
29
|
+
def self.codigo_banco_do_arquivo(file)
|
30
|
+
arquivo = File.open(file, "r")
|
31
|
+
header = arquivo.gets
|
32
|
+
codigo_banco = header.blank? ? nil : header[76..78]
|
33
|
+
arquivo.close
|
34
|
+
codigo_banco
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Retorno
|
5
|
+
module Cnab400
|
6
|
+
# Formato de Retorno CNAB 400
|
7
|
+
# Baseado em: http://www.bradesco.com.br/portal/PDF/pessoajuridica/solucoes-integradas/outros/layout-de-arquivo/cobranca/4008-524-0121-08-layout-cobranca-versao-portugues.pdf
|
8
|
+
class Bradesco < Brcobranca::Retorno::Cnab400::Base
|
9
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
10
|
+
|
11
|
+
# Load lines
|
12
|
+
def self.load_lines(file, options = {})
|
13
|
+
default_options = { except: [1] } # por padrao ignora a primeira linha que é header
|
14
|
+
options = default_options.merge!(options)
|
15
|
+
super file, options
|
16
|
+
end
|
17
|
+
|
18
|
+
# Fixed width layout for Bradesco
|
19
|
+
fixed_width_layout do |parse|
|
20
|
+
# Todos os campos descritos no documento em ordem
|
21
|
+
# :tipo_de_registro, 0..0 # identificacao do registro transacao
|
22
|
+
# :codigo_de_inscricao, 1..2 # identificacao do tipo de inscricao/empresa
|
23
|
+
# :numero_de_inscricao, 3..16 # numero de inscricao da empresa (cpf/cnpj)
|
24
|
+
# :zeros, 17..19
|
25
|
+
|
26
|
+
# Identificacao da empresa no banco
|
27
|
+
# :zeros, 20..20
|
28
|
+
# :carteira, 21..23
|
29
|
+
# :agencia_sem_dv, 24..28
|
30
|
+
# :cedente_com_dv 29..36
|
31
|
+
parse.field :carteira, 21..23
|
32
|
+
parse.field :agencia_sem_dv, 24..28
|
33
|
+
parse.field :cedente_com_dv, 29..36
|
34
|
+
|
35
|
+
# :numero_controle_empresa, 37..61, # numero de controle da empresa
|
36
|
+
# :zeros, 62..69
|
37
|
+
|
38
|
+
# :nosso_numero, 70..81 # identificacao do titulo no banco
|
39
|
+
parse.field :nosso_numero, 70..81
|
40
|
+
|
41
|
+
# :zeros, 82..91 # uso do banco
|
42
|
+
# :zeros, 92..103 # uso do banco
|
43
|
+
# :indicador_de_rateio, 104..104 # indicador de rateio de credito
|
44
|
+
# :zeros, 105..106
|
45
|
+
# :carteira, 107..107 # de novo?
|
46
|
+
# :cod_de_ocorrencia, 108..109 # código de ocorrencia
|
47
|
+
# :data_de_ocorrencia, 110..115 # data de ocorrencia no banco (ddmmaa)
|
48
|
+
# :n_do_documento, 116..125 # n umero do documento de cobranca (dupl, np etc)
|
49
|
+
# :nosso_numero, 126..133 # confirmacao do numero do titulo no banco
|
50
|
+
# :brancos, 134..145 # complemento de registro
|
51
|
+
|
52
|
+
# :vencimento, 146..151 # data de vencimento do titulo (ddmmaa)
|
53
|
+
parse.field :data_vencimento, 146..151
|
54
|
+
|
55
|
+
# :valor_do_titulo, 152..164 # valor nominal do titulo (ultimos 2 digitos, virgula decimal assumida)
|
56
|
+
parse.field :valor_titulo, 152..164
|
57
|
+
|
58
|
+
# :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
|
59
|
+
parse.field :banco_recebedor, 165..167
|
60
|
+
|
61
|
+
# :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
|
62
|
+
# :dac_ag_cobradora, 172..172 # dac da agencia cobradora
|
63
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
64
|
+
|
65
|
+
# :especie, 173..174 # especie do titulo
|
66
|
+
parse.field :especie_documento, 173..174
|
67
|
+
|
68
|
+
# :tarifa_de_cobranca, 175..187 # valor da despesa de cobranca (ultimos 2 digitos, virgula decimal assumida)
|
69
|
+
parse.field :valor_tarifa, 175..187
|
70
|
+
|
71
|
+
# :outras_despesas 188..200, # valor de outras despesas ou custos do protesto
|
72
|
+
# :juros_operacao_em_atraso, 201..213 # zeros?
|
73
|
+
|
74
|
+
# :valor_do_iof, 214..226 # valor do iof a ser recolhido (ultimos 2 digitos, virgula decimal assumida)
|
75
|
+
parse.field :iof, 214..226
|
76
|
+
|
77
|
+
# :valor_abatimento, 227..239 # valor do abatimento concedido (ultimos 2 digitos, virgula decimal assumida)
|
78
|
+
parse.field :valor_abatimento, 227..239
|
79
|
+
|
80
|
+
# :descontos, 240..252 # valor do desconto concedido (ultimos 2 digitos, virgula decimal assumida)
|
81
|
+
parse.field :desconto, 240..252
|
82
|
+
|
83
|
+
# :valor_recebido, 253..265 # valor lancado em conta corrente (ultimos 2 digitos, virgula decimal assumida)
|
84
|
+
parse.field :valor_recebido, 253..265
|
85
|
+
|
86
|
+
# :juros_mora, 266..278 # valor de mora e multa pagos pelo sacado (ultimos 2 digitos, virgula decimal assumida)
|
87
|
+
parse.field :juros_mora, 266..278
|
88
|
+
|
89
|
+
# :outros_creditos, 279..291 # valor de outros creditos (ultimos 2 digitos, virgula decimal assumida)
|
90
|
+
parse.field :outros_recebimento, 279..291
|
91
|
+
|
92
|
+
# :brancos, 292..293
|
93
|
+
# :motivo_do_codigo_de_ocorrencia, 294..294
|
94
|
+
|
95
|
+
# :data_credito, 295..300 # data de credito desta liquidacao
|
96
|
+
parse.field :data_credito, 295..300
|
97
|
+
|
98
|
+
# :origem_pagamento, 301..303
|
99
|
+
# :brancos, 304..313
|
100
|
+
# :cheque_bradesco, 314..317
|
101
|
+
# :motivo_rejeicao, 318..327
|
102
|
+
# :brancos, 328..367
|
103
|
+
# :numero_do_cartorio, 368..369
|
104
|
+
# :numero_do_protocolo, 370..379
|
105
|
+
# :brancos, 380..393
|
106
|
+
|
107
|
+
# :numero_sequencial, 394..399 # numero sequencial no arquivo
|
108
|
+
parse.field :sequencial, 394..399
|
109
|
+
end
|
110
|
+
|
111
|
+
def agencia_com_dv
|
112
|
+
"#{agencia_sem_dv}-#{agencia_sem_dv.modulo11}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'parseline'
|
3
|
+
|
4
|
+
module Brcobranca
|
5
|
+
module Retorno
|
6
|
+
module Cnab400
|
7
|
+
# Formato de Retorno CNAB 400
|
8
|
+
# Baseado em: http://download.itau.com.br/bankline/layout_cobranca_400bytes_cnab_itau_mensagem.pdf
|
9
|
+
class Itau < Brcobranca::Retorno::Cnab400::Base
|
10
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
11
|
+
|
12
|
+
# Load lines
|
13
|
+
def self.load_lines(file, options = {})
|
14
|
+
default_options = { except: [1] } # por padrao ignora a primeira linha que é header
|
15
|
+
options = default_options.merge!(options)
|
16
|
+
super file, options
|
17
|
+
end
|
18
|
+
|
19
|
+
fixed_width_layout do |parse|
|
20
|
+
# Todos os campos descritos no documento em ordem
|
21
|
+
# :tipo_de_registro, 0..0 # identificacao do registro transacao
|
22
|
+
# :codigo_de_inscricao, 1..2 # identificacao do tipo de inscrica/empresa
|
23
|
+
# :numero_de_inscricao, 3..16 #numero de inscricao da empresa (cpf/cnpj)
|
24
|
+
|
25
|
+
# :agencia, 17..20 #agencia mantenedora da conta
|
26
|
+
parse.field :agencia_com_dv, 17..20 # FIXME - SEM DIV
|
27
|
+
|
28
|
+
# :zeros, 21..22 # complemento de registro
|
29
|
+
|
30
|
+
# :conta, 23..27 #numero da conta corrente da empresa
|
31
|
+
# :dac, 28..28 #digito de auto conferencia ag/conta empresa
|
32
|
+
parse.field :cedente_com_dv, 23..28
|
33
|
+
|
34
|
+
# :brancos, 29..36 #complemento de registro
|
35
|
+
# :uso_da_empresa, 37..61 #identificacao do titulo na empresa
|
36
|
+
|
37
|
+
# :nosso_numero,62..69 # identificacao do titulo no banco
|
38
|
+
parse.field :nosso_numero, 62..69
|
39
|
+
|
40
|
+
# :brancos, 70..81 #complemento do registro
|
41
|
+
|
42
|
+
# :carteira, 82..84 #numero da carteira
|
43
|
+
parse.field :carteira_variacao, 82..84
|
44
|
+
|
45
|
+
# :nosso_numero, 85..92 #identificacao do titulo no banco (novamente?)
|
46
|
+
# :dac_nosso_numero, 93..93 #dac nosso numero
|
47
|
+
# :brancos, 94..106 #complemento do registro
|
48
|
+
|
49
|
+
# :carteira, 107..107 #código da carteira
|
50
|
+
parse.field :carteira, 107..107
|
51
|
+
|
52
|
+
# :cod_de_ocorrencia, 108..109 # código de ocorrencia
|
53
|
+
# :data_de_ocorrencia, 110..115 # data de ocorrencia no banco (ddmmaa)
|
54
|
+
# :n_do_documento, 116..125 # n umero do documento de cobranca (dupl, np etc)
|
55
|
+
# :nosso_numero, 126..133 # confirmacao do numero do titulo no banco
|
56
|
+
# :brancos, 134..145 #complemento de registro
|
57
|
+
|
58
|
+
# :vencimento, 146..151 #data de vencimento do titulo (ddmmaa)
|
59
|
+
parse.field :data_vencimento, 146..151
|
60
|
+
|
61
|
+
# :valor_do_titulo, 152..164 #valor nominal do titulo (ultimos 2 digitos, virgula decimal assumida)
|
62
|
+
parse.field :valor_titulo, 152..164
|
63
|
+
|
64
|
+
# :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
|
65
|
+
parse.field :banco_recebedor, 165..167
|
66
|
+
|
67
|
+
# :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
|
68
|
+
# :dac_ag_cobradora, 172..172 # dac da agencia cobradora
|
69
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
70
|
+
|
71
|
+
# :especie, 173..174 # especie do titulo
|
72
|
+
parse.field :especie_documento, 173..174
|
73
|
+
|
74
|
+
# :tarifa_de_cobranca, 175..187 #valor da despesa de cobranca (ultimos 2 digitos, virgula decimal assumida)
|
75
|
+
parse.field :valor_tarifa, 175..187
|
76
|
+
|
77
|
+
# :brancos, 188..213 #complemento do registro
|
78
|
+
|
79
|
+
# :valor_do_iof, 214..226 #valor do iof a ser recolhido (ultimos 2 digitos, virgula decimal assumida)
|
80
|
+
parse.field :iof, 214..226
|
81
|
+
|
82
|
+
# :valor_abatimento, 227..239 #valor do abatimento concedido (ultimos 2 digitos, virgula decimal assumida)
|
83
|
+
parse.field :valor_abatimento, 227..239
|
84
|
+
|
85
|
+
# :descontos, 240..252 #valor do desconto concedido (ultimos 2 digitos, virgula decimal assumida)
|
86
|
+
parse.field :desconto, 240..252
|
87
|
+
|
88
|
+
# :valor_principal, 253..265 #valor lancado em conta corrente (ultimos 2 digitos, virgula decimal assumida)
|
89
|
+
|
90
|
+
parse.field :valor_recebido, 253..265
|
91
|
+
|
92
|
+
# :juros_mora_multa, 266..278 #valor de mora e multa pagos pelo sacado (ultimos 2 digitos, virgula decimal assumida)
|
93
|
+
parse.field :juros_mora, 266..278
|
94
|
+
|
95
|
+
# :outros_creditos, 279..291 #valor de outros creditos (ultimos 2 digitos, virgula decimal assumida)
|
96
|
+
parse.field :outros_recebimento, 279..291
|
97
|
+
|
98
|
+
# :boleto_dda, 292..292 #indicador de boleto dda
|
99
|
+
# :brancos, 293..294 #complemento de registro
|
100
|
+
|
101
|
+
# :data_credito, 295..300 #data de credito desta liquidacao
|
102
|
+
parse.field :data_credito, 295..300
|
103
|
+
|
104
|
+
# :instr_cancelada, 301..304 # codigo da instrucao cancelada
|
105
|
+
# :brancos , 305..310 # complemento de registro
|
106
|
+
# :zeros, 311..323 #complemento de registro
|
107
|
+
# :nome_do_sacado, 324..353, #nome do sacado
|
108
|
+
# :brancos , 354..376 # complemento de registro
|
109
|
+
# :erros_msg, 377..384 #registros rejeitados ou laegacao do sacado ou registro de mensagem informativa
|
110
|
+
# :brancos, 385..391 #complemento de registro
|
111
|
+
# :cod_de_liquidacao, 392..393 #meio pelo qual o título foi liquidado
|
112
|
+
|
113
|
+
# :numero_sequencial, 394..399 #numero sequencial no arquivo
|
114
|
+
parse.field :sequencial, 394..399
|
115
|
+
|
116
|
+
# Campos da classe base que não encontrei a relação com CNAB400
|
117
|
+
# parse.field :tipo_cobranca, 80..80
|
118
|
+
# parse.field :tipo_cobranca_anterior, 81..81
|
119
|
+
# parse.field :natureza_recebimento, 86..87
|
120
|
+
# parse.field :convenio, 31..37
|
121
|
+
# parse.field :comando, 108..109
|
122
|
+
# parse.field :juros_desconto, 201..213
|
123
|
+
# parse.field :iof_desconto, 214..226
|
124
|
+
# parse.field :desconto_concedito, 240..252
|
125
|
+
# parse.field :outras_despesas, 279..291
|
126
|
+
# parse.field :abatimento_nao_aproveitado, 292..304
|
127
|
+
# parse.field :data_liquidacao, 295..300
|
128
|
+
# parse.field :valor_lancamento, 305..317
|
129
|
+
# parse.field :indicativo_lancamento, 318..318
|
130
|
+
# parse.field :indicador_valor, 319..319
|
131
|
+
# parse.field :valor_ajuste, 320..331
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# @author Kivanio Barbosa
|
3
|
+
module Brcobranca
|
4
|
+
# Métodos auxiliares
|
5
|
+
module Util
|
6
|
+
class Empresa
|
7
|
+
|
8
|
+
def initialize(documento, zero=true)
|
9
|
+
@documento = documento
|
10
|
+
@zero = zero
|
11
|
+
end
|
12
|
+
|
13
|
+
# Tipo de empresa (fisica ou juridica)
|
14
|
+
# de acordo com o documento (CPF/CNPJ)
|
15
|
+
# 1 = CPF
|
16
|
+
# 2 = CNPJ
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
# @param [String] documento Número do documento da empresa
|
20
|
+
# @param [Boollean] zero Incluir zero a esquerda
|
21
|
+
def tipo
|
22
|
+
@tipo = @documento.somente_numeros.size <= 11 ? '1' : '2'
|
23
|
+
@tipo = @tipo.rjust(2, '0') if @zero
|
24
|
+
@tipo
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/lib/brcobranca/version.rb
CHANGED