VirtualXML es una librería de funciones para facturación electrónica en formato DLL para Windows de 32 y 64 bits desarrollada por Cibernética y Tecnología, S.A. de C.V. desde el año 2012.
VirtualXML
crea archivos XML 100% compatibles con las versiones 3.3 y 4.0 de
Comprobantes Fiscales Digitales, de acuerdo a las especificaciones del
Anexo 20 de la RMF, de una manera fácil y efectiva, simplemente
llamando a un conjunto de funciones especificamente diseñadas para
crear todos y cada uno de los nodos de un documento XML CFDI, por lo
que los XMLs generados con ella pasan perfectamente todas las
validaciones del SAT.
VirtualXML adicionamente firma digitalmente los XMLs generados, genera sello digital de la factura y envía a certificar digitalmente el documento (timbre fiscal digital) a nuestro servicio VirtualPAC.
VirtualXML es compatible con todos los lenguajes de programación que soporten el uso de DLLs para el sistema operativo Windows, desde la version XP Service pack 2 hasta Windows 11, pasando por Windows Server desde 2008 hasta 2022.
Para los lenguajes que no soporten el uso de DLLs, VirtualXML provee de un "ejecutable externo" y su propio lenguaje interpretado (scripting) que mediante la generación de un archivo de texto con la extensión VXML le permitirá hacer uso de todas y cada una de las funciones de la libreria externamente.
¿ Cómo funciona VirtualXML ?
Las
funciones de VirtualXML van "construyendo" en la memoria de la
computadora un archivo XML, de acuerdo a la versión de facturación
electrónica que se desea certificar: 3.3 o 4.0
Cada
función de VirtualXML va creando determinados nodos del archivo
XML, cuyos atributos son los valores pasados a la función como
parámetros, si un parámetro no se manda, el atributo no se crea.
Usar VirtualXML es muy sencillo, comenzamos con la asignación a una variable del resultado de una llamada simple a la primer función:
hXml := VirtualXML_New ( "4.0" )
Esta llamada a la primer función de VirtualXML hace 2 cosas:
- Crea un "handle", un espacio en memoria donde se va a generar el archivo XML. Este "handle" es un valor numérico que será usado como primer parámetro en las llamadas subsecuentes a otras funciones de VirtualXML.
- Agrega al XML que se está creando en la memoria de la computadora la siguiente información, en este caso, hemos elegido crear un XML de la versión 4.0 de CFDI:
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
Version="4.0"
</cfdi:Comprobante>
A partir de este punto, cada llamada a una función de VirtualXML creará un nodo y sus distintos atributos, por ejemplo, si deseamos agregar mas información al nodo <cfdi:Comprobante> haremos:
VirtualXML_SetComprobanteInfo_cfdi40( hXml,"CJZ","7303","2022-01-27T13:43:33","99","CREDITO","6034.48","0.00","MXN","1","7000.00","I","PPD","32350","","01" )
Lo cual complementará el nodo del XML del ejemplo anterior, el cual quedará (en la memoria de la computadora) asi:
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.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>
Podemos seguir llamando funciones, por ejemplo, para añadir la información de emisor y receptor del CFDI usaremos:
VirtualXML_SetEmisorInfo_cfdi40 (hXml,"EKU9003173C9","ESCUELA KEMPER URGATE","601","" )
VirtualXML_SetReceptorInfo_cfdi40 ( hXml,"CTE940531F58","CIBERNETICA Y TECNOLOGIA","","","G03","53050","601" )
Y nuestro XML en memoria ahora quedaría así:
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.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>
Ahora agreguemos un concepto y sus respectivos impuestos:
VirtualXML_AddConcepto_cfdi40 ( hXml,"43211500","EQU-0025","1.000","H87","Computadora","COMPUTADORA HP PORTATIL","6034.48","6034.48","0.00","02" )
VirtualXML_AddConceptoTraslado_cfdi40 ( hXml,"6034.48","002","Tasa","0.160000","965.52" )
Nuestro XML en memoria ahora está así:
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.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:Comprobante>
Finalmente, agregaremos información de los impuestos:
VirtualXML_SetImpuestosInfo_cfdi40 ( hXml, "152.00", "" )
VirtualXML_AddTraslado_cfdi40 ( hXml, "002", "Tasa", "0.160000", "152.00" )
Nuestro XML en memoria está listo !!!!!!:
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.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="152.00">
<cfdi:Traslados>
<cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="152.00"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Comprobante>
Ahora podemos "procesarlo". Este "procesamiento" realiza 4 operaciones:
- Firma digitalmente el documento conviertiendo el archivo .CER a Base64 y complementa los atributos Certificado y NoCertificado.
- Genera el Sello Digital del comprobante usando el archivo .KEY y su password (genera cadena original, digesto SHA-256 para CFDI 3.3 ó SHA-1 para CFDI 3.2 y encriptamiento RSA-Encrypt para ambos casos)
- Envía a nuestro servicio VirtualPAC el comprobante para que sea firmado por alguno de nuestros Proveedores Autorizado de Certificacion
- Recoge el resultado del proceso de timbrado, genera el CBB
en formato BMP y PNG y escribe a disco el archivo XML final el cual se
encuenta Firmado, Sellado y Timbrado digitalmente.
VirtualXML_ProcesaDocumento (hXml,"CSD_EKU9003173C9.cer","CSD_EKU9003173C9.key","12345678a","demoIngresoCFDI40.xml")
Esta función devuelve un valor numérico, si este valor es "0" (cero) el procesamiento del XML ha sido exitoso, de lo contrario devuelve un valor numérico negativo, para conocer una descripción del código de error se puede consultar la tabla de Códigos de error.
Si el procesamiento fue exitoso, entoces podemos recuperar los valores que deberán ir en el documento impreso, estos valores se recuperan con uno o varios llamados a la función:
VirtualXML_GetValue (hXml, <valor a recuperar>)
Esta función devuelve una cadena de caracteres con el valor a recupera, estos valores son 21 y se obtienen pasando un número del 1 al 21 en el parámetro <valor a recuperar>. Estos valores se pueden consultar en la tabla de Valores para recuperar información.
Por último liberamos el espacio en memoria ocupado por el XML porque ya no lo vamos a utilizar mas con la función:
VirtualXML_Free (hXml)
Class | Description | |
---|---|---|
VirtualXML |
Libreria VirtualXML
| |
VirtualXML_Wrappers |
Tabla | Descripción | |
---|---|---|
VirtualXML VirtualXML_Errors_Code |
Codigos de Error devueltos por las funciones de procesamiento
| |
VirtualXML VirtualXML_Values_Code |
Codigos para obtener valores del procesamiento usadas en las funciones GetValue
|