brcobranca 8.0.0 → 9.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-gemset +1 -1
- data/.ruby-version +1 -1
- data/.travis.yml +5 -3
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -2
- data/README.md +24 -12
- data/brcobranca.gemspec +0 -2
- data/lib/brcobranca.rb +43 -26
- data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/cecred.eps +427 -0
- data/lib/brcobranca/arquivos/logos/cecred_carne.eps +427 -0
- data/lib/brcobranca/arquivos/logos/credisis.eps +5402 -0
- data/lib/brcobranca/arquivos/logos/credisis_carne.eps +5410 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +21 -21
- data/lib/brcobranca/boleto/banco_brasilia.rb +96 -0
- data/lib/brcobranca/boleto/banco_nordeste.rb +4 -6
- data/lib/brcobranca/boleto/banestes.rb +7 -7
- data/lib/brcobranca/boleto/banrisul.rb +5 -5
- data/lib/brcobranca/boleto/base.rb +28 -22
- data/lib/brcobranca/boleto/bradesco.rb +6 -6
- data/lib/brcobranca/boleto/caixa.rb +11 -18
- data/lib/brcobranca/boleto/cecred.rb +86 -0
- data/lib/brcobranca/boleto/credisis.rb +124 -0
- data/lib/brcobranca/boleto/hsbc.rb +10 -27
- data/lib/brcobranca/boleto/itau.rb +9 -10
- data/lib/brcobranca/boleto/santander.rb +5 -6
- data/lib/brcobranca/boleto/sicoob.rb +5 -5
- data/lib/brcobranca/boleto/sicredi.rb +7 -7
- data/lib/brcobranca/boleto/template/rghost.rb +127 -80
- data/lib/brcobranca/boleto/template/rghost_carne.rb +9 -9
- data/lib/brcobranca/boleto/unicred.rb +126 -4
- data/lib/brcobranca/calculo_data.rb +3 -0
- data/lib/brcobranca/formatacao_string.rb +15 -5
- data/lib/brcobranca/remessa/base.rb +16 -9
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +14 -13
- data/lib/brcobranca/remessa/cnab240/base.rb +252 -119
- data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +299 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +61 -7
- data/lib/brcobranca/remessa/cnab240/cecred.rb +151 -0
- data/lib/brcobranca/remessa/cnab240/sicoob.rb +109 -123
- data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
- data/lib/brcobranca/remessa/cnab240/sicredi.rb +177 -0
- data/lib/brcobranca/remessa/cnab240/unicred.rb +9 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +14 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
- data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +4 -6
- data/lib/brcobranca/remessa/cnab400/banrisul.rb +155 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +4 -4
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +7 -8
- data/lib/brcobranca/remessa/cnab400/citibank.rb +3 -4
- data/lib/brcobranca/remessa/cnab400/credisis.rb +128 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +23 -6
- data/lib/brcobranca/remessa/cnab400/santander.rb +80 -65
- data/lib/brcobranca/remessa/cnab400/sicoob.rb +2 -2
- data/lib/brcobranca/remessa/cnab400/unicred.rb +143 -0
- data/lib/brcobranca/remessa/pagamento.rb +50 -14
- data/lib/brcobranca/retorno/base.rb +4 -4
- data/lib/brcobranca/retorno/cnab240/base.rb +11 -8
- data/lib/brcobranca/retorno/cnab240/caixa.rb +4 -0
- data/lib/brcobranca/retorno/cnab240/cecred.rb +102 -0
- data/lib/brcobranca/retorno/cnab240/santander.rb +35 -12
- data/lib/brcobranca/retorno/cnab240/sicoob.rb +8 -4
- data/lib/brcobranca/retorno/cnab240/sicredi.rb +79 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +127 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
- data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
- data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +18 -7
- data/lib/brcobranca/retorno/cnab400/bradesco.rb +9 -3
- data/lib/brcobranca/retorno/cnab400/credisis.rb +115 -0
- data/lib/brcobranca/retorno/cnab400/itau.rb +10 -4
- data/lib/brcobranca/retorno/cnab400/santander.rb +57 -0
- data/lib/brcobranca/retorno/cnab400/unicred.rb +118 -0
- data/lib/brcobranca/retorno/retorno_cnab240.rb +7 -3
- data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -77
- data/lib/brcobranca/util/date.rb +20 -0
- data/lib/brcobranca/util/errors.rb +76 -0
- data/lib/brcobranca/validations.rb +232 -0
- data/lib/brcobranca/version.rb +1 -1
- data/spec/arquivos/CNAB240CECRED.RET +10 -0
- data/spec/arquivos/CNAB240SANTANDER.RET +8 -26
- data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
- data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
- data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
- data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
- data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
- data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
- data/spec/arquivos/CNAB400UNICRED.RET +3 -0
- data/spec/brcobranca/base_spec.rb +6 -4
- data/spec/brcobranca/boleto/banco_brasil_spec.rb +22 -22
- data/spec/brcobranca/boleto/banco_brasilia_spec.rb +134 -0
- data/spec/brcobranca/boleto/banco_nordeste_spec.rb +19 -19
- data/spec/brcobranca/boleto/banestes_spec.rb +19 -19
- data/spec/brcobranca/boleto/banrisul_spec.rb +14 -14
- data/spec/brcobranca/boleto/bradesco_spec.rb +13 -13
- data/spec/brcobranca/boleto/caixa_spec.rb +7 -7
- data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
- data/spec/brcobranca/boleto/credisis_spec.rb +155 -0
- data/spec/brcobranca/boleto/hsbc_spec.rb +17 -37
- data/spec/brcobranca/boleto/itau_spec.rb +16 -16
- data/spec/brcobranca/boleto/santander_spec.rb +11 -11
- data/spec/brcobranca/boleto/sicoob_spec.rb +17 -17
- data/spec/brcobranca/boleto/sicredi_spec.rb +13 -13
- data/spec/brcobranca/boleto/unicred_spec.rb +10 -10
- data/spec/brcobranca/boletos_em_lote_spec.rb +1 -1
- data/spec/brcobranca/formatacao_string_spec.rb +1 -1
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +10 -18
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +39 -38
- data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
- data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
- data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +58 -39
- data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
- data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
- data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
- data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +4 -2
- data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -1
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +16 -11
- data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +11 -11
- data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +25 -12
- data/spec/brcobranca/remessa/cnab400/santander_spec.rb +35 -36
- data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +37 -0
- data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
- data/spec/brcobranca/remessa/pagamento_spec.rb +45 -27
- data/spec/brcobranca/retorno/cnab240/base_spec.rb +7 -8
- data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
- data/spec/brcobranca/retorno/cnab240/santander_spec.rb +35 -18
- data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +20 -19
- data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
- data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
- data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
- data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
- data/spec/brcobranca/retorno/cnab400/base_spec.rb +34 -13
- data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +4 -4
- data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
- data/spec/brcobranca/retorno/cnab400/itau_spec.rb +4 -4
- data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
- data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
- data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +1 -1
- data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +1 -1
- data/spec/brcobranca/rghost_spec.rb +1 -1
- data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +1 -1
- data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +1 -1
- data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +5 -4
- data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +5 -4
- data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +1 -1
- data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +6 -5
- data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +1 -1
- data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
- data/spec/fixtures/remessa/remessa-itau-cnab400.rem +3 -2
- data/spec/fixtures/remessa/remessa-santander-cnab400.rem +2 -2
- data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
- data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
- data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
- data/spec/support/shared_examples/busca_logotipo.rb +0 -2
- data/spec/support/shared_examples/cnab240.rb +92 -28
- data/spec/support/shared_examples/cnab400.rb +60 -14
- data/spec/support/shared_examples/formatos_validos.rb +6 -6
- metadata +103 -31
@@ -1,5 +1,4 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
#
|
3
2
|
|
4
3
|
require 'parseline'
|
5
4
|
module Brcobranca
|
@@ -41,14 +40,16 @@ module Brcobranca
|
|
41
40
|
class Line < Base
|
42
41
|
extend ParseLine::FixedWidth # Extendendo parseline
|
43
42
|
|
44
|
-
REGISTRO_T_FIELDS = %w(agencia_com_dv cedente_com_dv nosso_numero carteira data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa)
|
45
|
-
REGISTRO_U_FIELDS = %w(desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido outras_despesas outros_recebimento data_credito
|
43
|
+
REGISTRO_T_FIELDS = %w(codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia)
|
44
|
+
REGISTRO_U_FIELDS = %w(desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido outras_despesas outros_recebimento data_ocorrencia data_credito)
|
46
45
|
|
47
46
|
attr_accessor :tipo_registro
|
48
47
|
|
49
48
|
fixed_width_layout do |parse|
|
49
|
+
parse.field :codigo_registro, 7..7
|
50
50
|
parse.field :tipo_registro, 13..13
|
51
51
|
parse.field :sequencial, 8..12
|
52
|
+
parse.field :codigo_ocorrencia, 15..16
|
52
53
|
parse.field :agencia_com_dv, 17..22
|
53
54
|
parse.field :cedente_com_dv, 23..35
|
54
55
|
parse.field :nosso_numero, 46..56
|
@@ -67,6 +68,9 @@ module Brcobranca
|
|
67
68
|
parse.field :juros_mora, 17..31
|
68
69
|
parse.field :outros_recebimento, 122..136
|
69
70
|
parse.field :valor_tarifa, 198..212
|
71
|
+
parse.field :motivo_ocorrencia, 213..222, ->(motivos) do
|
72
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject{|motivo| motivo == '00'}
|
73
|
+
end
|
70
74
|
|
71
75
|
# Dados que não consegui extrair dos registros T e U
|
72
76
|
# parse.field :convenio,31..37
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
#
|
3
|
-
#
|
4
3
|
# DEPRECATED
|
5
4
|
#
|
6
5
|
# Classe original desenvolvida a partir do layout do Itau.
|
@@ -23,100 +22,30 @@ module Brcobranca
|
|
23
22
|
end
|
24
23
|
|
25
24
|
fixed_width_layout do |parse|
|
26
|
-
|
27
|
-
# :tipo_de_registro, 0..0 # identificacao do registro transacao
|
28
|
-
# :codigo_de_inscricao, 1..2 # identificacao do tipo de inscrica/empresa
|
29
|
-
# :numero_de_inscricao, 3..17 #numero de inscricao da empresa (cpf/cnpj)
|
30
|
-
|
31
|
-
# :agencia ,17..20 #agencia mantenedora da conta
|
25
|
+
parse.field :codigo_registro, 0..0
|
32
26
|
parse.field :agencia_com_dv, 17..20 # FIXME - SEM DIV
|
33
|
-
|
34
|
-
# :zeros, 21..22 # complemento de registro
|
35
|
-
|
36
|
-
# :conta, 23..27 #numero da conta corrente da empresa
|
37
|
-
# :dac, 28..28 #digito de auto conferencia ag/conta empresa
|
38
27
|
parse.field :cedente_com_dv, 23..28
|
39
|
-
|
40
|
-
# :brancos, 29..36 #complemento de registro
|
41
|
-
# :uso_da_empresa, 37..61 #identificacao do titulo na empresa
|
42
|
-
|
43
|
-
# :nosso_numero,62..69 # identificacao do titulo no banco
|
44
28
|
parse.field :nosso_numero, 62..69
|
45
|
-
|
46
|
-
# :brancos, 70..81 #complemento do registro
|
47
|
-
|
48
|
-
# :carteira, 82..84 #numero da carteira
|
49
29
|
parse.field :carteira_variacao, 82..84
|
50
|
-
|
51
|
-
# :nosso_numero, 85..92 #identificacao do titulo no banco (novamente?)
|
52
|
-
# :dac_nosso_numero, 93..93 #dac nosso numero
|
53
|
-
# :brancos, 94..106 #complemento do registro
|
54
|
-
|
55
|
-
# :carteira, 107..107 #código da carteira
|
56
30
|
parse.field :carteira, 107..107
|
57
|
-
|
58
|
-
|
59
|
-
# :data_de_ocorrencia, 110..115 # data de ocorrencia no banco (ddmmaa)
|
60
|
-
# :n_do_documento, 116..125 # n umero do documento de cobranca (dupl, np etc)
|
61
|
-
# :nosso_numero, 126..133 # confirmacao do numero do titulo no banco
|
62
|
-
# :brancos, 134..145 #complemento de registro
|
63
|
-
|
64
|
-
# :vencimento, 146..151 #data de vencimento do titulo (ddmmaa)
|
31
|
+
parse.field :codigo_ocorrencia, 108..109
|
32
|
+
parse.field :data_ocorrencia, 110..115
|
65
33
|
parse.field :data_vencimento, 146..151
|
66
|
-
|
67
|
-
# :valor_do_titulo, 152..164 #valor nominal do titulo (ultimos 2 digitos, virgula decimal assumida)
|
68
34
|
parse.field :valor_titulo, 152..164
|
69
|
-
|
70
|
-
# :codigo_do_banco, 165..167 # numero do banco na camara de compensacao
|
71
35
|
parse.field :banco_recebedor, 165..167
|
72
|
-
|
73
|
-
# :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
|
74
|
-
# :dac_ag_cobradora, 172..172 # dac da agencia cobradora
|
75
36
|
parse.field :agencia_recebedora_com_dv, 168..172
|
76
|
-
|
77
|
-
# :especie, 173..174 # especie do titulo
|
78
37
|
parse.field :especie_documento, 173..174
|
79
|
-
|
80
|
-
# :tarifa_de_cobranca, 175..187 #valor da despesa de cobranca (ultimos 2 digitos, virgula decimal assumida)
|
81
38
|
parse.field :valor_tarifa, 175..187
|
82
|
-
|
83
|
-
# :brancos, 188..213 #complemento do registro
|
84
|
-
|
85
|
-
# :valor_do_iof, 214..226 #valor do iof a ser recolhido (ultimos 2 digitos, virgula decimal assumida)
|
86
39
|
parse.field :iof, 214..226
|
87
|
-
|
88
|
-
# :valor_abatimento, 227..239 #valor do abatimento concedido (ultimos 2 digitos, virgula decimal assumida)
|
89
40
|
parse.field :valor_abatimento, 227..239
|
90
|
-
|
91
|
-
# :descontos, 240..252 #valor do desconto concedido (ultimos 2 digitos, virgula decimal assumida)
|
92
41
|
parse.field :desconto, 240..252
|
93
|
-
|
94
|
-
# :valor_principal, 253..265 #valor lancado em conta corrente (ultimos 2 digitos, virgula decimal assumida)
|
95
|
-
|
96
42
|
parse.field :valor_recebido, 253..265
|
97
|
-
|
98
|
-
# :juros_mora_multa, 266..278 #valor de mora e multa pagos pelo sacado (ultimos 2 digitos, virgula decimal assumida)
|
99
43
|
parse.field :juros_mora, 266..278
|
100
|
-
|
101
|
-
# :outros_creditos, 279..291 #valor de outros creditos (ultimos 2 digitos, virgula decimal assumida)
|
102
44
|
parse.field :outros_recebimento, 279..291
|
103
|
-
|
104
|
-
# :boleto_dda, 292..292 #indicador de boleto dda
|
105
|
-
# :brancos, 293..294 #complemento de registro
|
106
|
-
|
107
|
-
# :data_credito, 295..300 #data de credito desta liquidacao
|
108
45
|
parse.field :data_credito, 295..300
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
# :zeros, 311..323 #complemento de registro
|
113
|
-
# :nome_do_sacado, 324..353, #nome do sacado
|
114
|
-
# :brancos , 354..376 # complemento de registro
|
115
|
-
# :erros_msg, 377..384 #registros rejeitados ou laegacao do sacado ou registro de mensagem informativa
|
116
|
-
# :brancos, 385..391 #complemento de registro
|
117
|
-
# :cod_de_liquidacao, 392..393 #meio pelo qual o título foi liquidado
|
118
|
-
|
119
|
-
# :numero_sequencial, 394..399 #numero sequencial no arquivo
|
46
|
+
parse.field :motivo_ocorrencia, 377..384, ->(motivos) do
|
47
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject{|motivo| motivo == '00'}
|
48
|
+
end
|
120
49
|
parse.field :sequencial, 394..399
|
121
50
|
|
122
51
|
# Campos da classe base que não encontrei a relação com CNAB400
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @author Eduardo Reboucas
|
4
|
+
#
|
5
|
+
# Para manter compatibilidade com ActiveModel
|
6
|
+
|
7
|
+
require 'date'
|
8
|
+
require 'time'
|
9
|
+
|
10
|
+
class Date
|
11
|
+
def self.current
|
12
|
+
Time.respond_to?(:zone) && Time.zone ? Time.zone.today : Date.today
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Time
|
17
|
+
def self.current
|
18
|
+
Time.respond_to?(:zone) && Time.zone ? Time.zone.now : Time.now
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Brcobranca
|
2
|
+
module Util
|
3
|
+
class Errors
|
4
|
+
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
CALLBACKS_OPTIONS = [:if, :unless, :on, :allow_nil, :allow_blank, :strict]
|
8
|
+
MESSAGE_OPTIONS = [:message]
|
9
|
+
|
10
|
+
attr_reader :messages, :details
|
11
|
+
|
12
|
+
def initialize(base)
|
13
|
+
@base = base
|
14
|
+
@messages = apply_default_array({})
|
15
|
+
@details = apply_default_array({})
|
16
|
+
end
|
17
|
+
|
18
|
+
def add(attribute, message = :invalid, options = {})
|
19
|
+
message = message.call if message.respond_to?(:call)
|
20
|
+
detail = normalize_detail(message, options)
|
21
|
+
message = normalize_message(attribute, message, options)
|
22
|
+
details[attribute.to_sym] << detail
|
23
|
+
messages[attribute.to_sym] << message
|
24
|
+
end
|
25
|
+
|
26
|
+
def size
|
27
|
+
@messages.values.flatten.size
|
28
|
+
end
|
29
|
+
alias :count :size
|
30
|
+
|
31
|
+
def generate_message(attribute, type = :invalid, options = {})
|
32
|
+
:"errors.attributes.#{attribute}.#{type}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def full_messages
|
36
|
+
@messages.values.flatten
|
37
|
+
end
|
38
|
+
alias :to_a :full_messages
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def apply_default_array(hash)
|
43
|
+
hash.default_proc = proc { |h, key| h[key] = [] }
|
44
|
+
hash
|
45
|
+
end
|
46
|
+
|
47
|
+
def normalize_message(attribute, message, options)
|
48
|
+
case message
|
49
|
+
when Symbol
|
50
|
+
generate_message(attribute, message, except(options, *CALLBACKS_OPTIONS))
|
51
|
+
else
|
52
|
+
if message.start_with?(variable_name(attribute))
|
53
|
+
message
|
54
|
+
else
|
55
|
+
"#{variable_name(attribute)} #{message}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def normalize_detail(message, options)
|
61
|
+
{ error: message }.merge(except(options, *CALLBACKS_OPTIONS + MESSAGE_OPTIONS))
|
62
|
+
end
|
63
|
+
|
64
|
+
def except(hash, *keys)
|
65
|
+
dup = hash.dup
|
66
|
+
keys.each { |key| dup.delete(key) }
|
67
|
+
dup
|
68
|
+
end
|
69
|
+
|
70
|
+
def variable_name(symbol)
|
71
|
+
symbol.to_s.tr("_", " ").capitalize
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# @author Eduardo Reboucas
|
3
|
+
require 'brcobranca/util/errors'
|
4
|
+
|
5
|
+
module Brcobranca
|
6
|
+
|
7
|
+
# Métodos auxiliares de validação para evitar ActiveSupport e ActiveModel com
|
8
|
+
# mínimo de impacto nas definições das validações existentes
|
9
|
+
|
10
|
+
module Validations
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
|
18
|
+
attr_reader :presences
|
19
|
+
attr_reader :lengths
|
20
|
+
attr_reader :numericals
|
21
|
+
attr_reader :inclusions
|
22
|
+
attr_reader :eachs
|
23
|
+
|
24
|
+
def validates_presence_of(*attr_names)
|
25
|
+
@presences ||= []
|
26
|
+
@presences = @presences << attr_names
|
27
|
+
end
|
28
|
+
|
29
|
+
def validates_length_of(*attr_names)
|
30
|
+
@lengths ||= []
|
31
|
+
@lengths = @lengths << attr_names
|
32
|
+
end
|
33
|
+
|
34
|
+
def validates_numericality_of(*attr_names)
|
35
|
+
@numericals ||= []
|
36
|
+
@numericals = @numericals << attr_names
|
37
|
+
end
|
38
|
+
|
39
|
+
def validates_inclusion_of(*attr_names)
|
40
|
+
@inclusions ||= []
|
41
|
+
@inclusions = @inclusions << attr_names
|
42
|
+
end
|
43
|
+
|
44
|
+
def validates_each(*attr_names, &block)
|
45
|
+
@eachs ||= {}
|
46
|
+
attr_names.each do |attr_name|
|
47
|
+
@eachs[attr_name] = block
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def with_options(options, &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def errors
|
57
|
+
@errors ||= Brcobranca::Util::Errors.new(self)
|
58
|
+
end
|
59
|
+
|
60
|
+
def valid?
|
61
|
+
#puts "** #{self.class}"
|
62
|
+
#puts "** #{self.class.superclass}"
|
63
|
+
all_valid = true
|
64
|
+
all_valid = false if !check_eachs
|
65
|
+
all_valid = false if !check_presences
|
66
|
+
all_valid = false if !check_numericals
|
67
|
+
all_valid = false if !check_lengths
|
68
|
+
all_valid = false if !check_inclusions
|
69
|
+
return all_valid
|
70
|
+
end
|
71
|
+
|
72
|
+
def invalid?
|
73
|
+
!valid?
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def check_eachs
|
79
|
+
eachs = {}
|
80
|
+
if self.class.superclass.superclass.respond_to?(:eachs)
|
81
|
+
eachs.merge!(self.class.superclass.superclass.eachs || {})
|
82
|
+
end
|
83
|
+
if self.class.superclass.respond_to?(:eachs)
|
84
|
+
eachs.merge!(self.class.superclass.eachs || {})
|
85
|
+
end
|
86
|
+
if self.class.eachs
|
87
|
+
eachs.merge!(self.class.eachs)
|
88
|
+
end
|
89
|
+
return true if eachs.keys.size == 0
|
90
|
+
eachs.each do |attr_name, block|
|
91
|
+
value = ''
|
92
|
+
begin
|
93
|
+
value = self.send(attr_name)
|
94
|
+
rescue
|
95
|
+
end
|
96
|
+
block.call(self, attr_name, value)
|
97
|
+
end
|
98
|
+
return errors.size == 0
|
99
|
+
end
|
100
|
+
|
101
|
+
def check_presences
|
102
|
+
presences = []
|
103
|
+
if self.class.superclass.superclass.respond_to?(:presences)
|
104
|
+
presences = self.class.superclass.superclass.presences || []
|
105
|
+
end
|
106
|
+
if self.class.superclass.respond_to?(:presences)
|
107
|
+
presences += self.class.superclass.presences || []
|
108
|
+
end
|
109
|
+
if self.class.presences
|
110
|
+
presences += self.class.presences
|
111
|
+
end
|
112
|
+
all_present = true
|
113
|
+
presences.each do |presence|
|
114
|
+
presence.select { |p| p.is_a? Symbol}.each do |variable|
|
115
|
+
if blank?(self.send(variable))
|
116
|
+
all_present = false
|
117
|
+
errors.add variable, presence[-1][:message]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
return all_present
|
122
|
+
end
|
123
|
+
|
124
|
+
def check_numericals
|
125
|
+
numericals = []
|
126
|
+
if self.class.superclass.respond_to?(:numericals)
|
127
|
+
numericals = self.class.superclass.numericals || []
|
128
|
+
end
|
129
|
+
if self.class.numericals
|
130
|
+
numericals += self.class.numericals
|
131
|
+
end
|
132
|
+
return true if !numericals
|
133
|
+
all_numerical = true
|
134
|
+
numericals.each do |numerical|
|
135
|
+
numerical.select { |p| p.is_a? Symbol}.each do |variable|
|
136
|
+
if self.respond_to?(variable) && self.send(variable) && (self.send(variable).to_s =~ /\A[+-]?\d+\z/).nil?
|
137
|
+
all_numerical = false
|
138
|
+
errors.add variable, numerical[-1][:message]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
return all_numerical
|
143
|
+
end
|
144
|
+
|
145
|
+
def check_lengths
|
146
|
+
lengths = []
|
147
|
+
if self.class.superclass.superclass.respond_to?(:lengths)
|
148
|
+
lengths = self.class.superclass.superclass.lengths || []
|
149
|
+
end
|
150
|
+
if self.class.superclass.respond_to?(:lengths)
|
151
|
+
lengths += self.class.superclass.lengths || []
|
152
|
+
end
|
153
|
+
if self.class.lengths
|
154
|
+
lengths += self.class.lengths
|
155
|
+
end
|
156
|
+
return true if !lengths
|
157
|
+
all_checked = true
|
158
|
+
lengths.each do |rule|
|
159
|
+
variable = rule[0]
|
160
|
+
next if !self.respond_to?(variable)
|
161
|
+
value = self.send(variable)
|
162
|
+
if rule[-1][:in]
|
163
|
+
if !value
|
164
|
+
all_checked = false
|
165
|
+
errors.add variable, rule[-1][:message]
|
166
|
+
elsif value.size < rule[-1][:in].first || value.size > rule[-1][:in].last
|
167
|
+
all_checked = false
|
168
|
+
errors.add variable, rule[-1][:message]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
if rule[-1][:is]
|
172
|
+
if !value
|
173
|
+
all_checked = false
|
174
|
+
errors.add variable, rule[-1][:message]
|
175
|
+
elsif value.to_s.size != rule[-1][:is]
|
176
|
+
all_checked = false
|
177
|
+
errors.add variable, rule[-1][:message]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
if rule[-1][:minimum] && rule[-1][:maximum]
|
181
|
+
if !value || value.size < rule[-1][:minimum] || value.size > rule[-1][:maximum]
|
182
|
+
all_checked = false
|
183
|
+
errors.add variable, rule[-1][:message]
|
184
|
+
end
|
185
|
+
elsif rule[-1][:maximum]
|
186
|
+
if value && value.size > rule[-1][:maximum]
|
187
|
+
all_checked = false
|
188
|
+
errors.add variable, rule[-1][:message]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
return all_checked
|
193
|
+
end
|
194
|
+
|
195
|
+
def check_inclusions
|
196
|
+
inclusions = []
|
197
|
+
if self.class.superclass.superclass.respond_to?(:inclusions)
|
198
|
+
inclusions = self.class.superclass.superclass.inclusions || []
|
199
|
+
end
|
200
|
+
if self.class.superclass.respond_to?(:inclusions)
|
201
|
+
inclusions += self.class.superclass.inclusions || []
|
202
|
+
end
|
203
|
+
if self.class.inclusions
|
204
|
+
inclusions += self.class.inclusions
|
205
|
+
end
|
206
|
+
return true if !inclusions
|
207
|
+
all_checked = true
|
208
|
+
inclusions.each do |rule|
|
209
|
+
variable = rule[0]
|
210
|
+
next if !self.respond_to?(variable)
|
211
|
+
value = self.send(variable)
|
212
|
+
next if !value
|
213
|
+
if rule[-1][:in]
|
214
|
+
if !rule[-1][:in].include?(value)
|
215
|
+
all_checked = false
|
216
|
+
errors.add variable, rule[-1][:message]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
return all_checked
|
221
|
+
end
|
222
|
+
|
223
|
+
def variable_name(symbol)
|
224
|
+
symbol.to_s.tr("_", " ").capitalize
|
225
|
+
end
|
226
|
+
|
227
|
+
def blank?(obj)
|
228
|
+
return obj !~ /\S/ if obj.is_a? String
|
229
|
+
obj.respond_to?(:empty?) ? obj.empty? : !obj
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|