VirtualXML® Ejecutable Externo (VirtualXML.EXE y VirtualXML_x64.EXE) VirtualXML
Adicionalmente a la librería de funciones VirtualXML.DLL, VirtualXML provee de un programa ejecutable externo para equipos de 32 y 64 bits (VirtualXML.EXE y VirtualXML_x64.EXE) que se ejecuta desde la línea de comandos.

Este programa externo utiliza archivos de texto (scripts) para realizar el proceso de firmado, sellado y timbrado de documentos fiscales digitales (CFDIs) en versiones 3.3. y 4.0

Es muy útil cuando tu lenguaje de programación no soporta llamadas a DLLs externas o bien cuando requieres hacer una factura sin necesidad de recurrir a un programa formal.

Los scripts de VirtualXML son simplemente archivos de texto con la extensión .vxml (aunque pueden tener cualquier extensión), que contienen llamadas a las funciones de la librería VirtualXML con un formato específico.

Ejemplo:

Si queremos crear un documento CFDI en la version 4.0 nuestro script (archivo de texto) deberá contener las siguientes lineas:

                 |>| VirtualXML_New | 4.0 |<|

Si observas bien, esta es una llamada similar a la función VirtuaXML_New() y utiliza incluso su mismo parámetro.

Las reglas para el llamado a las instrucciones de VirtualXML para los archivos scripts son muy simples:

             Se coloca una sola instrucción por línea
             |>|  Inicia instruccion VirtualXML
             Instruccion Virtual XML + | (pleca, pipe)
             Parámetro(s) de la función separados por " | " (pleca, pipe) en vez de ",". Son los mismos parametros de la funciones de la DLL a excepción del "handler" de la función, el cual no es requerido en el Script.
             Parámetro que no deba de ser expresado se representa vacio: " | | "
             |<|  Termina instruccion VirtualXML

Similar a como se usan la funciones de la DLL VirtualXML, cada llamada a una función va creando en la memoria de la computadora el archivo XML, en el ejemplo anterior se crea el siguiente nodo:

                        <?xml version="1.0" encoding="UTF-8"?>
                        <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
                                                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                     xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
                                                    Version="4.0"

                        </cfdi:Comprobante>

Tal como si estuvieramos programando en un lenguaje de programación convencional, agregaremos mas instrucciones VirtualXML, siguiendo la regla de llamado, así por ejemplo para completar el nodo <cfdi:Comprobante> agregaremos:

                        |>|VirtualXML_SetComprobanteInfo_cfdi40|CJZ|7303|%cb_date|99|CREDITO|6034.48|0.00|MXN|1|7000.00|I|PPD|07270||01|<|

Y en la memoria de la computadora se habra creado:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
                                                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                      xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
                                                      Version="4.0"
                                                        Serie="CJZ"
                                                        Folio="7303"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="CREDITO"
                                                        SubTotal="6034.00"
                                                        Descuento="0.00"
                                                        Moneda="MXN"
                                                        Total="7000.00"
                                                        TipoDeComprobante="I"
                                                        Exportacion="01"

                                                        MetodoPago="PPD"
                                                        LugarExpedicion="07270">
                         </cfdi:Comprobante>

Agregamos información de Emisor y Receptor:

                |>|VirtualXML_SetEmisorInfo_cfdi40|EKU9003173C9|ESCUELA KEMPER URGATE|601||<|
                |>|VirtualXML_SetReceptorInfo_cfdi40|CTE940531F58|CIBERNETICA Y TECNOLOGIA|||G03|53050|601|<|
               
