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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +8 -0
- data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
- data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
- data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
- data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
- data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
- data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
- data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
- data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
- data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
- data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
- data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
- data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
- data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
- data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
- data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
- data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
- data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
- data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
- data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
- data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
- data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
- data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
- data/lib/brcobranca/boleto/ailos.rb +89 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
- data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
- data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
- data/lib/brcobranca/boleto/banestes.rb +86 -0
- data/lib/brcobranca/boleto/banrisul.rb +95 -0
- data/lib/brcobranca/boleto/base.rb +256 -0
- data/lib/brcobranca/boleto/bradesco.rb +100 -0
- data/lib/brcobranca/boleto/caixa.rb +123 -0
- data/lib/brcobranca/boleto/citibank.rb +97 -0
- data/lib/brcobranca/boleto/credisis.rb +118 -0
- data/lib/brcobranca/boleto/hsbc.rb +96 -0
- data/lib/brcobranca/boleto/itau.rb +138 -0
- data/lib/brcobranca/boleto/safra.rb +152 -0
- data/lib/brcobranca/boleto/santander.rb +86 -0
- data/lib/brcobranca/boleto/sicoob.rb +120 -0
- data/lib/brcobranca/boleto/sicredi.rb +145 -0
- data/lib/brcobranca/boleto/template/base.rb +28 -0
- data/lib/brcobranca/boleto/template/rghost.rb +308 -0
- data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
- data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
- data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
- data/lib/brcobranca/boleto/unicred.rb +99 -0
- data/lib/brcobranca/calculo.rb +120 -0
- data/lib/brcobranca/calculo_data.rb +63 -0
- data/lib/brcobranca/currency.rb +69 -0
- data/lib/brcobranca/formatacao.rb +104 -0
- data/lib/brcobranca/formatacao_string.rb +37 -0
- data/lib/brcobranca/limpeza.rb +20 -0
- data/lib/brcobranca/remessa/base.rb +72 -0
- data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
- data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
- data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
- data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
- data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
- data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
- data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
- data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
- data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
- data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
- data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
- data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
- data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
- data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
- data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
- data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
- data/lib/brcobranca/remessa/pagamento.rb +320 -0
- data/lib/brcobranca/retorno/base.rb +11 -0
- data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
- data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
- data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
- data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
- data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
- data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
- data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
- data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
- data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
- data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
- data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
- data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
- data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
- data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
- data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
- data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
- data/lib/brcobranca/util/date.rb +21 -0
- data/lib/brcobranca/util/empresa.rb +29 -0
- data/lib/brcobranca/util/errors.rb +76 -0
- data/lib/brcobranca/validations.rb +208 -0
- data/lib/brcobranca/version.rb +5 -0
- data/lib/brcobranca.rb +200 -0
- metadata +225 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parseline'
|
4
|
+
|
5
|
+
module Brcobranca
|
6
|
+
module Retorno
|
7
|
+
module Cnab400
|
8
|
+
# Formato de Retorno CNAB 400 Sicredi
|
9
|
+
class Sicredi < Brcobranca::Retorno::Cnab400::Base
|
10
|
+
extend ParseLine::FixedWidth
|
11
|
+
|
12
|
+
# Carregar as linhas do arquivo, ignorando o header
|
13
|
+
def self.load_lines(file, options = {})
|
14
|
+
default_options = { except: [1] } # Ignorar primeira linha (header)
|
15
|
+
options = default_options.merge!(options)
|
16
|
+
|
17
|
+
super(file, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
fixed_width_layout do |parse|
|
21
|
+
# Definir layout conforme especificado no manual
|
22
|
+
# Código de Registro: 1 - Transação
|
23
|
+
parse.field :codigo_registro, 0..0
|
24
|
+
|
25
|
+
# Agência sem dígito verificador (4 posições)
|
26
|
+
parse.field :agencia_sem_dv, 17..20
|
27
|
+
|
28
|
+
# Código do Cedente com dígito verificador (9 posições)
|
29
|
+
parse.field :cedente_com_dv, 22..30
|
30
|
+
|
31
|
+
# Nosso número (17 posições)
|
32
|
+
parse.field :nosso_numero, 45..61
|
33
|
+
|
34
|
+
# Código da ocorrência (2 posições)
|
35
|
+
parse.field :codigo_ocorrencia, 108..109
|
36
|
+
|
37
|
+
# Data do crédito (6 posições, formato DDMMAA)
|
38
|
+
parse.field :data_credito, 110..115
|
39
|
+
|
40
|
+
# Data de vencimento (6 posições, formato DDMMAA)
|
41
|
+
parse.field :data_vencimento, 146..151
|
42
|
+
|
43
|
+
# Valor nominal do título (13 posições, 2 últimas dígitos decimais)
|
44
|
+
parse.field :valor_titulo, 152..164
|
45
|
+
|
46
|
+
# Banco Recebedor (3 posições)
|
47
|
+
parse.field :banco_recebedor, 165..167
|
48
|
+
|
49
|
+
# Agência Recebedora com dígito verificador (5 posições)
|
50
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
51
|
+
|
52
|
+
# Valor da tarifa de cobrança (7 posições, 2 últimas dígitos decimais)
|
53
|
+
parse.field :valor_tarifa, 181..187
|
54
|
+
|
55
|
+
# Valor do abatimento concedido (13 posições, 2 últimas dígitos decimais)
|
56
|
+
parse.field :valor_abatimento, 227..239
|
57
|
+
|
58
|
+
# Valor do desconto concedido (13 posições, 2 últimas dígitos decimais)
|
59
|
+
parse.field :desconto, 240..252
|
60
|
+
|
61
|
+
# Valor recebido (13 posições, 2 últimas dígitos decimais)
|
62
|
+
parse.field :valor_recebido, 253..265
|
63
|
+
|
64
|
+
# Juros e mora pagos (13 posições, 2 últimas dígitos decimais)
|
65
|
+
parse.field :juros_mora, 266..278
|
66
|
+
|
67
|
+
# Motivo da ocorrência (8 posições, 4 motivos de 2 posições)
|
68
|
+
parse.field :motivo_ocorrencia, 318..325, lambda { |motivos|
|
69
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
|
70
|
+
}
|
71
|
+
|
72
|
+
# Número sequencial no arquivo (6 posições)
|
73
|
+
parse.field :sequencial, 394..399
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parseline'
|
4
|
+
|
5
|
+
module Brcobranca
|
6
|
+
module Retorno
|
7
|
+
module Cnab400
|
8
|
+
# Formato de Retorno CNAB 400
|
9
|
+
class Unicred < Brcobranca::Retorno::Cnab400::Base
|
10
|
+
extend ParseLine::FixedWidth
|
11
|
+
|
12
|
+
def self.load_lines(file, options = {})
|
13
|
+
# por padrao ignora a primeira linha que é header
|
14
|
+
default_options = { except: [1] }
|
15
|
+
options = default_options.merge!(options)
|
16
|
+
|
17
|
+
super(file, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
fixed_width_layout do |parse|
|
21
|
+
# Todos os campos descritos no documento em ordem
|
22
|
+
# :tipo_de_registro, 0..0 # identificacao do registro transacao - Fixo 1
|
23
|
+
parse.field :codigo_registro, 0..0
|
24
|
+
|
25
|
+
# :codigo_de_inscricao, 1..2 # identificacao do tipo de inscricao/empresa
|
26
|
+
# :numero_de_inscricao, 3..16 # numero de inscricao da empresa (cpf/cnpj)
|
27
|
+
|
28
|
+
# Identificacao da empresa no banco
|
29
|
+
# :agencia_com_dv, 17..21
|
30
|
+
# :digito_agencia, 21..21
|
31
|
+
# :cedente_com_dv, 22..29
|
32
|
+
parse.field :agencia_sem_dv, 17..20
|
33
|
+
parse.field :cedente_com_dv, 22..30
|
34
|
+
|
35
|
+
# :codigo_beneficiario, 31..44
|
36
|
+
# :nosso_numero, 45..61 # identificacao do titulo no banco
|
37
|
+
parse.field :nosso_numero, 45..61
|
38
|
+
|
39
|
+
# :FIXO, 62..72 BRANCOS* Este campo deve ser
|
40
|
+
# desconsiderado. Ele esta reservado para melhorias.
|
41
|
+
# :zeros, 73..73
|
42
|
+
# :FIXO, 74..74 # 1 - SIMPLES
|
43
|
+
# :FIXO 75..84 BRANCOS* Este campo deve ser
|
44
|
+
# desconsiderado. Ele esta reservado para melhorias.
|
45
|
+
# :FIXO 85..87 # 019
|
46
|
+
# :zeros 88..105
|
47
|
+
# :FIXO 106..107 # 18
|
48
|
+
|
49
|
+
# :codigo_ocorrencia 108..109
|
50
|
+
parse.field :codigo_ocorrencia, 108..109
|
51
|
+
|
52
|
+
# :data_credito, 110..115 # data de credito desta liquidacao
|
53
|
+
parse.field :data_credito, 110..115
|
54
|
+
|
55
|
+
# :FIXO 116..145 BRANCOS* Este campo deve ser
|
56
|
+
# desconsiderado. Ele está reservado para melhorias.
|
57
|
+
|
58
|
+
# :vencimento, 146..151 # data de vencimento do titulo (ddmmaa)
|
59
|
+
parse.field :data_vencimento, 146..151
|
60
|
+
|
61
|
+
# :valor_do_titulo, 152..164 # valor nominal do titulo
|
62
|
+
# (ultimos 2 digitos, virgula decimal assumida)
|
63
|
+
parse.field :valor_titulo, 152..164
|
64
|
+
|
65
|
+
# :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
|
66
|
+
parse.field :banco_recebedor, 165..167
|
67
|
+
|
68
|
+
# :agencia_recebedora, 168..171 # agencia cobradora,
|
69
|
+
# ag de liquidacao ou baixa
|
70
|
+
# DV-PREFIXO AGENCIA RECEBEDORA, 172..172 #
|
71
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
72
|
+
|
73
|
+
# :FIXO 173..174 BRANCOS* Este campo deve ser
|
74
|
+
# desconsiderado. Ele esta reservado para melhorias.
|
75
|
+
|
76
|
+
# DATA PROGRAMADA PARA REPASSE
|
77
|
+
# :data, 175..180
|
78
|
+
|
79
|
+
# :tarifa_de_cobranca, 181..187 # valor da despesa de cobranca
|
80
|
+
# (ultimos 2 digitos, virgula decimal assumida)
|
81
|
+
parse.field :valor_tarifa, 181..187
|
82
|
+
|
83
|
+
# :FIXO 188..226 BRANCOS* Este campo deve ser
|
84
|
+
# desconsiderado. Ele está reservado para melhorias.
|
85
|
+
|
86
|
+
# :valor_abatimento, 227..239 # valor do abatimento concedido
|
87
|
+
# (ultimos 2 digitos, virgula decimal assumida)
|
88
|
+
parse.field :valor_abatimento, 227..239
|
89
|
+
|
90
|
+
# :descontos, 240..252 # valor do desconto concedid
|
91
|
+
# o (ultimos 2 digitos, virgula decimal assumida)
|
92
|
+
parse.field :desconto, 240..252
|
93
|
+
|
94
|
+
# :valor_recebido, 253..265 # valor lancado em conta corrente
|
95
|
+
# (ultimos 2 digitos, virgula decimal assumida)
|
96
|
+
parse.field :valor_recebido, 253..265
|
97
|
+
|
98
|
+
# :juros_mora, 266..278 # valor de mora e multa pagos pelo sacado
|
99
|
+
# (ultimos 2 digitos, virgula decimal assumida)
|
100
|
+
parse.field :juros_mora, 266..278
|
101
|
+
|
102
|
+
# :numero_controle_empresa, 279..304, # numero de controle da empresa
|
103
|
+
|
104
|
+
# : Valor Liquido, 305..317 Diferença entre: Valor Pago e Valor da
|
105
|
+
# Tarifa (Valor Pago – Valor da Tarifa)
|
106
|
+
|
107
|
+
# :Complemento do Movimento 318..325
|
108
|
+
parse.field :motivo_ocorrencia, 318..325, lambda { |motivos|
|
109
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
|
110
|
+
}
|
111
|
+
|
112
|
+
# :Tipo de Instrucao de Origem 326..327
|
113
|
+
|
114
|
+
# :FIXO 328..393 BRANCOS* Este campo deve ser
|
115
|
+
# desconsiderado. Ele está reservado para melhorias.
|
116
|
+
|
117
|
+
# :numero_sequencial, 394..399 # numero sequencial no arquivo
|
118
|
+
parse.field :sequencial, 394..399
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parseline'
|
4
|
+
module Brcobranca
|
5
|
+
module Retorno
|
6
|
+
# Formato de Retorno CNAB 643
|
7
|
+
class RetornoCbr643 < Base
|
8
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
9
|
+
|
10
|
+
fixed_width_layout do |parse|
|
11
|
+
parse.field :agencia_com_dv, 17..21
|
12
|
+
parse.field :cedente_com_dv, 22..30
|
13
|
+
parse.field :convenio, 31..37
|
14
|
+
parse.field :nosso_numero, 63..79
|
15
|
+
parse.field :tipo_cobranca, 80..80
|
16
|
+
parse.field :tipo_cobranca_anterior, 81..81
|
17
|
+
parse.field :natureza_recebimento, 86..87
|
18
|
+
parse.field :carteira_variacao, 91..93
|
19
|
+
parse.field :desconto, 95..99
|
20
|
+
parse.field :iof, 100..104
|
21
|
+
parse.field :carteira, 106..107
|
22
|
+
parse.field :comando, 108..109
|
23
|
+
parse.field :data_liquidacao, 110..115
|
24
|
+
parse.field :data_vencimento, 146..151
|
25
|
+
parse.field :valor_titulo, 152..164
|
26
|
+
parse.field :banco_recebedor, 165..167
|
27
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
28
|
+
parse.field :especie_documento, 173..174
|
29
|
+
parse.field :data_credito, 175..180
|
30
|
+
parse.field :valor_tarifa, 181..187
|
31
|
+
parse.field :outras_despesas, 188..200
|
32
|
+
parse.field :juros_desconto, 201..213
|
33
|
+
parse.field :iof_desconto, 214..226
|
34
|
+
parse.field :valor_abatimento, 227..239
|
35
|
+
parse.field :desconto_concedito, 240..252
|
36
|
+
parse.field :valor_recebido, 253..265
|
37
|
+
parse.field :juros_mora, 266..278
|
38
|
+
parse.field :outros_recebimento, 279..291
|
39
|
+
parse.field :abatimento_nao_aproveitado, 292..304
|
40
|
+
parse.field :valor_lancamento, 305..317
|
41
|
+
parse.field :indicativo_lancamento, 318..318
|
42
|
+
parse.field :indicador_valor, 319..319
|
43
|
+
parse.field :valor_ajuste, 320..331
|
44
|
+
parse.field :sequencial, 394..399
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parseline'
|
4
|
+
module Brcobranca
|
5
|
+
module Retorno
|
6
|
+
# Formato de Retorno CNAB 240
|
7
|
+
class RetornoCnab240 < Base
|
8
|
+
# Regex para remoção de headers e trailers além de registros diferentes de T ou U
|
9
|
+
REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
|
10
|
+
|
11
|
+
def self.load_lines(file, options = {})
|
12
|
+
default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
|
13
|
+
options = default_options.merge!(options)
|
14
|
+
|
15
|
+
Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
|
16
|
+
retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.generate_retorno_based_on_cnab_lines(cnab_lines)
|
21
|
+
retorno = new
|
22
|
+
cnab_lines.each do |line|
|
23
|
+
if line.tipo_registro == 'T'
|
24
|
+
Line::REGISTRO_T_FIELDS.each do |attr|
|
25
|
+
retorno.send(:"#{attr}=", line.send(attr))
|
26
|
+
end
|
27
|
+
else
|
28
|
+
Line::REGISTRO_U_FIELDS.each do |attr|
|
29
|
+
retorno.send(:"#{attr}=", line.send(attr))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
retorno
|
34
|
+
end
|
35
|
+
|
36
|
+
# Linha de mapeamento do retorno do arquivo CNAB 240
|
37
|
+
# O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
|
38
|
+
# O primeiro é do tipo T que retorna dados gerais sobre a transação
|
39
|
+
# O segundo é do tipo U que retorna os valores da transação
|
40
|
+
class Line < Base
|
41
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
42
|
+
|
43
|
+
REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
|
44
|
+
data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
|
45
|
+
REGISTRO_U_FIELDS = %w[desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido
|
46
|
+
outras_despesas outros_recebimento data_ocorrencia data_credito].freeze
|
47
|
+
|
48
|
+
attr_accessor :tipo_registro
|
49
|
+
|
50
|
+
fixed_width_layout do |parse|
|
51
|
+
parse.field :codigo_registro, 7..7
|
52
|
+
parse.field :tipo_registro, 13..13
|
53
|
+
parse.field :sequencial, 8..12
|
54
|
+
parse.field :codigo_ocorrencia, 15..16
|
55
|
+
parse.field :agencia_com_dv, 17..22
|
56
|
+
parse.field :cedente_com_dv, 23..35
|
57
|
+
parse.field :nosso_numero, 46..56
|
58
|
+
parse.field :carteira, 57..57
|
59
|
+
parse.field :data_vencimento, 73..80
|
60
|
+
parse.field :valor_titulo, 81..95
|
61
|
+
parse.field :banco_recebedor, 96..98
|
62
|
+
parse.field :agencia_recebedora_com_dv, 99..104
|
63
|
+
parse.field :data_ocorrencia, 137..144
|
64
|
+
parse.field :data_credito, 145..152
|
65
|
+
parse.field :outras_despesas, 107..121
|
66
|
+
parse.field :iof_desconto, 62..76
|
67
|
+
parse.field :valor_abatimento, 47..61
|
68
|
+
parse.field :desconto_concedito, 32..46
|
69
|
+
parse.field :valor_recebido, 77..91
|
70
|
+
parse.field :juros_mora, 17..31
|
71
|
+
parse.field :outros_recebimento, 122..136
|
72
|
+
parse.field :valor_tarifa, 198..212
|
73
|
+
parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
|
74
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
|
75
|
+
}
|
76
|
+
|
77
|
+
# Dados que não consegui extrair dos registros T e U
|
78
|
+
# parse.field :convenio,31..37
|
79
|
+
# parse.field :tipo_cobranca,80..80
|
80
|
+
# parse.field :tipo_cobranca_anterior,81..81
|
81
|
+
# parse.field :natureza_recebimento,86..87
|
82
|
+
# parse.field :carteira_variacao,91..93
|
83
|
+
# parse.field :desconto,95..99
|
84
|
+
# parse.field :iof,100..104
|
85
|
+
# parse.field :comando,108..109
|
86
|
+
# parse.field :data_liquidacao,110..115
|
87
|
+
# parse.field :especie_documento,173..174
|
88
|
+
# parse.field :valor_tarifa,181..187
|
89
|
+
# parse.field :juros_desconto,201..213
|
90
|
+
# parse.field :abatimento_nao_aproveitado,292..304
|
91
|
+
# parse.field :valor_lancamento,305..317
|
92
|
+
# parse.field :indicativo_lancamento,318..318
|
93
|
+
# parse.field :indicador_valor,319..319
|
94
|
+
# parse.field :valor_ajuste,320..331
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# DEPRECATED
|
5
|
+
#
|
6
|
+
# Classe original desenvolvida a partir do layout do Itau.
|
7
|
+
# Movido para: cnab400/itau.rb
|
8
|
+
#
|
9
|
+
require 'parseline'
|
10
|
+
module Brcobranca
|
11
|
+
module Retorno
|
12
|
+
# Formato de Retorno CNAB 400
|
13
|
+
|
14
|
+
# Baseado em: http://download.itau.com.br/bankline/layout_cobranca_400bytes_cnab_itau_mensagem.pdf
|
15
|
+
class RetornoCnab400 < Base
|
16
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
17
|
+
|
18
|
+
def self.load_lines(file, options = {})
|
19
|
+
default_options = { except: [1] } # por padrao ignora a primeira linha que é header
|
20
|
+
options = default_options.merge!(options)
|
21
|
+
|
22
|
+
super(file, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
fixed_width_layout do |parse|
|
26
|
+
parse.field :codigo_registro, 0..0
|
27
|
+
parse.field :agencia_com_dv, 17..20 # FIXME: - SEM DIV
|
28
|
+
parse.field :cedente_com_dv, 23..28
|
29
|
+
parse.field :nosso_numero, 62..69
|
30
|
+
parse.field :carteira_variacao, 82..84
|
31
|
+
parse.field :carteira, 107..107
|
32
|
+
parse.field :codigo_ocorrencia, 108..109
|
33
|
+
parse.field :data_ocorrencia, 110..115
|
34
|
+
parse.field :data_vencimento, 146..151
|
35
|
+
parse.field :valor_titulo, 152..164
|
36
|
+
parse.field :banco_recebedor, 165..167
|
37
|
+
parse.field :agencia_recebedora_com_dv, 168..172
|
38
|
+
parse.field :especie_documento, 173..174
|
39
|
+
parse.field :valor_tarifa, 175..187
|
40
|
+
parse.field :iof, 214..226
|
41
|
+
parse.field :valor_abatimento, 227..239
|
42
|
+
parse.field :desconto, 240..252
|
43
|
+
parse.field :valor_recebido, 253..265
|
44
|
+
parse.field :juros_mora, 266..278
|
45
|
+
parse.field :outros_recebimento, 279..291
|
46
|
+
parse.field :data_credito, 295..300
|
47
|
+
parse.field :motivo_ocorrencia, 377..384, lambda { |motivos|
|
48
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
|
49
|
+
}
|
50
|
+
parse.field :sequencial, 394..399
|
51
|
+
|
52
|
+
# Campos da classe base que não encontrei a relação com CNAB400
|
53
|
+
# parse.field :tipo_cobranca,80..80
|
54
|
+
# parse.field :tipo_cobranca_anterior,81..81
|
55
|
+
# parse.field :natureza_recebimento,86..87
|
56
|
+
# parse.field :convenio,31..37
|
57
|
+
# parse.field :comando,108..109
|
58
|
+
# parse.field :juros_desconto,201..213
|
59
|
+
# parse.field :iof_desconto,214..226
|
60
|
+
# parse.field :desconto_concedito,240..252
|
61
|
+
# parse.field :outras_despesas,279..291
|
62
|
+
# parse.field :abatimento_nao_aproveitado,292..304
|
63
|
+
# parse.field :data_liquidacao,295..300
|
64
|
+
# parse.field :valor_lancamento,305..317
|
65
|
+
# parse.field :indicativo_lancamento,318..318
|
66
|
+
# parse.field :indicador_valor,319..319
|
67
|
+
# parse.field :valor_ajuste,320..331
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author Eduardo Reboucas
|
5
|
+
#
|
6
|
+
# Para manter compatibilidade com ActiveModel
|
7
|
+
|
8
|
+
require 'date'
|
9
|
+
require 'time'
|
10
|
+
|
11
|
+
class Date
|
12
|
+
def self.current
|
13
|
+
Time.respond_to?(:zone) && Time.zone ? Time.zone.today : Date.today
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Time
|
18
|
+
def self.current
|
19
|
+
Time.respond_to?(:zone) && Time.zone ? Time.zone.now : Time.now
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author Kivanio Barbosa
|
5
|
+
module Brcobranca
|
6
|
+
# Métodos auxiliares
|
7
|
+
module Util
|
8
|
+
class Empresa
|
9
|
+
def initialize(documento, zero = true)
|
10
|
+
@documento = documento
|
11
|
+
@zero = zero
|
12
|
+
end
|
13
|
+
|
14
|
+
# Tipo de empresa (fisica ou juridica)
|
15
|
+
# de acordo com o documento (CPF/CNPJ)
|
16
|
+
# 1 = CPF
|
17
|
+
# 2 = CNPJ
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
# @param [String] documento Número do documento da empresa
|
21
|
+
# @param [Boollean] zero Incluir zero a esquerda
|
22
|
+
def tipo
|
23
|
+
@tipo = @documento.somente_numeros.size <= 11 ? '1' : '2'
|
24
|
+
@tipo = @tipo.rjust(2, '0') if @zero
|
25
|
+
@tipo
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Util
|
5
|
+
class Errors
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
CALLBACKS_OPTIONS = %i[if unless on allow_nil allow_blank strict].freeze
|
9
|
+
MESSAGE_OPTIONS = [:message].freeze
|
10
|
+
|
11
|
+
attr_reader :messages, :details
|
12
|
+
|
13
|
+
def initialize(base)
|
14
|
+
@base = base
|
15
|
+
@messages = apply_default_array({})
|
16
|
+
@details = apply_default_array({})
|
17
|
+
end
|
18
|
+
|
19
|
+
def add(attribute, message = :invalid, options = {})
|
20
|
+
message = message.call if message.respond_to?(:call)
|
21
|
+
detail = normalize_detail(message, options)
|
22
|
+
message = normalize_message(attribute, message, options)
|
23
|
+
details[attribute.to_sym] << detail
|
24
|
+
messages[attribute.to_sym] << message
|
25
|
+
end
|
26
|
+
|
27
|
+
def size
|
28
|
+
@messages.values.flatten.size
|
29
|
+
end
|
30
|
+
alias count size
|
31
|
+
|
32
|
+
def generate_message(attribute, type = :invalid, _options = {})
|
33
|
+
:"errors.attributes.#{attribute}.#{type}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def full_messages
|
37
|
+
@messages.values.flatten
|
38
|
+
end
|
39
|
+
alias to_a full_messages
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def apply_default_array(hash)
|
44
|
+
hash.default_proc = proc { |h, key| h[key] = [] }
|
45
|
+
hash
|
46
|
+
end
|
47
|
+
|
48
|
+
def normalize_message(attribute, message, options)
|
49
|
+
case message
|
50
|
+
when Symbol
|
51
|
+
generate_message(attribute, message, except(options, *CALLBACKS_OPTIONS))
|
52
|
+
else
|
53
|
+
if message.start_with?(variable_name(attribute))
|
54
|
+
message
|
55
|
+
else
|
56
|
+
"#{variable_name(attribute)} #{message}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def normalize_detail(message, options)
|
62
|
+
{ error: message }.merge(except(options, *CALLBACKS_OPTIONS + MESSAGE_OPTIONS))
|
63
|
+
end
|
64
|
+
|
65
|
+
def except(hash, *keys)
|
66
|
+
dup = hash.dup
|
67
|
+
keys.each { |key| dup.delete(key) }
|
68
|
+
dup
|
69
|
+
end
|
70
|
+
|
71
|
+
def variable_name(symbol)
|
72
|
+
symbol.to_s.tr('_', ' ').capitalize
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|