MX-Banxico 1.0.2
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/.gitignore +18 -0
- data/.rspec +3 -0
- data/.travis.yml +12 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +36 -0
- data/Guardfile +26 -0
- data/LICENSE.txt +22 -0
- data/MX-Banxico.gemspec +29 -0
- data/README.md +140 -0
- data/REFERENCIAS.md +6 -0
- data/Rakefile +26 -0
- data/lib/MX/Banxico.rb +12 -0
- data/lib/MX/Banxico/historico.rb +4 -0
- data/lib/MX/Banxico/historico/tipo_de_cambio.rb +296 -0
- data/lib/MX/Banxico/series.rb +346 -0
- data/lib/MX/Banxico/tipo_de_cambio.rb +159 -0
- data/lib/MX/Banxico/version.rb +14 -0
- data/lib/MX/Banxico/web_services.rb +4 -0
- data/lib/MX/Banxico/web_services/tipo_de_cambio.rb +83 -0
- data/lib/MX/Banxico/web_services/web_service.rb +99 -0
- data/spec/MX/Banxico/historico/tipo_de_cambio_spec.rb +525 -0
- data/spec/MX/Banxico/series_spec.rb +475 -0
- data/spec/MX/Banxico/tipo_de_cambio_spec.rb +688 -0
- data/spec/MX/Banxico/web_services/tipo_de_cambio_spec.rb +152 -0
- data/spec/MX/Banxico/web_services/web_service_spec.rb +108 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_correctas/tipo_de_cambio.xml +2228 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/mal_formado.xml +1 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/serie_sin_valores.xml +28 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/sin_series.xml +26 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +393 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/serie_sin_valores.xml +28 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/sin_serie.xml +26 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/reservas_internacionales_banxico.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tasas_de_interes_banxico.xml +50 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tipos_de_cambio_banxico.xml +56 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/udis_banxico.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_fecha_tipo_de_cambio.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_nodo_obs.xml +40 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_valor_tipo_de_cambio.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +41 -0
- data/spec/spec_helper.rb +31 -0
- metadata +152 -0
@@ -0,0 +1,346 @@
|
|
1
|
+
#
|
2
|
+
# Series de datos que se pueden obtener de los servicios web del Banco de México (Banxico).
|
3
|
+
#
|
4
|
+
#
|
5
|
+
class MX::Banxico::Series
|
6
|
+
|
7
|
+
# Series de reservas internacionales.
|
8
|
+
#
|
9
|
+
# Series:
|
10
|
+
# * :reserva_internacional
|
11
|
+
#
|
12
|
+
SERIES_RESERVAS_INTERNACIONALES = {
|
13
|
+
reserva_internacional: {
|
14
|
+
id: "SF43707",
|
15
|
+
titulo: "Reserva internacional",
|
16
|
+
descripcion: "Reserva internacional en millones de dólares",
|
17
|
+
tipo_cifra: "Saldos",
|
18
|
+
tipo_unidad: "Millones de dólares"
|
19
|
+
}
|
20
|
+
}.freeze
|
21
|
+
|
22
|
+
|
23
|
+
# Series de tasas de interés.
|
24
|
+
#
|
25
|
+
# Series:
|
26
|
+
# * :tasa_objetivo
|
27
|
+
# * :tasa_interes_interbancaria_tiie_28_dias
|
28
|
+
# * :tasa_interes_interbancaria_tiie_91_dias
|
29
|
+
# * :tasa_rendimiento_cetes_28_dias
|
30
|
+
#
|
31
|
+
SERIES_TASAS_DE_INTERES = {
|
32
|
+
tasa_objetivo:{
|
33
|
+
id: "SF61745",
|
34
|
+
titulo: "Tasa objetivo",
|
35
|
+
descripcion: "Tasa objetivo"
|
36
|
+
},
|
37
|
+
tasa_interes_interbancaria_tiie_28_dias: {
|
38
|
+
id: "SF60648",
|
39
|
+
titulo: "Tasa de interés interbancario TIIE a 28 días",
|
40
|
+
descripcion: "Tasa de interés interbancario TIIE a 28 días"
|
41
|
+
},
|
42
|
+
tasa_interes_interbancaria_tiie_91_dias: {
|
43
|
+
id: "SF60649",
|
44
|
+
titulo: "Tasa de interés interbancario TIIE a 91 días",
|
45
|
+
descripcion: "Tasa de interés interbancario TIIE a 91 días"
|
46
|
+
},
|
47
|
+
tasa_rendimiento_cetes_28_dias: {
|
48
|
+
id: "SF60633",
|
49
|
+
titulo: "Tasa de rendimiento resultado de la subasta semanal Cetes a 28 días",
|
50
|
+
descripcion: "Tasa de rendimiento resultado de la subasta semanal Cetes a 28 días"
|
51
|
+
}
|
52
|
+
}.freeze
|
53
|
+
|
54
|
+
|
55
|
+
# Series de tipos de cambio.
|
56
|
+
#
|
57
|
+
# Series:
|
58
|
+
# * :dolar_canadiense
|
59
|
+
# * :dolar_fix
|
60
|
+
# * :dolar_liquidacion
|
61
|
+
# * :euro
|
62
|
+
# * :libra_esterlina
|
63
|
+
# * :yen
|
64
|
+
#
|
65
|
+
SERIES_TIPOS_DE_CAMBIO = {
|
66
|
+
dolar_canadiense: {
|
67
|
+
id: "SF60632",
|
68
|
+
titulo: "Cotización de las divisas que conforman la canasta del DEG respecto al Peso mexicano vs. el Dólar canadiense",
|
69
|
+
descripcion: "Peso mexicano vs. el Dólar canadiense",
|
70
|
+
tipo_cifra: "Tipo de cambio",
|
71
|
+
tipo_unidad: "Peso mexicano"
|
72
|
+
},
|
73
|
+
dolar_fix: {
|
74
|
+
id: "SF43718",
|
75
|
+
titulo: "Tipo de cambio Pesos mexicanos por Dólar E.U.A. para solventar obligaciones en moneda extranjera (fecha de determinación - Fix)",
|
76
|
+
descripcion: "Peso mexicano vs. el Dólar E.U.A. (fecha de determinación - Fix)",
|
77
|
+
tipo_cifra: "Tipo de cambio",
|
78
|
+
tipo_unidad: "Peso por dólar"
|
79
|
+
},
|
80
|
+
dolar_liquidacion: {
|
81
|
+
id: "SF60653",
|
82
|
+
titulo: "Tipo de cambio Pesos mexicanos por Dólar E.U.A. para solventar obligaciones en moneda extranjera (fecha de liquidación)",
|
83
|
+
descripcion: "Peso mexicano vs. el Dólar E.U.A. (fecha de liquidación)",
|
84
|
+
tipo_cifra: "Tipo de cambio",
|
85
|
+
tipo_unidad: "Peso por dólar"
|
86
|
+
},
|
87
|
+
euro: {
|
88
|
+
id: "SF46410",
|
89
|
+
titulo: "Cotización de las divisas que conforman la canasta del DEG respecto al Peso mexicano vs. el Euro",
|
90
|
+
descripcion: "Peso mexicano vs. el Euro",
|
91
|
+
tipo_cifra: "Tipo de cambio",
|
92
|
+
tipo_unidad: "Peso mexicano"
|
93
|
+
},
|
94
|
+
libra_esterlina: {
|
95
|
+
id: "SF46407",
|
96
|
+
titulo: "Cotización de las divisas que conforman la canasta del DEG respecto al Peso mexicano vs. la Libra esterlina",
|
97
|
+
descripcion: "Peso mexicano vs. la Libra esterlina",
|
98
|
+
tipo_cifra: "Tipo de cambio",
|
99
|
+
tipo_unidad: "Peso mexicano"
|
100
|
+
},
|
101
|
+
yen: {
|
102
|
+
id: "SF46406",
|
103
|
+
titulo: "Cotización de las divisas que conforman la canasta del DEG respecto al Peso mexicano vs. el Yen japonés",
|
104
|
+
descripcion: "Peso mexicano vs. el Yen japonés",
|
105
|
+
tipo_cifra: "Tipo de cambio",
|
106
|
+
tipo_unidad: "Peso mexicano"
|
107
|
+
}
|
108
|
+
}.freeze
|
109
|
+
|
110
|
+
|
111
|
+
# Series de UDIS ({http://www.banxico.org.mx/ayuda/temas-mas-consultados/udis--unidades-inversion-.html Unidades de Inversión}).
|
112
|
+
#
|
113
|
+
# Series:
|
114
|
+
# * :udis
|
115
|
+
#
|
116
|
+
SERIES_UDIS = {
|
117
|
+
udis: {
|
118
|
+
id: "SP68257",
|
119
|
+
titulo: "Valor de UDIS",
|
120
|
+
descripcion: "Valor de UDIS",
|
121
|
+
tipo_cifra: "Tipo de cambio",
|
122
|
+
tipo_unidad: "UDI"
|
123
|
+
}
|
124
|
+
}.freeze
|
125
|
+
|
126
|
+
|
127
|
+
# Tipos de series.
|
128
|
+
#
|
129
|
+
# Tipos:
|
130
|
+
# * :reservas_internacionales
|
131
|
+
# * :tasas_de_interes
|
132
|
+
# * :tipos_de_cambio
|
133
|
+
# * :udis
|
134
|
+
#
|
135
|
+
TIPOS = {
|
136
|
+
reservas_internacionales: SERIES_RESERVAS_INTERNACIONALES,
|
137
|
+
tasas_de_interes: SERIES_TASAS_DE_INTERES,
|
138
|
+
tipos_de_cambio: SERIES_TIPOS_DE_CAMBIO,
|
139
|
+
udis: SERIES_UDIS,
|
140
|
+
}.freeze
|
141
|
+
|
142
|
+
|
143
|
+
class << self
|
144
|
+
|
145
|
+
# Todas las series por tipo.
|
146
|
+
#
|
147
|
+
# @return [Hash] con el tipo por llave. Cada llave contiene otro `Hash` con las series.
|
148
|
+
#
|
149
|
+
def todas
|
150
|
+
TIPOS
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
# Arreglo con los tipos de series. Ver {TIPOS}.
|
155
|
+
#
|
156
|
+
# Tipos:
|
157
|
+
# * :reservas_internacionales
|
158
|
+
# * :tasas_de_interes
|
159
|
+
# * :tipos_de_cambio
|
160
|
+
# * :udis
|
161
|
+
#
|
162
|
+
# @return [Array<Symbol>] arreglo con los tipos de series.
|
163
|
+
def tipos
|
164
|
+
TIPOS.keys
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
# Series de reservas internacionales.
|
169
|
+
#
|
170
|
+
# Series:
|
171
|
+
# * :reserva_internacional
|
172
|
+
#
|
173
|
+
# @return [Hash] donde cada llave es el nombre de la serie y su valor es otro `Hash`con:
|
174
|
+
# * identificador (`:id`)
|
175
|
+
# * descripción (`:descripcion`)
|
176
|
+
# * título (`:titulo`)
|
177
|
+
# * tipo de la cifra (`:tipo_cifra`), por ejemplo: "Tipo de cambio"
|
178
|
+
# * tipo de la unidad (`:tipo_unidad`), por ejemplo: "Millones de dólares"
|
179
|
+
#
|
180
|
+
def reservas_internacionales
|
181
|
+
SERIES_RESERVAS_INTERNACIONALES
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
# Series de tasas de interés.
|
186
|
+
#
|
187
|
+
# Series:
|
188
|
+
# * :tasa_objetivo
|
189
|
+
# * :tasa_interes_interbancaria_tiie_28_dias
|
190
|
+
# * :tasa_interes_interbancaria_tiie_91_dias
|
191
|
+
# * :tasa_rendimiento_cetes_28_dias
|
192
|
+
#
|
193
|
+
# @return [Hash] donde cada llave es el nombre de la serie y su valor es otro `Hash`con:
|
194
|
+
# * identificador (`:id`)
|
195
|
+
# * descripción (`:descripcion`)
|
196
|
+
# * título (`:titulo`)
|
197
|
+
#
|
198
|
+
def tasas_de_interes
|
199
|
+
SERIES_TASAS_DE_INTERES
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
# Series de tipos de cambio.
|
204
|
+
#
|
205
|
+
# Series:
|
206
|
+
# * :dolar_canadiense
|
207
|
+
# * :dolar_fix
|
208
|
+
# * :dolar_liquidacion
|
209
|
+
# * :euro
|
210
|
+
# * :libra_esterlina
|
211
|
+
# * :yen
|
212
|
+
#
|
213
|
+
# @return [Hash] donde cada llave es el nombre de la serie y su valor es otro `Hash`con:
|
214
|
+
# * identificador (`:id`)
|
215
|
+
# * descripción (`:descripcion`)
|
216
|
+
# * título (`:titulo`)
|
217
|
+
# * tipo de la cifra (`:tipo_cifra`), por ejemplo: "Tipo de cambio"
|
218
|
+
# * tipo de la unidad (`:tipo_unidad`), por ejemplo: "Millones de dólares"
|
219
|
+
#
|
220
|
+
def tipos_de_cambio
|
221
|
+
SERIES_TIPOS_DE_CAMBIO
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
# Series de UDIS ({http://www.banxico.org.mx/ayuda/temas-mas-consultados/udis--unidades-inversion-.html Unidades de Inversión}).
|
226
|
+
#
|
227
|
+
# Series:
|
228
|
+
# * :udis
|
229
|
+
#
|
230
|
+
# @return [Hash] donde cada llave es el nombre de la serie y su valor es otro `Hash`con:
|
231
|
+
# * identificador (`:id`)
|
232
|
+
# * descripción (`:descripcion`)
|
233
|
+
# * título (`:titulo`)
|
234
|
+
# * tipo de la cifra (`:tipo_cifra`), por ejemplo: "Tipo de cambio"
|
235
|
+
# * tipo de la unidad (`:tipo_unidad`), por ejemplo: "Millones de dólares"
|
236
|
+
#
|
237
|
+
def udis
|
238
|
+
SERIES_UDIS
|
239
|
+
end
|
240
|
+
|
241
|
+
|
242
|
+
# Obtiene el identificador de acuerdo al tipo y a la serie.
|
243
|
+
#
|
244
|
+
# @param tipo [Symbol] el tipo de la serie (ver {TIPOS} o {.tipos}).
|
245
|
+
# @param serie [Symbol] el nombre de la serie.
|
246
|
+
#
|
247
|
+
# @return [String] el identificador de la serie.
|
248
|
+
#
|
249
|
+
# @raise [ArgumentError] si `tipo` no existe (no es una llave en {TIPOS} o un elemento de {.tipos}).
|
250
|
+
# @raise [ArgumentError] si `serie` no existe.
|
251
|
+
#
|
252
|
+
def identificador(tipo, serie)
|
253
|
+
raise ArgumentError.new("El tipo no existe (tipo: #{tipo}).") unless TIPOS.has_key?(tipo.to_sym)
|
254
|
+
raise ArgumentError.new("La serie no existe (serie: #{serie}).") unless send(tipo.to_sym).has_key?(serie.to_sym)
|
255
|
+
send(tipo.to_sym)[serie.to_sym][:id]
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
# Obtiene una lista de identificadores de las series.
|
260
|
+
#
|
261
|
+
# Cuando se especifica el `tipo`, la lista de identificadores se limita a los de las series de ese `tipo` únicamente.
|
262
|
+
#
|
263
|
+
# @param tipo [Symbol] el tipo de la serie (ver {TIPOS} o {.tipos}).
|
264
|
+
#
|
265
|
+
# @return [Array<String>] arreglo de identificadores.
|
266
|
+
#
|
267
|
+
# @raise [ArgumentError] si `tipo` no existe (no es una llave en {TIPOS} o un elemento de {.tipos}).
|
268
|
+
#
|
269
|
+
def identificadores(tipo = nil)
|
270
|
+
if tipo.nil?
|
271
|
+
TIPOS.inject([]){ |arr, tipo_serie| arr << tipo_serie.last.values.each.map{ |s| s[:id] } }.flatten
|
272
|
+
else
|
273
|
+
raise ArgumentError.new("El tipo no existe (tipo: #{tipo}).") unless TIPOS.has_key?(tipo.to_sym)
|
274
|
+
send(tipo.to_sym).values.map{ |v| v[:id] }
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
|
279
|
+
# Obtiene el nombre de la serie de acuerdo al identificador dado.
|
280
|
+
#
|
281
|
+
# Cuando se especifica el `tipo`, la búsqueda del nombre se limita a los de las series de ese `tipo` únicamente.
|
282
|
+
#
|
283
|
+
# @param identificador [String] identificador de la serie.
|
284
|
+
# @param tipo [Symbol] el tipo de la serie (ver {TIPOS} o {.tipos}).
|
285
|
+
#
|
286
|
+
# @return [String] el nombre de la serie.
|
287
|
+
#
|
288
|
+
# @raise [ArgumentError] si `tipo` no existe (no es una llave en {TIPOS} o un elemento de {.tipos}).
|
289
|
+
# @raise [ArgumentError] si `identificador` no existe.
|
290
|
+
#
|
291
|
+
def nombre(identificador, tipo = nil)
|
292
|
+
nom = nil
|
293
|
+
if tipo.nil?
|
294
|
+
tipos.each do |t|
|
295
|
+
nom = busca_nombre(identificador, t)
|
296
|
+
break unless nom.nil?
|
297
|
+
end
|
298
|
+
raise ArgumentError.new("El identificador no existe (identificador: #{identificador}).") if nom.nil?
|
299
|
+
else
|
300
|
+
nom = busca_nombre(identificador, tipo)
|
301
|
+
raise ArgumentError.new("El identificador (identificador: #{identificador}) no se encuentra en el tipo de serie dado (tipo: #{tipo}).") if nom.nil?
|
302
|
+
end
|
303
|
+
nom
|
304
|
+
end
|
305
|
+
|
306
|
+
|
307
|
+
# Obtiene una lista de nombres de las series.
|
308
|
+
#
|
309
|
+
# Cuando se especifica el `tipo`, la lista de nombres se limita a los de las series de ese `tipo` únicamente.
|
310
|
+
#
|
311
|
+
# @param tipo [Symbol] el tipo de la serie (ver {TIPOS} o {.tipos}).
|
312
|
+
#
|
313
|
+
# @return [Array<String>] arreglo de nombres.
|
314
|
+
#
|
315
|
+
# @raise [ArgumentError] si `tipo` no existe (no es una llave en {TIPOS} o un elemento de {.tipos}).
|
316
|
+
#
|
317
|
+
def nombres(tipo = nil)
|
318
|
+
if tipo.nil?
|
319
|
+
TIPOS.inject([]){ |arr, tipo_serie| arr << tipo_serie.last.keys }.flatten
|
320
|
+
else
|
321
|
+
raise ArgumentError.new("El tipo no existe (tipo: #{tipo}).") unless TIPOS.has_key?(tipo.to_sym)
|
322
|
+
send(tipo.to_sym).keys
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
private
|
327
|
+
|
328
|
+
# Busca el nombre de acuerdo al identificador y el tipo dado.
|
329
|
+
#
|
330
|
+
# @param identificador [String] identificador de la serie.
|
331
|
+
# @param tipo [Symbol] el tipo de la serie (ver {TIPOS} o {.tipos}).
|
332
|
+
#
|
333
|
+
# @return [String] si el nombre de la serie fue encontrado.
|
334
|
+
# @return [nil] si el nombre de la serie no fue encontrado.
|
335
|
+
#
|
336
|
+
# @raise [ArgumentError] si `tipo` no existe (no es una llave en {TIPOS} o un elemento de {.tipos}).
|
337
|
+
#
|
338
|
+
def busca_nombre(identificador, tipo)
|
339
|
+
raise ArgumentError.new("El tipo no existe (tipo: #{tipo}).") unless TIPOS.has_key?(tipo.to_sym)
|
340
|
+
send(tipo.to_sym).each_pair{|k, v| return k if v[:id] == identificador }
|
341
|
+
nil
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# Estructura para guardar el tipo de cambio de una fecha.
|
2
|
+
#
|
3
|
+
class MX::Banxico::TipoDeCambio
|
4
|
+
# !@attribute [r] moneda
|
5
|
+
# @return [Symbol] el nombre de la moneda de origen.
|
6
|
+
attr_reader :moneda
|
7
|
+
|
8
|
+
|
9
|
+
# !@attribute [r] fecha
|
10
|
+
# @return [Date] la fecha del tipo de cambio.
|
11
|
+
attr_reader :fecha
|
12
|
+
|
13
|
+
|
14
|
+
# !@attribute [r] valor_en_mxn
|
15
|
+
# @return [Float] el importe en pesos mexicanos (MXN) del tipo de cambio.
|
16
|
+
attr_reader :valor_en_mxn
|
17
|
+
|
18
|
+
|
19
|
+
# Constructor.
|
20
|
+
#
|
21
|
+
# @param moneda [String, Symbol] el nombre de la moneda de origen.
|
22
|
+
# @param fecha [String, Date] la fecha del tipo de cambio. Cuando es una cadena debe estar
|
23
|
+
# en formato {http://www.iso.org/iso/home/standards/iso8601.htm ISO-8601}.
|
24
|
+
# @param valor_en_mxn [String, Float] el importe en pesos mexicanos (MXN) del tipo de cambio.
|
25
|
+
#
|
26
|
+
# @return [MX::Banxico::TipoDeCambio] una instancia de la clase.
|
27
|
+
#
|
28
|
+
# @raise [ArgumentError] cuando alguno de los parámetros no es valido.
|
29
|
+
#
|
30
|
+
def initialize(moneda, fecha, valor_en_mxn)
|
31
|
+
procesar_moneda(moneda)
|
32
|
+
procesar_fecha(fecha)
|
33
|
+
procesar_valor_en_mxn(valor_en_mxn)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# La representación en cadena de la instancia.
|
38
|
+
#
|
39
|
+
# @return [String] La representación en cadena de la instancia.
|
40
|
+
#
|
41
|
+
def to_s
|
42
|
+
"#{@moneda}: #{"$%.4f MXN" % @valor_en_mxn} al día #{@fecha.to_s}"
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Compara `self` con `otro`.
|
47
|
+
#
|
48
|
+
# @param otro [MX::Banxico::TipoDeCambio] la instancia contra la que se realizará la comparación.
|
49
|
+
#
|
50
|
+
# @return [Integer]
|
51
|
+
# * `1` si `self` es mayor que `otro`
|
52
|
+
# * `0` si `self` es igual a `otro`
|
53
|
+
# * `-1` si `self` es menor que `otro`
|
54
|
+
#
|
55
|
+
def <=>(otro)
|
56
|
+
if self == otro
|
57
|
+
0
|
58
|
+
elsif @moneda == otro.moneda
|
59
|
+
if @fecha == otro.fecha
|
60
|
+
@valor_en_mxn <=> otro.valor_en_mxn
|
61
|
+
elsif @fecha < otro.fecha
|
62
|
+
-1
|
63
|
+
else
|
64
|
+
1
|
65
|
+
end
|
66
|
+
elsif @moneda < otro.moneda
|
67
|
+
-1
|
68
|
+
else
|
69
|
+
1
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# Indica si `self` y `otro` son iguales.
|
75
|
+
#
|
76
|
+
# @param otro [MX::Banxico::TipoDeCambio] la instancia contra la que se realizará la comparación.
|
77
|
+
#
|
78
|
+
# @return [Boolean] `true` si `self` es igual a `otro`, `false` de lo contrario.
|
79
|
+
#
|
80
|
+
def ==(otro)
|
81
|
+
@moneda == otro.moneda && @fecha == otro.fecha && @valor_en_mxn == otro.valor_en_mxn
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Mensaje para la excepción al convertir la fecha.
|
89
|
+
#
|
90
|
+
FECHA_EX_MSG = "fecha debe ser una cadena (String) en formato ISO-8601 o un objeto de tipo fecha (Date)."
|
91
|
+
|
92
|
+
# Mensaje para la excepción al convertir el valor en pesos.
|
93
|
+
#
|
94
|
+
VALOR_EN_MXN_EX_MSG = "valor_en_mxn debe ser una cadena con un número decimal o un objeto de tipo (Float)."
|
95
|
+
|
96
|
+
|
97
|
+
# Verifica que la moneda sea del tipo adecuado y de ser posible, la convierte a un símbolo (Symbol) y asigna
|
98
|
+
# el valor a la variable `moneda` de la instancia.
|
99
|
+
#
|
100
|
+
# @param moneda [String, Symbol] el nombre de la moneda de origen.
|
101
|
+
#
|
102
|
+
# @raise [ArgumentError] cuando no tiene el tipo correcto el parámetro `moneda`.
|
103
|
+
#
|
104
|
+
def procesar_moneda(moneda)
|
105
|
+
if moneda.is_a?(String)
|
106
|
+
@moneda = moneda.to_sym
|
107
|
+
elsif moneda.is_a?(Symbol)
|
108
|
+
@moneda = moneda
|
109
|
+
else
|
110
|
+
raise ArgumentError.new("moneda debe ser una cadena (String) o un objeto tipo símbolo (Symbol).")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
# Verifica que la fecha sea del tipo adecuado y de ser posible, la convierte a un objeto de tipo fecha (Date) y asigna
|
116
|
+
# el valor a la variable `fecha` de la instancia.
|
117
|
+
#
|
118
|
+
# @param fecha [String, Date] la fecha del tipo de cambio. Cuando es una cadena debe estar
|
119
|
+
# en formato {http://www.iso.org/iso/home/standards/iso8601.htm ISO-8601}.
|
120
|
+
#
|
121
|
+
# @raise [ArgumentError] cuando no tiene el tipo o formato correcto el parámetro `fecha`.
|
122
|
+
#
|
123
|
+
def procesar_fecha(fecha)
|
124
|
+
if fecha.is_a?(Date)
|
125
|
+
@fecha = fecha
|
126
|
+
elsif fecha.is_a?(String)
|
127
|
+
begin
|
128
|
+
@fecha = Date.iso8601(fecha)
|
129
|
+
rescue ArgumentError
|
130
|
+
raise ArgumentError.new(FECHA_EX_MSG)
|
131
|
+
end
|
132
|
+
else
|
133
|
+
raise ArgumentError.new(FECHA_EX_MSG)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
# Verifica que el valor en pesos mexicanos sea del tipo adecuado y de ser posible,
|
139
|
+
# lo convierte a un número flotante (Float) y asigna el valor a la variable `valor_en_mxn` de la instancia.
|
140
|
+
#
|
141
|
+
# @param valor_en_mxn [String, Float] el importe en pesos mexicanos (MXN) del tipo de cambio.
|
142
|
+
#
|
143
|
+
# @raise [ArgumentError] cuando no tiene el tipo o formato correcto el parámetro `valor_en_mxn`.
|
144
|
+
#
|
145
|
+
def procesar_valor_en_mxn(valor_en_mxn)
|
146
|
+
if valor_en_mxn.is_a?(Float)
|
147
|
+
@valor_en_mxn = valor_en_mxn
|
148
|
+
elsif valor_en_mxn.is_a?(String)
|
149
|
+
if valor_en_mxn =~ /^\d+(\.\d+)?$/
|
150
|
+
@valor_en_mxn = valor_en_mxn.to_f
|
151
|
+
else
|
152
|
+
raise ArgumentError.new(VALOR_EN_MXN_EX_MSG)
|
153
|
+
end
|
154
|
+
else
|
155
|
+
raise ArgumentError.new(VALOR_EN_MXN_EX_MSG)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|