br_boleto 1.2.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -46,7 +46,7 @@ module BrBoleto
46
46
  # 3 posições
47
47
  #
48
48
  def segmento_q_posicao_001_a_003
49
- codigo_banco
49
+ conta.codigo_banco
50
50
  end
51
51
 
52
52
  # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
@@ -56,7 +56,7 @@ module BrBoleto
56
56
  # 4 posições
57
57
  #
58
58
  def segmento_q_posicao_004_a_007(numero_do_lote)
59
- numero_do_lote.to_s.rjust(4, '0')
59
+ "#{numero_do_lote}".adjust_size_to(4, '0', :right)
60
60
  end
61
61
 
62
62
  # Tipo do registro -> Padrão 3
@@ -70,7 +70,7 @@ module BrBoleto
70
70
  # 5 posições
71
71
  #
72
72
  def segmento_q_posicao_009_a_013(sequencial)
73
- sequencial.to_s.rjust(5, '0')
73
+ "#{sequencial}".adjust_size_to(5, '0', :right)
74
74
  end
75
75
 
76
76
  # Cód. Segmento do Registro Detalhe
@@ -98,84 +98,84 @@ module BrBoleto
98
98
  # 1 posição
99
99
  #
100
100
  def segmento_q_posicao_018_a_018(pagamento)
101
- pagamento.tipo_documento_sacado(1)
101
+ pagamento.pagador.tipo_cpf_cnpj(1)
102
102
  end
103
103
 
104
104
  # Número de Inscrição
105
105
  # 15 posições
106
106
  #
107
107
  def segmento_q_posicao_019_a_033(pagamento)
108
- BrBoleto::Helper::CpfCnpj.new(pagamento.documento_sacado).sem_formatacao.rjust(15, '0')
108
+ "#{pagamento.pagador.cpf_cnpj}".adjust_size_to(15, '0', :right)
109
109
  end
110
110
 
111
111
  # Nome do sacado
112
112
  # 40 posições
113
113
  #
114
114
  def segmento_q_posicao_034_a_073(pagamento)
115
- pagamento.nome_sacado.adjust_size_to(40)
115
+ "#{pagamento.pagador.nome}".adjust_size_to(40)
116
116
  end
117
117
 
118
118
  # Endereço sacado
119
119
  # 40 posições
120
120
  #
121
121
  def segmento_q_posicao_074_a_113(pagamento)
122
- pagamento.endereco_sacado.adjust_size_to(40)
122
+ "#{pagamento.pagador.endereco}".adjust_size_to(40)
123
123
  end
124
124
 
125
125
  # Bairro do sacado
126
126
  # 15 posições
127
127
  #
128
128
  def segmento_q_posicao_114_a_128(pagamento)
129
- pagamento.bairro_sacado.adjust_size_to(15)
129
+ "#{pagamento.pagador.bairro}".adjust_size_to(15)
130
130
  end
131
131
 
132
132
  # CEP (prefixo)
133
133
  # 5 posições
134
134
  #
135
135
  def segmento_q_posicao_129_a_133(pagamento)
136
- pagamento.cep_sacado[0..4]
136
+ "#{pagamento.pagador.cep}"[0..4]
137
137
  end
138
138
 
139
139
  # CEP sufixo
140
140
  # 3 posições
141
141
  #
142
142
  def segmento_q_posicao_134_a_136(pagamento)
143
- pagamento.cep_sacado[5..7]
143
+ "#{pagamento.pagador.cep}"[5..7]
144
144
  end
145
145
 
146
146
  # Cidade
147
147
  # 15 posições
148
148
  #
149
149
  def segmento_q_posicao_137_a_151(pagamento)
150
- pagamento.cidade_sacado.adjust_size_to(15)
150
+ "#{pagamento.pagador.cidade}".adjust_size_to(15)
151
151
  end
152
152
 
153
153
  # Unidade da Federação
154
154
  # 2 posuções
155
155
  #
156
156
  def segmento_q_posicao_152_a_153(pagamento)
157
- pagamento.uf_sacado
157
+ "#{pagamento.pagador.uf}".adjust_size_to(2)
158
158
  end
159
159
 
160
160
  # Tipo de Inscrição
161
161
  # 1 posição
162
162
  #
163
163
  def segmento_q_posicao_154_a_154(pagamento)
164
- pagamento.tipo_documento_avalista(1)
164
+ pagamento.pagador.tipo_documento_avalista(1)
165
165
  end
