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
@@ -0,0 +1,114 @@
1
+ module BrBoleto
2
+ module Remessa
3
+ module Cnab400
4
+ module Helper
5
+ module Header
6
+ # Monta o registro header do arquivo
7
+ #
8
+ # @return [String]
9
+ #
10
+ def monta_header
11
+ header = '' # TAMANHO INFORMAÇÃO
12
+ header << header_posicao_001_a_001 # 001 Código do registro
13
+ header << header_posicao_002_a_002 # 001 Código da remessa
14
+ header << header_posicao_003_a_009 # 007 Literal de transmissão
15
+ header << header_posicao_010_a_011 # 002 Código do serviço
16
+ header << header_posicao_012_a_026 # 015 Literal de serviço
17
+ header << header_posicao_027_a_046 # 020 Informações da conta <- Específico para cada banco
18
+ header << header_posicao_047_a_076 # 030 Nome do cedente
19
+ header << header_posicao_077_a_094 # 018 Informações do banco
20
+ header << header_posicao_095_a_100 # 006 Data de Gravação
21
+ header << header_posicao_101_a_394 # 294 Complemento do registro
22
+ header << header_posicao_395_a_400 # 006 Número sequencial do registro no arquivo
23
+ header.upcase
24
+ end
25
+
26
+ # Código do registro
27
+ # Padrão: 0
28
+ # Tipo: Numérico
29
+ # Tamanho: 001
30
+ def header_posicao_001_a_001
31
+ '0'
32
+ end
33
+
34
+ # Código da remessa
35
+ # Padrão: 1
36
+ # Tipo: Numérico
37
+ # Tamanho: 001
38
+ def header_posicao_002_a_002
39
+ '0'
40
+ end
41
+
42
+ # Literal de transmissão
43
+ # Padrão: REMESSA
44
+ # Tipo: Caracteres
45
+ # Tamanho: 007
46
+ def header_posicao_003_a_009
47
+ 'REMESSA'
48
+ end
49
+
50
+ # Código do serviço
51
+ # Padrão: 01
52
+ # Tipo: Numérico
53
+ # Tamanho: 002
54
+ def header_posicao_010_a_011
55
+ '01'
56
+ end
57
+
58
+ # Literal de serviço
59
+ # Padrão: COBRANÇA
60
+ # Tipo: Caracteres
61
+ # Tamanho: 015
62
+ def header_posicao_012_a_026
63
+ 'COBRANÇA'.ljust(15, ' ')
64
+ end
65
+
66
+ # Informações da conta <- Específico para cada banco
67
+ # Tipo: Numérico
68
+ # Tamanho: 020
69
+ def header_posicao_027_a_046
70
+ informacoes_da_conta(:header)
71
+ end
72
+
73
+ # Nome do cedente
74
+ # Tipo: Caracteres
75
+ # Tamanho: 030
76
+ def header_posicao_047_a_076
77
+ "#{conta.razao_social}".adjust_size_to(30)
78
+ end
79
+
80
+ # Informações do banco
81
+ # Padrão:
82
+ # 077 a 079 = Código do banco com 3 posições
83
+ # 080 a 094 = Nome do banco com 15 posições
84
+ # Tamanho: 018
85
+ def header_posicao_077_a_094
86
+ informacoes_do_banco
87
+ end
88
+
89
+ # Data de Gravação
90
+ # Tipo: Numérico
91
+ # Tamanho: 006
92
+ def header_posicao_095_a_100
93
+ data_geracao('%d%m%y')
94
+ end
95
+
96
+ # Complemento do registro
97
+ # Vai na posição 101 até 394
98
+ # Tamanho: 294
99
+ def header_posicao_101_a_394
100
+ complemento_registro
101
+ end
102
+
103
+ # Número sequencial do registro no arquivo
104
+ # Padrão: 000001
105
+ # Tipo: Numérico
106
+ # Tamanho: 006
107
+ def header_posicao_395_a_400
108
+ '000001'
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,50 @@
1
+ module BrBoleto
2
+ module Remessa
3
+ module Cnab400
4
+ module Helper
5
+ module Trailer
6
+
7
+ # Monta o registro trailer do arquivo
8
+ #
9
+ # @param nro_lotes [Integer]
10
+ # numero de lotes no arquivo
11
+ # @param sequencial [Integer]
12
+ # numero de registros(linhas) no arquivo
13
+ #
14
+ # @return [String]
15
+ #
16
+ def monta_trailer(sequencial)
17
+ trailer_arquivo = '' # CAMPO
18
+ trailer_arquivo << trailer_arquivo_posicao_001_a_001 # Identificação do Trailer
19
+ trailer_arquivo << trailer_arquivo_posicao_002_a_394(sequencial) # Mensagens
20
+ trailer_arquivo << trailer_arquivo_posicao_394_a_400(sequencial) # Sequencial do registro
21
+ trailer_arquivo.upcase
22
+ end
23
+
24
+ # Identificação do Registro Trailer
25
+ # Padrão: '9'
26
+ # Tipo: N
27
+ # Tamanho: 001
28
+ def trailer_arquivo_posicao_001_a_001
29
+ '9'
30
+ end
31
+
32
+ # Mensagens
33
+ # Padrão: ' ' (393 brancos)
34
+ # Tipo: X
35
+ # Tamanho: 393
36
+ def trailer_arquivo_posicao_002_a_394(sequencial)
37
+ ''.rjust(393, ' ')
38
+ end
39
+
40
+ # Sequencial do Trailer
41
+ # Tipo: N
42
+ # Tamanho: 6
43
+ def trailer_arquivo_posicao_394_a_400(sequencial)
44
+ "#{sequencial}".adjust_size_to(6, '0', :right)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,249 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module BrBoleto
3
+ module Remessa
4
+ module Cnab400
5
+ class Sicoob < BrBoleto::Remessa::Cnab400::Base
6
+ def conta_class
7
+ BrBoleto::Conta::Sicoob
8
+ end
9
+
10
+ # Informações da conta <- Específico para cada banco
11
+ # Posição: 027 até 046
12
+ # Tipo: Numérico
13
+ # Tamanho: 020
14
+ def informacoes_da_conta(local)
15
+ # POSIÇÂO TAM. Descrição
16
+ # 027 030 004 Prefixo da Cooperativa: vide planilha "Capa" deste arquivo
17
+ # 031 031 001 Dígito Verificador do Prefixo: vide planilha "Capa" deste arquivo
18
+ # 032 039 008 Código do Cliente/Beneficiário: vide planilha "Capa" deste arquivo
19
+ # 040 040 001 Dígito Verificador do Código: vide planilha "Capa" deste arquivo
20
+ # 041 046 006 Número do convênio líder: Brancos
21
+ info = "#{conta.agencia}".adjust_size_to(4, '0')
22
+ info << "#{conta.agencia_dv}".adjust_size_to(1,'0')
23
+ info << "#{conta.codigo_cedente}".adjust_size_to(8,'0', :right)
24
+ info << "#{conta.codigo_cedente_dv}".adjust_size_to(1,'0')
25
+
26
+ # A unica diferença entre o header e o delathe é que no
27
+ # header é preenchido com valores em branco, e no
28
+ # detalhe é preenchido com 0(zero)
29
+ conv = if local == :detalhe then '0' else ' ' end
30
+ info << ''.rjust(6, conv)
31
+
32
+ info.adjust_size_to(20)
33
+ end
34
+
35
+
36
+ # Complemento do registro
37
+ # Posição: 101 até 394
38
+ # Tamanho total: 294
39
+ def complemento_registro
40
+ # Posição TAM. Descrição
41
+ # 101 107 007 Seqüencial da Remessa: número seqüencial acrescido de 1 a cada remessa. Inicia com "0000001"
42
+ # 108 394 287 Complemento do Registro: Brancos
43
+ "#{sequencial_remessa}".rjust(7, '0').adjust_size_to(294)
44
+ end
45
+
46
+ # Nosso numero do pagamento e outras informações
47
+ # Posição: 063 até 076
48
+ # Tamanho: 14
49
+ def dados_do_pagamento(pagamento)
50
+ # 063 074 012 9(12) "Nosso Número:
51
+ # - Para comando 01 com emissão a cargo do Sicoob (vide e-mail enviado com os dados do processo de homologação e lista de comandos seq. 23): Preencher com zeros
52
+ # - Para comando 01 com emissão a cargo do Beneficiário ou para os demais comandos (vide e-mail enviado com os dados do processo de homologação e lista de comandos seq. 23):
53
+ # Preencher da seguinte forma:
54
+ # - Posição 063 a 073 – Número seqüencial a partir de ""0000000001"", não sendo admitida reutilização ou duplicidade.
55
+ # - Posição 074 a 074 – DV do Nosso-Número, calculado pelo módulo 11."
56
+ # 075 076 002 9(02) Número da Parcela: "01" se parcela única
57
+ dados = "#{pagamento.nosso_numero}".adjust_size_to(12, '0', :right)
58
+ dados << "#{pagamento.parcela}".adjust_size_to(2, '0', :right)
59
+ dados
60
+ end
61
+
62
+ # Informações diferenciadas para cada banco
63
+ # Posição: 077 até 108
64
+ # Tamanho: 32
65
+ def detalhe_posicao_077_108(pagamento, sequencial)
66
+ dados = ''
67
+ dados << '00' # 077 078 002 9(02) Grupo de Valor: "00"
68
+
69
+ dados << ''.rjust(3, ' ') # 079 081 003 X(03) Complemento do Registro: Brancos
70
+ dados << ' ' # 082 082 001 X(01) "Indicativo de Mensagem ou Sacador/Avalista:
71
+ # Brancos: Poderá ser informada nas posições 352 a 391 (SEQ 50) qualquer mensagem para ser impressa no boleto;
72
+ # “A”: Deverá ser informado nas posições 352 a 391 (SEQ 50) o nome e CPF/CNPJ do sacador"
73
+ dados << ''.rjust(3, ' ') # 083 085 003 X(03) Prefixo do Título: Brancos
74
+ dados << '000' # 086 088 003 9(03) Variação da Carteira: "000"
75
+ dados << '0' # 089 089 001 9(01) Conta Caução: "0"
76
+
77
+ dados << ''.rjust(5, '0') # 090 094 005 9(05) "Número do Contrato Garantia: Para Carteira 1 preencher ""00000""; Para Carteira 3 preencher com o número do contrato sem DV."
78
+ dados << '0' # 095 095 001 X(01) "DV do contrato: Para Carteira 1 preencher ""0""; Para Carteira 3 preencher com o Dígito Verificador."
79
+
80
+ dados << ''.rjust(6, '0') # 096 101 006 9(06) Numero do borderô: preencher em caso de carteira 3
81
+ dados << ''.rjust(4, ' ') # 102 105 004 X(04) Complemento do Registro: Brancos
82
+
83
+ dados << "#{pagamento.tipo_emissao}".adjust_size_to(1) # 106 106 001 9(01) "Tipo de Emissão: 1-Cooperativa 2-Cliente"
84
+ dados << "#{conta.modalidade}".adjust_size_to(2, '0', :right) # 107 108 002 9(02) "Carteira/Modalidade: 01 = Simples Com Registro 02 = Simples Sem Registro 03 = Garantida Caucionada "
85
+ dados
86
+ end
87
+
88
+ # Informações referente ao pagamento
89
+ # Posição 121 até 160
90
+ # Tamanho: 40
91
+ def informacoes_do_pagamento(pagamento, sequencial)
92
+ dados = ''
93
+ # POSIÇÂO TAM. TIPO
94
+ # 121 126 006 A(06) "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
95
+ dados << pagamento.data_vencimento_formatado('%d%m%y')
96
+
97
+ # 127 139 013 9(11) Valor do Titulo
98
+ dados << pagamento.valor_documento_formatado(13)
99
+
100
+ # 140 142 003 9(03) Número Banco: "756"
101
+ dados << conta.codigo_banco
102
+
103
+ # 143 146 004 9(04) Prefixo da Cooperativa: vide e-mail enviado com os dados do processo de homologação
104
+ dados << "#{conta.agencia}".adjust_size_to(4,'0', :right)
105
+
106
+ # 147 147 001 X(01) Dígito Verificador do Prefixo: vide e-mail enviado com os dados do processo de homologação
107
+ dados << "#{conta.agencia_dv}".adjust_size_to(1, '0')
108
+
109
+ # 148 149 002 9(02)
110
+ # "Espécie do Título :
111
+ # 01 = Duplicata Mercantil
112
+ # 02 = Nota Promissória
113
+ # 03 = Nota de Seguro
114
+ # 05 = Recibo
115
+ # 06 = Duplicata Rural
116
+ # 08 = Letra de Câmbio
117
+ # 09 = Warrant
118
+ # 10 = Cheque
119
+ # 12 = Duplicata de Serviço
120
+ # 13 = Nota de Débito
121
+ # 14 = Triplicata Mercantil
122
+ # 15 = Triplicata de Serviço
123
+ # 18 = Fatura
124
+ # 20 = Apólice de Seguro
125
+ # 21 = Mensalidade Escolar
126
+ # 22 = Parcela de Consórcio
127
+ # 99 = Outros"
128
+ dados << "#{pagamento.especie_titulo}".adjust_size_to(2, '0', :right)
129
+
130
+ # 150 150 001 X(01) "Aceite do Título: "0" = Sem aceite "1" = Com aceite"
131
+ dados << "#{pagamento.aceite ? '1' : '0'}".adjust_size_to(1, '0')
132
+
133
+ # 151 156 006 9(06) Data de Emissão do Título: formato ddmmaa
134
+ dados << pagamento.data_emissao_formatado('%d%m%y')
135
+
136
+ # 157 158 002 9(02) "Primeira instrução codificada:
137
+ # Regras de impressão de mensagens nos boletos:
138
+ # * Primeira instrução (SEQ 34) = 00 e segunda (SEQ 35) = 00, não imprime nada.
139
+ # * Primeira instrução (SEQ 34) = 01 e segunda (SEQ 35) = 01, desconsidera-se as instruções CNAB e imprime as mensagens relatadas no trailler do arquivo.
140
+ # * Primeira e segunda instrução diferente das situações acima, imprimimos o conteúdo CNAB:
141
+ # 00 = AUSENCIA DE INSTRUCOES
142
+ # 01 = COBRAR JUROS
143
+ # 03 = PROTESTAR 3 DIAS UTEIS APOS VENCIMENTO
144
+ # 04 = PROTESTAR 4 DIAS UTEIS APOS VENCIMENTO
145
+ # 05 = PROTESTAR 5 DIAS UTEIS APOS VENCIMENTO
146
+ # 07 = NAO PROTESTAR
147
+ # 10 = PROTESTAR 10 DIAS UTEIS APOS VENCIMENTO
148
+ # 15 = PROTESTAR 15 DIAS UTEIS APOS VENCIMENTO
149
+ # 20 = PROTESTAR 20 DIAS UTEIS APOS VENCIMENTO
150
+ # 22 = CONCEDER DESCONTO SO ATE DATA ESTIPULADA
151
+ # 42 = DEVOLVER APOS 15 DIAS VENCIDO
152
+ # 43 = DEVOLVER APOS 30 DIAS VENCIDO"
153
+ dados << '00'
154
+
155
+ # 159 160 002 9(02) Segunda instrução: vide SEQ 33
156
+ dados << '00'
157
+
158
+ dados
159
+ end
160
+
161
+ # Informações referente aos juros e multas do pagamento
162
+ # Posição: 161 a 218
163
+ # Tamanho: 58
164
+ def detalhe_multas_e_juros_do_pagamento(pagamento, sequencial)
165
+ detalhe = ''
166
+
167
+ # 161 166 006 9(02) "Taxa de mora mês Ex: 022000 = 2,20%)"
168
+ detalhe << pagamento.percentual_juros_formatado(6)
169
+
170
+ # 167 172 006 9(02) "Taxa de multa Ex: 022000 = 2,20%)"
171
+ detalhe << pagamento.percentual_multa_formatado(6)
172
+
173
+ # 173 173 001 9(01) "Tipo Distribuição: 1 – Cooperativa 2 - Cliente"
174
+ detalhe << "#{pagamento.tipo_emissao}".adjust_size_to(1)
175
+
176
+ # 174 179 006 9(06) "Data primeiro desconto:
177
+ # Informar a data limite a ser observada pelo cliente para o pagamento
178
+ # do título com Desconto no formato ddmmaa.
179
+ # Preencher com zeros quando não for concedido nenhum desconto.
180
+ # Obs: A data limite não poderá ser superior a data de vencimento do título."
181
+ detalhe << "#{pagamento.data_desconto_formatado('%d%m%y')}".adjust_size_to(6,'0')
182
+
183
+ # 180 192 013 9(11)V99 "Valor primeiro desconto:
184
+ # Informar o valor do desconto, com duas casa decimais.
185
+ # Preencher com zeros quando não for concedido nenhum desconto."
186
+ detalhe << "#{pagamento.valor_desconto_formatado}".adjust_size_to(13,'0', :right)
187
+
188
+ # 193 205 013 9(13) "193-193 – Código da moeda
189
+ # 194-205 – Valor IOF / Quantidade Monetária: ""000000000000""
190
+ # Se o código da moeda for REAL, o valor restante representa o IOF.
191
+ # Se o código da moeda for diferente de REAL, o valor restante será a quantidade monetária.
192
+ detalhe << "#{pagamento.codigo_moeda}".adjust_size_to(1,'9')
193
+ detalhe << (pagamento.moeda_real? ? ''.ljust(12 ,'0') : pagamento.valor_iof_formatado(12))
194
+
195
+ # 206 218 013 9(11)V99 Valor Abatimento
196
+ detalhe << "#{pagamento.valor_abatimento_formatado}".adjust_size_to(13,'0', :right)
197
+
198
+ detalhe
199
+ end
200
+
201
+ # Informações referente aos dados do sacado/pagador
202
+ # Posição: 219 a 394
203
+ # Tamanho: 176
204
+ def informacoes_do_sacado(pagamento, sequencial)
205
+ info = ''
206
+ # 219 220 002 9(01) "Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
207
+ info << "#{pagamento.pagador.tipo_cpf_cnpj}".adjust_size_to(2, '0', :right)
208
+
209
+ # 221 234 014 9(14) Número do CNPJ ou CPF do Pagador
210
+ info << "#{pagamento.pagador.cpf_cnpj}".adjust_size_to(14, '0', :right)
211
+
212
+ # 235 274 040 A(40) Nome do Pagador
213
+ info << "#{pagamento.pagador.nome}".adjust_size_to(40)
214
+
215
+ # 275 311 037 A(37) Endereço do Pagador
216
+ info << "#{pagamento.pagador.endereco}".adjust_size_to(37)
217
+
218
+ # 312 326 015 X(15) Bairro do Pagador
219
+ info << "#{pagamento.pagador.bairro}".adjust_size_to(15)
220
+
221
+ # 327 334 008 9(08) CEP do Pagador
222
+ info << "#{pagamento.pagador.cep}".adjust_size_to(8, '0')
223
+
224
+ # 335 349 015 A(15) Cidade do Pagador
225
+ info << "#{pagamento.pagador.cidade}".adjust_size_to(15)
226
+
227
+ # 350 351 002 A(02) UF do Pagador
228
+ info << "#{pagamento.pagador.uf}".adjust_size_to(2)
229
+
230
+ # 352 391 040 X(40) "Observações/Mensagem ou Sacador/Avalista:
231
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com Brancos,
232
+ # as informações constantes desse campo serão impressas no campo “texto de responsabilidade
233
+ # da Empresa, no Recibo do Sacado e na Ficha de Compensação do boleto de cobrança.
234
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com “A” ,
235
+ # este campo deverá ser preenchido com o nome/razão social do Sacador/Avalista
236
+ info << "#{pagamento.pagador.nome_avalista}".adjust_size_to(40)
237
+
238
+ # 392 393 002 X(02) "Número de Dias Para Protesto: Quantidade dias para envio protesto. Se = "0", utilizar dias protesto padrão do cliente cadastrado na cooperativa
239
+ info << "00"
240
+
241
+ # 394 395 001 X(01) Complemento do Registro: Brancos
242
+ info << " "
243
+
244
+ info
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
@@ -4,29 +4,7 @@ module BrBoleto
4
4
  class Lote < BrBoleto::ActiveModelBase
5
5
  # variavel que terá os pagamentos no qual será gerado o lote do arquivo de remessa
6
6
  # Pode haver 1 ou vários pagamentos para o mesmo arquivo
7
- attr_accessor :pagamentos
8
-
9
- def self.class_for_pagamentos
10
- BrBoleto::Remessa::Pagamento
11
- end
12
-
13
- validates_each :pagamentos do |record, attr, value|
14
- record.errors.add(attr, 'não pode estar vazio.') if value.empty?
15
- value.each do |pagamento|
16
- if pagamento.is_a? record.class.class_for_pagamentos
17
- if pagamento.invalid?
18
- pagamento.errors.full_messages.each { |msg| record.errors.add(attr, msg) }
19
- end
20
- else
21
- record.errors.add(attr, 'cada item deve ser um objeto Pagamento.')
22
- end
23
- end
24
- end
25
-
26
- # O atributo pagamentos sempre irá retornar umm Array
27
- def pagamentos
28
- @pagamentos = [@pagamentos].flatten
29
- end
7
+ include BrBoleto::HavePagamentos
30
8
  end
31
9
  end
32
10
  end