fm_timbrado_cfdi 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9b9fa77ba426f4a50bb3b55a91a4d21e8def90f6
4
- data.tar.gz: 41013f05b6e0e999ac42dbbea0357d2e775aacb8
2
+ SHA256:
3
+ metadata.gz: 4eec2dd5721cfade0124f07d426f3a4100b68e8d0aa27a1a1b2e750969036236
4
+ data.tar.gz: 4c6caca909988cc75843f7f0501a43c0188d6f22ce526abeb3fdbcba0aa30328
5
5
  SHA512:
6
- metadata.gz: 1879d848bea0827593a81548900243710c745444a7765ce6c22e4d88eafea1e6f8c3150cd4933c5f3aa2d90f85352b4596f56318d3e68c05aa51fe50d998c674
7
- data.tar.gz: b202365825142f3fa9308df54b9527b205bc11926558f3241728178b763e31448ee59c4c4efe778008e886fd7cd3f9d4751c94a47f75fdcf54253d186570c77c
6
+ metadata.gz: 828cbeada1e8faa6eca6bb200240c4b6254752a91a1dd88a026305d9cab400d152e9405a14670cb0950ee634752dd45bbcad9c79b011ae6726a10f5115e1edbe
7
+ data.tar.gz: b1f47a5d8a7d2620953ecab00e1977efe4efb0b6cdabeeb0f7d6819b0d0f3b1db4de86033705a922efed0ad512391fe9b101eda4e8f618936fe6d1f27b244d0d
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p353
1
+ 2.5.0
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
3
+ - 2.2.2
4
+ - 2.5.0
5
+ before_install:
6
+ - 'gem update --system'
@@ -1,6 +1,7 @@
1
- require "fm_timbrado_cfdi/version"
2
- require "fm_timbrado_cfdi/fm_cliente"
3
- require "fm_timbrado_cfdi/fm_informacion_cfdi"
1
+ require 'fm_timbrado_cfdi/version'
2
+ require 'fm_timbrado_cfdi/fm_cliente'
3
+ require 'fm_timbrado_cfdi/fm_informacion_cfdi'
4
+ require 'fm_timbrado_cfdi/fm_cfdi'
4
5
  require 'nokogiri'
5
6
  require 'base64'
6
7
 
@@ -24,7 +25,7 @@ module FmTimbradoCfdi
24
25
  def timbra_cfdi_xml (xml, generar_cbb = false)
25
26
  factura_xml = Nokogiri::XML(xml)
26
27
  #procesar rfc del emisor
27
- emisor = factura_xml.xpath("//cfdi:Emisor")
28
+ emisor = factura_xml.xpath('//cfdi:Emisor')
28
29
  rfc = emisor[0]['rfc']
29
30
  cliente.timbrar rfc, factura_xml.to_s, 'generarCBB' => generar_cbb
30
31
  end
@@ -0,0 +1,29 @@
1
+ module FmTimbradoCfdi
2
+ class FmCfdi
3
+ attr_reader :xml
4
+ def initialize(response)
5
+ @doc = Nokogiri::XML(response)
6
+ @xml = obtener_xml(@doc)
7
+ end
8
+
9
+ def version_3_2?
10
+ obtener_version('version') == '3.2'
11
+ end
12
+
13
+ def version_3_3?
14
+ obtener_version('Version') == '3.3'
15
+ end
16
+
17
+ private
18
+
19
+ def obtener_version(version)
20
+ factura_xml = Nokogiri::XML(xml)
21
+ factura_xml.xpath("//cfdi:Comprobante").attribute(version).value rescue nil
22
+ end
23
+
24
+ def obtener_xml(doc)
25
+ return nil if doc.xpath("//xml").empty?
26
+ Base64::decode64 doc.xpath("//xml")[0].content
27
+ end
28
+ end
29
+ end
@@ -4,7 +4,8 @@ require 'fm_timbrado_cfdi/fm_respuesta_cancelacion'
4
4
 
5
5
  module FmTimbradoCfdi
6
6
  class FmCliente
7
- attr_accessor :user_id, :user_pass, :namespace, :fm_wsdl, :endpoint, :ssl_verify_mode, :log, :log_level
7
+ attr_accessor :user_id, :user_pass, :namespace, :fm_wsdl, :endpoint,
8
+ :ssl_verify_mode, :log, :log_level, :logger
8
9
 
9
10
  def initialize
10
11
  # La configuracion por default es la del ambiente de pruebas de FM
@@ -12,27 +13,28 @@ module FmTimbradoCfdi
12
13
  @user_id = 'UsuarioPruebasWS'
13
14
  @user_pass = 'b9ec2afa3361a59af4b4d102d3f704eabdf097d4'
14
15
  # Datos del webservise de prueba
15
- @namespace = "https://t2demo.facturacionmoderna.com/timbrado/soap"
16
- @endpoint = "https://t2demo.facturacionmoderna.com/timbrado/soap"
17
- @fm_wsdl = "https://t2demo.facturacionmoderna.com/timbrado/wsdl"
16
+ @namespace = 'https://t2demo.facturacionmoderna.com/timbrado/soap'
17
+ @endpoint = 'https://t2demo.facturacionmoderna.com/timbrado/soap'
18
+ @fm_wsdl = 'https://t2demo.facturacionmoderna.com/timbrado/wsdl'
18
19
 
19
20
  #Opciones adicionales
20
21
  @log = false
21
22
  @log_level = :error
22
23
  @ssl_verify_mode = :none
24
+ @logger = nil
23
25
  end
24
26
 
25
27
  def timbrar(rfc, documento, opciones={})
26
28
  text_to_cfdi = Base64::encode64( documento )
27
29
  # Realizamos la peticion
28
- respuesta = webservice_call(:request_timbrar_cfdi, rfc, {"text2CFDI" => text_to_cfdi}.merge(opciones))
30
+ respuesta = webservice_call(:request_timbrar_cfdi, rfc, {'text2CFDI' => text_to_cfdi}.merge(opciones))
29
31
  FmRespuesta.new(respuesta)
30
32
  end
31
33
 
32
34
  def subir_certificado(rfc, certificado, llave, password, opciones = {})
33
- parametros = { "archivoCer" => Base64::encode64(certificado),
34
- "archivoKey" => Base64::encode64(llave),
35
- "clave" => password }
35
+ parametros = { 'archivoCer' => Base64::encode64(certificado),
36
+ 'archivoKey' => Base64::encode64(llave),
37
+ 'clave' => password }
36
38
  respuesta = webservice_call(:activar_cancelacion, rfc, parametros.merge(opciones))
37
39
  FmRespuestaCancelacion.new(respuesta)
38
40
  end
@@ -42,28 +44,26 @@ module FmTimbradoCfdi
42
44
  FmRespuestaCancelacion.new(respuesta)
43
45
  end
44
46
 
45
-
46
47
  private
47
48
 
48
49
  def webservice_call(accion, rfc, opciones)
49
50
  configurar_cliente
50
- parametros= { "param0" => { "UserPass" => user_pass, "UserID" => user_id, "emisorRFC" => rfc }.merge(opciones) }
51
- @client.call(accion,
52
- message: parametros
53
- )
51
+ parametros= { 'param0' => { 'UserPass' => user_pass, 'UserID' => user_id, 'emisorRFC' => rfc }.merge(opciones) }
52
+ @client.call(accion, message: parametros)
54
53
  end
55
54
 
56
55
  def configurar_cliente
57
- @client = Savon.client(
58
- ssl_verify_mode: ssl_verify_mode,
59
- wsdl: fm_wsdl,
60
- endpoint: endpoint,
61
- raise_errors: false,
62
- log_level: log_level,
63
- log: log,
64
- open_timeout: 15,
65
- read_timeout: 15
66
- )
56
+ @client = Savon.client do |globals|
57
+ globals.ssl_verify_mode ssl_verify_mode
58
+ globals.wsdl fm_wsdl
59
+ globals.endpoint endpoint
60
+ globals.raise_errors false
61
+ globals.log_level log_level
62
+ globals.log log
63
+ globals.logger logger if logger
64
+ globals.open_timeout 15
65
+ globals.read_timeout 15
66
+ end
67
67
  end
68
68
 
69
69
  end
@@ -15,18 +15,15 @@ private
15
15
  end
16
16
 
17
17
  def obtener_total(xml,ns)
18
- xml.xpath("//cfdi:Comprobante",ns).attribute('total').value rescue nil
18
+ xml.xpath('//cfdi:Comprobante',ns).attribute('Total').value rescue nil
19
19
  end
20
20
 
21
21
  def obtener_subtotal(xml,ns)
22
- xml.xpath("//cfdi:Comprobante",ns).attribute('subTotal').value rescue nil
22
+ xml.xpath('//cfdi:Comprobante',ns).attribute('SubTotal').value rescue nil
23
23
  end
24
24
 
25
25
  def obtener_descuento(xml,ns)
26
- xml.xpath("//cfdi:Comprobante",ns).attribute('descuento').value rescue nil
26
+ xml.xpath('//cfdi:Comprobante',ns).attribute('Descuento').value rescue nil
27
27
  end
28
-
29
-
30
28
  end
31
29
  end
32
-
@@ -71,12 +71,13 @@ module FmTimbradoCfdi
71
71
  end
72
72
 
73
73
  def obtener_xml(doc)
74
- unless doc.xpath("//xml").empty? then
75
- Base64::decode64 doc.xpath("//xml")[0].content
76
- else
77
- @errors << "No se ha encontrado el nodo xml"
78
- nil
79
- end
74
+ return sin_nodo_xml if doc.xpath('//xml').empty?
75
+ Base64::decode64 doc.xpath('//xml')[0].content
76
+ end
77
+
78
+ def sin_nodo_xml
79
+ @errors << 'No se ha encontrado el nodo xml'
80
+ nil
80
81
  end
81
82
 
82
83
  def obtener_timbre(xml)
@@ -84,23 +85,23 @@ module FmTimbradoCfdi
84
85
  end
85
86
 
86
87
  def obtener_pdf(doc)
87
- unless doc.xpath("//pdf").empty?
88
- Base64::decode64 doc.xpath("//pdf")[0].content
88
+ unless doc.xpath('//pdf').empty?
89
+ Base64::decode64 doc.xpath('//pdf')[0].content
89
90
  end
90
91
  end
91
92
 
92
93
  def obtener_cbb(doc)
93
- unless doc.xpath("//png").empty?
94
- Base64::decode64 doc.xpath("//png")[0].content
94
+ unless doc.xpath('//png').empty?
95
+ Base64::decode64 doc.xpath('//png')[0].content
95
96
  end
96
97
  end
97
98
 
98
99
  def obtener_no_csd_emisor(xml)
99
- begin
100
- factura_xml = Nokogiri::XML(xml)
101
- factura_xml.xpath("//cfdi:Comprobante").attribute('noCertificado').value
102
- rescue Exception => e
103
- @errors << "No se ha podido obtener el CSD del emisor"
100
+ factura_xml = Nokogiri::XML(xml)
101
+ if factura_xml.xpath('//cfdi:Comprobante').attribute('NoCertificado')
102
+ factura_xml.xpath('//cfdi:Comprobante').attribute('NoCertificado').value
103
+ else
104
+ @errors << 'No se ha podido obtener el CSD del emisor'
104
105
  nil
105
106
  end
106
107
  end
@@ -4,7 +4,8 @@ require 'fm_timbrado_cfdi/fm_cfdi_parser'
4
4
 
5
5
  module FmTimbradoCfdi
6
6
  class FmTimbre < FmCfdiParser
7
- attr_reader :no_certificado_sat, :no_certificado, :fecha_timbrado, :uuid, :sello_sat, :sello_cfd, :fecha_comprobante, :serie, :folio, :trans_id, :version
7
+ attr_reader :no_certificado_sat, :no_certificado, :fecha_timbrado, :uuid, :sello_sat, :sello_cfd,
8
+ :fecha_comprobante, :serie, :folio, :trans_id, :version, :rfc_provedor_certificacion
8
9
 
9
10
 
