SW Smarterweb libreria para consumir los servicios de cfdi
Librería Ruby para el consumo de los servicios de SW sapien®.
- CFDI 4.0
- Ruby 2.1 o superior
Ejecutar los comandos directamente en consola
winget install RubyInstallerTeam.Ruby
Snap (Ubuntu u otras distribuciones Linux)
$ sudo snap install ruby --classic
gem install ruby
Para efectos prácticos, usaremos el siguiente array asociativo como conjunto de parámetros utilizados por los servicios.
params = {"url" => 'http://services.test.sw.com.mx', "user" => 'demo', "password" => '123456789'}
La clase de authentication, nos sirve para obtener un token de 2 hrs de duración. Podrá ser utilizado en los siguientes servicios para consumo.
Authentication
Parámetros necesarios
- url
- user
- password
Funciones disponibles
- set(Params)
- authentication
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Authentication/auth.rb'
Ejemplo de uso
Auth::set(params)
token = Auth::authentication.get_token
Las funciones utilizables para el objeto obtenido son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_token | |
get_time_expire | |
get_status_code |
La clase de Balance nos ayuda a obtener información referente a nuestra cuenta. Así sabremos cuando nos quedan pocos timbres o cuantos tenemos asignados, etc.
Balance
Parámetros necesarios
- url
- user y password o url y token
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Balance/balance.rb'
Ejemplo de uso
Balance::set(params)
response = Balance::account_balance
timbres = response.get_data['saldoTimbres']
Las funciones utilizables para el objeto obtenido son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase de Cancelation nos servirá para cancelar algún comprobante anteriormente ya timbrado, teniendo diversas opciones para poder cancelar dicho documento.
Cancelation
Parámetros necesarios
- url
- user y password o url y token
Además de los parámetros que nos sean necesarios dependiendo del tipo de cancelación a usar.
Funciones disponibles
- cancel_csd(uuid, rfc, password_csd, b64_cer, b64_key, motivo, foliosustitucion)
- cancel_uuid(uuid, rfc, motivo, foliosustitucion)
- cancel_pfx(uuid, rfc, password_csd, b64_pfx, motivo, foliosustitucion)
- cancel_xml(xml_cancel, motivo, foliosustitucion)
Parámetro | Descripción |
---|---|
uuid | UUID del comprobante |
rfc | RFC del emisor |
b64_cer | Certificado del emisor en Base64 |
b64_key | Key del emisor en Base64 |
b64_pfx | Archivo Pfx en Base64 |
password_csd | Contraseña del certificado |
xml_cancel | XML con los comprobantes a cancelar |
motivo | Clave para expresar el motivo de la cancelación |
foliosustitucion | UUID del comprobante que sustituye |
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Cancelation/cancelation.rb'
Ejemplo de uso
Cancelation::set(params)
response_csd = Cancelation::cancel_csd(uuid, rfc, password_csd, b64_cer, b64_key, motivo)
response_uuid = Cancelation::cancel_uuid(uuid, rfc, motivo, foliosustitucion)
response_pfx = Cancelation::cancel_pfx(uuid, rfc, password_csd, b64_pfx, motivo)
response_xml = Cancelation::cancel_xml(xml_cancel, motivo, foliosustitucion)
Las funciones utilizables para estos objetos de cancelación son los siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Issue nos ayudará a timbrar nuestros documentos XML por medio de emisión-timbrado. A diferencia de la clase Stamp, esta clase además de timbrar el documento le pondrá el sello.
📌 NOTA: Para realizar el sellado, los certificados del rfc emisor deberán estar almacenados en el administrador de timbres.
Issue
Parámetros necesarios
- url
- user y password o url y token
- xml
Funciones disponibles
- set(params)
- issue_v1(xml, b64)
- issue_v2(xml, b64)
- issue_v3(xml, b64)
- issue_v4(xml, b64)
b64 es un parámetro opcional y se debe indicar en true si el XML va encodeado en base64. De no indicarse por defecto se tomará el valor de false
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Issue/issue.rb'
Ejemplo de uso
Issue::set(params)
response = Issue::issue_v4(xml,false)
File.open(response.get_data['uuid']+'.xml', 'w') { |file| file.write(response.get_data['cfdi']) }
Las funciones correspondientes al objeto Issue son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Issue nos ayudará a timbrar nuestros documentos JSON por medio de emisión-timbrado.
IssueJson
Parámetros necesarios
- url
- user y password o url y token
- JSON
Funciones disponibles
- set(params)
- issue_JSON_v1(json)
- issue_JSON_v2(json)
- issue_JSON_v3(json)
- issue_JSON_v4(json)
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Issue/issue.rb'
Ejemplo de uso
Issue::set(params)
response = Issue::issue_JSON_v4(json)
File.open(response.get_data['uuid']+'.xml', 'w') { |file| file.write(response.get_data['cfdi']) }
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Stamp se utiliza para el timbrado de documentos XML. El documento deberá venir ya con el sello.
Stamp
Parámetros necesarios
- url
- user y password o url y token
- xml sellado
Funciones disponibles
- set(params)
- stamp_v1(xml, b64)
- stamp_v2(xml, b64)
- stamp_v3(xml, b64)
- stamp_v4(xml, b64)
b64 es un parámetro opcional y se debe indicar en true si el XML va encodeado en base 64. De no indicarse por defecto se tomará el valor de false
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Stamp/stamp.rb'
Ejemplo de uso
Stamp::set(params)
response = Stamp::stamp_v4(xml)
File.open(response.get_data['uuid']+'.xml', 'w') { |file| file.write(response.get_data['cfdi']) }
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
📌 NOTA: Existen varias versiones de respuesta, las cuales son las siguientes:
Version | Respuesta |
---|---|
V1 | Devuelve el timbre fiscal digital |
V2 | Devuelve el timbre fiscal digital y el CFDI timbrado |
V3 | Devuelve el CFDI timbrado |
V4 | Devuelve todos los datos del timbrado |
La clase Validation servirá para validar si nuestro XML no tiene algún error.
Validation
Parámetros necesarios
- url
- user y password o url y token
Funciones disponibles
- set(params)
- validate_xml(xml)
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Validation/validate.rb'
Ejemplo de uso
Validate::set(params)
response_xml = Validate::validateXml(xml)
puts response_xml.get_response
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Pendings servirá para obtener una lista de UUID's que tenga pendientes el RFC.
Pendings
Parámetros necesarios
- url
- user y password o url y token
Además de el RFC del cual consultaremos los UUID's pendientes.
Funciones disponibles
- set(params)
- get_pendings(rfc)
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Pendings/pendings.rb'
Ejemplo de uso
rfc = 'LAN7008173R5'
Pendings::set(params)
reponse = Pendings::get_pendings(rfc)
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase AcceptReject servirá para aceptar o rechazar alguna factura que tenga pendiente el RFC asociado.
AcceptReject
Parámetros necesarios
- url
- user y password o url y token
Funciones disponibles
- set(params)
- accept_reject_csd(uuids, rfc, password, csd, key)
- accept_reject_pfx(uuids, rfc, password, pfx)
- accept_reject_uuid(uuid, rfc, action)
- accept_reject_xml(xml)
Action puede ser "aceptacion" o "rechazo"
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'AcceptReject/accept_reject.rb'
Ejemplo de uso
b64_csd = read_file('../../resources/b64CSD.txt')
b64_key = read_file('../../resources/b64Key.txt')
password_csd = '12345678a'
uuids = []
uuids << {"uuid" => "6b02b155-25fd-488d-862b-5a5dc5694b62", "action" => "Rechazo"}
uuids << {"uuid" => "ef47cd9e-b495-483d-b7ad-7f374fe8e353", "action" => "Rechazo"}
rfc = 'LAN7008173R5'
AcceptReject::set(params)
response = AcceptReject::accept_reject_csd(uuids, rfc, password_csd, b64_csd, b64_key)
puts response.get_response
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Relations servirá para consultar las facturas que se encuentren relacionadas a un UUID.
Relations
Parámetros necesarios
- url
- user y password o url y token
Funciones disponibles
- set(params)
- relations_csd(uuid, rfc, passwordcsd, b64CSD, b64Key)
- relations_pfx(uuid, rfc, passwordcsd, b64PFX)
- relations_uuid(uuid, rfc)
- relations_xml(xml) Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Relations/relations.rb'
Ejemplo de uso
b64_csd = read_file('../../resources/b64CSD.txt')
b64_key = read_file('../../resources/b64Key.txt')
password_csd = '12345678a'
uuid = "77e5ee7e-518e-48d1-b719-2562eaf9cb1f"
rfc = 'LAN7008173R5'
Relations::set(params)
response = Relations::relations_csd(uuid, rfc, password_csd, b64_csd, b64_key)
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
En caso de éxito | En caso de error |
---|---|
get_status | get_message |
get_data | get_messageDetail |
get_response | |
get_status_code |
La clase Status Cfdi servirá para consultar el estatus de cancelación, si es cancelable, vigente o cancelada de nuestras facturas.
StatusCfdi
Parámetros necesarios
- url
- user y password o url y token.
Funciones disponibles
- status(rfc_emisor, rfc_receptor, total, uuid, url, action)
Importar la clase al comienzo de nuestro programa de la siguiente manera
require_relative 'StatusCfdi/status_cfdi.rb'
Ejemplo de uso
url = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc'
action = 'http://tempuri.org/IConsultaCFDIService/Consulta'
rfc_emisor = 'LAN7008173R5'
rfc_receptor = 'LAN8507268IA'
total = '5800.00'
uuid = 'a9143107-25c5-4fb9-b0eb-2fcbcb855967'
response = StatusCfdi::status(rfc_emisor, rfc_receptor, total, uuid, url, action)
Las funciones correspondientes al objeto que regresan estas funciones son las siguientes
- get_status_code
- get_response
- get_codigoEstatus
- get_esCancelable
- get_estado
- get_estatusCancelacion
La clase de Storage permite recuperar un XML enviando como parámetro el folio fiscal del comprobante.
Storage
Parámetros necesarios
- url api
- url
- user y password o url api y token
Funciones disponibles
- get_xml(uuid)
Importar la clase al comienzo de nuestro programa de la siguiente manera
require 'Storage/storage.rb'
Setear los parámetros.
params = {"url_api" => 'http://api.test.sw.com.mx', "token" => ENV["SDKTEST_TOKEN"]}
Storage::set(params)
params = {"url_api" => 'http://api.test.sw.com.mx', "url" => 'http://services.test.sw.com.mx', "user" => ENV["SDKTEST_USER"], "password" => ENV["SDKTEST_PASSWORD"]}
Storage::set(params)
Ejemplo de uso
uuid = "b35d525e-d845-42c9-bbfb-eeeef601e2b4"
response = Storage::get_xml(uuid)