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
@@ -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