166
166
 
167
- # Número de Inscrição
167
+ # CNPF/CNPJ Avalista
168
168
  # 15 posições
169
169
  #
170
170
  def segmento_q_posicao_155_a_169(pagamento)
171
- BrBoleto::Helper::CpfCnpj.new("#{pagamento.documento_avalista}").sem_formatacao.rjust(15, '0')
171
+ "#{pagamento.pagador.documento_avalista}".adjust_size_to(15, '0', :right)
172
172
  end
173
173
 
174
174
  # Nome do avalista
175
175
  # 40 posições
176
176
  #
177
177
  def segmento_q_posicao_170_a_209(pagamento)
178
- "#{pagamento.nome_avalista}".adjust_size_to(40)
178
+ "#{pagamento.pagador.nome_avalista}".adjust_size_to(40)
179
179
  end
180
180
 
181
181
  # Cód. Bco. Corresp. na Compensação
@@ -52,7 +52,7 @@ module BrBoleto
52
52
  # 3 posições
53
53
  #
54
54
  def segmento_r_posicao_001_a_003
55
- codigo_banco
55
+ conta.codigo_banco
56
56
  end
57
57
 
58
58
  # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
@@ -62,7 +62,7 @@ module BrBoleto
62
62
  # 4 posições
63
63
  #
64
64
  def segmento_r_posicao_004_a_007(numero_do_lote)
65
- numero_do_lote.to_s.rjust(4, '0')
65
+ "#{numero_do_lote}".adjust_size_to(4, '0', :right)
66
66
  end
67
67
 
68
68
  # Tipo do registro -> Padrão 3
@@ -76,7 +76,7 @@ module BrBoleto
76
76
  # 5 posições
77
77
  #
78
78
  def segmento_r_posicao_009_a_013(sequencial)
79
- sequencial.to_s.rjust(5, '0')
79
+ "#{sequencial}".adjust_size_to(5, '0', :right)
80
80
  end
81
81
 
82
82
  # Cód. Segmento do Registro Detalhe
@@ -36,7 +36,7 @@ module BrBoleto
36
36
  # 3 posições
37
37
  #
38
38
  def segmento_s_posicao_001_a_003
39
- codigo_banco
39
+ conta.codigo_banco
40
40
  end
41
41
 
42
42
  # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
@@ -46,7 +46,7 @@ module BrBoleto
46
46
  # 4 posições
47
47
  #
48
48
  def segmento_s_posicao_004_a_007(numero_do_lote)
49
- numero_do_lote.to_s.rjust(4, '0')
49
+ "#{numero_do_lote}".adjust_size_to(4, '0', :right)
50
50
  end
51
51
 
52
52
  # Tipo do registro -> Padrão 3
@@ -60,7 +60,7 @@ module BrBoleto
60
60
  # 5 posições
61
61
  #
62
62
  def segmento_s_posicao_009_a_013(sequencial)
63
- sequencial.to_s.rjust(5, '0')
63
+ "#{sequencial}".adjust_size_to(5, '0', :right)
64
64
  end
65
65
 
66
66
  # Cód. Segmento do Registro Detalhe
@@ -30,7 +30,7 @@ module BrBoleto
30
30
  # 3 posições
31
31
  #
32
32
  def trailer_arquivo_posicao_001_a_003
33
- codigo_banco
33
+ conta.codigo_banco
34
34
  end
35
35
 
36
36
  # Lote de Serviço -> Padrão 9999
@@ -65,14 +65,14 @@ module BrBoleto
65
65
  # 6 posições
66
66
  #
67
67
  def trailer_arquivo_posicao_018_a_023(nro_lotes)
68
- nro_lotes.to_s.rjust(6, '0')
68
+ "#{nro_lotes}".adjust_size_to(6, '0', :right)
69
69
  end
70
70
 
71
71
  # Quantidade de Registros do Arquivo
72
72
  # 6 posições
73
73
  #
74
74
  def trailer_arquivo_posicao_024_a_029(sequencial)
75
- sequencial.to_s.rjust(6, '0')
75
+ "#{sequencial}".adjust_size_to(6, '0', :right)
76
76
  end
77
77
 
78
78
  # Qtde de Contas p/ Conc. (Lotes)
@@ -28,7 +28,7 @@ module BrBoleto
28
28
  # 3 posições