Y Obtenemos esto:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
                                                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                     xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
                                                     Version="4.0"   
                                                        Serie="CJZ"
                                                        Folio="7303"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="CREDITO"
                                                        SubTotal="6034.00"
                                                        Descuento="0.00"
                                                        Moneda="MXN"
                                                        Total="7000.00"
                                                        TipoDeComprobante="I"
                                                        Exportacion="01"

                                                        MetodoPago="PPD"
                                                        LugarExpedicion="07270">
                               <cfdi:Emisor Rfc="EKU9003173C9" Nombre="ESCUELA KEMPER URGATE" RegimenFiscal="601"/>
                               <cfdi:Receptor Rfc="CTE940531F58" Nombre="CIBERNETICA Y TECNOLOGIA" DomicilioFiscalReceptor="53050" RegimenFiscalReceptor="601" UsoCFDI="G03"/>
                         </cfdi:Comprobante>

Agreguemos un concepto y sus respectivos impuestos:

               |>|VirtualXML_AddConcepto_cfdi40|43211500|EQU-0025|1.000|H87|Computadora|COMPUTADORA HP PORTATIL|6034.48|6034.48|0.00|02|<|
               |>|VirtualXML_AddConceptoTraslado|6034.48|002|Tasa|0.160000|965.52|<|


Nuestro XML en memoria va así:

                         <?xml version="1.0" encoding="UTF-8"?>
                        <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
                                                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                     xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
                                                     Version="4.0"
                                                        Serie="CJZ"
                                                        Folio="7303"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="CREDITO"
                                                        SubTotal="6034.00"
                                                        Descuento="0.00"
                                                        Moneda="MXN"
                                                        Total="7000.00"
                                                        TipoDeComprobante="I"
                                                        Exportacion="01"

                                                        MetodoPago="PPD"
                                                        LugarExpedicion="07270">
                                        <cfdi:Emisor Rfc="EKU9003173C9" Nombre="ESCUELA KEMPER URGATE SA DE CV" RegimenFiscal="601"/>
                                       <cfdi:Receptor Rfc="CTE940531F58" Nombre="CIBERNETICA Y TECNOLOGIA" DomicilioFiscalReceptor="53050" RegimenFiscalReceptor="601" UsoCFDI="G03"/>

                                        <cfdi:Conceptos>
                                                <cfdi:Concepto ClaveProdServ="43211500" NoIdentificacion="EQU-0025" Cantidad="1.000" ClaveUnidad="H87" Unidad="Computadora" Descripcion="COMPUTADORA HP PORTATIL" ValorUnitario="6034.48" Importe="6034.48" Descuento="0.00" ObjetoImp="02">
                                                        <cfdi:Impuestos>
                                                            <cfdi:Traslados>
                                                                    <cfdi:Traslado Base="6034.48" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="965.52"/>
                                                            </cfdi:Traslados>
                                                        </cfdi:Impuestos>
                                                </cfdi:Concepto>
                                        </cfdi:Conceptos>
                         </cfdi:Comprobante>

Finalmente el nodo de impuestos y sus valores:

             |>|VirtualXML_SetImpuestosInfo_cfdi40|965.52||<|
             |>|VirtualXML_AddTraslado_cfdi40|002|Tasa|0.160000|965.52|6034.48|<|


Nuestro XML en memoria está listo:

                         <?xml version="1.0" encoding="UTF-8"?>
                        <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
                                                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                     xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
                                                     Version="4.0" 
                                                        Serie="CJZ"
                                                        Folio="7303"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="CREDITO"
                                                        SubTotal="6034.00"
                                                        Descuento="0.00"
                                                        Moneda="MXN"
                                                        Total="7000.00"
                                                        TipoDeComprobante="I"
                                                        Exportacion="01"

                                                        MetodoPago="PPD"
                                                        LugarExpedicion="07270">
                                        <cfdi:Emisor Rfc="EKU9003173C9" Nombre="ESCUELA KEMPER URGATE" RegimenFiscal="601"/>
                                       <cfdi:Receptor Rfc="CTE940531F58" Nombre="CIBERNETICA Y TECNOLOGIA" DomicilioFiscalReceptor="53050" RegimenFiscalReceptor="601" UsoCFDI="G03"/>

                                        <cfdi:Conceptos>
                                                <cfdi:Concepto ClaveProdServ="43211500" NoIdentificacion="EQU-0025" Cantidad="1.000" ClaveUnidad="H87" Unidad="Computadora" Descripcion="COMPUTADORA HP PORTATIL" ValorUnitario="6034.48" Importe="6034.48" Descuento="0.00" ObjetoImp="02">
                                                        <cfdi:Impuestos>
                                                            <cfdi:Traslados>
                                                                    <cfdi:Traslado Base="6034.48" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="965.52"/>
                                                            </cfdi:Traslados>
                                                        </cfdi:Impuestos>
                                                </cfdi:Concepto>
                                        </cfdi:Conceptos>

                                    <cfdi:Impuestos TotalImpuestosTrasladados="965.52">
                                            <cfdi:Traslados>
                                               <cfdi:Traslado Base="6034.48" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="965.52"/>
                                            </cfdi:Traslados>
                
                    </cfdi:Impuestos>
                         </cfdi:Comprobante>

