brcobranca 8.0.0 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +5 -3
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +2 -2
  7. data/README.md +24 -12
  8. data/brcobranca.gemspec +0 -2
  9. data/lib/brcobranca.rb +43 -26
  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/cecred.eps +427 -0
  13. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +427 -0
  14. data/lib/brcobranca/arquivos/logos/credisis.eps +5402 -0
  15. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +5410 -0
  16. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  17. data/lib/brcobranca/boleto/banco_brasil.rb +21 -21
  18. data/lib/brcobranca/boleto/banco_brasilia.rb +96 -0
  19. data/lib/brcobranca/boleto/banco_nordeste.rb +4 -6
  20. data/lib/brcobranca/boleto/banestes.rb +7 -7
  21. data/lib/brcobranca/boleto/banrisul.rb +5 -5
  22. data/lib/brcobranca/boleto/base.rb +28 -22
  23. data/lib/brcobranca/boleto/bradesco.rb +6 -6
  24. data/lib/brcobranca/boleto/caixa.rb +11 -18
  25. data/lib/brcobranca/boleto/cecred.rb +86 -0
  26. data/lib/brcobranca/boleto/credisis.rb +124 -0
  27. data/lib/brcobranca/boleto/hsbc.rb +10 -27
  28. data/lib/brcobranca/boleto/itau.rb +9 -10
  29. data/lib/brcobranca/boleto/santander.rb +5 -6
  30. data/lib/brcobranca/boleto/sicoob.rb +5 -5
  31. data/lib/brcobranca/boleto/sicredi.rb +7 -7
  32. data/lib/brcobranca/boleto/template/rghost.rb +127 -80
  33. data/lib/brcobranca/boleto/template/rghost_carne.rb +9 -9
  34. data/lib/brcobranca/boleto/unicred.rb +126 -4
  35. data/lib/brcobranca/calculo_data.rb +3 -0
  36. data/lib/brcobranca/formatacao_string.rb +15 -5
  37. data/lib/brcobranca/remessa/base.rb +16 -9
  38. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +14 -13
  39. data/lib/brcobranca/remessa/cnab240/base.rb +252 -119
  40. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +299 -0
  41. data/lib/brcobranca/remessa/cnab240/caixa.rb +61 -7
  42. data/lib/brcobranca/remessa/cnab240/cecred.rb +151 -0
  43. data/lib/brcobranca/remessa/cnab240/sicoob.rb +109 -123
  44. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
  45. data/lib/brcobranca/remessa/cnab240/sicredi.rb +177 -0
  46. data/lib/brcobranca/remessa/cnab240/unicred.rb +9 -0
  47. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +14 -0
  48. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
  49. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +4 -6
  50. data/lib/brcobranca/remessa/cnab400/banrisul.rb +155 -0
  51. data/lib/brcobranca/remessa/cnab400/base.rb +4 -4
  52. data/lib/brcobranca/remessa/cnab400/bradesco.rb +7 -8
  53. data/lib/brcobranca/remessa/cnab400/citibank.rb +3 -4
  54. data/lib/brcobranca/remessa/cnab400/credisis.rb +128 -0
  55. data/lib/brcobranca/remessa/cnab400/itau.rb +23 -6
  56. data/lib/brcobranca/remessa/cnab400/santander.rb +80 -65
  57. data/lib/brcobranca/remessa/cnab400/sicoob.rb +2 -2
  58. data/lib/brcobranca/remessa/cnab400/unicred.rb +143 -0
  59. data/lib/brcobranca/remessa/pagamento.rb +50 -14
  60. data/lib/brcobranca/retorno/base.rb +4 -4
  61. data/lib/brcobranca/retorno/cnab240/base.rb +11 -8
  62. data/lib/brcobranca/retorno/cnab240/caixa.rb +4 -0
  63. data/lib/brcobranca/retorno/cnab240/cecred.rb +102 -0
  64. data/lib/brcobranca/retorno/cnab240/santander.rb +35 -12
  65. data/lib/brcobranca/retorno/cnab240/sicoob.rb +8 -4
  66. data/lib/brcobranca/retorno/cnab240/sicredi.rb +79 -0
  67. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +127 -0
  68. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
  69. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
  70. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  71. data/lib/brcobranca/retorno/cnab400/base.rb +18 -7
  72. data/lib/brcobranca/retorno/cnab400/bradesco.rb +9 -3
  73. data/lib/brcobranca/retorno/cnab400/credisis.rb +115 -0
  74. data/lib/brcobranca/retorno/cnab400/itau.rb +10 -4
  75. data/lib/brcobranca/retorno/cnab400/santander.rb +57 -0
  76. data/lib/brcobranca/retorno/cnab400/unicred.rb +118 -0
  77. data/lib/brcobranca/retorno/retorno_cnab240.rb +7 -3
  78. data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -77
  79. data/lib/brcobranca/util/date.rb +20 -0
  80. data/lib/brcobranca/util/errors.rb +76 -0
  81. data/lib/brcobranca/validations.rb +232 -0
  82. data/lib/brcobranca/version.rb +1 -1
  83. data/spec/arquivos/CNAB240CECRED.RET +10 -0
  84. data/spec/arquivos/CNAB240SANTANDER.RET +8 -26
  85. data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
  86. data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
  87. data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
  88. data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
  89. data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
  90. data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
  91. data/spec/arquivos/CNAB400UNICRED.RET +3 -0
  92. data/spec/brcobranca/base_spec.rb +6 -4
  93. data/spec/brcobranca/boleto/banco_brasil_spec.rb +22 -22
  94. data/spec/brcobranca/boleto/banco_brasilia_spec.rb +134 -0
  95. data/spec/brcobranca/boleto/banco_nordeste_spec.rb +19 -19
  96. data/spec/brcobranca/boleto/banestes_spec.rb +19 -19
  97. data/spec/brcobranca/boleto/banrisul_spec.rb +14 -14
  98. data/spec/brcobranca/boleto/bradesco_spec.rb +13 -13
  99. data/spec/brcobranca/boleto/caixa_spec.rb +7 -7
  100. data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
  101. data/spec/brcobranca/boleto/credisis_spec.rb +155 -0
  102. data/spec/brcobranca/boleto/hsbc_spec.rb +17 -37
  103. data/spec/brcobranca/boleto/itau_spec.rb +16 -16
  104. data/spec/brcobranca/boleto/santander_spec.rb +11 -11
  105. data/spec/brcobranca/boleto/sicoob_spec.rb +17 -17
  106. data/spec/brcobranca/boleto/sicredi_spec.rb +13 -13
  107. data/spec/brcobranca/boleto/unicred_spec.rb +10 -10
  108. data/spec/brcobranca/boletos_em_lote_spec.rb +1 -1
  109. data/spec/brcobranca/formatacao_string_spec.rb +1 -1
  110. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +10 -18
  111. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +39 -38
  112. data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
  113. data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
  114. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +58 -39
  115. data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
  116. data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
  117. data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
  118. data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +4 -2
  119. data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
  120. data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -1
  121. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +16 -11
  122. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +11 -11
  123. data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
  124. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +25 -12
  125. data/spec/brcobranca/remessa/cnab400/santander_spec.rb +35 -36
  126. data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +37 -0
  127. data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
  128. data/spec/brcobranca/remessa/pagamento_spec.rb +45 -27
  129. data/spec/brcobranca/retorno/cnab240/base_spec.rb +7 -8
  130. data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
  131. data/spec/brcobranca/retorno/cnab240/santander_spec.rb +35 -18
  132. data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +20 -19
  133. data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
  134. data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
  135. data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
  136. data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
  137. data/spec/brcobranca/retorno/cnab400/base_spec.rb +34 -13
  138. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +4 -4
  139. data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
  140. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +4 -4
  141. data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
  142. data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
  143. data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +1 -1
  144. data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +1 -1
  145. data/spec/brcobranca/rghost_spec.rb +1 -1
  146. data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +1 -1
  147. data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
  148. data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +1 -1
  149. data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +5 -4
  150. data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +5 -4
  151. data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
  152. data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +1 -1
  153. data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +6 -5
  154. data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
  155. data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +1 -1
  156. data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
  157. data/spec/fixtures/remessa/remessa-itau-cnab400.rem +3 -2
  158. data/spec/fixtures/remessa/remessa-santander-cnab400.rem +2 -2
  159. data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
  160. data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
  161. data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
  162. data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
  163. data/spec/support/shared_examples/busca_logotipo.rb +0 -2
  164. data/spec/support/shared_examples/cnab240.rb +92 -28
  165. data/spec/support/shared_examples/cnab400.rb +60 -14
  166. data/spec/support/shared_examples/formatos_validos.rb +6 -6
  167. 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).freeze
45
- REGISTRO_U_FIELDS = %w(desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido outras_despesas outros_recebimento data_credito data_ocorrencia).freeze
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
- # Todos os campos descritos no documento em ordem
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
- # :cod_de_ocorrencia, 108..109 # código de ocorrencia
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
- # :instr_cancelada, 301..304 # codigo da instrucao cancelada
111
- # :brancos , 305..310 # complemento de registro
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