29
29
  #
30
30
  def trailer_lote_posicao_001_a_003
31
- codigo_banco
31
+ conta.codigo_banco
32
32
  end
33
33
 
34
34
  # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
@@ -38,7 +38,7 @@ module BrBoleto
38
38
  # 4 posições
39
39
  #
40
40
  def trailer_lote_posicao_004_a_007(numero_do_lote)
41
- numero_do_lote.to_s.rjust(4, '0')
41
+ "#{numero_do_lote}".adjust_size_to(4, '0', :right)
42
42
  end
43
43
 
44
44
  # Tipo do registro -> Padrão 5
@@ -59,7 +59,7 @@ module BrBoleto
59
59
  # 6 posições
60
60
  #
61
61
  def trailer_lote_posicao_018_a_023(nro_registros)
62
- nro_registros.to_s.rjust(6, '0')
62
+ "#{nro_registros}".adjust_size_to(6, '0', :right)
63
63
  end
64
64
 
65
65
  # Complemento trailer diferente para cada banco
@@ -3,82 +3,33 @@ module BrBoleto
3
3
  module Remessa
4
4
  module Cnab240
5
5
  class Sicoob < BrBoleto::Remessa::Cnab240::Base
6
+ def conta_class
7
+ BrBoleto::Conta::Sicoob
8
+ end
6
9
 
7
- #O banco siccob utiliza a combinação da carteira e modalidade para
8
- # saber se é um pagamento com registro, sem registrou ou caucionada.
9
- # Carteira / Modalidade = Tipo de pagamento
10
- # 1 / 01 = Simples com Registro
11
- # 1 / 02 = Simples sem Registro
12
- # 3 / 03 = Garantia caicionada
13
- #
14
- attr_accessor :modalidade_carteira
15
-
16
-
10
+ # Tipo Formulário - 01 posição (15 a 15):
11
+ # "1" -auto-copiativo
12
+ # "3" -auto-envelopável
13
+ # "4" -A4 sem envelopamento
14
+ # "6" -A4 sem envelopamento 3 vias
17
15
  attr_accessor :tipo_formulario
18
- # Tipo Formulário - 01 posição (15 a 15):
19
- # "1" -auto-copiativo
20
- # "3" -auto-envelopável
21
- # "4" -A4 sem envelopamento
22
- # "6" -A4 sem envelopamento 3 vias
23
-
24
- attr_accessor :parcela
25
- # Parcela - 02 posições (11 a 12) - "01" se parcela única
26
16
 
27
- def convenio_obrigatorio?
28
- false
29
- end
30
-
31
- validates :modalidade_carteira, :tipo_formulario, :conta_corrente, :parcela, presence: true
32
- # Remessa 400 - 8 digitos
33
- # Remessa 240 - 12 digitos
34
- validates :conta_corrente, length: {maximum: 12, message: 'deve ter no máximo 12 dígitos.'}
35
- validates :agencia, length: {is: 4, message: 'deve ter 4 dígitos.'}
36
- validates :modalidade_carteira, length: {is: 2, message: 'deve ter 2 dígitos.'}
17
+ #################### VALIDAÇÕES DA CONTA #####################
18
+ def valid_modalidade_required; true end # <= Modalidade é obrigatória
19
+ def valid_codigo_cedente_required; true end # <= Código do cedente/beneficiário/convenio deve ser obrigatorio
20
+ def valid_conta_corrente_required; true end # <= Conta corrente obrigatória
21
+ def valid_conta_corrente_maximum; 12 end # <= Máximo de digitos da conta corrente
22
+ def valid_modalidade_length; 2 end # <= Modalidade deve ter 2 digitos
23
+ ##############################################################
37
24
 
25
+ validates :tipo_formulario, presence: true
26
+
38
27
  def default_values
39
28
  super.merge({
40
- emissao_boleto: '2',
41
- distribuicao_boleto: '2',
42
- especie_titulo: '02', # 02 = DM Duplicata mercantil
43
- tipo_formulario: '4',
44
- parcela: '01',
45
- modalidade_carteira: '01',
46
- forma_cadastramento: '0'
29
+ tipo_formulario: '4'
47
30
  })
48
31
  end
49
32
 