Nuestro XML está listo, ahora debemos "procesarlo" (firmarlo, sellarlo y timbrarlo digitalmente), esta operación se realiza usando LA MISMA FUNCION como si utilizaramos la función de la DLL:

            |>|VirtualXML_ProcesaDocumento|CSD_EKU9003173C9.cer|CSD_EKU9003173C9.key|12345678a|demoIngresoCFDI40.xml|<|

El resultado del procesamiento lo obtendremos un archivo de texto con el mismo nombre del archivo de salida especificado en la llamada a la función VirtualXML_ProcesaDocumento(). los 21 valores recuperados estarán ahi.

Para procesar nuestro archivo script, desde la línea de comandos haremos:

             C:\>  VirtualXML.exe <archivo.vxml>

También es posible procesar mas de 1 documento CFDI a la vez dentro del mismo archivo .VXML, simplemente repite las instrucciones de llenado del CFDI tantas veces como documentos quieras timbrar y podrás timbrar tantos documentos como desees con un solo archivo .VMXL

El ejemplo completo quedaría como sigue;


Ejemplo:

|>|VirtualXML_New|4.0|<|
|>|VirtualXML_SetVirtualPACInfo|demo_cibertec|demo|<|
|>|VirtualXML_SetComprobanteInfo_cfdi40|CJZ|7303|%cb_date|99|CREDITO|6034.48|0.00|MXN|1|7000.00|I|PPD|32350||01|<|
|>|VirtualXML_SetEmisorInfo_cfdi40|EKU9003173C9|ESCUELA KEMPER URGATE|601||<|
|>|VirtualXML_SetReceptorInfo_cfdi40|FOSM380609Q76|MARTIN FLORES SOLORZANO|||G03|53050|612|<|
|>|VirtualXML_AddConcepto_cfdi40|43211500|EQU-0025|1.000|H87|Computadora|COMPUTADORA HP PORTATIL|6034.48|6034.48|0.00|02|<|
|>|VirtualXML_AddConceptoTraslado|6034.48|002|Tasa|0.160000|965.52|<|
|>|VirtualXML_SetImpuestosInfo_cfdi4O|965.52||<|
|>|VirtualXML_AddTraslado_cfdi40|002|Tasa|0.160000|965.52|6034.48|<|
|>|VirtualXML_ProcesaDocumento|CSD_EKU9003173C9.cer|CSD_EKU9003173C9.key|12345678a|demoIngresoCFDI40.xml|<|

El resultado de este documento queda en un archivo de texto similar a este:

VIRTUALXML_GET_DESCERROR[1]: VIRTUALXML_OK
VIRTUALXML_GET_ERROR[2]:
VIRTUALXML_GET_CSDNUMBER[3]: 30001000000300023708
VIRTUALXML_GET_SELLO[4]: L7U9zYzmSCGtrzsaryv3K4Zhn/n4tDon/sm5MoJsYYCuQcFtUCMtJlN05hlt7D+I4g7+fvoiJbmKL+96ysbrWc6X9iu0NYhMxewBMqajcCGNiAIzDquq2zlXtzn5SXn5UOxJfzicR8MvnTXr/yg+MaK5zdMCCzFO9GmGXyOOubCXo/QbE+POIloft9dgKNPKmEJ5+E5hB7U5VJ+85By3kKquZeppulFHHUWG1OEankwg8gdxKqI3fcnvJnc/GbNsLBBxuVuxwWB0Kd+qRV6XfjGIkan8a2HNPlTHNMWXRaeHrJ7m1FGHX8cgR6y1qPj7fmU2xv/PzS8tWzWDu9UfVQ==
VIRTUALXML_GET_CADENA[5]: ||4.0|J|999999|2017-08-22T08:26:14|99|30001000000300023708|Por Definir|100.00|MXN|116.00|I|PPD|66269|AAA010101AAA|MIRADOR AUTOMOTRIZ, S.A. DE C.V.|601|MVA021112M8A|PRUEBA|G03|01010101|1|H87|Servicio|PRUEBA|100|100|100|002|Tasa|0.160000|16|002|Tasa|0.160000|16.00|16.00||
VIRTUALXML_GET_SATCSDNUMBER[6]: 20001000000300022323
VIRTUALXML_GET_SATSELLO[7]: jynm9eepM9TAOgykOpIQ6KHwc45ZZL7lwpQppyl2ggzrBZ9J9SRSmPGR/tnCgdzdjapMlLRYmcyKfk76EKNfwn7gDsmP8i4BV2jwgGqD+EJ73hSjpB5M69XykVI4vltJN0prGXtReJzl2UBIHQJRnAKxm+vuept+88oBnYpHjTpkYkybMb+t4DrSEL9GO7Cbx8xosUD20HpPCtMk/4Po4ucGSAR8X5sDQKokMjvrEm8fftyxWgKRSI4inZHcAUNiIXxuHfogRTH57awreGyZGraf8nm3TGXFOGWHy1nxI3O3UkaCu+A3ZuDqvAczc3eTy0kF4XAXk942JrDzgQYCTA==
VIRTUALXML_GET_SATCADENA[8]: ||1.1|2ADF43A0-393B-4F3D-AF25-F1A4797EFB05|2017-08-22T14:58:58|FEL100622S88|L7U9zYzmSCGtrzsaryv3K4Zhn/n4tDon/sm5MoJsYYCuQcFtUCMtJlN05hlt7D+I4g7+fvoiJbmKL+96ysbrWc6X9iu0NYhMxewBMqajcCGNiAIzDquq2zlXtzn5SXn5UOxJfzicR8MvnTXr/yg+MaK5zdMCCzFO9GmGXyOOubCXo/QbE+POIloft9dgKNPKmEJ5+E5hB7U5VJ+85By3kKquZeppulFHHUWG1OEankwg8gdxKqI3fcnvJnc/GbNsLBBxuVuxwWB0Kd+qRV6XfjGIkan8a2HNPlTHNMWXRaeHrJ7m1FGHX8cgR6y1qPj7fmU2xv/PzS8tWzWDu9UfVQ==|20001000000300022323||
VIRTUALXML_GET_SATUUID[9]: 2ADF43A0-393B-4F3D-AF25-F1A4797EFB05
VIRTUALXML_GET_SATFECHA[10]: 2017-08-22T14:58:58
VIRTUALXML_GET_CSDINI[11]: 170518035456Z
VIRTUALXML_GET_CSDFIN[12]: 210518035456Z
VIRTUALXML_GET_VPID[13]: 407708
VIRTUALXML_GET_DISP[14]: 5000
VIRTUALXML_GET_DLLVERSION[15]: vxml220108v1.0.3.5
VIRTUALXML_GET_FECHAXML[16]: 2017-08-22T08:26:14
VIRTUALXML_GET_WARN[17]:
VIRTUALXML_GET_PAC[18]: SWE
VIRTUALXML_GET_REVISION[19]: x86
VIRTUALXML_GET_SATRFCPROVCERTIF[20]: FEL100622S88
VIRTUALXML_GET_SATLEYENDA[21]:

Vease Tambien