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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +12 -0
  5. data/.yardopts +9 -0
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +36 -0
  8. data/Guardfile +26 -0
  9. data/LICENSE.txt +22 -0
  10. data/MX-Banxico.gemspec +29 -0
  11. data/README.md +140 -0
  12. data/REFERENCIAS.md +6 -0
  13. data/Rakefile +26 -0
  14. data/lib/MX/Banxico.rb +12 -0
  15. data/lib/MX/Banxico/historico.rb +4 -0
  16. data/lib/MX/Banxico/historico/tipo_de_cambio.rb +296 -0
  17. data/lib/MX/Banxico/series.rb +346 -0
  18. data/lib/MX/Banxico/tipo_de_cambio.rb +159 -0
  19. data/lib/MX/Banxico/version.rb +14 -0
  20. data/lib/MX/Banxico/web_services.rb +4 -0
  21. data/lib/MX/Banxico/web_services/tipo_de_cambio.rb +83 -0
  22. data/lib/MX/Banxico/web_services/web_service.rb +99 -0
  23. data/spec/MX/Banxico/historico/tipo_de_cambio_spec.rb +525 -0
  24. data/spec/MX/Banxico/series_spec.rb +475 -0
  25. data/spec/MX/Banxico/tipo_de_cambio_spec.rb +688 -0
  26. data/spec/MX/Banxico/web_services/tipo_de_cambio_spec.rb +152 -0
  27. data/spec/MX/Banxico/web_services/web_service_spec.rb +108 -0
  28. data/spec/fixtures/MX/Banxico/historico/respuestas_correctas/tipo_de_cambio.xml +2228 -0
  29. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/mal_formado.xml +1 -0
  30. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/serie_sin_valores.xml +28 -0
  31. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/sin_series.xml +26 -0
  32. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +393 -0
  33. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/serie_sin_valores.xml +28 -0
  34. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/sin_serie.xml +26 -0
  35. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/reservas_internacionales_banxico.xml +41 -0
  36. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tasas_de_interes_banxico.xml +50 -0
  37. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tipos_de_cambio_banxico.xml +56 -0
  38. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/udis_banxico.xml +41 -0
  39. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_fecha_tipo_de_cambio.xml +41 -0
  40. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_nodo_obs.xml +40 -0
  41. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_valor_tipo_de_cambio.xml +41 -0
  42. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +41 -0
  43. data/spec/spec_helper.rb +31 -0
  44. 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