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,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Citibank < Brcobranca::Remessa::Cnab400::Base
7
+ # Identificação do portfolio.
8
+ # Necessário consultar o Citibank para informações referentes à conta cobrança e carteira do cliente.
9
+ attr_accessor :portfolio
10
+
11
+ validates_presence_of :documento_cedente, :portfolio, message: 'não pode estar em branco.'
12
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
13
+ validates_length_of :carteira, maximum: 1, message: 'deve ter no máximo 1 dígito.'
14
+ validates_length_of :portfolio, maximum: 20, message: 'deve ter no máximo 20 dígitos.'
15
+
16
+ # Nova instancia do Citibank
17
+ def initialize(campos = {})
18
+ campos = { aceite: 'N', carteira: '1' }.merge!(campos)
19
+ super(campos)
20
+ end
21
+
22
+ def cod_banco
23
+ '745'
24
+ end
25
+
26
+ def nome_banco
27
+ 'CITIBANK'.ljust(15, ' ')
28
+ end
29
+
30
+ # Informacoes da conta corrente do cedente
31
+ #
32
+ # @return [String]
33
+ #
34
+ def info_conta
35
+ # CAMPO TAMANHO
36
+ # portfolio 20
37
+ portfolio.rjust(20, ' ')
38
+ end
39
+
40
+ # Complemento do header
41
+ # (no caso do Citibank, sao apenas espacos em branco)
42
+ #
43
+ # @return [String]
44
+ #
45
+ def complemento
46
+ # CAMPO TAMANHO
47
+ # Densidade de gravação 5
48
+ # Unidade de densidade de gravação 3
49
+ '01600BPI'.rjust(294, ' ')
50
+ end
51
+
52
+ # Detalhe do arquivo
53
+ #
54
+ # @param pagamento [PagamentoCnab400]
55
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
56
+ # @param sequencial
57
+ # num. sequencial do registro no arquivo
58
+ #
59
+ # @return [String]
60
+ #
61
+ def monta_detalhe(pagamento, sequencial)
62
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
63
+
64
+ detalhe = '1' # identificacao transacao 9[01]
65
+ detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
66
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
67
+ detalhe << portfolio # portfolio X[20]
68
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa X[25]
69
+ detalhe << pagamento.especie_titulo # espécie do título 9[02] - 00 = DMI – Duplicata Mercantil por Indicação, 02 = DM – Duplicata Mercantil
70
+ detalhe << pagamento.nosso_numero.to_s.rjust(12, '0') # nosso numero 9[12]
71
+ detalhe << ''.rjust(6, ' ') # brancos X[06]
72
+ detalhe << pagamento.formata_data_segundo_desconto # data limite para o segundo desconto 9[06]
73
+ detalhe << pagamento.formata_valor_segundo_desconto # valor do segundo desconto 9[13]
74
+ detalhe << '000' # carne 9[03] - Válido apenas quando o campo 148/149 for igual a 03
75
+ detalhe << '000' # parcela 9[03] - Só preencher se o banco for imprimir e enviar e for um carnê
76
+ detalhe << carteira # codigo da carteira X[01] - Código 1 = Cobrança Simples, Código 2 = Cobrança Caucionada
77
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
78
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
79
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
80
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
81
+ detalhe << cod_banco # codigo banco 9[03]
82
+ detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
83
+
84
+ # 01 = Banco imprime (apenas boletos simples não personalizados) 03 = Banco imprime de forma personalizada (boletos simples, personalizados e carnês)
85
+ # 07 = Banco não imprime
86
+ # 08 = Impressão via WEB (boleto por e-mail) sem impressão banco 09 = Impressão via WEB (boleto por e-mail) com impressão banco Observações:
87
+ # - Quando código 03, o cliente deverá entrar em contato com o banco, antes de enviar o arquivo, para definir a personalização do boleto.
88
+ # - Quando código 07, o campo 065/076, deverá ter o NOSSO NÚMERO atribuído pelo cliente.
89
+ # Se o portfolio do cliente for cobrança flexível:
90
+ # 04 = Título flex com boleto impresso via web (boleto por e-mail), aceita pagamento parcial
91
+ # 06 = Título flex com boleto impresso via web (boleto por e-mail), não aceita pagamento parcial
92
+ # (No caso de Cobrança Flexível, o campo 065/076 – NOSSO NÚMERO, no arquivo remessa, deve ser preenchido pelo cliente,
93
+ # ou será preenchido no banco após a entrada do arquivo no sistema de cobrança, visto que os códigos utilizados serão 04 ou 06 no campo Tipo de Emissão.)
94
+ # (Para a modalidade de Cobrança Flexível, a opção de envio por e- mail deverá ser um parâmetro cadastral.)
95
+ detalhe << '07' # Tipo de Emissão X[02]
96
+ detalhe << aceite # aceite (A/N) X[01]
97
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
98
+
99
+ # 00 = SEM INSTRUÇÂO: após o vencimento, o título sofrerá a instrução presente no cadastro do cliente. Não havendo instruções no cadastro do cliente, o título será baixado automaticamente após 60 dias e o pagamento, após vencimento, poderá ser restrito ao Citibank
100
+ # 06 = PROTESTAR: quando esta instrução for dada também deverá ser preenchida a posição 159/160
101
+ # 07 = NEGATIVAR: instrução utilizada para envio de título para negativação na Serasa. Quando esta for informada, também deverá ser preenchida as posições 159/160.
102
+ # IMPORTANTE: essa instrução somente poderá ser utilizada após assinatura de contrato específico para o produto.
103
+ # 09 = DEVOLVER: esta é a instrução de BAIXA quando esta instrução for dada também deverá ser preenchida a posição 159/160
104
+ # 10 = SUSTAR PROTESTO: instrução utilizada para títulos que NÃO estejam em cartório
105
+ detalhe << '00' # Instrução para o título 9[02]
106
+
107
+ # Quando posição 157/158 (Instrução para título) conter instrução 06 ou 09,
108
+ # este campo deverá conter a quantidade de dias válidos para execução da instrução.
109
+ detalhe << '00' # Número de dias válidos para instrução 9[02]
110
+ detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
111
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
112
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
113
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
114
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
115
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
116
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
117
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
118
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
119
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
120
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
121
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
122
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
123
+
124
+ # Este campo tem 3 finalidades:
125
+ # a) mensagem da empresa impressa no boleto pelo banco
126
+ # (para isto na primeira posição deve haver um
127
+ # asterisco);
128
+ # b) sem o asterisco, este campo será o nome do Sacador/Avalista, quando preenchido;
129
+ # c) Se posição 148/149 (Tipo de Emissão) estiver com código 08 ou 09, este campo será o e-mail do sacado.
130
+ detalhe << pagamento.nome_avalista.format_size(40) # Sacador/Mensagens X[40]
131
+ detalhe << ''.rjust(2, ' ') # Brancos X[06]
132
+ detalhe << '9' # moeda 9[01] - Código 9 = REAIS Código 5 = Dólar
133
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
134
+ detalhe
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Credisis < Brcobranca::Remessa::Cnab400::Base
7
+ attr_accessor :codigo_cedente, :documento_cedente, :convenio
8
+
9
+ validates_presence_of :agencia, :conta_corrente, :codigo_cedente, :digito_conta,
10
+ message: 'não pode estar em branco.'
11
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
12
+ validates_length_of :codigo_cedente, maximum: 4, message: 'deve ter 4 dígitos.'
13
+ validates_length_of :conta_corrente, maximum: 8, message: 'deve ter 8 dígitos.'
14
+ validates_length_of :carteira, maximum: 2, message: 'deve ter 2 dígitos.'
15
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
16
+ validates_length_of :sequencial_remessa, :convenio, maximum: 7, message: 'deve ter 7 dígitos.'
17
+
18
+ # Nova instancia do CrediSIS
19
+ def initialize(campos = {})
20
+ campos = { aceite: 'N' }.merge!(campos)
21
+ super(campos)
22
+ end
23
+
24
+ def agencia=(valor)
25
+ @agencia = valor.to_s.rjust(4, '0') if valor
26
+ end
27
+
28
+ def conta_corrente=(valor)
29
+ @conta_corrente = valor.to_s.rjust(8, '0') if valor
30
+ end
31
+
32
+ def carteira=(valor)
33
+ @carteira = valor.to_s.rjust(2, '0') if valor
34
+ end
35
+
36
+ def sequencial_remessa=(valor)
37
+ @sequencial_remessa = valor.to_s.rjust(7, '0') if valor
38
+ end
39
+
40
+ def codigo_cedente=(valor)
41
+ @codigo_cedente = valor.to_s.rjust(4, '0') if valor
42
+ end
43
+
44
+ def cod_banco
45
+ '097'
46
+ end
47
+
48
+ def nome_banco
49
+ 'CENTRALCRED'.ljust(15, ' ')
50
+ end
51
+
52
+ # Informacoes da conta corrente do cedente
53
+ #
54
+ # @return [String]
55
+ #
56
+ def info_conta
57
+ # CAMPO TAMANHO
58
+ # agencia 4
59
+ # complemento 1
60
+ # conta corrente 8
61
+ # digito da conta 1
62
+ # complemento 6
63
+ "#{agencia} #{conta_corrente}#{digito_conta}#{''.rjust(6, ' ')}"
64
+ end
65
+
66
+ # Complemento do header
67
+ #
68
+ # @return [String]
69
+ #
70
+ def complemento
71
+ sequencial_remessa.to_s.ljust(294, ' ')
72
+ end
73
+
74
+ def formata_nosso_numero(nosso_numero)
75
+ "0#{codigo_cedente}#{nosso_numero.rjust(6, '0')}"
76
+ end
77
+
78
+ # Detalhe do arquivo
79
+ #
80
+ # @param pagamento [PagamentoCnab400]
81
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
82
+ # @param sequencial
83
+ # num. sequencial do registro no arquivo
84
+ #
85
+ # @return [String]
86
+ #
87
+ def monta_detalhe(pagamento, sequencial)
88
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
89
+
90
+ detalhe = '1' # identificacao transacao 9[01]
91
+ detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
92
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
93
+ detalhe << agencia # agencia 9[04]
94
+ detalhe << ''.rjust(1, ' ') # brancos X[01]
95
+ detalhe << conta_corrente # conta corrente 9[08]
96
+ detalhe << digito_conta # dac 9[01]
97
+ detalhe << ''.rjust(6, ' ') # complemento do registro (brancos) X[06]
98
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa X[25]
99
+ detalhe << formata_nosso_numero(pagamento.nosso_numero.to_s) # nosso numero 9[11]
100
+ detalhe << ''.rjust(37, ' ') # brancos X[37]
101
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
102
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento A[06]
103
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
104
+ detalhe << ''.rjust(11, ' ') # brancos X[11]
105
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
106
+ detalhe << ''.rjust(4, ' ') # brancos X[04]
107
+ detalhe << pagamento.formata_valor_mora(4).ljust(6, '0') # valor mora ao dia 9[06]
108
+ detalhe << pagamento.formata_percentual_multa.ljust(6, '0') # valor multa 9[06]
109
+ detalhe << ''.rjust(33, ' ') # brancos X[33]
110
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
111
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
112
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
113
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador A[40]
114
+ detalhe << pagamento.endereco_sacado.format_size(37) # endereco do pagador A[37]
115
+ detalhe << pagamento.bairro_sacado.format_size(15) # bairro do pagador X[15]
116
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
117
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador A[15]
118
+ detalhe << pagamento.uf_sacado # uf do pagador A[02]
119
+ detalhe << pagamento.nome_avalista.format_size(25) # nome do sacador/avalista X[25]
120
+ detalhe << ''.rjust(1, ' ') # complemento do registro X[01]
121
+ detalhe << ''.rjust(14, ' ') # documento avalista X[14] *
122
+ detalhe << pagamento.dias_protesto.rjust(2, '0') # quantidade de dias do prazo 9[02]
123
+ detalhe << ''.rjust(1, ' ') # complemento do registro (brancos) X[01]
124
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
125
+ detalhe
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,162 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab400
6
+ class Itau < Brcobranca::Remessa::Cnab400::Base
7
+ VALOR_EM_REAIS = '1'
8
+ VALOR_EM_PERCENTUAL = '2'
9
+
10
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
11
+ validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
12
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
13
+ validates_length_of :conta_corrente, maximum: 5, message: 'deve ter 5 dígitos.'
14
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
15
+ validates_length_of :carteira, maximum: 3, message: 'deve ter no máximo 3 dígitos.'
16
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
17
+
18
+ # Nova instancia do Itau
19
+ def initialize(campos = {})
20
+ campos = { aceite: 'N' }.merge!(campos)
21
+ super(campos)
22
+ end
23
+
24
+ def agencia=(valor)
25
+ @agencia = valor.to_s.rjust(4, '0') if valor
26
+ end
27
+
28
+ def conta_corrente=(valor)
29
+ @conta_corrente = valor.to_s.rjust(5, '0') if valor
30
+ end
31
+
32
+ def carteira=(valor)
33
+ @carteira = valor.to_s.rjust(3, '0') if valor
34
+ end
35
+
36
+ def cod_banco
37
+ '341'
38
+ end
39
+
40
+ def nome_banco
41
+ 'BANCO ITAU SA'.ljust(15, ' ')
42
+ end
43
+
44
+ # Informacoes da conta corrente do cedente
45
+ #
46
+ # @return [String]
47
+ #
48
+ def info_conta
49
+ # CAMPO TAMANHO
50
+ # agencia 4
51
+ # complemento 2
52
+ # conta corrente 5
53
+ # digito da conta 1
54
+ # complemento 8
55
+ "#{agencia}00#{conta_corrente}#{digito_conta}#{''.rjust(8, ' ')}"
56
+ end
57
+
58
+ # Complemento do header
59
+ # (no caso do Itau, sao apenas espacos em branco)
60
+ #
61
+ # @return [String]
62
+ #
63
+ def complemento
64
+ ''.rjust(294, ' ')
65
+ end
66
+
67
+ # Codigo da carteira de acordo com a documentacao o Itau
68
+ # se a carteira nao forem as testadas (150, 191 e 147)
69
+ # retorna 'I' que é o codigo das carteiras restantes na documentacao
70
+ #
71
+ # @return [String]
72
+ #
73
+ def codigo_carteira
74
+ return 'U' if carteira.to_s == '150'
75
+ return '1' if carteira.to_s == '191'
76
+ return 'E' if carteira.to_s == '147'
77
+
78
+ 'I'
79
+ end
80
+
81
+ # Detalhe do arquivo
82
+ #
83
+ # @param pagamento [PagamentoCnab400]
84
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
85
+ # @param sequencial
86
+ # num. sequencial do registro no arquivo
87
+ #
88
+ # @return [String]
89
+ #
90
+ def monta_detalhe(pagamento, sequencial)
91
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
92
+
93
+ detalhe = '1' # identificacao transacao 9[01]
94
+ detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
95
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
96
+ detalhe << agencia # agencia 9[04]
97
+ detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
98
+ detalhe << conta_corrente # conta corrente 9[05]
99
+ detalhe << digito_conta # dac 9[01]
100
+ detalhe << ''.rjust(4, ' ') # complemento do registro (brancos) X[04]
101
+ detalhe << ''.rjust(4, '0') # codigo cancelamento (zeros) 9[04]
102
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa X[25]
103
+ detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[08]
104
+ detalhe << ''.rjust(13, '0') # quantidade de moeda variavel 9[13]
105
+ detalhe << carteira # carteira 9[03]
106
+ detalhe << ''.rjust(21, ' ') # identificacao da operacao no banco X[21]
107
+ detalhe << codigo_carteira # codigo da carteira X[01]
108
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
109
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
110
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
111
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
112
+ detalhe << cod_banco # codigo banco 9[03]
113
+ detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
114
+ detalhe << pagamento.especie_titulo # especie do titulo X[02]
115
+ detalhe << aceite # aceite (A/N) X[01]
116
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
117
+ detalhe << pagamento.cod_primeira_instrucao.to_s.rjust(2, '0') # 1a instrucao - deixar zero X[02]
118
+ detalhe << pagamento.cod_segunda_instrucao.to_s.rjust(2, '0') # 2a instrucao - deixar zero X[02]
119
+ detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
120
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
121
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
122
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
123
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
124
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
125
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
126
+ detalhe << pagamento.nome_sacado.format_size(30) # nome do pagador X[30]
127
+ detalhe << ''.rjust(10, ' ') # complemento do registro (brancos) X[10]
128
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
129
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
130
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
131
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
132
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
133
+ detalhe << pagamento.nome_avalista.format_size(30) # nome do sacador/avalista X[30]
134
+ detalhe << ''.rjust(4, ' ') # complemento do registro X[04]
135
+ detalhe << ''.rjust(6, '0') # data da mora 9[06] *
136
+ detalhe << prazo_instrucao(pagamento) # prazo para a instrução 9[02]
137
+ detalhe << ''.rjust(1, ' ') # complemento do registro (brancos) X[01]
138
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
139
+ detalhe
140
+ end
141
+
142
+ def prazo_instrucao(pagamento)
143
+ return "03" unless %w[09 34 35].include?(
144
+ pagamento.cod_primeira_instrucao
145
+ )
146
+
147
+ pagamento.dias_protesto.rjust(2, '0')
148
+ end
149
+
150
+ def monta_detalhe_multa(pagamento, sequencial)
151
+ detalhe = '2'
152
+ detalhe += pagamento.codigo_multa
153
+ detalhe << pagamento.data_vencimento.strftime('%d%m%Y')
154
+ detalhe << pagamento.formata_percentual_multa(13)
155
+ detalhe << ''.rjust(371, ' ')
156
+ detalhe << sequencial.to_s.rjust(6, '0')
157
+ detalhe
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end