10
11
  def cadena_original
@@ -24,56 +25,56 @@ module FmTimbradoCfdi
24
25
  'sello_cfd',
25
26
  'fecha_comprobante',
26
27
  'serie',
28
+ 'rfc_provedor_certificacion',
27
29
  'folio' ]
28
30
  end
29
31
 
30
32
  def obtener_version(xml,ns)
31
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('version').value rescue nil
33
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('Version').value rescue nil
32
34
  end
33
35
 
34
36
  def obtener_no_certificado(xml,ns)
35
- xml.xpath("//cfdi:Comprobante",ns).attribute('noCertificado').value rescue nil
37
+ xml.xpath('//cfdi:Comprobante',ns).attribute('NoCertificado').value rescue nil
36
38
  end
37
39
 
38
40
  def obtener_trans_id(xml,ns)
39
- xml.xpath("//cfdi:Comprobante",ns).attribute('TransID').value rescue nil
40
- end
41
-
42
- def obtener_trans_id(xml,ns)
43
- xml.xpath("//cfdi:Comprobante",ns).attribute('TransID').value rescue nil
41
+ xml.xpath('//cfdi:Comprobante',ns).attribute('TransID').value rescue nil
44
42
  end
45
43
 
46
44
  def obtener_no_certificado_sat(xml, ns)
47
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('noCertificadoSAT').value rescue nil
45
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('NoCertificadoSAT').value rescue nil
48
46
  end
49
47
 
50
48
  def obtener_uuid(xml,ns)
51
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('UUID').value rescue nil
49
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('UUID').value rescue nil
52
50
  end
53
51
 
54
52
  def obtener_fecha_timbrado(xml, ns)
55
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('FechaTimbrado').value rescue nil
53
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('FechaTimbrado').value rescue nil
56
54
  end
57
55
 
58
56
  def obtener_sello_sat(xml, ns)
59
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('selloSAT').value rescue nil
57
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('SelloSAT').value rescue nil
60
58
  end
61
59
 
62
60
  def obtener_fecha_comprobante(xml, ns)
63
- xml.xpath("//cfdi:Comprobante", ns).attribute('fecha').value rescue nil
61
+ xml.xpath('//cfdi:Comprobante', ns).attribute('Fecha').value rescue nil
64
62
  end
65
63
 
66
64
  def obtener_sello_cfd(xml, ns)
67
- xml.xpath("//tfd:TimbreFiscalDigital", ns).attribute('selloCFD').value rescue nil
65
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('SelloCFD').value rescue nil
68
66
  end
69
67
 
70
68
  def obtener_serie(xml, ns )
71
- xml.xpath("//cfdi:Comprobante", ns).attribute('serie').value rescue nil
69
+ xml.xpath('//cfdi:Comprobante', ns).attribute('Serie').value rescue nil
72
70
  end
73
71
 
74
72
  def obtener_folio(xml, ns)
75
- xml.xpath("//cfdi:Comprobante", ns).attribute('folio').value rescue nil
73
+ xml.xpath('//cfdi:Comprobante', ns).attribute('Folio').value rescue nil
74
+ end
75
+
76
+ def obtener_rfc_provedor_certificacion(xml, ns)
77
+ xml.xpath('//tfd:TimbreFiscalDigital', ns).attribute('RfcProvCertif').value rescue nil
76
78
  end
77
79
  end
78
80
  end
79
-
@@ -1,3 +1,3 @@
1
1
  module FmTimbradoCfdi
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1,108 +1,85 @@
1
- [Encabezado]
1
+ [ComprobanteFiscalDigital]
2
+
3
+ ; Nota: Los comentarios empiezan con ;
4
+ ; Elaboró: Facturación Moderna
5
+ ; Contacto: wsoporte@facturacionmoderna.com
6
+
7
+ Version=3.3
8
+ Serie=A
9
+ Folio=03
10
+ Fecha=--fecha-comprobante--
11
+ FormaPago=03
12
+ NoCertificado=20001000000300022815
13
+ CondicionesDePago=CONTADO
14
+ SubTotal=2880.00
15
+ Descuento=
16
+ Moneda=MXN
17
+ Total=3390.30
18
+ TipoDeComprobante=I
19
+ MetodoPago=PUE
20
+ LugarExpedicion=68050
2
21
 
3
- serie|
4
- fecha|--fecha-comprobante--
5
- folio|
6
- tipoDeComprobante|egreso
7
- formaDePago|PAGO EN UNA SOLA EXHIBICIÓN
8
- metodoDePago|Transferencía Electrónica
9
- condicionesDePago|Contado
10
- NumCtaPago|0098-HSBC
11
- subTotal|862068.97
12
- descuento|0.00
13
- total|735344.84
14
- Moneda|MXN
15
- noCertificado|
16
- LugarExpedicion|Nuevo León, México.
17
-
18
- [Datos Adicionales]
19
-
20
- tipoDocumento|Factura
21
- numeropedido|
22
- observaciones|Efectos Fiscales al Pago
22
+ [DatosAdicionales]
23
+ tipoDocumento=FACTURA
24
+ observaciones=Observaciones al documento versión 3.3
25
+ plantillaPDF=clasic
23
26
 
24
27
  [Emisor]
25
-
26
- rfc|ESI920427886
27
- nombre|EMPRESA DE MUESTRA S.A de C.V.
28
- RegimenFiscal|REGIMEN GENERAL DE LEY
29
-
30
- [DomicilioFiscal]
31
-
32
- calle|Calle
33
- noExterior|Número Ext.
34
- noInterior|Número Int.
35
- colonia|Colonia
36
- localidad|Localidad
37
- municipio|Municipio
38
- estado|NUEVO LEON
39
- pais|México
40
- codigoPostal|66260
41
-
42
- [ExpedidoEn]
43
- calle|Calle sucursal
44
- noExterior|
45
- noInterior|
46
- colonia|
47
- localidad|
48
- municipio|Nuevo León
49
- estado|Nuevo León
50
- pais|México
51
- codigoPostal|77000
28
+ Rfc=LAN7008173R5
29
+ Nombre=FACTURACION MODERNA SA DE CV
30
+ RegimenFiscal=601
52
31
 
53
32
  [Receptor]
