brcobranca_sicredi_400 1.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 (126) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +91 -0
  5. data/Rakefile +8 -0
  6. data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
  7. data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
  8. data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  9. data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
  13. data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  14. data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
  15. data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  16. data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
  17. data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  18. data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
  19. data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  20. data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
  21. data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  22. data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
  23. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
  24. data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
  25. data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
  26. data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
  27. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
  28. data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
  29. data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  30. data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
  31. data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
  32. data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
  33. data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
  34. data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
  35. data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
  36. data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
  37. data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  38. data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
  39. data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  40. data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
  41. data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
  42. data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  43. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  44. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  45. data/lib/brcobranca/boleto/ailos.rb +89 -0
  46. data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
  47. data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
  48. data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
  49. data/lib/brcobranca/boleto/banestes.rb +86 -0
  50. data/lib/brcobranca/boleto/banrisul.rb +95 -0
  51. data/lib/brcobranca/boleto/base.rb +256 -0
  52. data/lib/brcobranca/boleto/bradesco.rb +100 -0
  53. data/lib/brcobranca/boleto/caixa.rb +123 -0
  54. data/lib/brcobranca/boleto/citibank.rb +97 -0
  55. data/lib/brcobranca/boleto/credisis.rb +118 -0
  56. data/lib/brcobranca/boleto/hsbc.rb +96 -0
  57. data/lib/brcobranca/boleto/itau.rb +138 -0
  58. data/lib/brcobranca/boleto/safra.rb +152 -0
  59. data/lib/brcobranca/boleto/santander.rb +86 -0
  60. data/lib/brcobranca/boleto/sicoob.rb +120 -0
  61. data/lib/brcobranca/boleto/sicredi.rb +145 -0
  62. data/lib/brcobranca/boleto/template/base.rb +28 -0
  63. data/lib/brcobranca/boleto/template/rghost.rb +308 -0
  64. data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
  65. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
  66. data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
  67. data/lib/brcobranca/boleto/unicred.rb +99 -0
  68. data/lib/brcobranca/calculo.rb +120 -0
  69. data/lib/brcobranca/calculo_data.rb +63 -0
  70. data/lib/brcobranca/currency.rb +69 -0
  71. data/lib/brcobranca/formatacao.rb +104 -0
  72. data/lib/brcobranca/formatacao_string.rb +37 -0
  73. data/lib/brcobranca/limpeza.rb +20 -0
  74. data/lib/brcobranca/remessa/base.rb +72 -0
  75. data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
  76. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
  77. data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
  78. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
  79. data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
  80. data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
  81. data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
  82. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
  83. data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
  84. data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
  85. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  86. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
  87. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
  88. data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
  89. data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
  90. data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
  91. data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
  92. data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
  93. data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
  94. data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
  95. data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
  96. data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
  97. data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
  98. data/lib/brcobranca/remessa/pagamento.rb +320 -0
  99. data/lib/brcobranca/retorno/base.rb +11 -0
  100. data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
  101. data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
  102. data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
  103. data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
  104. data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
  105. data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
  106. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
  107. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
  108. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
  109. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  110. data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
  111. data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
  112. data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
  113. data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
  114. data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
  115. data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
  116. data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
  117. data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
  118. data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
  119. data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
  120. data/lib/brcobranca/util/date.rb +21 -0
  121. data/lib/brcobranca/util/empresa.rb +29 -0
  122. data/lib/brcobranca/util/errors.rb +76 -0
  123. data/lib/brcobranca/validations.rb +208 -0
  124. data/lib/brcobranca/version.rb +5 -0
  125. data/lib/brcobranca.rb +200 -0
  126. metadata +225 -0
