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,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class BancoNordeste < Brcobranca::Remessa::Cnab400::Base
7
+ # 1 - Emitido pelo banco
8
+ # 2 - Emitido pelo cliente
9
+ attr_accessor :emissao_boleto
10
+
11
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
12
+ validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
13
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
14
+ validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
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: 2, message: 'deve ter 2 dígitos.'
17
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
18
+ validates_inclusion_of :carteira, in: %w[21 41 51], message: 'não é válida.'
19
+
20
+ # Nova instancia do Banco do Nordeste
21
+ def initialize(campos = {})
22
+ campos = {
23
+ aceite: 'N',
24
+ emissao_boleto: '2'
25
+ }.merge!(campos)
26
+
27
+ super(campos)
28
+ end
29
+
30
+ def agencia=(valor)
31
+ @agencia = valor.to_s.rjust(4, '0') if valor
32
+ end
33
+
34
+ def conta_corrente=(valor)
35
+ @conta_corrente = valor.to_s.rjust(7, '0') if valor
36
+ end
37
+
38
+ def carteira=(valor)
39
+ @carteira = valor.to_s.rjust(2, '0') if valor
40
+ end
41
+
42
+ def cod_banco
43
+ '004'
44
+ end
45
+
46
+ def nome_banco
47
+ 'B.DO NORDESTE'.ljust(15, ' ')
48
+ end
49
+
50
+ # Informacoes da conta corrente do cedente
51
+ #
52
+ # @return [String]
53
+ #
54
+ def info_conta
55
+ # CAMPO TAMANHO
56
+ # agencia 4
57
+ # zeros 2
58
+ # conta corrente 7
59
+ # digito da conta 1
60
+ # complemento 6
61
+ "#{agencia}00#{conta_corrente}#{digito_conta}#{''.rjust(6, ' ')}"
62
+ end
63
+
64
+ # Complemento do header
65
+ # (no caso do Banco do Nordeste, sao apenas espacos em branco)
66
+ #
67
+ # @return [String]
68
+ #
69
+ def complemento
70
+ ''.rjust(294, ' ')
71
+ end
72
+
73
+ # Codigo da carteira de acordo com a documentacao do Banco do Nordeste
74
+ #
75
+ # @return [String]
76
+ #
77
+ def codigo_carteira
78
+ return 'I' if carteira.to_s == '51'
79
+
80
+ carteiras = {
81
+ '1' => { '21' => '1', '41' => '2' }, # 1 - Emitido pelo banco
82
+ '2' => { '21' => '4', '41' => '5' } # 2 - Emitido pelo cliente
83
+ }
84
+
85
+ carteiras[emissao_boleto.to_s][carteira.to_s]
86
+ end
87
+
88
+ # Dígito verificador do nosso número.
89
+ #
90
+ # @param nosso_numero
91
+ #
92
+ # @return [String] 1 caracteres numéricos.
93
+ def digito_nosso_numero(nosso_numero)
94
+ nosso_numero.to_s.rjust(7, '0').modulo11(
95
+ multiplicador: (2..8).to_a,
96
+ mapeamento: { 1 => 0, 10 => 0, 11 => 0 }
97
+ ) { |total| 11 - (total % 11) }
98
+ end
99
+
100
+ # Detalhe do arquivo
101
+ #
102
+ # @param pagamento [PagamentoCnab400]
103
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
104
+ # @param sequencial
105
+ # num. sequencial do registro no arquivo
106
+ #
107
+ # @return [String]
108
+ #
109
+ def monta_detalhe(pagamento, sequencial)
110
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
111
+
112
+ detalhe = '1' # identificacao transacao 9[01]
113
+ detalhe += ''.rjust(16, ' ') # filler [16]
114
+ detalhe << agencia # agencia 9[04]
115
+ detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
116
+ detalhe << conta_corrente # conta corrente 9[07]
117
+ detalhe << digito_conta # dac 9[01]
118
+ detalhe << pagamento.formata_percentual_multa.to_s[0..1] # taxa - multa [02]
119
+ detalhe << ''.rjust(4, ' ') # filler [04]
120
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa X[25]
121
+ detalhe << pagamento.nosso_numero.to_s.rjust(7, '0') # nosso numero 9[07]
122
+ detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # dv nosso numero 9[01]
123
+ detalhe << ''.rjust(10, '0') # numero do contrato [10]
124
+ detalhe << ''.rjust(6, '0') # data do segundo pagamento [06]
125
+ detalhe << ''.rjust(13, '0') # valor do segundo pagamento [13]
126
+ detalhe << ''.rjust(8, ' ') # filler [08]
127
+ detalhe << codigo_carteira # codigo da carteira X[01]
128
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
129
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
130
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
131
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
132
+ detalhe << cod_banco # codigo banco 9[03]
133
+ detalhe << ''.rjust(4, '0') # agencia cobradora - deixar zero 9[05]
134
+ detalhe << ' ' # filler [01]
135
+ detalhe << '01' # especie do titulo X[02]
136
+ detalhe << aceite # aceite (A/N) X[01]
137
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
138
+ detalhe << ''.rjust(4, '0') # instrucao - deixar zero [04]
139
+ detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
140
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
141
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
142
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
143
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
144
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
145
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
146
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
147
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
148
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
149
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
150
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
151
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
152
+ detalhe << pagamento.nome_avalista.format_size(40) # nome do sacador/avalista X[30]
153
+ detalhe << '99' # prazo para protesto [02]
154
+ detalhe << '0' # código da moeda X[01]
155
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
156
+ detalhe
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Banrisul < Brcobranca::Remessa::Cnab400::Base
7
+ attr_accessor :convenio
8
+
9
+ validates_presence_of :agencia, :convenio, :sequencial_remessa, message: 'não pode estar em branco.'
10
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
11
+ validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
12
+ validates_length_of :convenio, maximum: 13, message: 'deve ter 13 dígitos.'
13
+ validates_length_of :carteira, maximum: 1, message: 'deve ter 1 dígito.'
14
+
15
+ def agencia=(valor)
16
+ @agencia = valor.to_s.rjust(4, '0') if valor
17
+ end
18
+
19
+ def convenio=(valor)
20
+ @convenio = valor.to_s.rjust(13, '0') if valor
21
+ end
22
+
23
+ def sequencial_remessa=(valor)
24
+ @sequencial_remessa = valor.to_s.rjust(7, '0') if valor
25
+ end
26
+
27
+ def info_conta
28
+ codigo_cedente.ljust(20, ' ')
29
+ end
30
+
31
+ def cod_banco
32
+ '041'
33
+ end
34
+
35
+ def nome_banco
36
+ 'BANRISUL'.ljust(15, ' ')
37
+ end
38
+
39
+ def complemento
40
+ ''.rjust(294, ' ')
41
+ end
42
+
43
+ def codigo_cedente
44
+ convenio
45
+ end
46
+
47
+ def digito_nosso_numero(nosso_numero)
48
+ nosso_numero.duplo_digito
49
+ end
50
+
51
+ # Header do arquivo remessa
52
+ #
53
+ # @return [String]
54
+ #
55
+ def monta_header
56
+ # CAMPO TAMANHO VALOR
57
+ # tipo do registro [1] 0
58
+ # operacao [1] 1
59
+ # literal remessa [7] REMESSA
60
+ # brancos [16]
61
+ # info. conta [20]
62
+ # empresa mae [30]
63
+ # cod. banco [3]
64
+ # nome banco [15]
65
+ # data geracao [6] formato DDMMAA
66
+ # complemento registro [294]
67
+ # num. sequencial [6] 000001
68
+ "01REMESSA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
69
+ end
70
+
71
+ def monta_detalhe(pagamento, sequencial)
72
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
73
+
74
+ detalhe = '1' # identificação do registro 9[01] 001 a 001
75
+ detalhe += ''.rjust(16, ' ') # brancos 9[16] 002 a 017
76
+ detalhe << codigo_cedente.rjust(13, ' ') # código do cedente X[13] 018 a 030
77
+ detalhe << ''.rjust(7, ' ') # brancos X[07] 031 a 037
78
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # num. controle X[25] 038 a 062
79
+ detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # identificação do título (nosso número) 9[08] 063 a 070
80
+ detalhe << digito_nosso_numero(pagamento.nosso_numero) # dígitos de conferência do nosso número (dv) 9[02] 071 a 072
81
+ detalhe << ''.rjust(32, ' ') # mensagem no bloqueto X[32] 073 a 104
82
+ detalhe << ''.rjust(3, ' ') # brancos X[03] 105 a 107
83
+ detalhe << carteira # carteira 9[01] 108 a 108
84
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02] 109 a 110
85
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(10, ' ') # numero do documento alfanum. X[10] 111 a 120
86
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data de vencimento 9[06] 121 a 126
87
+ detalhe << pagamento.formata_valor # valor do titulo 9[13] 127 a 139
88
+ detalhe << cod_banco # banco encarregado 9[03] 140 a 142
89
+ detalhe << ''.rjust(5, ' ') # agencia depositaria (brancos) 9[05] 143 a 147
90
+ detalhe << '08' # especie do titulo 9[02] 148 a 149
91
+ detalhe << 'N' # identificacao (sempre N) X[01] 150 a 150
92
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06] 151 a 156
93
+ detalhe << codigo_primeira_instrucao(pagamento) # 1a instrucao 9[02] 157 a 158
94
+ detalhe << pagamento.cod_segunda_instrucao # 2a instrucao 9[02] 159 a 160
95
+ detalhe << tipo_mora(pagamento) # tipo de mora (diária ou mensal) 9[13] 161 a 161
96
+ detalhe << formata_valor_mora(12, pagamento) # mora 9[13] 162 a 173
97
+ detalhe << pagamento.formata_data_desconto # data desconto 9[06] 174 a 179
98
+ detalhe << pagamento.formata_valor_desconto # valor desconto 9[13] 180 a 192
99
+ detalhe << pagamento.formata_valor_iof # valor iof 9[13] 193 a 205
100
+ detalhe << pagamento.formata_valor_abatimento # valor abatimento 9[13] 206 a 218
101
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02] 219 a 220
102
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # cpf/cnpj do pagador 9[14] 221 a 234
103
+ detalhe << pagamento.nome_sacado.format_size(35) # nome do pagador 9[35] 235 a 269
104
+ detalhe << ''.rjust(5, ' ') # brancos 9[05] 270 a 274
105
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40] 275 a 314
106
+ detalhe << ''.rjust(7, ' ') # brancos X[07] 315 a 321
107
+ detalhe << formata_percentual_multa(pagamento) # percentual multa X[02] 322 a 324
108
+ detalhe << '00' # num.dias para a multa após o vencimento 9[02] 325 a 326
109
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08] 327 a 334
110
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador 9[15] 335 a 349
111
+ detalhe << pagamento.uf_sacado # uf do pagador 9[02] 350 a 351
112
+ detalhe << '0000' # taxa ao dia para pag. antecipado 9[04] 352 a 355
113
+ detalhe << ' ' # branco 9[01] 356 a 356
114
+ detalhe << ''.rjust(13, '0') # valor para cálc. do desconto 9[13] 357 a 369
115
+ detalhe << pagamento.dias_protesto.to_s.rjust(2, '0') # dias para protesto 9[02] 370 a 371
116
+ detalhe << ''.rjust(23, ' ') # brancos X[23] 370 a 394
117
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
118
+ detalhe
119
+ end
120
+
121
+ def monta_trailer(sequencial)
122
+ trailer = '9'
123
+ trailer += ''.rjust(26, ' ') # brancos X[26] 002 a 027
124
+ trailer << valor_titulos_carteira(13) # total geral/valores dos títulos 9[13] 028 a 040
125
+ trailer << ''.rjust(354, ' ') # brancos X[354] 041 a 394
126
+ trailer << sequencial.to_s.rjust(6, '0') # sequencial 9[06] 395 a 400
127
+ trailer
128
+ end
129
+
130
+ private
131
+
132
+ def codigo_primeira_instrucao(pagamento)
133
+ return '18' if pagamento.percentual_multa.to_f > 0.00
134
+
135
+ pagamento.cod_primeira_instrucao
136
+ end
137
+
138
+ def tipo_mora(pagamento)
139
+ return ' ' if pagamento.tipo_mora == '3'
140
+
141
+ pagamento.tipo_mora
142
+ end
143
+
144
+ def formata_percentual_multa(pagamento)
145
+ raise ValorInvalido, 'Deve ser um Float' unless pagamento.percentual_multa.to_s.include?('.')
146
+
147
+ format('%.1f', pagamento.percentual_multa).delete('.').rjust(3, '0')
148
+ end
149
+
150
+ def formata_valor_mora(tamanho, pagamento)
151
+ return ''.rjust(tamanho, ' ') if pagamento.tipo_mora == '3'
152
+
153
+ pagamento.formata_valor_mora(tamanho)
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Base < Brcobranca::Remessa::Base
7
+ validates_presence_of :carteira, message: 'não pode estar em branco.'
8
+
9
+ # Data da geracao do arquivo seguindo o padrao DDMMAA
10
+ #
11
+ # @return [String]
12
+ #
13
+ def data_geracao
14
+ Date.current.strftime('%d%m%y')
15
+ end
16
+
17
+ # Header do arquivo remessa
18
+ #
19
+ # @return [String]
20
+ #
21
+ def monta_header
22
+ # CAMPO TAMANHO VALOR
23
+ # tipo do registro [1] 0
24
+ # operacao [1] 1
25
+ # literal remessa [7] REMESSA
26
+ # Código do serviço [2] 01
27
+ # cod. servico [15] COBRANCA
28
+ # info. conta [20]
29
+ # empresa mae [30]
30
+ # cod. banco [3]
31
+ # nome banco [15]
32
+ # data geracao [6] formato DDMMAA
33
+ # complemento registro [294]
34
+ # num. sequencial [6] 000001
35
+ "01REMESSA01COBRANCA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
36
+ end
37
+
38
+ # Trailer do arquivo remessa
39
+ #
40
+ # @param sequencial
41
+ # num. sequencial do registro no arquivo
42
+ #
43
+ # @return [String]
44
+ #
45
+ def monta_trailer(sequencial)
46
+ # CAMPO TAMANHO VALOR
47
+ # identificacao registro [1] 9
48
+ # complemento [393]
49
+ # num. sequencial [6]
50
+ "9#{''.rjust(393, ' ')}#{sequencial.to_s.rjust(6, '0')}"
51
+ end
52
+
53
+ # Registro detalhe do arquivo remessa
54
+ #
55
+ # Este metodo deve ser sobrescrevido na classe do banco
56
+ #
57
+ def monta_detalhe(_pagamento, _sequencial)
58
+ raise Brcobranca::NaoImplementado,
59
+ 'Sobreescreva este método na classe referente ao banco que você esta criando'
60
+ end
61
+
62
+ # Gera o arquivo com os registros
63
+ #
64
+ # @return [String]
65
+ def gera_arquivo
66
+ raise Brcobranca::RemessaInvalida, self unless valid?
67
+
68
+ # contador de registros no arquivo
69
+ contador = 1
70
+ ret = [monta_header]
71
+ pagamentos.each do |pagamento|
72
+ contador += 1
73
+ ret << monta_detalhe(pagamento, contador)
74
+ if pagamento.codigo_multa.to_i.positive? && respond_to?(:monta_detalhe_multa)
75
+ contador += 1
76
+ ret << monta_detalhe_multa(pagamento, contador)
77
+ end
78
+
79
+ # Adiciona registro de desconto adicional
80
+ if pagamento.valor_segundo_desconto.to_f.positive? && respond_to?(:monta_descontos_adicionais)
81
+ contador += 1
82
+ ret << monta_descontos_adicionais(pagamento, contador)
83
+ end
84
+ end
85
+ ret << monta_trailer(contador + 1)
86
+
87
+ remittance = ret.join("\n").remove_accents.upcase
88
+ remittance << "\n"
89
+
90
+ remittance.encode(remittance.encoding, universal_newline: true).encode(remittance.encoding,
91
+ crlf_newline: true)
92
+ end
93
+
94
+ # Informacoes referentes a conta do cedente
95
+ #
96
+ # Este metodo deve ser sobrescrevido na classe do banco
97
+ #
98
+ def info_conta
99
+ raise Brcobranca::NaoImplementado,
100
+ 'Sobreescreva este método na classe referente ao banco que você esta criando'
101
+ end
102
+
103
+ # Numero do banco na camara de compensacao
104
+ #
105
+ # Este metodo deve ser sobrescrevido na classe do banco
106
+ #
107
+ def cod_banco
108
+ raise Brcobranca::NaoImplementado,
109
+ 'Sobreescreva este método na classe referente ao banco que você esta criando'
110
+ end
111
+
112
+ # Nome por extenso do banco cobrador
113
+ #
114
+ # Este metodo deve ser sobrescrevido na classe do banco
115
+ #
116
+ def nome_banco
117
+ raise Brcobranca::NaoImplementado,
118
+ 'Sobreescreva este método na classe referente ao banco que você esta criando'
119
+ end
120
+
121
+ # Complemento do registro header
122
+ #
123
+ # Este metodo deve ser sobrescrevido na classe do banco
124
+ #
125
+ def complemento
126
+ raise Brcobranca::NaoImplementado,
127
+ 'Sobreescreva este método na classe referente ao banco que você esta criando'
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Bradesco < Brcobranca::Remessa::Cnab400::Base
7
+ # codigo da empresa (informado pelo Bradesco no cadastramento)
8
+ attr_accessor :codigo_empresa
9
+
10
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
11
+ validates_presence_of :codigo_empresa, :sequencial_remessa,
12
+ :digito_conta, message: 'não pode estar em branco.'
13
+ validates_length_of :codigo_empresa, maximum: 20, message: 'deve ser menor ou igual a 20 dígitos.'
14
+ validates_length_of :agencia, maximum: 5, message: 'deve ter 5 dígitos.'
15
+ validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
16
+ validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
17
+ validates_length_of :carteira, maximum: 2, message: 'deve ter no máximo 2 dígitos.'
18
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
19
+
20
+ def agencia=(valor)
21
+ @agencia = valor.to_s.rjust(5, '0') if valor
22
+ end
23
+
24
+ def conta_corrente=(valor)
25
+ @conta_corrente = valor.to_s.rjust(7, '0') if valor
26
+ end
27
+
28
+ def codigo_empresa=(valor)
29
+ @codigo_empresa = valor.to_s.rjust(20, '0') if valor
30
+ end
31
+
32
+ def sequencial_remessa=(valor)
33
+ @sequencial_remessa = valor.to_s.rjust(7, '0') if valor
34
+ end
35
+
36
+ def info_conta
37
+ codigo_empresa
38
+ end
39
+
40
+ def cod_banco
41
+ '237'
42
+ end
43
+
44
+ def nome_banco
45
+ 'BRADESCO'.ljust(15, ' ')
46
+ end
47
+
48
+ def complemento
49
+ "#{''.rjust(8, ' ')}MX#{sequencial_remessa}#{''.rjust(277, ' ')}"
50
+ end
51
+
52
+ def identificacao_empresa
53
+ # identificacao da empresa no banco
54
+ identificacao = '0' # vazio [1]
55
+ identificacao += carteira.to_s.rjust(3, '0') # carteira [3]
56
+ identificacao << agencia # codigo da agencia (sem dv) [5]
57
+ identificacao << conta_corrente # codigo da conta [7]
58
+ identificacao << digito_conta # digito da conta [1]
59
+ end
60
+
61
+ def digito_nosso_numero(nosso_numero)
62
+ "#{carteira}#{nosso_numero.to_s.rjust(11, '0')}".modulo11(
63
+ multiplicador: [2, 3, 4, 5, 6, 7],
64
+ mapeamento: { 10 => 'P', 11 => 0 }
65
+ ) { |total| 11 - (total % 11) }
66
+ end
67
+
68
+ # Formata o endereco do sacado
69
+ # de acordo com os caracteres disponiveis (40)
70
+ # concatenando o endereco, cidade e uf
71
+ #
72
+ def formata_endereco_sacado(pgto)
73
+ endereco = "#{pgto.endereco_sacado}, #{pgto.cidade_sacado}/#{pgto.uf_sacado}"
74
+ return endereco.ljust(40, ' ') if endereco.size <= 40
75
+
76
+ "#{pgto.endereco_sacado[0..19]} #{pgto.cidade_sacado[0..14]}/#{pgto.uf_sacado}".format_size(40)
77
+ end
78
+
79
+ def monta_detalhe(pagamento, sequencial)
80
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
81
+
82
+ detalhe = '1' # identificacao do registro 9[01] 001 a 001
83
+ detalhe += ''.rjust(5, '0') # agencia de debito (op) 9[05] 002 a 006
84
+ detalhe << ''.rjust(1, '0') # digito da agencia de debito (op) X[01] 007 a 007
85
+ detalhe << ''.rjust(5, '0') # razao da conta corrente de debito (op) 9[05] 008 a 012
86
+ detalhe << ''.rjust(7, '0') # conta corrente (op) 9[07] 013 a 019
87
+ detalhe << ''.rjust(1, '0') # digito da conta corrente (op) X[01] 020 a 020
88
+ detalhe << identificacao_empresa # identficacao da empresa X[17] 021 a 037
89
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # num. controle X[25] 038 a 062
90
+ detalhe << ''.rjust(3, '0') # codigo do banco (debito automatico apenas) 9[03] 063 a 065
91
+ detalhe << pagamento.codigo_multa # campo da multa (0 = sem, 2 = com) 9[01] 066 a 066 *
92
+ detalhe << pagamento.formata_percentual_multa # percentual multa 9[04] 067 a 070 *
93
+ detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 071 a 081
94
+ detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # digito de conferencia do nosso numero (dv) X[01] 082 a 082
95
+ detalhe << ''.rjust(10, '0') # desconto por dia 9[10] 083 a 092
96
+ detalhe << '2' # condicao emissao boleto (2 = cliente) 9[01] 093 a 093
97
+ detalhe << 'N' # emite boleto para debito X[01] 094 a 094
98
+ detalhe << ''.rjust(10, ' ') # operacao no banco (brancos) X[10] 095 a 104
99
+ detalhe << ' ' # indicador rateio X[01] 105 a 105
100
+ detalhe << '2' # endereco para aviso debito (op 2 = ignora) 9[01] 106 a 106
101
+ detalhe << ''.rjust(2, ' ') # brancos X[02] 107 a 108
102
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
103
+ detalhe << pagamento.numero.to_s.ljust(10, ' ') # numero do documento alfanum. X[10] 111 a 120
104
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data de vencimento 9[06] 121 a 126
105
+ detalhe << pagamento.formata_valor # valor do titulo 9[13] 127 a 139
106
+ detalhe << ''.rjust(3, '0') # banco encarregado (zeros) 9[03] 140 a 142
107
+ detalhe << ''.rjust(5, '0') # agencia depositaria (zeros) 9[05] 143 a 147
108
+ detalhe << '01' # especie do titulo 9[02] 148 a 149
109
+ detalhe << 'N' # identificacao (sempre N) X[01] 150 a 150
110
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06] 151 a 156
111
+ detalhe << ''.rjust(2, '0') # 1a instrucao 9[02] 157 a 158
112
+ detalhe << ''.rjust(2, '0') # 2a instrucao 9[02] 159 a 160
113
+ detalhe << pagamento.formata_valor_mora # mora 9[13] 161 a 173
114
+ detalhe << pagamento.formata_data_desconto # data desconto 9[06] 174 a 179
115
+ detalhe << pagamento.formata_valor_desconto # valor desconto 9[13] 180 a 192
116
+ detalhe << pagamento.formata_valor_iof # valor iof 9[13] 193 a 205
117
+ detalhe << pagamento.formata_valor_abatimento # valor abatimento 9[13] 206 a 218
118
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02] 219 a 220
119
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # cpf/cnpj do pagador 9[14] 221 a 234
120
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador 9[40] 235 a 274
121
+ detalhe << formata_endereco_sacado(pagamento) # endereco do pagador X[40] 275 a 314
122
+ detalhe << ''.rjust(12, ' ') # 1a mensagem X[12] 315 a 326
123
+ detalhe << pagamento.cep_sacado[0..4] # cep do pagador 9[05] 327 a 331
124
+ detalhe << pagamento.cep_sacado[5..7] # sufixo do cep do pagador 9[03] 332 a 334
125
+ detalhe << ''.rjust(60, ' ') # sacador/2a mensagem - verificar X[60] 335 a 394
126
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
127
+ detalhe
128
+ end
129
+
130
+ def monta_descontos_adicionais(pagamento, sequencial)
131
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
132
+
133
+ detalhe = '2' # identificacao do registro 9[01] 001 a 001
134
+ detalhe += ''.rjust(80, ' ') # mensagem 1 X[80] 002 a 081
135
+ detalhe << ''.rjust(80, ' ') # mensagem 2 X[80] 082 a 161
136
+ detalhe << ''.rjust(80, ' ') # mensagem 3 X[80] 162 a 241
137
+ detalhe << ''.rjust(80, ' ') # mensagem 4 X[80] 242 a 321
138
+ detalhe << pagamento.formata_data_segundo_desconto # data limite para o terceiro desconto 9[06] 322 a 327
139
+ detalhe << pagamento.formata_valor_segundo_desconto # valor do segundo desconto 9[13] 328 a 340
140
+ detalhe << pagamento.formata_data_terceiro_desconto # data limite para o terceiro desconto 9[06] 341 a 346
141
+ detalhe << pagamento.formata_valor_terceiro_desconto # valor do terceiro desconto 9[13] 347 a 359
142
+ detalhe << ''.rjust(7, ' ') # reserva X[07] 360 a 366
143
+ detalhe << carteira.to_s.rjust(3, '0') # carteira 9[03] 367 a 369
144
+ detalhe << agencia # codigo da agencia (sem dv) 9[05] 370 a 374
145
+ detalhe << conta_corrente # codigo da conta 9[07] 375 a 381
146
+ detalhe << digito_conta # digito da conta X[01] 382 a 382
147
+ detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 383 a 393
148
+ detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # digito de conferencia do nosso numero (dv) X[01] 394 a 394
149
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
150
+ detalhe
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end