54
- rfc|GHR090615KH8
55
- nombre|GOBIERNO DEL EDO DE OAXACA
56
-
57
- [Domicilio]
58
- calle|AVE BATALLON DE SAN PATRICIO
59
- noExterior|1000
60
- noInterior|1000
61
- colonia|RESIDENCIAL SAN AGUSTIN
62
- localidad|SAN PEDRO GARZA GARCIA
63
- municipio|
64
- estado|NUEVO LEON
65
- pais|MEXICO
66
- codigoPostal|66260
67
-
68
- [DatosAdicionales]
69
-
70
- noCliente|09871
71
- email|edgar.duran@facturacionmoderna.com
72
-
73
-
74
- [Concepto]
75
-
76
- cantidad|1
77
- unidad|No aplica
78
- noIdentificacion|
79
- descripcion|RECIBI DE LA TESORERIA MUNICIPAL DEL H. AYUNTAMIENTO DE SANTA MARIA OZOLOTEPEC, MIAHUATLAN, OAXACA, CON CARGO A LOS RECURSOS DEL RAMO GENERAL 33, ESPECIFICAMENTE DEL FONDO III.- FONDO PARA LA INFRAESTRUCTURA SOCIAL MUNICIPAL, EJERCICIO PRESUPUESTAL 2012, LA CANTIDAD DE $ 551,000.00 (QUINIENTOS CINCUENTA Y UN MIL PESOS 00/100 M.N.) POR CONCEPTO DEL PAGO DE LA ESTIMACION NUMERO UNO, RELATIVO A LA OBRA: CONSTRUCCION DEL SISTEMA DE AGUA POTABLE 2a. ETAPA, UBICADA EN LA LOCALIDAD DE SAN PABLO, MUNICIPIO DE SANTA MARIA OZOLOTEPEC, DISTRITO DE MIAHUATLAN, REGION DE LA SIERRA SUR, ESTADO DE OAXACA, SEGUN CONTRATO DE OBRA PUBLICA A PRECIOS UNITARIOS Y TIEMPO DETERMINADO No. MSM/AD/FISM/424-013/2012 DE FECHA: 01 DE MARZO DEL DOS MIL DOCE Y SEGUN OFICIO DE NOTIFICACION DE APROBACION Y AUTORIZACION DE OBRA NUM. R33/FISM/424/013/20012 DE FECHA: DIECINUEVE DE FEBRERO DEL DOS MIL DOCE, CORRESPONDIENTE A LA CUENTA AGUA POTABLE, TENIENDO UN PERIODO DE EJECUCION DE ACUERDO AL CONTRATO DEL 02 DE MARZO DEL 2012 AL 30 DE ABRIL DEL 2012, CON PERIODO DE EJECUCION DE LOS TRABAJOS DE LA PRESENTE ESTIMACION DEL 02 DE MARZO DEL 2012 AL 31 DE MARZO DEL 2012.
80
- valorUnitario|862068.97
81
- importe|862068.97
82
-
83
-
84
-
85
- [ImpuestoTrasladado]
86
-
87
- impuesto|IVA
88
- importe|137931.04
89
- tasa|16.00
90
-
91
-
92
-
93
- [RetencionLocal]
94
- ImpLocRetenido|Amortización de anticipo
95
- TasadeRetencion|30
96
- Importe|258620.69
97
-
98
- [RetencionLocal]
99
- ImpLocRetenido|Inspección y Vigilancia
100
- TasadeRetencion|0.5
101
- Importe|4310.34
102
-
103
- [RetencionLocal]
104
- ImpLocRetenido|Retención 2 al millar
105
- TasadeRetencion|0.2
106
- Importe|1724.14
107
-
108
-
33
+ Rfc=XAXX010101000
34
+ Nombre=PUBLICO EN GENERAL
35
+ UsoCFDI=G01
36
+
37
+ [Concepto#1]
38
+ ClaveProdServ=90111800
39
+ NoIdentificacion=HOSP
40
+ Cantidad=3
41
+ ClaveUnidad=DAY
42
+ Unidad=día
43
+ Descripcion=Hospedaje de habitación sencilla
44
+ ValorUnitario=550.00
45
+ Importe=1650.00
46
+ Descuento=
47
+
48
+ Impuestos.Traslados.Base=[1650.00]
49
+ Impuestos.Traslados.Impuesto=[002]
50
+ Impuestos.Traslados.TipoFactor=[Tasa]
51
+ Impuestos.Traslados.TasaOCuota=[0.160000]
52
+ Impuestos.Traslados.Importe=[264.00]
53
+
54
+ [Concepto#2]
55
+ ClaveProdServ=90101700
56
+ NoIdentificacion=
57
+ Cantidad=1
58
+ ClaveUnidad=A9
59
+ Unidad=
60
+ Descripcion=Servicio a habitación
61
+ ValorUnitario=1230.00
62
+ Importe=1230.00
63
+
64
+ Impuestos.Traslados.Base=[1230.00]
65
+ Impuestos.Traslados.Impuesto=[002]
66
+ Impuestos.Traslados.TipoFactor=[Tasa]
67
+ Impuestos.Traslados.TasaOCuota=[0.160000]
68
+ Impuestos.Traslados.Importe=[196.80]
69
+
70
+ [Traslados]
71
+ TotalImpuestosTrasladados=460.80
72
+ Impuesto=[002]
73
+ TipoFactor=[Tasa]
74
+ TasaOCuota=[0.160000]
75
+ Importe=[460.80]
76
+
77
+ [TrasladosLocales]
78
+ ImpLocTrasladado=[ISH]
79
+ TasadeTraslado=[3.00]
80
+ Importe=[49.50]
81
+
82
+ ;[RetencionesLocales]
83
+ ;ImpLocRetenido=[Amortización Anticipo, Inspección y Vigilancia]
84
+ ;TasadeRetencion=[30,0.5]
85
+ ;Importe=[258620.69,4310.34]
@@ -1,13 +1,69 @@
1
- A1|101|--fecha-comprobante--|San Pedro Garza García|ingreso|Contado|Efectivo|Pago en una sola Exhibición|0009 - Banamex|100.00|0.00|116.00|MXN|0.00||
2
- ESI920427886|COMERCIALIZADORA SA DE CV|PERSONA MORAL REGIMEN GENERAL DE LEY.
3
- Calzada del Valle|90|int-10|Col. Del Valle||San Pedro Garza Garcia.|Nuevo León|México|76888
4
- Calzada del Valle(Sucursal)|90|int-10|Col. Del Valle||San Pedro Garza Garcia.|Nuevo León|México|76888
5
- XAXX010101000|PUBLICO EN GENERAL
6
- Calle|Num Ext|Num Int|Colonia||Municipio|Estado|Pais|60000
7
- CONCEPTOS|2
8
- 7899701|Pieza|Caja de Chocolates|1.00|50.00|50.00
9
- |No aplica|Envio|1.00|50.00|50.00
10
- IMPUESTOS_TRASLADADOS|1
11
- IVA|16.00|16.00
12
- IMPUESTOS_RETENIDOS|1
13
- ISR|200.00
1
+ [ComprobanteFiscalDigital]
2
+ Version=3.3
3
+ Serie=A
4
+ Folio=01
5
+ Fecha=--fecha-comprobante--
6
+ FormaPago=03
7
+ CondicionesDePago=CONTADO
8
+ SubTotal=1850.00
9
+ Descuento=175.00
10
+ Moneda=MXN
11
+ Total=1943.00
12
+ TipoDeComprobante=I
13
+ MetodoPago=PUE
14
+ LugarExpedicion=68050
15
+
16
+ [DatosAdicionales]
17
+ tipoDocumento=FACTURA
18
+ observaciones=Observaciones al documento versión 3.3
19
+ platillaPDF=clasic
20
+
21
+ [Emisor]
22
+ Rfc=ESI920427886
23
+ Nombre=FACTURACION MODERNA SA DE CV
24
+ RegimenFiscal=601
25
+
26
+ [Receptor]
27
+ Rfc=AAQM610917QJA
28
+ Nombre=PUBLICO EN GENERAL
29
+ UsoCFDI=G01
30
+
31
+ [Concepto#1]
32
+ ClaveProdServ=01010101
33
+ NoIdentificacion=AULOG001
34
+ Cantidad=5
35
+ ClaveUnidad=H87
36
+ Unidad=Pieza
37
+ Descripcion=Aurriculares USB Logitech
38
+ ValorUnitario=350.00
39
+ Importe=1750.00
40
+ Descuento=175.00
41
+
42
+ Impuestos.Traslados.Base=[1575.00]
43
+ Impuestos.Traslados.Impuesto=[002]
44
+ Impuestos.Traslados.TipoFactor=[Tasa]
45
+ Impuestos.Traslados.TasaOCuota=[0.160000]
46
+ Impuestos.Traslados.Importe=[252.00]
47
+
48
+ [Concepto#2]
49
+ ClaveProdServ=43201800
50
+ NoIdentificacion=USB
51
+ Cantidad=1
52
+ ClaveUnidad=H87
53
+ Unidad=Pieza
54
+ Descripcion=Memoria USB 32gb marca Kingston
55
+ ValorUnitario=100.00
56
+ Importe=100.00
57
+
58
+ Impuestos.Traslados.Base=[100.00]
59
+ Impuestos.Traslados.Impuesto=[002]
60
+ Impuestos.Traslados.TipoFactor=[Tasa]
61
+ Impuestos.Traslados.TasaOCuota=[0.160000]
62
+ Impuestos.Traslados.Importe=[16.00]
63
+
64
+ [Traslados]
65
+ TotalImpuestosTrasladados=268.00
66
+ Impuesto=[002]
67
+ TipoFactor=[Tasa]
68
+ TasaOCuota=[0.160000]
69
+ Importe=[268.00]
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://t2demo.facturacionmoderna.com/timbrado/soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:requestTimbrarCFDIResponse><return xsi:type="SOAP-ENC:Struct"><xml xsi:type="xsd:string">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGNmZGk6Q29tcHJvYmFudGUgeG1sbnM6Y2ZkaT0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmltcGxvY2FsPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvaW1wbG9jYWwiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvMy9jZmR2MzMueHNkIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9pbXBsb2NhbCBodHRwOi8vd3d3LnNhdC5nb2IubXgvc2l0aW9faW50ZXJuZXQvY2ZkL2ltcGxvY2FsL2ltcGxvY2FsLnhzZCIgVmVyc2lvbj0iMy4zIiBGb2xpbz0iNTM3NjgiIEZlY2hhPSIyMDE3LTA4LTEwVDEwOjE4OjA4IiBTZWxsbz0iZUsrWkMwRVE4Y3p6QVJUMGovMm9MM29GN21LUEJaR0FaMVgxc3Bjd3JBU3BPT096NGlSUzdDZExYZGJJcDhhT0VJSWp0cGJLK2FDOWNsTmVSaDk4cExGdVExc3NhU0lyNytzZ1JwZ3ErOXBLSG1JNmNCTHFZWjhCdnRJMi9EY3BvaGs3anZ4citTNUVzdDFhSFFmTk9XdFo0VVJzNU1UV1czTXRpQ2VlYklRPSIgRm9ybWFQYWdvPSIwMSIgTm9DZXJ0aWZpY2Fkbz0iMjAwMDEwMDAwMDAyMDAwMDAxOTIiIENlcnRpZmljYWRvPSJNSUlFUmpDQ0F5NmdBd0lCQWdJVU1qQXdNREV3TURBd01EQXlNREF3TURBeE9USXdEUVlKS29aSWh2Y05BUUVGQlFBd2dnRmNNUm93R0FZRFZRUUREQkZCTGtNdUlESWdaR1VnY0hKMVpXSmhjekV2TUMwR0ExVUVDZ3dtVTJWeWRtbGphVzhnWkdVZ1FXUnRhVzVwYzNSeVlXTnB3N051SUZSeWFXSjFkR0Z5YVdFeE9EQTJCZ05WQkFzTUwwRmtiV2x1YVhOMGNtRmphY096YmlCa1pTQlRaV2QxY21sa1lXUWdaR1VnYkdFZ1NXNW1iM0p0WVdOcHc3TnVNU2t3SndZSktvWklodmNOQVFrQkZocGhjMmx6Ym1WMFFIQnlkV1ZpWVhNdWMyRjBMbWR2WWk1dGVERW1NQ1FHQTFVRUNRd2RRWFl1SUVocFpHRnNaMjhnTnpjc0lFTnZiQzRnUjNWbGNuSmxjbTh4RGpBTUJnTlZCQkVNQlRBMk16QXdNUXN3Q1FZRFZRUUdFd0pOV0RFWk1CY0dBMVVFQ0F3UVJHbHpkSEpwZEc4Z1JtVmtaWEpoYkRFU01CQUdBMVVFQnd3SlEyOTViMkZqdzZGdU1UUXdNZ1lKS29aSWh2Y05BUWtDRENWU1pYTndiMjV6WVdKc1pUb2dRWEpoWTJWc2FTQkhZVzVrWVhKaElFSmhkWFJwYzNSaE1CNFhEVEV5TVRBeU1qSXdORGd3TmxvWERURTJNVEF5TWpJd05EZ3dObG93Z2NBeElUQWZCZ05WQkFNVEdFVkVTVlJQVWtsQlRDQlRTVk5VUVNCVFFTQkVSU0JEVmpFaE1COEdBMVVFS1JNWVJVUkpWRTlTU1VGTUlGTkpVMVJCSUZOQklFUkZJRU5XTVNFd0h3WURWUVFLRXhoRlJFbFVUMUpKUVV3Z1UwbFRWRUVnVTBFZ1JFVWdRMVl4SlRBakJnTlZCQzBUSEVWVFNUa3lNRFF5TnpnNE5pQXZJRWhGUjFRM05qRXdNRE0wVXpJeEhqQWNCZ05WQkFVVEZTQXZJRWhGUjFRM05qRXdNRE5OUkVaU1RrNHdPVEVPTUF3R0ExVUVDeE1GUVcxcFoyRXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBSzZZcUFnM0xIT1BwQUtEOU9Ga2NOZ0I1d2orM2s0b0hQSzNiRmZrdTRUQ0Vzd3RNaEl0NUxuWkN0NFVLMGNwOVNZcEtNYTJrWlZZbTZrNnpwaFdnOWJ6djNwdkh3dDltQjZrRkd5QXBVNzFjT2sxNnVucUwyby9wRGo2NXpOdFVCZkR5S2tLQlVHUU1ZZ3RxdlZxNmFYSmlwcUtPUy9Oc0RLRVV0MHExZ2hUQWdNQkFBR2pIVEFiTUF3R0ExVWRFd0VCL3dRQ01BQXdDd1lEVlIwUEJBUURBZ2JBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDZ0NDcFlEYm1OOG5wTFg2dkhDRUpBRi8xRzNLaHVBR1k0OHdWdDF2YTFZWFJ5NnlqK3RKWjlIWjNsOFRZN0o2bjEwWGtyYnplZE9Bckt5amRwZnFXYk5hYlpIdzZiMklsU044SHJIbGlpQUVvcjVod1RVSm5rZzZTMW5tMG1taXJJbnhDbVdvVlYrcXJFWC9YSHlsSitPaklxbC9HeVpySDlzRVBDWStMWUZmVmhPMFU3M2pLcWFqTUVlWnRXWXE1d3JvNFVoUFVobFlnd2hselVONlhOV3RpQzhvaGpFNlFKYWY4allSc0pqSHJhWkwyNTdPMW81VC8zVUxNSmhBU043UjIxMUZteUF1aVlzcThIM2J1UEUwa2wrRW1OOERVTnBURGtCOVhmMWJhNmdYWjBQUlhGMW9HVXd4dlg5RmlJNWVJYXUyUkxmeTlBZkpQY3BBWE4iIFN1YlRvdGFsPSI0MzYxLjkiIE1vbmVkYT0iTVhOIiBUb3RhbD0iMzY2NC4wIiBUaXBvRGVDb21wcm9iYW50ZT0iSSIgTWV0b2RvUGFnbz0iUFVFIiBMdWdhckV4cGVkaWNpb249IjY4MDAwIj4KICA8Y2ZkaTpFbWlzb3IgUmZjPSJFU0k5MjA0Mjc4ODYiIE5vbWJyZT0iTUFURVJJQUxFUyBNQVJST1FVSSBTQSBERSBDViIgUmVnaW1lbkZpc2NhbD0iNjAxIi8+CiAgPGNmZGk6UmVjZXB0b3IgUmZjPSJCQUpTNzIxMDI4Uzg4IiBOb21icmU9IkdBUkNJQSBERSBBTEJBIFpFUEVEQSBKT1JHRSBBUlRVUk8iIFVzb0NGREk9IlAwMSIvPgogIDxjZmRpOkNvbmNlcHRvcz4KICAgIDxjZmRpOkNvbmNlcHRvIENsYXZlUHJvZFNlcnY9IjAxMDEwMTAxIiBOb0lkZW50aWZpY2FjaW9uPSIxMTEgMTExMSAyMjIiIENhbnRpZGFkPSIyLjAiIENsYXZlVW5pZGFkPSJIODciIFVuaWRhZD0iTm8gYXBsaWNhIiBEZXNjcmlwY2lvbj0iUEFnb29wYWdvbzEiIFZhbG9yVW5pdGFyaW89IjIxODAuOTUiIEltcG9ydGU9IjQzNjEuOSI+CiAgICAgIDxjZmRpOkltcHVlc3Rvcz4KICAgICAgICA8Y2ZkaTpUcmFzbGFkb3M+CiAgICAgICAgICA8Y2ZkaTpUcmFzbGFkbyBCYXNlPSI0MzYxLjkiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IkV4ZW50byIvPgogICAgICAgIDwvY2ZkaTpUcmFzbGFkb3M+CiAgICAgICAgPGNmZGk6UmV0ZW5jaW9uZXM+CiAgICAgICAgICA8Y2ZkaTpSZXRlbmNpb24gQmFzZT0iNDM2MS45IiBJbXB1ZXN0bz0iMDAyIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjE2MDAwMCIgSW1wb3J0ZT0iNjk3LjkwIi8+CiAgICAgICAgICA8Y2ZkaTpSZXRlbmNpb24gQmFzZT0iNDM2MS45IiBJbXB1ZXN0bz0iMDAxIiBUaXBvRmFjdG9yPSJUYXNhIiBUYXNhT0N1b3RhPSIwLjA1MDAwMCIgSW1wb3J0ZT0iMjE4LjA5Ii8+CiAgICAgICAgPC9jZmRpOlJldGVuY2lvbmVzPgogICAgICA8L2NmZGk6SW1wdWVzdG9zPgogICAgPC9jZmRpOkNvbmNlcHRvPgogIDwvY2ZkaTpDb25jZXB0b3M+CiAgPGNmZGk6SW1wdWVzdG9zIFRvdGFsSW1wdWVzdG9zUmV0ZW5pZG9zPSI5MTUuOTkiPgogICAgPGNmZGk6UmV0ZW5jaW9uZXM+CiAgICAgIDxjZmRpOlJldGVuY2lvbiBJbXB1ZXN0bz0iMDAyIiBJbXBvcnRlPSI2OTcuOTAiLz4KICAgICAgPGNmZGk6UmV0ZW5jaW9uIEltcHVlc3RvPSIwMDEiIEltcG9ydGU9IjIxOC4wOSIvPgogICAgPC9jZmRpOlJldGVuY2lvbmVzPgogIDwvY2ZkaTpJbXB1ZXN0b3M+CiAgPGNmZGk6Q29tcGxlbWVudG8+CiAgICA8aW1wbG9jYWw6SW1wdWVzdG9zTG9jYWxlcyB2ZXJzaW9uPSIxLjAiIFRvdGFsZGVSZXRlbmNpb25lcz0iMC4wMCIgVG90YWxkZVRyYXNsYWRvcz0iMjE4LjA5Ij4KICAgICAgPGltcGxvY2FsOlRyYXNsYWRvc0xvY2FsZXMgSW1wTG9jVHJhc2xhZGFkbz0iSVNIIiBUYXNhZGVUcmFzbGFkbz0iNS4wIiBJbXBvcnRlPSIyMTguMDkiLz4KICAgIDwvaW1wbG9jYWw6SW1wdWVzdG9zTG9jYWxlcz4KICAgIDx0ZmQ6VGltYnJlRmlzY2FsRGlnaXRhbCB4bWxuczp0ZmQ9Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9UaW1icmVGaXNjYWxEaWdpdGFsIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9UaW1icmVGaXNjYWxEaWdpdGFsIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvVGltYnJlRmlzY2FsRGlnaXRhbC9UaW1icmVGaXNjYWxEaWdpdGFsdjExLnhzZCIgVmVyc2lvbj0iMS4xIiBVVUlEPSIxRUJCMzUyOC03RERGLTExRTctQTE5OC03NUY0RjhGNkZFQzEiIEZlY2hhVGltYnJhZG89IjIwMTctMDgtMTBUMTA6MTg6MTAiIFJmY1Byb3ZDZXJ0aWY9IkZNTzEwMDcxNjhDNiIgU2VsbG9DRkQ9ImVLK1pDMEVROGN6ekFSVDBqLzJvTDNvRjdtS1BCWkdBWjFYMXNwY3dyQVNwT09PejRpUlM3Q2RMWGRiSXA4YU9FSUlqdHBiSythQzljbE5lUmg5OHBMRnVRMXNzYVNJcjcrc2dScGdxKzlwS0htSTZjQkxxWVo4QnZ0STIvRGNwb2hrN2p2eHIrUzVFc3QxYUhRZk5PV3RaNFVSczVNVFdXM010aUNlZWJJUT0iIE5vQ2VydGlmaWNhZG9TQVQ9IjIwMDAxMDAwMDAwMzAwMDIyMzIzIiBTZWxsb1NBVD0iUW5SQjAvMFlxK2hmdjFSMHFqRU0weGV2V2JDZmJ2dEdLMjdmSVNFcWVhdWlIcjZwV09Td0ZNWFg5Tzd4M3JqSzhCSkh1SFBzVk5iN1lONXVxSXJpbS8rcWZVcEJTWGZjUHpxSHRNV2h5Q01PSUxDVXZHYmRSYnhEVmlFQnhUUC9MVDNkc0MwWkxWOHRaT1lMU1h4MHp1c0l6QkdNRjBWZHN0OEFJQUVlYlNBcDBERTFua1l5bEVidnRjMWd4aTJudnV4cTc0dnQ2VkJjTVU5WUlna3F6Uk4rVEhZUElYQU14d0V6ZFM3OGdpZ1dxNmVqYWhEck9UV2ZCYXZUSEFNSXI1OW5McTNTajFxV0M0enpzQVBrdXdzMDFwZWt2ajlhd3pnN21QQUVGRGhwNHpQL0xiTCtkSmtXUHI5RE9oYk1EZW5hNjFsbCtoME5scWhlYlM4eEFRPT0iLz4KICA8L2NmZGk6Q29tcGxlbWVudG8+CjwvY2ZkaTpDb21wcm9iYW50ZT4K</xml><png xsi:type="xsd:string">iVBORw0KGgoAAAANSUhEUgAAALwAAAC8AQMAAAD4h1boAAAABlBMVEX///8AAABVwtN+AAAB60lEQVRYhb2XUW4EIQxDc4Pc/5a+gRvbaNv+u0WjnVkeUgg4Ccz8Q1uSQxA7AEhg3VUF9yxwA+b+Hx1seotg80/GuZ6Bu9pg4bfoffNPwBk/dv755w+A2Hr33wTmx+qWgK39bh+VlIAbzqXbqR3697t1wFnymg1lE9Le6QFlINMKmBtxG6XnxnSBPDtbVMRIeTxhEFVgqS3lkuQmhyWIKtDeQxYvATzh4c2qBi7s9Rnjell+UwX2z7ulmERWUaQI4pAk507Jzi53gcweXQuacZRdsJayNkfaY9TWBUnIDtCl+7ATlfQAtXyyqeWkpxD/iiA2nWscMvC7DcY6U5pU8MjTnSpIXVH0vKI1LpJVIHfWtV2TYN6LNhBapGRpz5hc2QPq82EoVVFJTR1dAEeLQlQLGe0tysDJPmnyxsBHyCkDHx/G5XHc5xNrE6wr4yhWrjNHsSSZIrAMXg6GEqYkvWXAVw8ltohvEj81EIPIfjl2rO0q2JzkfSkZq5nPwR5IUlmnel9RfGhFF9jmSwB4Nwh2gUSm+psSPzlrTxfYxXfDSspU8pwq8KXhWc0AT6YL/KhCvqSPT1XrgVe0kOzvIVndMtAySmwu8r7L9YHvo0yqfGf7KnB21NqtL3NJ/dMFn8soskFwiFbBP7QvZWwyIs5EF5AAAAAASUVORK5CYII=</png></return></ns1:requestTimbrarCFDIResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
@@ -1,2 +1,2 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://t2demo.facturacionmoderna.com/timbrado/soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:requestTimbrarCFDIResponse><return xsi:type="SOAP-ENC:Struct"><xml xsi:type="xsd:string">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGNmZGk6Q29tcHJvYmFudGUgeG1sbnM6Y2ZkaT0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvMy9jZmR2MzIueHNkIiB2ZXJzaW9uPSIzLjIiIGZlY2hhPSIyMDEzLTEyLTI3VDE2OjEzOjQ2IiBmb2xpbz0iMTAxIiBzZXJpZT0iQTEiIHN1YlRvdGFsPSIxMDAuMDAiIGRlc2N1ZW50bz0iMC4wMCIgdG90YWw9IjExNi4wMCIgTW9uZWRhPSJNWE4iIFRpcG9DYW1iaW89IjAuMDAiIGNvbmRpY2lvbmVzRGVQYWdvPSJQYWdvIGVuIHVuYSBzb2xhIEV4aGliaWNpw7NuIiB0aXBvRGVDb21wcm9iYW50ZT0iaW5ncmVzbyIgbm9DZXJ0aWZpY2Fkbz0iMjAwMDEwMDAwMDAyMDAwMDAxOTIiIGNlcnRpZmljYWRvPSJNSUlFUmpDQ0F5NmdBd0lCQWdJVU1qQXdNREV3TURBd01EQXlNREF3TURBeE9USXdEUVlKS29aSWh2Y05BUUVGQlFBd2dnRmNNUm93R0FZRFZRUUREQkZCTGtNdUlESWdaR1VnY0hKMVpXSmhjekV2TUMwR0ExVUVDZ3dtVTJWeWRtbGphVzhnWkdVZ1FXUnRhVzVwYzNSeVlXTnB3N051SUZSeWFXSjFkR0Z5YVdFeE9EQTJCZ05WQkFzTUwwRmtiV2x1YVhOMGNtRmphY096YmlCa1pTQlRaV2QxY21sa1lXUWdaR1VnYkdFZ1NXNW1iM0p0WVdOcHc3TnVNU2t3SndZSktvWklodmNOQVFrQkZocGhjMmx6Ym1WMFFIQnlkV1ZpWVhNdWMyRjBMbWR2WWk1dGVERW1NQ1FHQTFVRUNRd2RRWFl1SUVocFpHRnNaMjhnTnpjc0lFTnZiQzRnUjNWbGNuSmxjbTh4RGpBTUJnTlZCQkVNQlRBMk16QXdNUXN3Q1FZRFZRUUdFd0pOV0RFWk1CY0dBMVVFQ0F3UVJHbHpkSEpwZEc4Z1JtVmtaWEpoYkRFU01CQUdBMVVFQnd3SlEyOTViMkZqdzZGdU1UUXdNZ1lKS29aSWh2Y05BUWtDRENWU1pYTndiMjV6WVdKc1pUb2dRWEpoWTJWc2FTQkhZVzVrWVhKaElFSmhkWFJwYzNSaE1CNFhEVEV5TVRBeU1qSXdORGd3TmxvWERURTJNVEF5TWpJd05EZ3dObG93Z2NBeElUQWZCZ05WQkFNVEdFVkVTVlJQVWtsQlRDQlRTVk5VUVNCVFFTQkVSU0JEVmpFaE1COEdBMVVFS1JNWVJVUkpWRTlTU1VGTUlGTkpVMVJCSUZOQklFUkZJRU5XTVNFd0h3WURWUVFLRXhoRlJFbFVUMUpKUVV3Z1UwbFRWRUVnVTBFZ1JFVWdRMVl4SlRBakJnTlZCQzBUSEVWVFNUa3lNRFF5TnpnNE5pQXZJRWhGUjFRM05qRXdNRE0wVXpJeEhqQWNCZ05WQkFVVEZTQXZJRWhGUjFRM05qRXdNRE5OUkVaU1RrNHdPVEVPTUF3R0ExVUVDeE1GUVcxcFoyRXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBSzZZcUFnM0xIT1BwQUtEOU9Ga2NOZ0I1d2orM2s0b0hQSzNiRmZrdTRUQ0Vzd3RNaEl0NUxuWkN0NFVLMGNwOVNZcEtNYTJrWlZZbTZrNnpwaFdnOWJ6djNwdkh3dDltQjZrRkd5QXBVNzFjT2sxNnVucUwyby9wRGo2NXpOdFVCZkR5S2tLQlVHUU1ZZ3RxdlZxNmFYSmlwcUtPUy9Oc0RLRVV0MHExZ2hUQWdNQkFBR2pIVEFiTUF3R0ExVWRFd0VCL3dRQ01BQXdDd1lEVlIwUEJBUURBZ2JBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDZ0NDcFlEYm1OOG5wTFg2dkhDRUpBRi8xRzNLaHVBR1k0OHdWdDF2YTFZWFJ5NnlqK3RKWjlIWjNsOFRZN0o2bjEwWGtyYnplZE9Bckt5amRwZnFXYk5hYlpIdzZiMklsU044SHJIbGlpQUVvcjVod1RVSm5rZzZTMW5tMG1taXJJbnhDbVdvVlYrcXJFWC9YSHlsSitPaklxbC9HeVpySDlzRVBDWStMWUZmVmhPMFU3M2pLcWFqTUVlWnRXWXE1d3JvNFVoUFVobFlnd2hselVONlhOV3RpQzhvaGpFNlFKYWY4allSc0pqSHJhWkwyNTdPMW81VC8zVUxNSmhBU043UjIxMUZteUF1aVlzcThIM2J1UEUwa2wrRW1OOERVTnBURGtCOVhmMWJhNmdYWjBQUlhGMW9HVXd4dlg5RmlJNWVJYXUyUkxmeTlBZkpQY3BBWE4iIGZvcm1hRGVQYWdvPSJDb250YWRvIiBtZXRvZG9EZVBhZ289IkVmZWN0aXZvIiBOdW1DdGFQYWdvPSIwMDA5IC0gQmFuYW1leCIgTHVnYXJFeHBlZGljaW9uPSJTYW4gUGVkcm8gR2FyemEgR2FyY8OtYSIgc2VsbG89ImZXb1RaN1NUWlpCb09hbHJ4SnF0V0hDckxYYW4vMWE4RnNiMkpDNjhqc3pSZ3VKclkrdXpYVDAxd2ZWZ1ZmM2lCdFM2MVVjTStNVlk4R21UQWVPOE9OaVJMc3lMci9kYjk4aVdRWlZ0OFlha3dySVJlT1Z0UVdnS0pZR3Z5cmx6U1BVYWJsS0E5bUtaWTVVNGtNd0ZzVXZmWmdBR3N5UGRxV0JDaUV3OFU3VT0iPjxjZmRpOkVtaXNvciBub21icmU9IkNPTUVSQ0lBTElaQURPUkEgU0EgREUgQ1YiIHJmYz0iRVNJOTIwNDI3ODg2Ij48Y2ZkaTpEb21pY2lsaW9GaXNjYWwgY2FsbGU9IkNhbHphZGEgZGVsIFZhbGxlIiBub0V4dGVyaW9yPSI5MCIgbm9JbnRlcmlvcj0iaW50LTEwIiBjb2xvbmlhPSJDb2wuIERlbCBWYWxsZSIgbXVuaWNpcGlvPSJTYW4gUGVkcm8gR2FyemEgR2FyY2lhLiIgZXN0YWRvPSJOdWV2byBMZcOzbiIgcGFpcz0iTcOpeGljbyIgY29kaWdvUG9zdGFsPSI3Njg4OCIvPjxjZmRpOkV4cGVkaWRvRW4gY2FsbGU9IkNhbHphZGEgZGVsIFZhbGxlKFN1Y3Vyc2FsKSIgbm9FeHRlcmlvcj0iOTAiIG5vSW50ZXJpb3I9ImludC0xMCIgY29sb25pYT0iQ29sLiBEZWwgVmFsbGUiIG11bmljaXBpbz0iU2FuIFBlZHJvIEdhcnphIEdhcmNpYS4iIGVzdGFkbz0iTnVldm8gTGXDs24iIHBhaXM9Ik3DqXhpY28iIGNvZGlnb1Bvc3RhbD0iNzY4ODgiLz48Y2ZkaTpSZWdpbWVuRmlzY2FsIFJlZ2ltZW49IlBFUlNPTkEgTU9SQUwgUkVHSU1FTiBHRU5FUkFMIERFIExFWS4iLz48L2NmZGk6RW1pc29yPjxjZmRpOlJlY2VwdG9yIG5vbWJyZT0iUFVCTElDTyBFTiBHRU5FUkFMIiByZmM9IlhBWFgwMTAxMDEwMDAiPjxjZmRpOkRvbWljaWxpbyBjYWxsZT0iQ2FsbGUiIG5vRXh0ZXJpb3I9Ik51bSBFeHQiIG5vSW50ZXJpb3I9Ik51bSBJbnQiIGNvbG9uaWE9IkNvbG9uaWEiIG11bmljaXBpbz0iTXVuaWNpcGlvIiBlc3RhZG89IkVzdGFkbyIgcGFpcz0iUGFpcyIgY29kaWdvUG9zdGFsPSI2MDAwMCIvPjwvY2ZkaTpSZWNlcHRvcj48Y2ZkaTpDb25jZXB0b3M+PGNmZGk6Q29uY2VwdG8gbm9JZGVudGlmaWNhY2lvbj0iNzg5OTcwMSIgdW5pZGFkPSJQaWV6YSIgZGVzY3JpcGNpb249IkNhamEgZGUgQ2hvY29sYXRlcyIgY2FudGlkYWQ9IjEuMDAiIHZhbG9yVW5pdGFyaW89IjUwLjAwIiBpbXBvcnRlPSI1MC4wMCIvPjxjZmRpOkNvbmNlcHRvIHVuaWRhZD0iTm8gYXBsaWNhIiBkZXNjcmlwY2lvbj0iRW52aW8iIGNhbnRpZGFkPSIxLjAwIiB2YWxvclVuaXRhcmlvPSI1MC4wMCIgaW1wb3J0ZT0iNTAuMDAiLz48L2NmZGk6Q29uY2VwdG9zPjxjZmRpOkltcHVlc3RvcyB0b3RhbEltcHVlc3Rvc1JldGVuaWRvcz0iMjAwLjAwIiB0b3RhbEltcHVlc3Rvc1RyYXNsYWRhZG9zPSIxNi4wMCI+PGNmZGk6UmV0ZW5jaW9uZXM+PGNmZGk6UmV0ZW5jaW9uIGltcHVlc3RvPSJJU1IiIGltcG9ydGU9IjIwMC4wMCIvPjwvY2ZkaTpSZXRlbmNpb25lcz48Y2ZkaTpUcmFzbGFkb3M+PGNmZGk6VHJhc2xhZG8gaW1wdWVzdG89IklWQSIgdGFzYT0iMTYuMDAiIGltcG9ydGU9IjE2LjAwIi8+PC9jZmRpOlRyYXNsYWRvcz48L2NmZGk6SW1wdWVzdG9zPjxjZmRpOkNvbXBsZW1lbnRvPjx0ZmQ6VGltYnJlRmlzY2FsRGlnaXRhbCB4bWxuczp0ZmQ9Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9UaW1icmVGaXNjYWxEaWdpdGFsIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9UaW1icmVGaXNjYWxEaWdpdGFsIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9UaW1icmVGaXNjYWxEaWdpdGFsL1RpbWJyZUZpc2NhbERpZ2l0YWwueHNkIiB2ZXJzaW9uPSIxLjAiIFVVSUQ9IjZGMzI4QjY1LTY1RDMtNDI3RS04NTYzLTZDQkFCRURBODZFQyIgRmVjaGFUaW1icmFkbz0iMjAxMy0xMi0yN1QxNjoxMzo0NiIgc2VsbG9DRkQ9ImZXb1RaN1NUWlpCb09hbHJ4SnF0V0hDckxYYW4vMWE4RnNiMkpDNjhqc3pSZ3VKclkrdXpYVDAxd2ZWZ1ZmM2lCdFM2MVVjTStNVlk4R21UQWVPOE9OaVJMc3lMci9kYjk4aVdRWlZ0OFlha3dySVJlT1Z0UVdnS0pZR3Z5cmx6U1BVYWJsS0E5bUtaWTVVNGtNd0ZzVXZmWmdBR3N5UGRxV0JDaUV3OFU3VT0iIG5vQ2VydGlmaWNhZG9TQVQ9IjIwMDAxMDAwMDAwMTAwMDA1NzYxIiBzZWxsb1NBVD0icEhyOXcwNWpwSnRGeVRUc0tURTRxYytsWW0rL3B6Y2VBOXNobXpEQXYrc0tlbU1wU3YyWjI2UFBiNlp1TFBEdUVKZGpsZ05leDJROUpmMXVxM2Z4aXdYSEZLM1JlK3paZHNYdWRjbTVjaTNNSU5VU21pNkpLVWx2OGpSajdRbGFHTFdqTWNsMFo5RjJ6RlMrQjljTDNzV1d1OWtrVEJYcjdFSHFHWmduaThJPSIvPjwvY2ZkaTpDb21wbGVtZW50bz48L2NmZGk6Q29tcHJvYmFudGU+Cg==</xml></return></ns1:requestTimbrarCFDIResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
2
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://t2demo.facturacionmoderna.com/timbrado/soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:requestTimbrarCFDIResponse><return xsi:type="SOAP-ENC:Struct"><xml xsi:type="xsd:string">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGNmZGk6Q29tcHJvYmFudGUgeG1sbnM6Y2ZkaT0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvMy9jZmR2MzMueHNkIiBWZXJzaW9uPSIzLjMiIFNlcmllPSJBIiBGb2xpbz0iMDEiIEZlY2hhPSIyMDE3LTA5LTEzVDEzOjUxOjE3IiBTZWxsbz0ia3M1Mm1NTG5NUnNVNVFYdDBidlBtR1RqN0t1SlJIM3VSeTdFeVlyeDQ1b3Q0ZVlVei9zN25kRGZ2eDVMcGFzK0Y4LytZRTNIeXZLaThqTGdsNVlLSkRJQytKNHVwaG5zbkpjVWpMTWwrRWJ5aHI3bmN0UEpXcWUxblN0a2g4VTNDd1RWNGo5NDRDR1JRb0NjM1BtRTg3WmF6N2MzZGhoVlNpbjNPREE3WEQ4PSIgRm9ybWFQYWdvPSIwMyIgTm9DZXJ0aWZpY2Fkbz0iMjAwMDEwMDAwMDAyMDAwMDAxOTIiIENlcnRpZmljYWRvPSJNSUlFUmpDQ0F5NmdBd0lCQWdJVU1qQXdNREV3TURBd01EQXlNREF3TURBeE9USXdEUVlKS29aSWh2Y05BUUVGQlFBd2dnRmNNUm93R0FZRFZRUUREQkZCTGtNdUlESWdaR1VnY0hKMVpXSmhjekV2TUMwR0ExVUVDZ3dtVTJWeWRtbGphVzhnWkdVZ1FXUnRhVzVwYzNSeVlXTnB3N051SUZSeWFXSjFkR0Z5YVdFeE9EQTJCZ05WQkFzTUwwRmtiV2x1YVhOMGNtRmphY096YmlCa1pTQlRaV2QxY21sa1lXUWdaR1VnYkdFZ1NXNW1iM0p0WVdOcHc3TnVNU2t3SndZSktvWklodmNOQVFrQkZocGhjMmx6Ym1WMFFIQnlkV1ZpWVhNdWMyRjBMbWR2WWk1dGVERW1NQ1FHQTFVRUNRd2RRWFl1SUVocFpHRnNaMjhnTnpjc0lFTnZiQzRnUjNWbGNuSmxjbTh4RGpBTUJnTlZCQkVNQlRBMk16QXdNUXN3Q1FZRFZRUUdFd0pOV0RFWk1CY0dBMVVFQ0F3UVJHbHpkSEpwZEc4Z1JtVmtaWEpoYkRFU01CQUdBMVVFQnd3SlEyOTViMkZqdzZGdU1UUXdNZ1lKS29aSWh2Y05BUWtDRENWU1pYTndiMjV6WVdKc1pUb2dRWEpoWTJWc2FTQkhZVzVrWVhKaElFSmhkWFJwYzNSaE1CNFhEVEV5TVRBeU1qSXdORGd3TmxvWERURTJNVEF5TWpJd05EZ3dObG93Z2NBeElUQWZCZ05WQkFNVEdFVkVTVlJQVWtsQlRDQlRTVk5VUVNCVFFTQkVSU0JEVmpFaE1COEdBMVVFS1JNWVJVUkpWRTlTU1VGTUlGTkpVMVJCSUZOQklFUkZJRU5XTVNFd0h3WURWUVFLRXhoRlJFbFVUMUpKUVV3Z1UwbFRWRUVnVTBFZ1JFVWdRMVl4SlRBakJnTlZCQzBUSEVWVFNUa3lNRFF5TnpnNE5pQXZJRWhGUjFRM05qRXdNRE0wVXpJeEhqQWNCZ05WQkFVVEZTQXZJRWhGUjFRM05qRXdNRE5OUkVaU1RrNHdPVEVPTUF3R0ExVUVDeE1GUVcxcFoyRXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBSzZZcUFnM0xIT1BwQUtEOU9Ga2NOZ0I1d2orM2s0b0hQSzNiRmZrdTRUQ0Vzd3RNaEl0NUxuWkN0NFVLMGNwOVNZcEtNYTJrWlZZbTZrNnpwaFdnOWJ6djNwdkh3dDltQjZrRkd5QXBVNzFjT2sxNnVucUwyby9wRGo2NXpOdFVCZkR5S2tLQlVHUU1ZZ3RxdlZxNmFYSmlwcUtPUy9Oc0RLRVV0MHExZ2hUQWdNQkFBR2pIVEFiTUF3R0ExVWRFd0VCL3dRQ01BQXdDd1lEVlIwUEJBUURBZ2JBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDZ0NDcFlEYm1OOG5wTFg2dkhDRUpBRi8xRzNLaHVBR1k0OHdWdDF2YTFZWFJ5NnlqK3RKWjlIWjNsOFRZN0o2bjEwWGtyYnplZE9Bckt5amRwZnFXYk5hYlpIdzZiMklsU044SHJIbGlpQUVvcjVod1RVSm5rZzZTMW5tMG1taXJJbnhDbVdvVlYrcXJFWC9YSHlsSitPaklxbC9HeVpySDlzRVBDWStMWUZmVmhPMFU3M2pLcWFqTUVlWnRXWXE1d3JvNFVoUFVobFlnd2hselVONlhOV3RpQzhvaGpFNlFKYWY4allSc0pqSHJhWkwyNTdPMW81VC8zVUxNSmhBU043UjIxMUZteUF1aVlzcThIM2J1UEUwa2wrRW1OOERVTnBURGtCOVhmMWJhNmdYWjBQUlhGMW9HVXd4dlg5RmlJNWVJYXUyUkxmeTlBZkpQY3BBWE4iIENvbmRpY2lvbmVzRGVQYWdvPSJDT05UQURPIiBTdWJUb3RhbD0iMTg1MC4wMCIgRGVzY3VlbnRvPSIxNzUuMDAiIE1vbmVkYT0iTVhOIiBUb3RhbD0iMTk0My4wMCIgVGlwb0RlQ29tcHJvYmFudGU9IkkiIE1ldG9kb1BhZ289IlBVRSIgTHVnYXJFeHBlZGljaW9uPSI2ODA1MCI+CiAgPGNmZGk6RW1pc29yIFJmYz0iRVNJOTIwNDI3ODg2IiBOb21icmU9IkZBQ1RVUkFDSU9OIE1PREVSTkEgU0EgREUgQ1YiIFJlZ2ltZW5GaXNjYWw9IjYwMSIvPgogIDxjZmRpOlJlY2VwdG9yIFJmYz0iQUFRTTYxMDkxN1FKQSIgTm9tYnJlPSJQVUJMSUNPIEVOIEdFTkVSQUwiIFVzb0NGREk9IkcwMSIvPgogIDxjZmRpOkNvbmNlcHRvcz4KICAgIDxjZmRpOkNvbmNlcHRvIENsYXZlUHJvZFNlcnY9IjAxMDEwMTAxIiBOb0lkZW50aWZpY2FjaW9uPSJBVUxPRzAwMSIgQ2FudGlkYWQ9IjUiIENsYXZlVW5pZGFkPSJIODciIFVuaWRhZD0iUGllemEiIERlc2NyaXBjaW9uPSJBdXJyaWN1bGFyZXMgVVNCIExvZ2l0ZWNoIiBWYWxvclVuaXRhcmlvPSIzNTAuMDAiIEltcG9ydGU9IjE3NTAuMDAiIERlc2N1ZW50bz0iMTc1LjAwIj4KICAgICAgPGNmZGk6SW1wdWVzdG9zPgogICAgICAgIDxjZmRpOlRyYXNsYWRvcz4KICAgICAgICAgIDxjZmRpOlRyYXNsYWRvIEJhc2U9IjE1NzUuMDAiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIyNTIuMDAiLz4KICAgICAgICA8L2NmZGk6VHJhc2xhZG9zPgogICAgICA8L2NmZGk6SW1wdWVzdG9zPgogICAgPC9jZmRpOkNvbmNlcHRvPgogICAgPGNmZGk6Q29uY2VwdG8gQ2xhdmVQcm9kU2Vydj0iNDMyMDE4MDAiIE5vSWRlbnRpZmljYWNpb249IlVTQiIgQ2FudGlkYWQ9IjEiIENsYXZlVW5pZGFkPSJIODciIFVuaWRhZD0iUGllemEiIERlc2NyaXBjaW9uPSJNZW1vcmlhIFVTQiAzMmdiIG1hcmNhIEtpbmdzdG9uIiBWYWxvclVuaXRhcmlvPSIxMDAuMDAiIEltcG9ydGU9IjEwMC4wMCI+CiAgICAgIDxjZmRpOkltcHVlc3Rvcz4KICAgICAgICA8Y2ZkaTpUcmFzbGFkb3M+CiAgICAgICAgICA8Y2ZkaTpUcmFzbGFkbyBCYXNlPSIxMDAuMDAiIEltcHVlc3RvPSIwMDIiIFRpcG9GYWN0b3I9IlRhc2EiIFRhc2FPQ3VvdGE9IjAuMTYwMDAwIiBJbXBvcnRlPSIxNi4wMCIvPgogICAgICAgIDwvY2ZkaTpUcmFzbGFkb3M+CiAgICAgIDwvY2ZkaTpJbXB1ZXN0b3M+CiAgICA8L2NmZGk6Q29uY2VwdG8+CiAgPC9jZmRpOkNvbmNlcHRvcz4KICA8Y2ZkaTpJbXB1ZXN0b3MgVG90YWxJbXB1ZXN0b3NUcmFzbGFkYWRvcz0iMjY4LjAwIj4KICAgIDxjZmRpOlRyYXNsYWRvcz4KICAgICAgPGNmZGk6VHJhc2xhZG8gSW1wdWVzdG89IjAwMiIgVGlwb0ZhY3Rvcj0iVGFzYSIgVGFzYU9DdW90YT0iMC4xNjAwMDAiIEltcG9ydGU9IjI2OC4wMCIvPgogICAgPC9jZmRpOlRyYXNsYWRvcz4KICA8L2NmZGk6SW1wdWVzdG9zPgogIDxjZmRpOkNvbXBsZW1lbnRvPgogICAgPHRmZDpUaW1icmVGaXNjYWxEaWdpdGFsIHhtbG5zOnRmZD0iaHR0cDovL3d3dy5zYXQuZ29iLm14L1RpbWJyZUZpc2NhbERpZ2l0YWwiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L1RpbWJyZUZpc2NhbERpZ2l0YWwgaHR0cDovL3d3dy5zYXQuZ29iLm14L3NpdGlvX2ludGVybmV0L2NmZC9UaW1icmVGaXNjYWxEaWdpdGFsL1RpbWJyZUZpc2NhbERpZ2l0YWx2MTEueHNkIiBWZXJzaW9uPSIxLjEiIFVVSUQ9Ijg3QzMxQUEwLTk4QjQtMTFFNy1BNTNELTk5NEIwMEJDNzQxNCIgRmVjaGFUaW1icmFkbz0iMjAxNy0wOS0xM1QxMzo1MToxOSIgUmZjUHJvdkNlcnRpZj0iRk1PMTAwNzE2OEM2IiBTZWxsb0NGRD0ia3M1Mm1NTG5NUnNVNVFYdDBidlBtR1RqN0t1SlJIM3VSeTdFeVlyeDQ1b3Q0ZVlVei9zN25kRGZ2eDVMcGFzK0Y4LytZRTNIeXZLaThqTGdsNVlLSkRJQytKNHVwaG5zbkpjVWpMTWwrRWJ5aHI3bmN0UEpXcWUxblN0a2g4VTNDd1RWNGo5NDRDR1JRb0NjM1BtRTg3WmF6N2MzZGhoVlNpbjNPREE3WEQ4PSIgTm9DZXJ0aWZpY2Fkb1NBVD0iMjAwMDEwMDAwMDAzMDAwMjIzMjMiIFNlbGxvU0FUPSJNeHhaRmZ2L0t2d2FsbG94SW1saVhhdU4zL1dvNVJKMlJRTXd0S3hqSkpQZndQK1RtaHhSSkRJQ1JjQnFGYUpaSnBScVBrOWE0MHQzbDBKSzE3Tm4yanF6SU1zRHpPaDNyVDduL0pSZEd3TVY4clI4cStHWk9rMkc0RXIxaHpRcFQ3dXdMbDQyck81SGo4T1I4UDNWb2xnOFFHRy8wUU1SL0tMek9jYU9HMGpXNkQrV2hCdFljSE9iTW9hYWk1eG9DMmhqcVNZeE40a0t1VkwxVWxtMUUzZTlCQjRSMkpSNEJGNDBOL1JnNXZ2UG9mc1J6bW9uckEwcURkM2s5K3dpNXF3ZGNMK1RJUlhFQ2JNb0thMkRESk93elM4NTNDNllDQk11K0ZNVVlKNXZndENWUWU3WHpNZ0FLZjhaTk9TVTg0ZWFMR09rSlVLcVh5RWFUdDJxeFE9PSIgUmZjUHJvdkNlcnRpZj0iRk1PMTAwNzE2OEM2Ii8+CiAgPC9jZmRpOkNvbXBsZW1lbnRvPgo8L2NmZGk6Q29tcHJvYmFudGU+Cg==</xml></return></ns1:requestTimbrarCFDIResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
@@ -6,4 +6,4 @@ selloSAT|wz9vUIm0qYSM8SfVUdj0RDTychEuZOw00hKsYI2JiU1ulD0zKEB6WyMnlfYWJjZ+xBHESYZ
6
6
  selloCFD|CbIFn71OXDw0htZ2Z2Pn90hHEMKciPNbfvStyACY7v5fr/cEw+QZBRm0kzQe+mkaDmgQsKUD6ol3LtV6VAfSqeim/nom98SvYxENgkrK9I7OgCKMobuNXyR+N10w1nJY4uDZXkBLiUbDsMiO3jcCAgm+/Hn7pN5TM9X2EsPDwMQ=
7
7
  Fecha|2013-01-02T20:12:20
8
8
  Serie|
9
- Folio|
9
+ Folio|
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe FmTimbradoCfdi::FmCfdi do
4
+ describe '#version_3_3?' do
5
+ let(:respuesta_timbrado) do
6
+ File.open('spec/fixtures/respuesta_timbrado_version.txt').read
7
+ end
8
+ it 'returns true' do
9
+ expect(FmTimbradoCfdi::FmCfdi.new(respuesta_timbrado).version_3_3?).to be_truthy
10
+ end
11
+ end
12
+ end
@@ -2,16 +2,16 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe FmTimbradoCfdi::FmInformacionCfdi do
5
- context "debe crear un objeto válido" do
6
- let(:plantilla){File.open('spec/fixtures/layout_example.txt').read}
7
- let(:layout){ plantilla.gsub('--fecha-comprobante--', 'asignarFecha' )}
8
- let(:respuesta){ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
9
- let(:informacion) { FmTimbradoCfdi::FmInformacionCfdi.new(respuesta.xml)}
10
- it { informacion.total.should_not be_nil }
11
- it { informacion.total.should == "116.00"}
12
- it { informacion.subtotal.should_not be_nil }
13
- it { informacion.subtotal.should == "100.00"}
14
- it { informacion.descuento.should_not be_nil }
15
- it { informacion.descuento.should == "0.00" }
5
+ context 'debe crear un objeto válido' do
6
+ let(:plantilla) { File.open('spec/fixtures/layout_example.txt').read }
7
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
8
+ let(:respuesta) { FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
9
+ let(:informacion) { FmTimbradoCfdi::FmInformacionCfdi.new(respuesta.xml) }
10
+ it { expect(informacion.total).to_not be_nil }
11
+ it { expect(informacion.total).to eq '1943.00' }
12
+ it { expect(informacion.subtotal).to_not be_nil }
13
+ it { expect(informacion.subtotal).to eq '1850.00' }
14
+ it { expect(informacion.descuento).to_not be_nil }
15
+ it { expect(informacion.descuento).to eq '175.00' }
16
16
  end
17
17
  end
@@ -1,16 +1,16 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
- require 'ostruct'
4
3
 
5
4
  describe FmTimbradoCfdi::FmRespuesta do
6
- context "respuesta no satisfactoria" do
7
- let(:respuesta_cliente) do
8
- prueba = OpenStruct.new
9
- prueba.stub(:success?).and_return(false)
10
- prueba.stub_chain(:soap_fault?).and_return(true)
11
- prueba.stub_chain(:soap_fault, :to_s).and_return('Test Error')
12
- prueba
5
+ context 'respuesta no satisfactoria' do
6
+ let(:respuesta_cliente) { double }
7
+
8
+ before :each do
9
+ allow(respuesta_cliente).to receive(:success?).and_return false
10
+ allow(respuesta_cliente).to receive(:soap_fault?).and_return true
11
+ allow(respuesta_cliente).to receive_message_chain(:soap_fault, :to_s).and_return 'Test Error'
13
12
  end
13
+
14
14
  let(:respuesta) { FmTimbradoCfdi::FmRespuesta.new(respuesta_cliente) }
15
15
  it { expect(respuesta.valid?).to eq(false) }
16
16
  it { expect(respuesta.xml?).to eq(false) }
@@ -21,15 +21,15 @@ describe FmTimbradoCfdi::FmRespuesta do
21
21
  end
22
22
 
23
23
  context 'respuesta correcta' do
24
- let(:texto_respuesta){File.open('spec/fixtures/soap_response.txt').read}
24
+ let(:texto_respuesta) { File.open('spec/fixtures/soap_response.txt').read }
25
25
  let(:respuesta) { FmTimbradoCfdi::FmRespuesta.new(texto_respuesta) }
26
26
  it { expect(respuesta.valid?).to eq(true) }
27
27
  end
28
28
 
29
- context "respuesta sin xml" do
30
- let(:texto_respuesta){File.open('spec/fixtures/soap_response_sin_xml.txt').read}
29
+ context 'respuesta sin xml' do
30
+ let(:texto_respuesta) { File.open('spec/fixtures/soap_response_sin_xml.txt').read }
31
31
  let(:respuesta) { FmTimbradoCfdi::FmRespuesta.new(texto_respuesta) }
32
32
  it { expect(respuesta.valid?).to eq(false) }
33
- it { expect(respuesta.errors.first).to eq("No se ha encontrado el nodo xml") }
33
+ it { expect(respuesta.errors.first).to eq('No se ha encontrado el nodo xml') }
34
34
  end
35
35
  end
@@ -2,16 +2,17 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe FmTimbradoCfdi::FmTimbre do
5
- context "debe crear un objeto válido" do
6
- let(:plantilla){File.open('spec/fixtures/layout_example.txt').read}
7
- let(:layout){ plantilla.gsub('--fecha-comprobante--', 'asignarFecha' )}
8
- let(:respuesta){ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
9
- let(:timbre) { FmTimbradoCfdi::FmTimbre.new(respuesta.xml)}
10
- it { timbre.no_certificado_sat.should_not be_nil }
11
- it { timbre.fecha_timbrado.should_not be_nil }
12
- it { timbre.uuid.should_not be_nil }
13
- it { timbre.sello_sat.should_not be_nil }
14
- it { timbre.sello_cfd.should_not be_nil }
15
- it { timbre.cadena_original.should_not be_nil }
5
+ context 'debe crear un objeto válido' do
6
+ let(:plantilla) { File.open('spec/fixtures/layout_example.txt').read }
7
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
8
+ let(:respuesta) { FmTimbradoCfdi.timbrar 'ESI920427886', layout }
9
+ let(:timbre) { FmTimbradoCfdi::FmTimbre.new(respuesta.xml) }
10
+ it { expect(timbre.no_certificado_sat).to_not be_nil }
11
+ it { expect(timbre.fecha_timbrado).to_not be_nil }
12
+ it { expect(timbre.uuid).to_not be_nil }
13
+ it { expect(timbre.sello_sat).to_not be_nil }
14
+ it { expect(timbre.sello_cfd).to_not be_nil }
15
+ it { expect(timbre.cadena_original).to_not be_nil }
16
+ it { expect(timbre.rfc_provedor_certificacion).to_not be_nil }
16
17
  end
17
18
  end
@@ -2,144 +2,194 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe FmTimbradoCfdi do
5
- describe ".cliente" do
6
- it "Por default el cliente debe cargar la configuración del ambiente de pruebas" do
7
- FmTimbradoCfdi.cliente.user_id.should == 'UsuarioPruebasWS'
8
- FmTimbradoCfdi.cliente.user_pass.should == 'b9ec2afa3361a59af4b4d102d3f704eabdf097d4'
9
- FmTimbradoCfdi.cliente.namespace.should == 'https://t2demo.facturacionmoderna.com/timbrado/soap'
10
- FmTimbradoCfdi.cliente.endpoint.should == 'https://t2demo.facturacionmoderna.com/timbrado/soap'
11
- FmTimbradoCfdi.cliente.fm_wsdl.should == 'https://t2demo.facturacionmoderna.com/timbrado/wsdl'
5
+ describe '.cliente' do
6
+ let(:user_id) { 'UsuarioPruebasWS' }
7
+ let(:user_pass) { 'b9ec2afa3361a59af4b4d102d3f704eabdf097d4' }
8
+ let(:namespace) { 'https://t2demo.facturacionmoderna.com/timbrado/soap' }
9
+ let(:endpoint) { 'https://t2demo.facturacionmoderna.com/timbrado/soap' }
10
+ let(:fm_wsdl) { 'https://t2demo.facturacionmoderna.com/timbrado/wsdl' }
11
+
12
+ it 'Por default carga la configuración del ambiente de pruebas' do
13
+ expect(FmTimbradoCfdi.cliente.user_id).to eq user_id
14
+ expect(FmTimbradoCfdi.cliente.user_pass).to eq user_pass
15
+ expect(FmTimbradoCfdi.cliente.namespace).to eq namespace
16
+ expect(FmTimbradoCfdi.cliente.endpoint).to eq endpoint
17
+ expect(FmTimbradoCfdi.cliente.fm_wsdl).to eq fm_wsdl
12
18
  end
13
19
  end
14
20
 
15
-
16
- describe ".timbra_cfdi_layout" do
17
- context "timbrado correcto" do
21
+ describe '.timbra_cfdi_layout' do
22
+ context 'timbrado correcto' do
18
23
  context 'archivo de prueba simple' do
19
- let(:plantilla){File.open('spec/fixtures/layout_example.txt').read}
20
- let(:layout){ plantilla.gsub('--fecha-comprobante--', 'asignarFecha' )}
21
- let(:respuesta){ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
22
- it { respuesta.should be_valid }
23
- it { respuesta.should be_xml }
24
-
25
- context "formato cbb" do
26
- let(:respuesta){ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout, true}
27
- it { respuesta.should be_valid }
28
- it { respuesta.should be_xml }
29
- it { respuesta.should be_cbb }
24
+ let(:plantilla) { File.open('spec/fixtures/layout_example.txt').read }
25
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
26
+ let(:respuesta) do
27
+ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout
28
+ end
29
+ it { expect(respuesta).to be_valid }
30
+ it { expect(respuesta).to be_xml }
31
+
32
+ context 'formato cbb' do
33
+ let(:respuesta) do
34
+ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout, true
35
+ end
36
+ it { expect(respuesta).to be_valid }
37
+ it { expect(respuesta).to be_xml }
38
+ it { expect(respuesta).to be_cbb }
30
39
  end
31
- end
40
+ end
32
41
  end
33
42
 
34
43
  context 'archivo de constructoras' do
35
- let(:plantilla){File.open('spec/fixtures/constructora_layout_example.txt').read}
36
- let(:layout){plantilla.gsub('--fecha-comprobante--', 'asignarFecha')}
37
- let(:respuesta){ FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
38
- it { respuesta.should be_valid }
39
- it { respuesta.should be_xml }
44
+ let(:plantilla) do
45
+ File.open('spec/fixtures/constructora_layout_example.txt').read
46
+ end
47
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
48
+ let(:respuesta) { FmTimbradoCfdi.timbra_cfdi_layout 'ESI920427886', layout }
49
+ it { expect(respuesta).to be_valid }
50
+ it { expect(respuesta).to be_xml }
40
51
  end
41
52
  end
42
53
 
43
- describe ".timbrar" do
44
- context "timbrado correcto" do
54
+ describe '.timbrar' do
55
+ context 'timbrado correcto' do
45
56
  context 'archivo de prueba simple' do
46
- let(:plantilla){File.open('spec/fixtures/layout_example.txt').read}
47
- let(:layout){ plantilla.gsub('--fecha-comprobante--', 'asignarFecha' )}
48
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout }
49
- it { respuesta.should be_valid }
50
- it { respuesta.should be_xml }
51
-
52
- context "formato cbb" do
53
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarCBB' => true }
54
- it { respuesta.should be_valid }
55
- it { respuesta.should be_xml }
56
- it { respuesta.should be_cbb }
57
+ let(:plantilla) { File.open('spec/fixtures/layout_example.txt').read }
58
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
59
+ let(:respuesta) { FmTimbradoCfdi.timbrar 'ESI920427886', layout }
60
+ it { expect(respuesta).to be_valid }
61
+ it { expect(respuesta).to be_xml }
62
+
63
+ context 'formato cbb' do
64
+ let(:respuesta) do
65
+ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarCBB' => true
66
+ end
67
+ it { expect(respuesta).to be_valid }
68
+ it { expect(respuesta).to be_xml }
69
+ it { expect(respuesta).to be_cbb }
57
70
  end
58
71
 
59
- context "formato txt" do
60
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarTXT' => true }
61
- it { respuesta.should be_valid }
62
- it { respuesta.should be_xml }
63
- it { respuesta.should be_timbre }
72
+ context 'formato txt' do
73
+ let(:respuesta) do
74
+ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarTXT' => true
75
+ end
76
+ it { expect(respuesta).to be_valid }
77
+ it { expect(respuesta).to be_xml }
78
+ it { expect(respuesta).to be_timbre }
64
79
  end
65
80
 
66
- context "formato pdf" do
67
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarPDF' => true }
68
- it { respuesta.should be_valid }
69
- it { respuesta.should be_xml }
70
- it { respuesta.should be_pdf }
81
+ context 'formato pdf' do
82
+ let(:respuesta) do
83
+ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarPDF' => true
84
+ end
85
+ it { expect(respuesta).to be_valid }
86
+ it { expect(respuesta).to be_xml }
87
+ it { expect(respuesta).to be_pdf }
71
88
  end
72
89
 
73
- context "formato pdf, pero no cbb, ni txt" do
74
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout, 'generarPDF' => true, 'generarCBB' => false, 'generarTXT' => false }
75
- it { respuesta.should be_valid }
76
- it { respuesta.should be_xml }
77
- it { respuesta.should be_pdf }
78
- it { respuesta.should_not be_cbb }
90
+ context 'formato pdf, pero no cbb, ni txt' do
91
+ let(:respuesta) do
92
+ FmTimbradoCfdi.timbrar('ESI920427886', layout,
93
+ 'generarPDF' => true, 'generarCBB' => false,
94
+ 'generarTXT' => false)
95
+ end
96
+ it { expect(respuesta).to be_valid }
97
+ it { expect(respuesta).to be_xml }
98
+ it { expect(respuesta).to be_pdf }
99
+ it { expect(respuesta).to_not be_cbb }
79
100
  end
80
101
  end
81
102
  end
82
103
 
83
104
  context 'archivo de constructoras' do
84
- let(:plantilla){File.open('spec/fixtures/constructora_layout_example.txt').read}
85
- let(:layout){plantilla.gsub('--fecha-comprobante--', 'asignarFecha')}
86
- let(:respuesta){ FmTimbradoCfdi.timbrar 'ESI920427886', layout }
87
- it { respuesta.should be_valid }
88
- it { respuesta.should be_xml }
105
+ let(:plantilla) { File.open('spec/fixtures/constructora_layout_example.txt').read }
106
+ let(:layout) { plantilla.gsub('--fecha-comprobante--', 'asignarFecha') }
107
+ let(:respuesta) { FmTimbradoCfdi.timbrar 'ESI920427886', layout }
108
+ it { expect(respuesta).to be_valid }
109
+ it { expect(respuesta).to be_xml }
89
110
  end
90
111
  end
91
112
 
92
113
  context 'timbrado incorrecto' do
93
- it "no timbra el comprobante si tiene más de 72 horas de haber sido generado" do
94
- fecha_comprobante = Time.now - 120*3600
95
- layout = File.open('spec/fixtures/layout_example.txt').read.gsub('--fecha-comprobante--', fecha_comprobante.strftime("%FT%T"))
96
- respuesta = FmTimbradoCfdi.timbrar 'ESI920427886', layout
97
- respuesta.should_not be_valid
114
+ context 'cuando comprobante tiene más de 72 horas de haber sido generado' do
115
+ it 'no lo timbra' do
116
+ fecha_comprobante = Time.now - 120 * 3600
117
+ layout = File.open('spec/fixtures/layout_example.txt').read
118
+ .gsub('--fecha-comprobante--', fecha_comprobante.strftime('%FT%T'))
119
+ respuesta = FmTimbradoCfdi.timbrar 'ESI920427886', layout
120
+ expect(respuesta).to_not be_valid
121
+ end
98
122
  end
99
123
  end
100
124
 
101
125
  context 'subir certificados' do
102
- let(:archivo_certificado) { File.read('spec/fixtures/certificados/20001000000200000192.cer') }
103
- let(:archivo_llave) { File.read('spec/fixtures/certificados/20001000000200000192.key') }
126
+ let(:archivo_certificado) do
127
+ File.read('spec/fixtures/certificados/20001000000200000192.cer')
128
+ end
129
+ let(:archivo_llave) do
130
+ File.read('spec/fixtures/certificados/20001000000200000192.key')
131
+ end
104
132
  let(:password) { '12345678a' }
105
133
  describe '.activar_cancelacion' do
106
134
  context 'petición válida' do
107
- let(:respuesta){ FmTimbradoCfdi.activar_cancelacion('ESI920427886', archivo_certificado, archivo_llave, password) }
135
+ let(:respuesta) do
136
+ FmTimbradoCfdi.activar_cancelacion('ESI920427886',
137
+ archivo_certificado,
138
+ archivo_llave,
139
+ password)
140
+ end
108
141
  it{ expect(respuesta.valid?).to eq(true) }
109
142
  end
110
143
 
111
144
  context 'petición inválida' do
112
- let(:respuesta){ FmTimbradoCfdi.activar_cancelacion('ESI920427886', archivo_llave, archivo_certificado, password) }
145
+ let(:respuesta) do
146
+ FmTimbradoCfdi.activar_cancelacion('ESI920427886',
147
+ archivo_llave,
148
+ archivo_certificado,
149
+ password)
150
+ end
113
151
  it{ expect(respuesta.valid?).to eq(false) }
114
152
  end
115
153
  end
116
154
 
117
155
  describe '.subir_certificado' do
118
156
  context 'petición válida' do
119
- let(:respuesta){ FmTimbradoCfdi.subir_certificado('ESI920427886', archivo_certificado, archivo_llave, password) }
157
+ let(:respuesta) do
158
+ FmTimbradoCfdi.subir_certificado('ESI920427886',
159
+ archivo_certificado,
160
+ archivo_llave,
161
+ password)
162
+ end
120
163
  it{ expect(respuesta.valid?).to eq(true) }
121
164
  end
122
165
 
123
166
  context 'petición inválida' do
124
- let(:respuesta){ FmTimbradoCfdi.subir_certificado('ESI920427886', archivo_llave, archivo_certificado, password) }
167
+ let(:respuesta) do
168
+ FmTimbradoCfdi.subir_certificado('ESI920427886',
169
+ archivo_llave,
170
+ archivo_certificado,
171
+ password)
172
+ end
125
173
  it{ expect(respuesta.valid?).to eq(false) }
126
174
  end
127
175
  end
128
-
129
176
  end
130
177
 
131
- describe ".cancelar" do
132
- context "petición inválida" do
178
+ describe '.cancelar' do
179
+ context 'petición inválida' do
133
180
  let(:respuesta){ FmTimbradoCfdi.cancelar('ESI920427886', 'asdasasdsa') }
134
181
  it{ expect(respuesta.valid?).to eq(false) }
135
182
  end
136
183
 
137
- context "formato válido" do
138
- let(:respuesta){ FmTimbradoCfdi.cancelar('ESI920427886', '00000000-0000-0000-0000-00000000000000') }
184
+ context 'formato válido' do
185
+ let(:respuesta) do
186
+ FmTimbradoCfdi.cancelar('ESI920427886',
187
+ '00000000-0000-0000-0000-00000000000000')
188
+ end
139
189
  it{ expect(respuesta.valid?).to eq(false) }
140
190
  end
141
191
 
142
- context "peticion válida" do
192
+ context 'peticion válida' do
143
193
  let(:uuid) do
144
194
  plantilla = File.open('spec/fixtures/layout_example.txt').read
145
195
  layout = plantilla.gsub('--fecha-comprobante--', 'asignarFecha' )
@@ -151,24 +201,21 @@ describe FmTimbradoCfdi do
151
201
  end
152
202
  end
153
203
 
154
- describe ".configurar" do
155
- it "cambia los valores de conexión por los proporcionados" do
204
+ describe '.configurar' do
205
+ it 'cambia los valores de conexión por los proporcionados' do
156
206
  FmTimbradoCfdi.configurar do |config|
157
- config.user_id = "mi_usuario"
158
- config.user_pass = "secret"
159
- config.namespace = "http://logicalbricks.com/soap"
160
- config.endpoint = "http://logicalbricks.com/endpoint"
161
- config.fm_wsdl = "http://logicalbricks.com/wsdl"
207
+ config.user_id = 'mi_usuario'
208
+ config.user_pass = 'secret'
209
+ config.namespace = 'http://logicalbricks.com/soap'
210
+ config.endpoint = 'http://logicalbricks.com/endpoint'
211
+ config.fm_wsdl = 'http://logicalbricks.com/wsdl'
162
212
  end
163
213
 
164
- FmTimbradoCfdi.cliente.user_id.should == 'mi_usuario'
165
- FmTimbradoCfdi.cliente.user_pass.should == 'secret'
166
- FmTimbradoCfdi.cliente.namespace.should == 'http://logicalbricks.com/soap'
167
- FmTimbradoCfdi.cliente.endpoint.should == 'http://logicalbricks.com/endpoint'
168
- FmTimbradoCfdi.cliente.fm_wsdl.should == 'http://logicalbricks.com/wsdl'
214
+ expect(FmTimbradoCfdi.cliente.user_id).to eq 'mi_usuario'
215
+ expect(FmTimbradoCfdi.cliente.user_pass).to eq 'secret'
216
+ expect(FmTimbradoCfdi.cliente.namespace).to eq 'http://logicalbricks.com/soap'
217
+ expect(FmTimbradoCfdi.cliente.endpoint).to eq 'http://logicalbricks.com/endpoint'
218
+ expect(FmTimbradoCfdi.cliente.fm_wsdl).to eq 'http://logicalbricks.com/wsdl'
169
219
  end
170
220
  end
171
-
172
221
  end
173
-
174
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fm_timbrado_cfdi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos García
@@ -10,48 +10,48 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-06-30 00:00:00.000000000 Z
13
+ date: 2018-03-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: savon
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - '>='
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
35
  version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - '>='
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: rspec
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - '>='
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  description: 'Implementación en Ruby de la Conexión con el Servicio de Timbrado de
@@ -62,16 +62,17 @@ executables: []
62
62
  extensions: []
63
63
  extra_rdoc_files: []
64
64
  files:
65
- - .gitignore
66
- - .ruby-gemset
67
- - .ruby-version
68
- - .travis.yml
65
+ - ".gitignore"
66
+ - ".ruby-gemset"
67
+ - ".ruby-version"
68
+ - ".travis.yml"
69
69
  - Gemfile
70
70
  - LICENSE.txt
71
71
  - README.md
72
72
  - Rakefile
73
73
  - fm_timbrado_cfdi.gemspec
74
74
  - lib/fm_timbrado_cfdi.rb
75
+ - lib/fm_timbrado_cfdi/fm_cfdi.rb
75
76
  - lib/fm_timbrado_cfdi/fm_cfdi_parser.rb
76
77
  - lib/fm_timbrado_cfdi/fm_cliente.rb
77
78
  - lib/fm_timbrado_cfdi/fm_informacion_cfdi.rb
@@ -86,9 +87,11 @@ files:
86
87
  - spec/fixtures/layout_example.txt
87
88
  - spec/fixtures/layout_example.txt~
88
89
  - spec/fixtures/pipes.txt
90
+ - spec/fixtures/respuesta_timbrado_version.txt
89
91
  - spec/fixtures/soap_response.txt
90
92
  - spec/fixtures/soap_response_sin_xml.txt
91
93
  - spec/fixtures/timbre_example.txt
94
+ - spec/fm_timbrado_cfdi/fm_cfdi_spec.rb
92
95
  - spec/fm_timbrado_cfdi/fm_informacion_cfdi_spec.rb
93
96
  - spec/fm_timbrado_cfdi/fm_respuesta_spec.rb
94
97
  - spec/fm_timbrado_cfdi/fm_timbre_spec.rb
@@ -103,17 +106,17 @@ require_paths:
103
106
  - lib
104
107
  required_ruby_version: !ruby/object:Gem::Requirement
105
108
  requirements:
106
- - - '>='
109
+ - - ">="
107
110
  - !ruby/object:Gem::Version
108
111
  version: '0'
109
112
  required_rubygems_version: !ruby/object:Gem::Requirement
110
113
  requirements:
111
- - - '>='
114
+ - - ">="
112
115
  - !ruby/object:Gem::Version
113
116
  version: '0'
114
117
  requirements: []
115
118
  rubyforge_project:
116
- rubygems_version: 2.4.6
119
+ rubygems_version: 2.7.3
117
120
  signing_key:
118
121
  specification_version: 4
119
122
  summary: Implementación en ruby de la conexión con el servicio de timbrado de cfdi
@@ -126,9 +129,11 @@ test_files:
126
129
  - spec/fixtures/layout_example.txt
127
130
  - spec/fixtures/layout_example.txt~
128
131
  - spec/fixtures/pipes.txt
132
+ - spec/fixtures/respuesta_timbrado_version.txt
129
133
  - spec/fixtures/soap_response.txt
130
134
  - spec/fixtures/soap_response_sin_xml.txt
131
135
  - spec/fixtures/timbre_example.txt
136
+ - spec/fm_timbrado_cfdi/fm_cfdi_spec.rb
132
137
  - spec/fm_timbrado_cfdi/fm_informacion_cfdi_spec.rb
133
138
  - spec/fm_timbrado_cfdi/fm_respuesta_spec.rb
134
139
  - spec/fm_timbrado_cfdi/fm_timbre_spec.rb