br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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