@@ -0,0 +1,233 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Santander < Brcobranca::Remessa::Cnab400::Base
7
+ # Código de Transmissão
8
+ # Consultar seu gerente para pegar esse código. Geralmente está no e-mail enviado pelo banco.
9
+ attr_accessor :codigo_transmissao
10
+
11
+ attr_accessor :codigo_carteira
12
+
13
+ validates_presence_of :documento_cedente, :codigo_transmissao, message: 'não pode estar em branco.'
14
+ validates_presence_of :digito_conta, message: 'não pode estar em branco.', if: :conta_padrao_novo?
15
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
16
+ validates_length_of :carteira, maximum: 3, message: 'deve ter no máximo 3 dígitos.'
17
+ validates_length_of :codigo_transmissao, maximum: 20, message: 'deve ter no máximo 20 dígitos.'
18
+
19
+ def initialize(campos = {})
20
+ campos = { aceite: 'N', carteira: '101', codigo_carteira: '1' }.merge!(campos)
21
+ super(campos)
22
+ end
23
+
24
+ def cod_banco
25
+ '033'
26
+ end
27
+
28
+ def nome_banco
29
+ 'SANTANDER'.format_size(15)
30
+ end
31
+
32
+ def codigo_transmissao=(valor)
33
+ @codigo_transmissao = valor.to_s.strip.rjust(20, '0') if valor
34
+ end
35
+
36
+ # Informacoes do Código de Transmissão
37
+ #
38
+ # @return [String]
39
+ #
40
+ def info_conta
41
+ # CAMPO TAMANHO
42
+ # codigo_transmissao 20
43
+ codigo_transmissao
44
+ end
45
+
46
+ # Zeros do header
47
+ #
48
+ # @return [String]
49
+ #
50
+ def zeros
51
+ ''.ljust(16, '0')
52
+ end
53
+
54
+ # Complemento do header
55
+ #
56
+ # @return [String]
57
+ #
58
+ def complemento
59
+ ''.ljust(275, ' ')
60
+ end
61
+
62
+ # Numero da versão da remessa
63
+ #
64
+ # @return [String]
65
+ #
66
+ def versao
67
+ '058'
68
+ end
69
+
70
+ def monta_header
71
+ # CAMPO TAMANHO VALOR
72
+ # tipo do registro [1] 0
73
+ # operacao [1] 1
74
+ # literal remessa [7] REMESSA
75
+ # Código do serviço [2] 01
76
+ # cod. servico [15] COBRANCA
77
+ # info. conta [20]
78
+ # empresa mae [30]
79
+ # cod. banco [3]
80
+ # nome banco [15]
81
+ # data geracao [6] formato DDMMAA
82
+ # zeros [16]
83
+ # complemento registro [275]
84
+ # versao [3]
85
+ # num. sequencial [6] 000001
86
+ "01REMESSA01COBRANCA #{info_conta}#{empresa_mae[0..29].to_s.ljust(30,
87
+ ' ')}#{cod_banco}#{nome_banco}#{data_geracao}#{zeros}#{complemento}#{versao}000001"
88
+ end
89
+
90
+ # Detalhe do arquivo
91
+ #
92
+ # @param pagamento [PagamentoCnab400]
93
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
94
+ # @param sequencial
95
+ # num. sequencial do registro no arquivo
96
+ #
97
+ # @return [String]
98
+ #
99
+ def monta_detalhe(pagamento, sequencial)
100
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
101
+
102
+ detalhe = '1' # identificacao transacao 9[01]
103
+ detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
104
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
105
+ detalhe << codigo_transmissao # Código de Transmissão 9[20]
106
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # identificacao do tit. na empresa X[25]
107
+ detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[8]
108
+ detalhe << pagamento.formata_data_segundo_desconto # data limite para o segundo desconto 9[06]
109
+ detalhe << ''.rjust(1, ' ') # brancos X[1]
110
+ detalhe << pagamento.codigo_multa # Com multa = 4, Sem multa = 0 9[1]
111
+ detalhe << pagamento.formata_percentual_multa # Percentual multa por atraso % 9[6]
112
+ detalhe << '00' # Unidade de valor moeda corrente = 00 9[2]
113
+ detalhe << '0'.rjust(13, '0') # Valor do título em outra unidade 9[15]
114
+ detalhe << ''.rjust(4, ' ') # brancos X[4]
115
+ detalhe << pagamento.formata_data_multa # Data para cobrança de multa 9[6]
116
+
117
+ # codigo da carteira
118
+ # 1 = ELETRÔNICA COM REGISTRO
119
+ # 3 = CAUCIONADA ELETRÔNICA
120
+ # 4 = COBRANÇA SEM REGISTRO
121
+ # 5 = RÁPIDA COM REGISTRO
122
+ # (BLOQUETE EMITIDO PELO CLIENTE) 6 = CAUCIONADA RAPIDA
123
+ # 7 = DESCONTADA ELETRÔNICA
124
+ detalhe << codigo_carteira # codigo da carteira 9[01]
125
+
126
+ # Código da ocorrência:
127
+ # 01 = ENTRADA DE TÍTULO
128
+ # 02 = BAIXA DE TÍTULO
129
+ # 04 = CONCESSÃO DE ABATIMENTO
130
+ # 05 = CANCELAMENTO ABATIMENTO
131
+ # 06 = PRORROGAÇÃO DE VENCIMENTO
132
+ # 07 = ALT. NÚMERO CONT.CEDENTE
133
+ # 08 = ALTERAÇÃO DO SEU NÚMERO
134
+ # 09 = PROTESTAR
135
+ # 18 = SUSTAR PROTESTO
136
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
137
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
138
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
139
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
140
+ detalhe << cod_banco # codigo banco 9[03]
141
+ detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
142
+
143
+ # Espécie de documento:
144
+ # 01 = DUPLICATA
145
+ # 02 = NOTA PROMISSÓRIA
146
+ # 03 = APÓLICE / NOTA DE SEGURO
147
+ # 05 = RECIBO
148
+ # 06 = DUPLICATA DE SERVIÇO
149
+ # 07 = LETRA DE CAMBIO
150
+ detalhe << pagamento.especie_titulo # Espécie de documento 9[02]
151
+ detalhe << aceite # aceite (A/N) X[01]
152
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
153
+
154
+ # Instrução cobrança
155
+ # 00 = NÃO HÁ INSTRUÇÕES
156
+ # 02 = BAIXAR APÓS QUINZE DIAS DO VENCIMENTO
157
+ # 03 = BAIXAR APÓS 30 DIAS DO VENCIMENTO
158
+ # 04 = NÃO BAIXAR
159
+ # 06 = PROTESTAR (VIDE POSIÇÃO392/393)
160
+ # 07 = NÃO PROTESTAR
161
+ # 08 = NÃO COBRAR JUROS DE MORA
162
+ detalhe << pagamento.cod_primeira_instrucao # primeira instrução 9[02]
163
+ detalhe << pagamento.cod_segunda_instrucao # segunda instrução 9[02]
164
+ detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
165
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
166
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
167
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
168
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
169
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
170
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
171
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
172
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
173
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
174
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
175
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
176
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
177
+ detalhe << pagamento.nome_avalista.format_size(30) # Sacador/Mensagens X[30]
178
+ detalhe << ''.rjust(1, ' ') # Brancos X[1]
179
+ detalhe << identificador_movimento_complemento # Identificador do Complemento X[1]
180
+ detalhe << movimento_complemento # Complemento 9[2]
181
+ detalhe << ''.rjust(6, ' ') # Brancos X[06]
182
+ # Se identificacao_ocorrencia = 06
183
+ detalhe << pagamento.dias_protesto.rjust(2, '0') # Número de dias para protesto 9[02]
184
+ detalhe << ''.rjust(1, ' ') # Brancos X[1]
185
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
186
+ detalhe
187
+ end
188
+
189
+ def identificador_movimento_complemento
190
+ return 'I' if conta_padrao_novo?
191
+
192
+ ''.rjust(1, ' ')
193
+ end
194
+
195
+ def movimento_complemento
196
+ return "#{conta_corrente[8]}#{digito_conta}" if conta_padrao_novo?
197
+
198
+ ''.rjust(2, ' ')
199
+ end
200
+
201
+ def conta_padrao_novo?
202
+ !conta_corrente.blank? && conta_corrente.length > 8
203
+ end
204
+
205
+ # Valor total de todos os títulos
206
+ #
207
+ # @return [String]
208
+ #
209
+ def total_titulos
210
+ total = format '%.2f', pagamentos.sum(&:valor)
211
+ total.to_s.somente_numeros.rjust(13, '0')
212
+ end
213
+
214
+ # Trailer do arquivo remessa
215
+ #
216
+ # @param sequencial
217
+ # num. sequencial do registro no arquivo
218
+ #
219
+ # @return [String]
220
+ #
221
+ def monta_trailer(sequencial)
222
+ # CAMPO TAMANHO VALOR
223
+ # código registro [1] 9
224
+ # quant. documentos [6]
225
+ # valor total titulos [13]
226
+ # zeros [374] 0
227
+ # num. sequencial [6]
228
+ "9#{sequencial.to_s.rjust(6, '0')}#{total_titulos}#{''.rjust(374, '0')}#{sequencial.to_s.rjust(6, '0')}"
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Sicoob < Brcobranca::Remessa::Cnab400::Base
7
+ # convenio do cedente
8
+ attr_accessor :convenio
9
+
10
+ attr_accessor :modalidade_carteira, :distribuicao_boleto, :tipo_formulario
11
+ # identificacao da emissao do boleto (attr na classe base)
12
+ # opcoes:
13
+ # ‘1’ = Banco Emite
14
+ # ‘2’ = Cliente Emite
15
+ #
16
+ # identificacao da distribuicao do boleto (attr na classe base)
17
+ # opcoes:
18
+ # ‘1’ = Banco distribui
19
+ # ‘2’ = Cliente distribui
20
+ # Tipo Formulário - 01 posição (15 a 15):
21
+ # "1" -auto-copiativo
22
+ # "3" -auto-envelopável
23
+ # "4" -A4 sem envelopamento
24
+ # "6" -A4 sem envelopamento 3 vias
25
+
26
+ # convenio do cedente
27
+ attr_accessor :convenio
28
+
29
+ validates_presence_of :agencia, :conta_corrente, :carteira, :convenio, :modalidade_carteira, :tipo_formulario,
30
+ :digito_conta, :sequencial_remessa, :documento_cedente, message: 'não pode estar em branco.'
31
+ # Remessa 400 - 8 digitos
32
+ # Remessa 240 - 12 digitos
33
+ validates_length_of :conta_corrente, is: 8, message: 'deve ter 8 dígitos.'
34
+ validates_length_of :agencia, is: 4, message: 'deve ter 4 dígitos.'
35
+ validates_length_of :modalidade_carteira, is: 1, message: 'deve ter 1 dígitos.'
36
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
37
+ validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
38
+ validates_length_of :carteira, is: 2, message: 'deve ter 2 dígitos.'
39
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
40
+
41
+ # Com DV
42
+ validates_length_of :convenio, is: 9, message: 'deve ter 9 dígitos.'
43
+
44
+ def initialize(campos = {})
45
+ campos = {
46
+ distribuicao_boleto: '2',
47
+ tipo_formulario: '4',
48
+ modalidade_carteira: '2',
49
+ sequencial_remessa: '0000001',
50
+ carteira: '01'
51
+ }.merge!(campos)
52
+ super(campos)
53
+ end
54
+
55
+ def cod_banco
56
+ '756'
57
+ end
58
+
59
+ def nome_banco
60
+ 'BANCOOBCED'.format_size(15)
61
+ end
62
+
63
+ # Informacoes do Código de Transmissão
64
+ #
65
+ # @return [String]
66
+ #
67
+ def info_conta
68
+ # CAMPO TAMANHO
69
+ # 030 004 9(004) Prefixo da Cooperativa: vide planilha "Capa" deste arquivo
70
+ # 031 001 A(001) Dígito Verificador do Prefixo: vide planilha "Capa" deste arquivo
71
+ # 039 008 9(008) Código do Cliente/Beneficiário: vide planilha "Capa" deste arquivo
72
+ # 040 001 A(001) Dígito Verificador do Código: vide planilha "Capa" deste arquivo
73
+ # 046 006 9(006) Número do convênio líder: Brancos
74
+ "#{agencia}#{digito_agencia}#{convenio} "
75
+ end
76
+
77
+ def digito_agencia
78
+ # utilizando a agencia com 4 digitos
79
+ # para calcular o digito
80
+ agencia.modulo11(mapeamento: { 10 => '0' }).to_s
81
+ end
82
+
83
+ # Complemento do header
84
+ #
85
+ # @return [String]
86
+ #
87
+ def complemento
88
+ ''.rjust(287, ' ')
89
+ end
90
+
91
+ # Header do arquivo remessa
92
+ #
93
+ # @return [String]
94
+ #
95
+ def monta_header
96
+ # CAMPO TAMANHO VALOR
97
+ # 001 001 9(001) Identificação do Registro Header: “0” (zero)
98
+ # 002 001 9(001) Tipo de Operação: “1” (um)
99
+ # 009 007 A(007) Identificação por Extenso do Tipo de Operação: "REMESSA"
100
+ # 011 002 9(002) Identificação do Tipo de Serviço: “01” (um)
101
+ # 019 008 A(008) Identificação por Extenso do Tipo de Serviço: “COBRANÇA”
102
+ # 026 007 A(007) Complemento do Registro: Brancos
103
+ # 030 004 9(004) Prefixo da Cooperativa: vide planilha "Capa" deste arquivo
104
+ # 031 001 A(001) Dígito Verificador do Prefixo: vide planilha "Capa" deste arquivo
105
+ # 039 008 9(008) Código do Cliente/Beneficiário: vide planilha "Capa" deste arquivo
106
+ # 040 001 A(001) Dígito Verificador do Código: vide planilha "Capa" deste arquivo
107
+ # 046 006 9(006) Número do convênio líder: Brancos
108
+ # 076 030 A(030) Nome do Beneficiário: vide planilha "Capa" deste arquivo
109
+ # 094 018 A(018) Identificação do Banco: "756BANCOOBCED"
110
+ # 100 006 9(006) Data da Gravação da Remessa: formato ddmmaa
111
+ # 107 007 9(007) Seqüencial da Remessa: número seqüencial acrescido de 1 a cada remessa. Inicia com "0000001"
112
+ # 394 287 A(287) Complemento do Registro: Brancos
113
+ # 400 006 9(006) Seqüencial do Registro:”000001”
114
+
115
+ "01REMESSA01COBRANCA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{sequencial_remessa}#{complemento}000001"
116
+ end
117
+
118
+ # Detalhe do arquivo
119
+ #
120
+ # @param pagamento [PagamentoCnab400]
121
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
122
+ # @param sequencial
123
+ # num. sequencial do registro no arquivo
124
+ #
125
+ # @return [String]
126
+ #
127
+ def monta_detalhe(pagamento, sequencial)
128
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
129
+
130
+ detalhe = '1' # identificacao transacao 9[01]
131
+ detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
132
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
133
+ detalhe << agencia # Prefixo da Cooperativa 9[4]
134
+ detalhe << digito_agencia # Digito da Cooperativa 9[1]
135
+ detalhe << conta_corrente # Conta corrente 9[8]
136
+ detalhe << digito_conta # Digito da conta corrente 9[1]
137
+ detalhe << '000000' # Convênio de Cobrança do Beneficiário: "000000" 9[6]
138
+ detalhe << ''.rjust(25, ' ') # Número de Controle do Participante: Brancos X[25]
139
+ detalhe << pagamento.nosso_numero.to_s.rjust(12, '0') # nosso numero com DV 9[12]
140
+ detalhe << pagamento.parcela.to_s.rjust(2, '0') # Número da Parcela: "01" se parcela única 9[02]
141
+ detalhe << '00' # Grupo de Valor: "00" 9[02]
142
+ detalhe << ' ' # Complemento do Registro: Brancos X[03]
143
+
144
+ # "Indicativo de Mensagem ou Sacador/Avalista:
145
+ # Brancos: Poderá ser informada nas posições 352 a 391 (SEQ 50) qualquer mensagem para ser impressa no boleto;
146
+ # “A”: Deverá ser informado nas posições 352 a 391 (SEQ 50) o nome e CPF/CNPJ do sacador"
147
+ detalhe << ' ' # X[01]
148
+ detalhe << ' ' # Prefixo do Título: Brancos X[03]
149
+ detalhe << '000' # Variação da Carteira: "000" 9[03]
150
+ detalhe << '0' # Conta Caução: "0" 9[01]
151
+
152
+ # "Número do Contrato Garantia:
153
+ # Para Carteira 1 preencher ""00000"";
154
+ # Para Carteira 3 preencher com o número do contrato sem DV."
155
+ detalhe << '00000' # Número do Contrato Garantia 9[05]
156
+ detalhe << '0' # DV do contrato 9[01]
157
+ detalhe << '000000' # Numero do borderô: preencher em caso de carteira 3 9[06]
158
+ detalhe << ' ' # Complemento do Registro: Brancos X[04]
159
+
160
+ # "Tipo de Emissão:
161
+ # 1 - Cooperativa
162
+ # 2 - Cliente"
163
+ detalhe << modalidade_carteira # Tipo de Emissão 9[01]
164
+
165
+ # "Carteira/Modalidade:
166
+ # 01 = Simples Com Registro
167
+ # 02 = Simples Sem Registro
168
+ # 03 = Garantida Caucionada "
169
+ detalhe << carteira # codigo da carteira 9[02]
170
+
171
+ # "Comando/Movimento:
172
+ # 01 = Registro de Títulos
173
+ # 02 = Solicitação de Baixa
174
+ # 04 = Concessão de Abatimento
175
+ # 05 = Cancelamento de Abatimento
176
+ # 06 = Alteração de Vencimento
177
+ # 08 = Alteração de Seu Número
178
+ # 09 = Instrução para Protestar
179
+ # 10 = Instrução para Sustar Protesto
180
+ # 11 = Instrução para Dispensar Juros
181
+ # 12 = Alteração de Pagador
182
+ # 31 = Alteração de Outros Dados
183
+ # 34 = Baixa - Pagamento Direto ao Beneficiário
184
+
185
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
186
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
187
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
188
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
189
+ detalhe << cod_banco # codigo banco 9[03]
190
+ detalhe << agencia # Prefixo da Cooperativa 9[4]
191
+ detalhe << digito_agencia # Digito da Cooperativa 9[1]
192
+
193
+ # "Espécie do Título :
194
+ # 01 = Duplicata Mercantil
195
+ # 02 = Nota Promissória
196
+ # 03 = Nota de Seguro
197
+ # 05 = Recibo
198
+ # 06 = Duplicata Rural
199
+ # 08 = Letra de Câmbio
200
+ # 09 = Warrant
201
+ # 10 = Cheque
202
+ # 12 = Duplicata de Serviço
203
+ # 13 = Nota de Débito
204
+ # 14 = Triplicata Mercantil
205
+ # 15 = Triplicata de Serviço
206
+ # 18 = Fatura
207
+ # 20 = Apólice de Seguro
208
+ # 21 = Mensalidade Escolar
209
+ # 22 = Parcela de Consórcio
210
+ # 99 = Outros"
211
+ detalhe << pagamento.especie_titulo # Espécie de documento 9[02]
212
+ detalhe << '0' # aceite (A=1/N=0) X[01]
213
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
214
+
215
+ # "Primeira instrução codificada:
216
+ # Regras de impressão de mensagens nos boletos:
217
+ # * Primeira instrução (SEQ 34) = 00 e segunda (SEQ 35) = 00, não imprime nada.
218
+ # * 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.
219
+ # * Primeira e segunda instrução diferente das situações acima, imprimimos o conteúdo CNAB:
220
+ # 00 = AUSENCIA DE INSTRUCOES
221
+ # 01 = COBRAR JUROS
222
+ # 03 = PROTESTAR 3 DIAS UTEIS APOS VENCIMENTO
223
+ # 04 = PROTESTAR 4 DIAS UTEIS APOS VENCIMENTO
224
+ # 05 = PROTESTAR 5 DIAS UTEIS APOS VENCIMENTO
225
+ # 07 = NAO PROTESTAR
226
+ # 10 = PROTESTAR 10 DIAS UTEIS APOS VENCIMENTO
227
+ # 15 = PROTESTAR 15 DIAS UTEIS APOS VENCIMENTO
228
+ # 20 = PROTESTAR 20 DIAS UTEIS APOS VENCIMENTO
229
+ # 22 = CONCEDER DESCONTO SO ATE DATA ESTIPULADA
230
+ # 42 = DEVOLVER APOS 15 DIAS VENCIDO
231
+ # 43 = DEVOLVER APOS 30 DIAS VENCIDO"
232
+ detalhe << '00' # Instrução para o título 9[02]
233
+ detalhe << '00' # Número de dias válidos para instrução 9[02]
234
+ detalhe << pagamento.formata_valor_mora(6) # valor mora ao dia 9[06]
235
+ detalhe << pagamento.formata_valor_multa(6) # taxa de multa 9[06]
236
+ detalhe << distribuicao_boleto # indentificacao entrega 9[01]
237
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
238
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
239
+
240
+ # "193-193 – Código da moeda
241
+ # 194-205 – Valor IOF / Quantidade Monetária: ""000000000000""
242
+ # Se o código da moeda for REAL, o valor restante representa o IOF.
243
+ # Se o código da moeda for diferente de REAL, o valor restante será a quantidade monetária.
244
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
245
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
246
+ detalhe << pagamento.identificacao_sacado.rjust(2, '0') # identificacao do pagador 9[02]
247
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
248
+ detalhe << pagamento.nome_sacado.format_size(40).ljust(40, ' ') # nome do pagador X[40]
249
+ detalhe << pagamento.endereco_sacado.format_size(37).ljust(37, ' ') # endereco do pagador X[37]
250
+ detalhe << pagamento.bairro_sacado.format_size(15).ljust(15, ' ') # bairro do pagador X[15]
251
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
252
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
253
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
254
+
255
+ # "Observações/Mensagem ou Sacador/Avalista:
256
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com Brancos,
257
+ # as informações constantes desse campo serão impressas no campo “texto de responsabilidade da Empresa”,
258
+ # no Recibo do Sacado e na Ficha de Compensação do boleto de cobrança.
259
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com “A” ,
260
+ # este campo deverá ser preenchido com o nome/razão social do Sacador/Avalista"
261
+ detalhe << ''.rjust(40, ' ') # X[40]
262
+
263
+ # "Número de Dias Para Protesto:
264
+ # Quantidade dias para envio protesto. Se = ""0"",
265
+ # utilizar dias protesto padrão do cliente cadastrado na cooperativa. "
266
+ detalhe << '00' # Número de Dias Para Protesto x[02]
267
+ detalhe << ' ' # Brancos X[1]
268
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
269
+ detalhe
270
+ end
271
+
272
+ # Trailer do arquivo remessa
273
+ #
274
+ # @param sequencial
275
+ # num. sequencial do registro no arquivo
276
+ #
277
+ # @return [String]
278
+ #
279
+ def monta_trailer(sequencial)
280
+ # CAMPO TAMANHO VALOR
281
+ # 1 001 001 001 9(01) Identificação Registro Trailler: "9"
282
+ # 2 002 194 193 X(193) Complemento do Registro: Brancos
283
+ # 3 195 234 040 X(40) "Mensagem responsabilidade Beneficiário:
284
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
285
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
286
+ # 4 235 274 040 X(40) "Mensagem responsabilidade Beneficiário:
287
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
288
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
289
+ # 5 275 314 040 X(40) "Mensagem responsabilidade Beneficiário:
290
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
291
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
292
+ # 6 315 354 040 X(40) "Mensagem responsabilidade Beneficiário:
293
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
294
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
295
+ # 7 355 394 040 X(40) "Mensagem responsabilidade Beneficiário:
296
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
297
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
298
+ # 8 395 400 006 9(06) Seqüencial do Registro: Incrementado em 1 a cada registro
299
+
300
+ "9#{''.rjust(393, '0')}#{sequencial.to_s.rjust(6, '0')}"
301
+ end
302
+ end
303
+ end
304
+ end
305
+ end
@@ -0,0 +1,117 @@
1
+ module Brcobranca
2
+ module Remessa
3
+ module Cnab400
4
+ class Sicredi < Brcobranca::Remessa::Cnab400::Base
5
+ attr_accessor :codigo_beneficiario, :numero_sicredi
6
+
7
+ validates_presence_of :documento_cedente, :codigo_beneficiario, :sequencial_remessa
8
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
9
+
10
+ def initialize(campos = {})
11
+ campos = { aceite: 'N', codigo_beneficiario: '12345' }.merge!(campos)
12
+ super(campos)
13
+ end
14
+
15
+ # Código do banco Sicredi
16
+ def cod_banco
17
+ '748'
18
+ end
19
+
20
+ # Nome do banco Sicredi
21
+ def nome_banco
22
+ 'SICREDI'.ljust(15)
23
+ end
24
+
25
+ # Informações da conta
26
+ def info_conta
27
+ codigo_beneficiario.to_s.rjust(5, '0')
28
+ end
29
+
30
+ # Data de geração do arquivo no formato AAAAMMDD
31
+ def data_geracao
32
+ Date.current.strftime('%Y%m%d')
33
+ end
34
+
35
+ # Header do arquivo de remessa
36
+ def monta_header
37
+ header = ''
38
+ header << '0' # Identificação do Registro (0)
39
+ header << '1' # Identificação do Arquivo (1)
40
+ header << 'REMESSA' # Literal Remessa
41
+ header << '01' # Código do serviço de cobrança (1)
42
+ header << 'COBRANCA' # Literal Cobrança
43
+ header << ''.ljust(7, ' ') # Filler
44
+ header << codigo_beneficiario.to_s.rjust(5, '0') # Código do beneficiário/cedente
45
+ header << documento_cedente.to_s.rjust(14, '0') # CPF/CNPJ do beneficiário/cedente
46
+ header << ''.ljust(31, ' ') # Filler
47
+ header << '748' # Número do Sicredi
48
+ header << 'SICREDI'.ljust(15) # Literal Sicredi
49
+ header << Date.current.strftime('%Y%m%d') # Data de geração do arquivo (AAAAMMDD)
50
+ header << ''.ljust(8, ' ') # Filler
51
+ header << sequencial_remessa.to_s.rjust(7, '0') # Número da remessa
52
+ header << ''.ljust(273, ' ') # Filler
53
+ header << '2.00000001'
54
+ header
55
+ end
56
+
57
+ # Detalhe do arquivo de remessa
58
+ def monta_detalhe(pagamento, sequencial)
59
+ detalhe = '1' # Identificação do registro detalhe
60
+ detalhe << 'A' # Código da carteira
61
+ detalhe << 'A' # Tipo de cobrança com registro
62
+ detalhe << 'A' # Impressão realizada pelo beneficiário
63
+ detalhe << ''.rjust(12, ' ') # Filler
64
+ detalhe << 'A' # Impressão realizada pelo beneficiário
65
+ detalhe << 'B' # Impressão realizada pelo beneficiário
66
+ detalhe << 'B' # Impressão realizada pelo beneficiário
67
+ detalhe << ''.rjust(28, ' ') # Filler
68
+ detalhe << pagamento.nosso_numero.to_s.rjust(9, '0') # Nosso número
69
+ detalhe << ''.rjust(6, ' ') # Filler
70
+ detalhe << pagamento.data_emissao.strftime('%Y%m%d') # Data de emissão
71
+ detalhe << ''.rjust(1, ' ') # Filler
72
+ detalhe << 'N' # Impressão realizada pelo beneficiário
73
+ detalhe << ''.rjust(1, ' ') # Filler
74
+ detalhe << 'B' # Impressão realizada pelo beneficiário
75
+ detalhe << ''.rjust(8, ' ') # Filler
76
+ detalhe << '00000000000200' # Impressão realizada pelo beneficiário
77
+ detalhe << ''.rjust(12, ' ') # Filler
78
+ detalhe << pagamento.cod_primeira_instrucao.to_s.rjust(2, '0') # Instrução de protesto
79
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # Valor do título
80
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # Data de vencimento
81
+ detalhe << pagamento.formata_valor # Valor do título
82
+ detalhe << ''.rjust(9, ' ') # Filler
83
+ detalhe << 'J' # Impressão realizada pelo beneficiário
84
+ detalhe << 'N' # Impressão realizada pelo beneficiário
85
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # Data de emissão
86
+ detalhe << '00' # Impressão realizada pelo beneficiário
87
+ detalhe << '00' # Impressão realizada pelo beneficiário
88
+ detalhe << pagamento.formata_valor_mora.to_s.rjust(13, '0') # Valor dos juros por dia de atraso
89
+ detalhe << '000000' # Impressão realizada pelo beneficiário
90
+ detalhe << pagamento.formata_valor_desconto.to_s.rjust(13, '0') # Valor do desconto
91
+ detalhe << ''.rjust(13, '0') # Filler
92
+ detalhe << pagamento.formata_valor_abatimento(13) # Valor do desconto
93
+ identificacao = pagamento.identificacao_sacado.to_s.sub(/^0+/, '') # Remove zeros à esquerda
94
+ detalhe << identificacao # Espécie do título
95
+ detalhe << '0' # Filler
96
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # CPF/CNPJ do sacado
97
+ detalhe << pagamento.nome_sacado.format_size(40) # Nome do sacado
98
+ detalhe << pagamento.endereco_sacado.format_size(40) # Endereço do sacado
99
+ detalhe << ''.rjust(5, '0') # Filler
100
+ detalhe << ''.rjust(6, '0') # Filler
101
+ detalhe << ''.rjust(1, ' ') # Filler
102
+ detalhe << pagamento.cep_sacado # CEP do sacado
103
+ detalhe << ''.rjust(5, '0') # Filler
104
+ detalhe << ''.rjust(14, ' ') # CPF/CNPJ do sacado
105
+ detalhe << ''.rjust(41, ' ') # Filler
106
+ detalhe << sequencial.to_s.rjust(6, '0') # Número sequencial do registro
107
+ detalhe
108
+ end
109
+
110
+ # Trailer do arquivo de remessa
111
+ def monta_trailer(sequencial)
112
+ "91748#{info_conta}#{''.rjust(384, ' ')}#{sequencial.to_s.rjust(6, '0')}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end