Class: MX::Banxico::WebServices::TipoDeCambio

Inherits:
WebService
  • Object
show all
Defined in:
lib/MX/Banxico/web_services/tipo_de_cambio.rb

Overview

Modelo para conectarse al servicio web de Banxico y obtener los tipos de cambio vigentes al día de hoy.

Esta clase hereda de WebService para especializarse en la recuperación de los tipos de cambio.

Constant Summary collapse

TIPOS_DE_CAMBIO =

Tipos de cambio soportados.

MX::Banxico::Series.tipos_de_cambio.keys.dup.freeze

Constants inherited from WebService

WebService::CODIFICACION_WS, WebService::OPERACIONES_WS, WebService::WSDL

Instance Method Summary collapse

Methods inherited from WebService

#client, init_client, operaciones, #realizar_operacion

Instance Method Details

#obtener(tipo, intentos = 5) ⇒ MX::Banxico::TipoDeCambio, String

Obtiene el tipo de cambio del día.

Parameters:

  • tipo (Symbol)

    el tipo de cambio deseado. Ver TIPOS_DE_CAMBIO.

  • intentos (Ingeger) (defaults to: 5)

    el número de intentos para obtener el tipo de cambio.

Returns:

  • (MX::Banxico::TipoDeCambio)

    si la petición es exitosa, la estructura con el tipo de cambio.

  • (String)

    si la petición no es exitosa, una cadena con la descripción del error.

Raises:

  • (ArgumentError)

    cuando el tipo dado no está soportado. Ver TIPOS_DE_CAMBIO.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/MX/Banxico/web_services/tipo_de_cambio.rb', line 32

def obtener(tipo, intentos = 5)
  raise ArgumentError.new("El tipo de cambio no está soportado (#{tipo}).") unless TIPOS_DE_CAMBIO.member?(tipo.to_sym)
  respuesta = realizar_operacion(:tipos_de_cambio_banxico, intentos)
  if respuesta.errores?
    return respuesta.errores
  else
    xml_doc_cuerpo_respuesta = Nokogiri::XML(respuesta.cuerpo, nil, CODIFICACION_WS )
    nodo_valor = xml_doc_cuerpo_respuesta.root.at_xpath(xpath_tipo_de_cambio(tipo))
    if nodo_valor
      tdc_o_error = procesar_nodo_obs_tipo_de_cambio(nodo_valor, tipo)
      return tdc_o_error
    else
      return "No fue posible extraer los valores del XML del nodo bm:Obs al consultar el servicio web." +
        " Operación: #{:tipos_de_cambio_banxico}. XPath: #{xpath_tipo_de_cambio(tipo)}." +
        "\n\n #{respuesta.cuerpo}"
    end
  end
end

#operationsObject

Operaciones soportadas en este web service via Savon.



19
# File 'lib/MX/Banxico/web_services/tipo_de_cambio.rb', line 19

operations :tipos_de_cambio_banxico

#procesar_nodo_obs_tipo_de_cambio(nodo_valor, tipo) ⇒ MX::Banxico::TipoDeCambio, String (private)

Procesa el nodo del XML de la respuesta de la petición que contiene la información del tipo de cambio.

Parameters:

  • nodo_valor (Nokogiri::XML::Node)

    nodo de la serie con el valor y fecha del tipo de cambio (bm:Obs).

  • tipo (Symbol)

    el tipo de cambio solicitado. Ver TIPOS_DE_CAMBIO.

Returns:

  • (MX::Banxico::TipoDeCambio)

    si la obtención del valor y la fecha es exitosa, la estructura con el tipo de cambio.

  • (String)

    si la obtención del valor y la fecha no es exitosa, una cadena con la descripción del error.



63
64
65
66
67
68
69
# File 'lib/MX/Banxico/web_services/tipo_de_cambio.rb', line 63

def procesar_nodo_obs_tipo_de_cambio(nodo_valor, tipo)
  begin
    return MX::Banxico::TipoDeCambio.new(tipo, nodo_valor[:TIME_PERIOD], nodo_valor[:OBS_VALUE])
  rescue ArgumentError => e
    return "Error al crear el tipo de cambio a partir del nodo bm:Obs. Error: #{e.message}"
  end
end

#xpath_tipo_de_cambio(tipo) ⇒ String (private)

XPath con la ruta del nodo bm:Obs del identificador de la serie de acuerdo a su tipo.

Parameters:

Returns:

  • (String)

    la ruta (XPath) del nodo de la serie de acuerdo al tipo dado.



77
78
79
80
# File 'lib/MX/Banxico/web_services/tipo_de_cambio.rb', line 77

def xpath_tipo_de_cambio(tipo)
  id = MX::Banxico::Series.identificador(:tipos_de_cambio, tipo)
  %Q{bm:DataSet/bm:Series[@IDSERIE="#{id}"]/bm:Obs}
end