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
@@ -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, :documento_cedente, message: 'não pode estar em branco.'
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 << tipo_empresa # tipo de identificacao da empresa 9[02]
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(tamanho = 2)
146
- documento_sacado.size < 14 ? '1'.rjust(tamanho, '0') : '2'.rjust(tamanho, '0')
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(tamanho = 2)
154
- return 0 if documento_avalista.nil?
155
- documento_avalista.size < 14 ? '1'.rjust(tamanho, '0') : '2'.rjust(tamanho, '0')
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
@@ -4,6 +4,7 @@ module Brcobranca
4
4
  module Retorno
5
5
  class Base # Classe base para retornos bancários
6
6
  attr_accessor :agencia_com_dv
7
+ attr_accessor :agencia_sem_dv
7
8
  attr_accessor :cedente_com_dv
8
9
  attr_accessor :convenio
9
10
  attr_accessor :nosso_numero
@@ -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
@@ -1,5 +1,10 @@
1
1
  # -*- encoding: utf-8 -*-
2
-
2
+ #
3
+ # DEPRECATED
4
+ #
5
+ # Classe original desenvolvida a partir do layout do Itau.
6
+ # Movido para: cnab400/itau.rb
7
+ #
3
8
  require 'parseline'
4
9
  module Brcobranca
5
10
  module Retorno
@@ -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
+
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module Brcobranca
4
- VERSION = '5.0.0'
4
+ VERSION = '5.0.1'
5
5
  end