LogicalBricks/fm_timbrado_cfdi

View on GitHub
lib/fm_timbrado_cfdi/fm_cliente.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'savon'
require 'fm_timbrado_cfdi/fm_respuesta'
require 'fm_timbrado_cfdi/fm_respuesta_cancelacion'

module FmTimbradoCfdi
  class FmCliente
    attr_accessor :user_id, :user_pass, :namespace, :fm_wsdl, :endpoint,
      :ssl_verify_mode, :log, :log_level, :logger

    def initialize
      # La configuracion por default es la del ambiente de pruebas de FM
      # Datos de acceso al webservice
      @user_id = 'UsuarioPruebasWS'
      @user_pass = 'b9ec2afa3361a59af4b4d102d3f704eabdf097d4'
      # Datos del webservise de prueba
      @namespace = 'https://t2demo.facturacionmoderna.com/timbrado/soap'
      @endpoint = 'https://t2demo.facturacionmoderna.com/timbrado/soap'
      @fm_wsdl = 'https://t2demo.facturacionmoderna.com/timbrado/wsdl'

      #Opciones adicionales
      @log = false
      @log_level = :error
      @ssl_verify_mode = :none
      @logger = nil
    end

    def timbrar(rfc, documento, opciones={})
      text_to_cfdi = Base64::encode64( documento )
      # Realizamos la peticion
      respuesta = webservice_call(:request_timbrar_cfdi, rfc, {'text2CFDI' => text_to_cfdi}.merge(opciones))
      FmRespuesta.new(respuesta)
    end

    def subir_certificado(rfc, certificado, llave, password, opciones = {})
      parametros = { 'archivoCer' => Base64::encode64(certificado),
                     'archivoKey' => Base64::encode64(llave),
                     'clave' => password }
      respuesta = webservice_call(:activar_cancelacion, rfc, parametros.merge(opciones))
      FmRespuestaCancelacion.new(respuesta)
    end

    def cancelar(rfc, uuid, opciones = {})
      respuesta = webservice_call(:request_cancelar_cfdi, rfc, {uuid: uuid}.merge(opciones))
      FmRespuestaCancelacion.new(respuesta)
    end

    private

    def webservice_call(accion, rfc, opciones)
      configurar_cliente
      parametros= { 'param0' => { 'UserPass' => user_pass, 'UserID' => user_id, 'emisorRFC' => rfc }.merge(opciones) }
      @client.call(accion, message: parametros)
    end

    def configurar_cliente
      @client = Savon.client do |globals|
        globals.ssl_verify_mode ssl_verify_mode
        globals.wsdl            fm_wsdl
        globals.endpoint        endpoint
        globals.raise_errors    false
        globals.log_level       log_level
        globals.log             log
        globals.logger          logger if logger
        globals.open_timeout    15
        globals.read_timeout    15
      end
    end

  end
end