50
- def convenio
51
- "#{@convenio}".adjust_size_to(20)
52
- end
53
-
54
- def codigo_banco
55
- '756'
56
- end
57
-
58
- def nome_banco
59
- 'SICOOB'.ljust(30, ' ')
60
- end
61
-
62
- def versao_layout_arquivo
63
- '081'
64
- end
65
-
66
- def versao_layout_lote
67
- '040'
68
- end
69
-
70
- def digito_agencia
71
- # utilizando a agencia com 4 digitos
72
- # para calcular o digito
73
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
74
- end
75
-
76
- def digito_conta
77
- # utilizando a conta corrente com 5 digitos
78
- # para calcular o digito
79
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(conta_corrente).to_s
80
- end
81
-
82
33
  def codigo_convenio
83
34
  # CAMPO TAMANHO
84
35
  # num. convenio 20 BRANCOS
@@ -96,7 +47,11 @@ module BrBoleto
96
47
  # conta corrente 12
97
48
  # digito conta 1
98
49
  # digito agencia/conta 1
99
- "#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta}".adjust_size_to(20)
50
+ result = "#{conta.agencia}".adjust_size_to(5, '0', :right)
51
+ result << "#{conta.agencia_dv}"
52
+ result << "#{conta.conta_corrente}".adjust_size_to(12, '0', :right)
53
+ result << "#{conta.conta_corrente_dv}"
54
+ result.adjust_size_to(20)
100
55
  end
101
56
 
102
57
  def complemento_header_arquivo
@@ -107,9 +62,13 @@ module BrBoleto
107
62
  # CAMPO TAMANHO
108
63
  # conta corrente 12
109
64
  # digito conta 1
110
- # digito agencia/conta 1
65
+ # digito agencia/conta 1 # Branco
111
66
  # ident. titulo no banco 20
112
- "#{conta_corrente.to_s.rjust(12, '0')}#{digito_conta} #{formata_nosso_numero(pagamento.nosso_numero)}"
67
+ result = "#{conta.conta_corrente}".adjust_size_to(12, '0', :right)
68
+ result << "#{conta.conta_corrente_dv}".adjust_size_to(1)
69
+ result << " "
70
+ result << "#{formata_nosso_numero(pagamento)}"
71
+ result
113
72
  end
114
73
 
115
74
  # Tipo de cobrança
@@ -119,7 +78,7 @@ module BrBoleto
119
78
  # É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
120
79
  #
121
80
  def tipo_cobranca_formatada
122
- case "#{modalidade_carteira}".rjust(2, "0")
81
+ case "#{conta.modalidade}".rjust(2, "0")
123
82
  when '01', '02'
124
83
  :simples
125
84
  when '03'
@@ -142,8 +101,12 @@ module BrBoleto
142
101
  # "4" -A4 sem envelopamento
143
102
  # "6" -A4 sem envelopamento 3 vias
144
103
  # Em branco - 05 posições (16 a 20)
145
- def formata_nosso_numero(nosso_numero)
146
- "#{nosso_numero.to_s.rjust(10, '0')}#{parcela}#{modalidade_carteira}#{tipo_formulario}".adjust_size_to(20)
104
+ def formata_nosso_numero(pagamento)
105
+ result = "#{pagamento.nosso_numero}".adjust_size_to(10, '0', :right)
106
+ result << "#{pagamento.parcela}".adjust_size_to(2, '0', :right)
107
+ result << "#{conta.modalidade}".adjust_size_to(2, '0', :right)
108
+ result << "#{tipo_formulario}".adjust_size_to(1, '1')
109
+ result.adjust_size_to(20)
147
110
  end
148
111
 
149
112
  def complemento_trailer_lote(lote, nr_lote)
@@ -0,0 +1,95 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'br_boleto/remessa/cnab400/helper/header'
3
+ require 'br_boleto/remessa/cnab400/helper/detalhe'
4
+ require 'br_boleto/remessa/cnab400/helper/trailer'
5
+
6
+ module BrBoleto
7
+ module Remessa
8
+ module Cnab400
9
+ class Base < BrBoleto::Remessa::Base
10
+ # Utilizado para montar o header
11
+ include BrBoleto::Remessa::Cnab400::Helper::Header
12
+ # Utilizado para montar oS DETALHES
13
+ include BrBoleto::Remessa::Cnab400::Helper::Detalhe
14
+ # Utilizado para montar o trailer do arquivo
15
+ include BrBoleto::Remessa::Cnab400::Helper::Trailer
16
+
17
+ include BrBoleto::HavePagamentos
18
+
19
+ # Informacoes da conta do cedente
20
+ # Este metodo deve ser sobrescrevido na classe do banco
21
+ # Tamanho: 20
22
+ def informacoes_da_conta(local)
23
+ raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
24
+ end
25
+
26
+ # Informações do banco
27
+ # Padrão:
28
+ # 077 a 079 = Código do banco com 3 posições
29
+ # 080 a 094 = Nome do banco com 15 posições
30
+ # Tamanho: 018
31
+ def informacoes_do_banco
32
+ "#{conta.codigo_banco}#{conta.nome_banco}".adjust_size_to(18)
33
+ end
34
+
35
+ # Complemento do registro
36
+ # Vai na posição 101 até 394
37
+ # Tamanho: 294
38
+ def complemento_registro
39
+ raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
40
+ end
41
+
42
+ # Nosso numero do pagamento e outras informações
43
+ # Vai na posição 063 até 076
44
+ # Tamanho: 14
45
+ def dados_do_pagamento(pagamento)
46
+ raise NotImplementedError.new("Sobreescreva o metodo #dados_do_pagamento para a class #{self}")
47
+ end
48
+
49
+ # Informações referente a cobrança do pagamento
50
+ def informacoes_do_pagamento(pagamento, sequencial)
51
+ raise NotImplementedError.new("Sobreescreva o metodo #informacoes_do_pagamento para a class #{self}")
52
+ end
53
+
54
+ # Informações referente aos juros e multas do pagamento
55
+ # Posição 161 a 218
56
+ # Tamanho: 58
57
+ def detalhe_multas_e_juros_do_pagamento(pagamento, sequencial)
58
+ raise NotImplementedError.new("Sobreescreva o metodo #detalhe_multas_e_juros_do_pagamento para a class #{self}")
59
+ end
60
+
61
+ # Informações referente aos dados do sacado/pagador
62
+ # Posição 219 a 394
63
+ # Tamanho: 176
64
+ def informacoes_do_sacado(pagamento, sequencial)
65
+ raise NotImplementedError.new("Sobreescreva o metodo #informacoes_do_sacado para a class #{self}")
66
+ end
67
+
68
+ # Gera os dados para o arquivo remessa
69
+ #
70
+ def dados_do_arquivo
71
+ return if self.invalid?
72
+
73
+ # contador dos registros do lote
74
+ contador = 1
75
+
76
+ # Metodo 'monta_header' implementado no module -> BrBoleto::Remessa::Cnab400::Helper::Header
77
+ arquivo = [monta_header]
78
+ contador += 1
79
+
80
+ pagamentos.each do |pagamento|
81
+ arquivo << monta_detalhe(pagamento, contador)
82
+ contador += 1
83
+ end
84
+
85
+ # Metodo 'monta_trailer' implementado no module -> BrBoleto::Remessa::Cnab400::Helper::Trailer
86
+ arquivo << monta_trailer(contador)
87
+
88
+ retorno = arquivo.join("\n")
89
+ ActiveSupport::Inflector.transliterate(retorno).upcase
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,136 @@
1
+ module BrBoleto
2
+ module Remessa
3
+ module Cnab400
4
+ module Helper
5
+ module Detalhe
6
+ # Monta o registro segmento P do arquivo
7
+ #
8
+ # @param pagamento [BrBoleto::Remessa::Pagamento]
9
+ # objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
10
+ # @param nr_lote [Integer]
11
+ # numero do lote que o segmento esta inserido
12
+ # @param sequencial [Integer]
13
+ # numero sequencial do registro no lote
14
+ #
15
+ # @return [String]
16
+ #
17
+ def monta_detalhe(pagamento, sequencial)
18
+ # campos com * na frente nao foram implementados
19
+ # # DESCRICAO TAMANHO
20
+ detalhe = ''
21
+
22
+ detalhe << detalhe_posicao_001_001 # Identificação do Registro Detalhe
23
+ detalhe << detalhe_posicao_002_003 # Tipo de inscrição do beneficiario
24
+ detalhe << detalhe_posicao_004_017 # CNPJ do beneficiario
25
+ detalhe << detalhe_posicao_018_037 # Informações da conta
26
+ detalhe << detalhe_posicao_038_062 # Numero de controle do participante
27
+ detalhe << detalhe_posicao_063_076(pagamento, sequencial) # Nosso número com DV
28
+ detalhe << detalhe_posicao_077_108(pagamento, sequencial) # Diferente para cada banco
29
+ detalhe << detalhe_posicao_109_110(pagamento, sequencial) # Comando/Movimento
30
+ detalhe << detalhe_posicao_111_120(pagamento, sequencial) # Seu número
31
+ detalhe << detalhe_posicao_121_160(pagamento, sequencial) # Informações do pagamento
32
+ detalhe << detalhe_posicao_161_218(pagamento, sequencial) # Informações de multa e juros
33
+ detalhe << detalhe_posicao_219_394(pagamento, sequencial) # Informações do sacado/pagador
34
+ detalhe << detalhe_posicao_395_400(pagamento, sequencial) # Sequencial
35
+ detalhe.upcase
36
+ end
37
+
38
+ # Identificação do Registro Detalhe
39
+ # Padrão: 1
40
+ # Tipo: Numero
41
+ # Tamanho: 001
42
+ def detalhe_posicao_001_001
43
+ '1'
44
+ end
45
+
46
+ # Tipo de inscrição do beneficiario
47
+ # 01 = CPF
48
+ # 02 = CNPJ
49
+ # Tipo: Numero
50
+ # Tamanho: 002
51
+ def detalhe_posicao_002_003
52
+ conta.tipo_cpf_cnpj
53
+ end
54
+
55
+ # CNPJ/CPF do beneficiário
56
+ # Tipo: Numero
57
+ # Tamanho: 014
58
+ def detalhe_posicao_004_017
59
+ "#{conta.cpf_cnpj}".adjust_size_to(14, '0', :right)
60
+ end
61
+
62
+ # Informações da conta
63
+ # Tipo: Numero
64
+ # Tamanho: 20
65
+ def detalhe_posicao_018_037
66
+ informacoes_da_conta(:detalhe)
67
+ end
68
+
69
+ # Numero de controle do participante
70
+ # Padrão: " " Brancos
71
+ # Tipo: String
72
+ # Tamanho: 25
73
+ def detalhe_posicao_038_062
74
+ ''.adjust_size_to(25)
75
+ end
76
+
77
+ # Nosso numero e informações do pagaemnto
78
+ # Tamanho: 14
79
+ def detalhe_posicao_063_076(pagamento, sequencial)
80
+ dados_do_pagamento(pagamento)
81
+ end
82
+
83
+ # Diferente para cada banco
84
+ # Tipo: X N
85
+ # Tamanho: 32
86
+ def detalhe_posicao_077_108(pagamento, sequencial)
87
+ raise NotImplementedError.new("Sobreescreva o metodo #detalhe_posicao_077_108 para a class #{self}")
88
+ end
89
+
90
+ # Comando/Movimento
91
+ # Tipo: N
92
+ # Padrão: '01' = Registro de títulos
93
+ # Tamanho: 2
94
+ def detalhe_posicao_109_110(pagamento, sequencial)
95
+ "#{pagamento.identificacao_ocorrencia}".adjust_size_to(2, '0', :right)
96
+ end
97
+
98
+ # Seu número
99
+ # Tipo: N
100
+ # Tamanho: 10
101
+ def detalhe_posicao_111_120(pagamento, sequencial)
102
+ "#{pagamento.numero_documento}".adjust_size_to(10, '0', :right)
103
+ end
104
+
105
+ # Informações do pagamento
106
+ # Tipo: XN
107
+ # Tamanho: 40
108
+ def detalhe_posicao_121_160(pagamento, sequencial)
109
+ informacoes_do_pagamento(pagamento, sequencial)
110
+ end
111
+
112
+ # Informações de multa e juros
113
+ # Tipo: XN
114
+ # Tamanho: 58
115
+ def detalhe_posicao_161_218(pagamento, sequencial)
116
+ detalhe_multas_e_juros_do_pagamento(pagamento, sequencial)
117
+ end
118
+
119
+ # Informações do sacado
120
+ # Tipo: XN
121
+ # Tamanho: 176
122
+ def detalhe_posicao_219_394(pagamento, sequencial)
123
+ informacoes_do_sacado(pagamento, sequencial)
124
+ end
125
+
126
+ # Sequencial do registro
127
+ # Tipo: N
128
+ # Tamanho: 6
129
+ def detalhe_posicao_395_400(pagamento, sequencial)
130
+ "#{sequencial}".adjust_size_to(6, '0', :right)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end