
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
virtualxml-cfdi
Advanced tools
Modulo para generar, firmar, sellar, timbrar y cancelar comprobantes fiscales digitales en Mexico (CFDI 4.0)
Librería para la generación y cancelación de CFDI 4.0 y CFDI 3.3, incluidos todos los complementos vigentes. Incluye el proceso de firmado, Sellado y tambien el Timbrado por medio del servicio de VirtualPAC, de acuerdo a la especificación del SAT.
NPM:
$ npm install --save virtualxml-cfdi
NOTA: Los archivos .cer/.key de la FIEL no funcionan para el proceso de timbrado, deberan usarse los del CSD
Estas credenciales pueden usarse sin necesidad de ningun tipo de registro
Procesa la solicitud de cancelación y devuelve el Acuse de solicitud/estatus Cancelación en caso de ser exitoso.
Esta funcion implementa los nuevos requisitos de cancelacion aplicables a partir de 2022.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| uuid | Cadena | Sí | FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF |
| motivo | Cadena | Sí | 02 |
| foliosust | Cadena | Sí | Texto en blanco si no se usa |
| certificado | Cadena | Sí | ./MisCertificados/EKU9003173C9.cer o Base64 (MIIF+TCCA+GgAwIBAgI...) |
| llaveprivada | Cadena | Sí | ./MisCertificados/EKU9003173C9.key o Base64 (MIIFDjBABgkqhkiG9w0...) |
| clave | Cadena | Sí | 12345678a |
| outbasepath | Cadena | No | ../../salida/ |
| outprefix | Cadena | No | prefijo |
| outsuffix | Cadena | No | sufijo |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un exitcode = 201 o exitcode = 202, un uuid y un acuse. Cualquier otro valor sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 201,
"message": "201 - Solicitud de cancelación recibida."
"uuid": "025357315-4D60-4E56-A056-7AA0B1D8D95F",
"acuse": "XML del acuse en base64"
}
Resolve (Then)
{
"exitcode": 202,
"message": "202 - UUID Previamente cancelado."
"uuid": "025357315-4D60-4E56-A056-7AA0B1D8D95F",
"acuse": "XML del acuse en base64"
}
Reject (Catch)
{
"exitcode": 205,
"message": "CA205 - El UUID no existe => Error al cancelar el UUID de la factura"
}
Agrega al Stack FIFO una llamada referenciada a la funcion funcName con los parámetros especificados.
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| funcName | Cadena | Sí | VirtualXML_SetEmisorInfo_cfdi40 |
| ...args | Multi parámetros | Sí | 'EKU9003173C9', 'NombreDelEmisorRazónSocial', '601' |
NOTA: Dependiendo de la funcion referenciada (funcName), el numero de parámetros varía. Ver las funciones disponibles y numero de argumentos en la sección funciones referenciadas para timbrado
Procesa Stack de funciones e intenta timbrar el documento generado.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| certificado | Cadena | Sí | ./MisCertificados/EKU9003173C9.cer o Base64 (MIIF+TCCA+GgAwIBAgI...) |
| llaveprivada | Cadena | Sí | ./MisCertificados/EKU9003173C9.key o Base64 (MIIFDjBABgkqhkiG9w0...) |
| clave | Cadena | Sí | 12345678a |
| outbasepath | Cadena | No | ../../salida/ |
| outprefix | Cadena | No | prefijo |
| outsuffix | Cadena | No | sufijo |
| qrpng | Bool | No | true |
| qrbmp | Bool | No | false |
| qrjpg | Bool | No | false |
| Bool | No | true |
Retorno
Regresa una promesa. Un timbrado exitoso resolvera la promesa (resolve/then) y la respuesta contendra un exitcode = 0, un uuid y un xmltimbrado. Cualquier otro valor sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
"uuid": "025357315-4D60-4E56-A056-7AA0B1D8D95F",
"xmltimbrado": "XML en base64",
"cadenasat": "Cadena Original del complemento de certificación digital del SAT",
"qrpng": "QR.png en base64",
"qrjpg": "QR.jpg en base64",
"qrbmp": "QR.bmp en base64",
"pdf": "Representacion impresa PDF en base64",
}
Reject (Catch)
{
"exitcode": -5,
"message": "Algunas funciones no son validas: VirtualXML_NoExiste"
}
Métodos útiles para la gestion y mantenimiento de RFC emisores, usuarios (distribuidores) y la asignación de timbres manual o automática; posibilitando una administracion por medio del este paquete sin necesidad de hacer uso del portal administrativo. Para el uso de todos estos métodos, es requerida una APIKEY
Alta de un nuevo RFC emisor.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| pwdconsulta | Cadena | Sí | SomeSecret. Usar texto en blanco para no establecer el valor |
| razonsocial | Cadena | Sí | Some Company AC. |
| Cadena | Sí | email@soporte.com. Texto en blanco si no se usa | |
| contacto | Cadena | Sí | IT guy. Texto en blanco si no se usa |
| asignacion | Int | Sí | 100 |
| suspendido | Bool | Sí | false |
| notificacion | Bool | Sí | true |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "RFC previamente agregado"
}
Actualizacion de la informacion general de un RFC emisor asociado a la cuenta del usuario.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| pwdconsulta | Cadena | Sí | SomeSecret. Usar texto en blanco para no establecer o alterar el valor actual |
| razonsocial | Cadena | Sí | Some Company AC. |
| Cadena | Sí | email@soporte.com. Texto en blanco si no se usa | |
| contacto | Cadena | Sí | IT guy. Texto en blanco si no se usa |
| suspendido | Bool | Sí | false |
| notificacion | Bool | Sí | true |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -3,
"message": "Usuario/APIKEY invalida"
}
Realiza una asignacion de timbres al RFC emisor.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| asignacion | Int | Sí | 100 |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "No se permiten asignaciones en 0 o negativas"
}
Crea o modifica la regla de autoasignación de timbres al RFC emisor. Cuando el total de timbres disponibles del emisor alcance el valor threshold, se asignaran el numero de timbres asignacion siempre que la regla se encuentre activa y el número de timbres totales asignados historicamente al emisor no supere el valor limite.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| rfcemisor | Cadena | Sí | EKU9003173C9 |
| asignacion | Int | Sí | 100 |
| threshold | Int | Sí | 20 |
| limit | Int | Sí | 5000 |
| active | Bool | Sí | false |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "Los timbres para asignar no debe ser mayor al total de tus timbres disponibles"
}
Alta de un usuario-hijo (distribuidor) relacionado al usuario actual. Este usuario podrá gestionar sus propios emisores y timbres de forma independiente pero podra recibir asignacion de timbres directamente del usuario padre.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| distribuidor | Cadena | Sí | childUserName |
| pwd | Cadena | Sí | SomeSecret. Usar texto en blanco para no establecer el valor |
| razonsocial | Cadena | Sí | Some Company AC. |
| Cadena | Sí | email@soporte.com. Texto en blanco si no se usa | |
| contacto | Cadena | Sí | IT guy. Texto en blanco si no se usa |
| asignacion | Int | Sí | 100 |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "Ya existe un usuario con este nombre"
}
Actualizacion de la informacion general de un usuario-hijo (distribuidor) RFC emisor asociado a la cuenta del usuario actual.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| distribuidor | Cadena | Sí | childUserName |
| pwd | Cadena | Sí | SomeSecret. Usar texto en blanco para no establecer o alterar el valor actual |
| razonsocial | Cadena | Sí | Some Company AC. |
| Cadena | Sí | email@soporte.com. Texto en blanco si no se usa | |
| contacto | Cadena | Sí | IT guy. Texto en blanco si no se usa |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "Nombre de usuario en blanco"
}
Realiza una asignacion de timbres al usuario-hijo (distribuidor) tomando los timbres disponibles del usuario actual.
Parametros
| Nombre | Tipo | Requerido | Ejemplo |
|---|---|---|---|
| apikey | Cadena | Sí | 1pIp-j-ZVVff2H2-Y54yTtYpW-Uhdffw8Pb3pJGRt7o |
| usuario | Cadena | Sí | demo_nodejs |
| distribuidor | Cadena | Sí | childUserName |
| asignacion | Int | Sí | 100 |
| reserved | Cadena | No |
Retorno
Regresa una promesa. Una solicitud exitosa resolvera la promesa (resolve/then) y la respuesta contendra un campo exitcode y message. Cualquier valor de exitcode diferente a 0 sera un error en el proceso y debera referirse al mensaje message = ... normalmente en el rechazo (reject/catch) de la promesa
Resolve (Then)
{
"exitcode": 0,
"message": ""
}
Reject (Catch)
{
"exitcode": -2,
"message": "Nombre de usuario en blanco"
}
El siguiente diagrama muestra el proceso de timbrado completo:

En el siguiente enlace se podra descargar un demo que incluye:
NOTA: El paquete virtualxml-cfdi puede ejecutarse en cualquier version Node 4+. Este demo utiliza la version minima de Node 12+
Descarga aqui - version minima NodeJS v12+
Abrir linea de comandos en folder server y ejecutar:
$ npm install
$ npm start
Abrir linea de comandos en folder client
$ npm install
$ npm start
Abrir browser en direccion http://localhost:3000 y probar el demo.
Estas funciones son añadidas a una pila FIFO (FirstIn-FirstOut) para ser enviadas y ejecutadas remotamente. Constan de un nombre funcName y de 1 o mas parámetros.
Las funciones se agregan a la pila mediante el metodo addFunctionCall una vez que la clase VirtualXML ha sido instanciada. El siguiente ejemplo ilustra el modo de uso:
Los parámetros de funcName deberan ser de tipo cadena independientemente del tipo de dato que representen, y deberan tener el formato que corresponda de acuerdo a los lineamientos del SAT.
Los parámetros de funcName deberan ser una cadena vacia si no contiene informacion, y debera respetarse la posicion de los mismos.
const VirtualXML = require('virtualxml-cfdi');
const vxml = new VirtualXML(); // Nueva Instancia
vxml.addFunctionCall( 'VirtualXML_SetComprobanteInfo_cfdi40', // **funcName**
'NOM', // param01 = Serie
'1', // param02 = Folio
'2018-01-30T05:24:30', // param03 = Fecha
'01', // param04 = FormaPago
'CondiciónDePago', // param05 = CondicionesDePago
'5000.00', // param06 = SubTotal
'', // param07 = Descuento
'MXN', // param08 = Moneda
'', // param09 = TipoCambio
'5000.00', // param10 = Total
'I', // param11 = TipoDeComprobante
'PUE', // param12 = MetodoPago
'68025', // param13 = LugarExpedicion
'', // param14 = Confirmacion
'01'); // param15 = Exportacion
Se pueden agregar tantas llamadas como se necesiten para el correcto llenado del CFDI, teniendo en cuenta que algunos elementos que pueden aparecer varias veces (ej. cfdi.Conceptos), a su vez podran contener un detalle y las funciones del detalle afectaran al ultimo elemento padre al que pertenece. Por ejemplo:
const VirtualXML = require('virtualxml-cfdi');
const vxml = new VirtualXML(); // Nueva Instancia
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'A', '1', FechaCFDI, '99', 'Contado Comercial', '1000.00', '50.00', 'MXN', '', '1102.00', 'I', 'PPD', '53050', '', '01');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'MAG041126GT8', 'NombreDelReceptorRazónSocial', '', '', 'G01', '53050', '601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', 'SEFXXX', '1', 'H87', 'Unidad', 'Paquete X - ObjetoImp1', '500.00', '500.00', '', '02');
vmlx.addFunctionCall('VirtualXML_AddConceptoCuentaPredial_cfdi40','5678901');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', 'SEFXXX', '2', 'H87', 'Unidad', 'Paquete X - ObjetoImp2', '250.00', '500.00', '50.00', '02');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', 'SEFXXX', '2', 'H87', 'Unidad', 'Paquete X - ObjetoImp3', '250.00', '500.00', '50.00', '02');
vxml.addFunctionCall('VirtualXML_AddConceptoTraslado_cfdi40', '450.00', '002', 'Tasa', '0.160000', '72.00');
// Para funciones que afectan informacion unica, NO importa el momento en que se llamen
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'NombreDelEmisorRazónSocial', '601','');
// Esta funcion afectara al ultimo CONCEPTO agregado
vmlx.addFunctionCall('VirtualXML_AddConceptoRetencion_cfdi40','3000.00','003','Tasa','0.300000','900.00');
El resultado seria un CFDI con la siguiente estructura:
CFDI
|--Emisor
|--Receptor
|--Conceptos
|--Concepto01
|--CuentaPredial
|--Concepto02
|--Concepto03
|--Impuestos
|--Traslado
|--Retencion
VirtualXML_SetComprobanteInfo_cfdi40
VirtualXML_SetInformacionGlobal_cfdi40
VirtualXML_AddCfdiRelacionados_cfdi40
VirtualXML_AddCfdiRelacionado_cfdi40 (Usar antes AddCfdiRelacionados_cfdi40)
VirtualXML_SetEmisorInfo_cfdi40
VirtualXML_SetReceptorInfo_cfdi40
VirtualXML_SetImpuestosInfo_cfdi40
VirtualXML_AddTraslado_cfdi40 (Usar antes SetImpuestosInfo_cfdi40)
VirtualXML_AddRetencion_cfdi40 (Usar antes SetImpuestosInfo_cfdi40)
VirtualXML_SetAddenda
VirtualXML_SetAddendaText
VirtualXML_AddConcepto_cfdi40
VirtualXML_AddConceptoTraslado_cfdi40 (Usar antes AddConcepto_cfdi40)
VirtualXML_AddConceptoRetencion_cfdi40 (Usar antes AddConcepto_cfdi40)
VirtualXML_AddConceptoInformacionAduanera_cfdi40 (Usar antes AddConcepto_cfdi40)
VirtualXML_AddConceptoCuentaPredial_cfdi40 (Usar antes AddConcepto_cfdi40)
VirtualXML_AddConceptoParte_cfdi40 (Usar antes AddConcepto_cfdi40)
VirtualXML_SetConceptoACuentaTerceros_cfdi40 (Usar antes AddConcepto_cfdi40)
La respuesta de este complemento incluye la URL usada para el QR especifico CCP30, y de solicitarse las imagenes de QR, tambien el QRCCP30
VirtualXML_SetCartaPorte30
VirtualXML_CartaPorte30AddUbicacion (Usar antes SetCartaPorte30)
VirtualXML_CartaPorte30SetMercancias
VirtualXML_CartaPorte30AddMercancia (Usar antes CartaPorte30SetMercancias)
VirtualXML_CartaPorte30SetDetalleMercancia (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30AddMercanciaDocumentacionAduanera (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30AddMercanciaGuiasIdentificacion (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30AddMercanciaCantidadTransporta (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30SetMercanciasAutotransporte (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30SetMercanciasTransporteMaritimo (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30SetMercanciasTransporteMaritimoRemolquesCCP (Usar antes CartaPorte30SetMercanciasTransporteMaritimo)
VirtualXML_CartaPorte30AddMercanciasTransporteMaritimoContenedor (Usar antes CartaPorte30SetMercanciasTransporteMaritimo)
VirtualXML_CartaPorte30SetMercanciasTransporteAereo (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30SetMercanciasTransporteFerroviario (Usar antes CartaPorte30AddMercancia)
VirtualXML_CartaPorte30AddMercanciasTransporteFerroviarioDerechosDePaso (Usar antes CartaPorte30SetMercanciasTransporteFerroviario)
VirtualXML_CartaPorte30AddMercanciasTransporteFerroviarioCarro (Usar antes CartaPorte30SetMercanciasTransporteFerroviario)
VirtualXML_CartaPorte30AddMercanciasTransporteFerroviarioCarroContenedor (Usar antes CartaPorte30SetMercanciasTransporteFerroviario)
VirtualXML_CartaPorte30AddFiguraTransporteTiposFigura
VirtualXML_CartaPorte30AddFiguraTransporteTiposFiguraPartesTransporte (Usar antes CartaPorte30AddFiguraTransporteTiposFigura)
VirtualXML_SetNomina12
VirtualXML_Nomina12SetEmisor (Usar antes SetNomina12)
VirtualXML_Nomina12SetReceptor (Usar antes SetNomina12)
VirtualXML_Nomina12AddSubContratacion (Usar antes Nomina12SetReceptor)
VirtualXML_Nomina12SetPercepciones (Usar antes SetNomina12)
VirtualXML_Nomina12AddPercepcion (Usar antes Nomina12SetPercepciones)
VirtualXML_Nomina12SetJubilacionPensionRetiro (Usar antes Nomina12SetPercepciones)
VirtualXML_Nomina12SetSeparacionIndemnizacion (Usar antes Nomina12SetPercepciones)
VirtualXML_Nomina12SetDeducciones (Usar antes SetNomina12)
VirtualXML_Nomina12AddDeduccion (Usar antes Nomina12SetDeducciones)
VirtualXML_Nomina12AddOtroPago (Usar antes SetNomina12)
VirtualXML_Nomina12AddIncapacidad (Usar antes SetNomina12)
VirtualXML_SetComercioExterior20
VirtualXML_CCE20SetEmisor (Usar antes SetComercioExterior20)
VirtualXML_CCE20SetReceptor (Usar antes SetComercioExterior20)
VirtualXML_CCE20AddDestinatario (Usar antes SetComercioExterior20)
VirtualXML_CCE20AddDestinatarioDomicilio (Usar antes CCE20AddDestinatario)
VirtualXML_CCE20AddPropietario (Usar antes SetComercioExterior20)
VirtualXML_CCE20AddMercancia (Usar antes SetComercioExterior20)
VirtualXML_CCE20AddMercanciaDescripcionesEspecificas (Usar antes CCE20AddMercancia)
VirtualXML_SetPagos20
VirtualXML_Pagos20AddPago (Usar antes SetPagos20)
VirtualXML_Pagos20AddPagoDoctoRelacionado (Usar antes Pagos20AddPago)
VirtualXML_Pagos20AddPagoDoctoRelacionadoRetencionDR (Usar antes Pagos20AddPagoDoctoRelacionado)
VirtualXML_Pagos20AddPagoDoctoRelacionadoTrasladoDR (Usar antes Pagos20AddPagoDoctoRelacionado)
VirtualXML_Pagos20AddPagoImpuestosPRetencionP (Usar antes Pagos20AddPago)
VirtualXML_Pagos20AddPagoImpuestosPTrasladoP (Usar antes Pagos20AddPago)
VirtualXML_SetImpuestosLocales10
VirtualXML_ImpLocal10AddRetencionesLocales (Usar antes SetImpuestosLocales10)
VirtualXML_ImpLocal10AddTrasladosLocales (Usar antes SetImpuestosLocales10)
VirtualXML_SetINE11
VirtualXML_INE11AddEntidad (Usar antes SetINE11)
VirtualXML_INE11AddEntidadContabilidad (Usar antes INE11AddEntidad)
VirtualXML_SetAerolineas10
VirtualXML_Aerolineas10AddCargo (Usar antes SetAerolineas10)
VirtualXML_SetNotariosPublicos10
VirtualXML_NotariosPublicos10AddDescInmueble (Usar antes SetNotariosPublicos10)
VirtualXML_NotariosPublicos10AddDatosUnEnajenante (Usar antes SetNotariosPublicos10)
VirtualXML_NotariosPublicos10AddDatosEnajenanteCopSC (Usar antes SetNotariosPublicos10)
VirtualXML_NotariosPublicos10AddDatosUnAdquiriente (Usar antes SetNotariosPublicos10)
VirtualXML_NotariosPublicos10AddDatosAdquirienteCopSC (Usar antes SetNotariosPublicos10)
VirtualXML_SetRenovSustitVehiculos10
VirtualXML_RenovSustitVehiculos10AddRenovVehicular (Usar antes SetRenovSustitVehiculos10)
VirtualXML_RenovSustitVehiculos10AddRenovVehicularVehiculoUsado (Usar antes RenovSustitVehiculos10AddRenovVehicular)
VirtualXML_RenovSustitVehiculos10AddSustitVehicular (Usar antes SetRenovSustitVehiculos10)
VirtualXML_SetVehiculoUsado10
VirtualXML_VehiculoUsado10AddInformacionAduanera (Usar antes SetVehiculoUsado10)
VirtualXML_SetEstadoDeCuentaCombustible12
VirtualXML_EstadoDeCuentaCombustible12AddConcepto (Usar antes SetEstadoDeCuentaCombustible12)
VirtualXML_EstadoDeCuentaCombustible12AddConceptoTraslado (Usar antes EstadoDeCuentaCombustible12AddConcepto)
VirtualXML_SetConsumoDeCombustibles11
VirtualXML_ConsumoDeCombustibles11AddConcepto (Usar antes SetConsumoDeCombustibles11)
VirtualXML_ConsumoDeCombustibles11AddConceptoDeterminado (Usar antes ConsumoDeCombustibles11AddConcepto)
VirtualXML_SetValesDeDespensa10
VirtualXML_ValesDeDespensa10AddConcepto (Usar antes SetValesDeDespensa10)
VirtualXML_SetDetallista10
VirtualXML_Detallista10AddOrderIdentificationReferenceIdentification (Usar antes SetDetallista10)
VirtualXML_Detallista10AddAdditionalInformationReferenceIdentification (Usar antes SetDetallista10)
VirtualXML_Detallista10AddSpecialInstruction (Usar antes SetDetallista10)
VirtualXML_Detallista10AddDeliveryNote (Usar antes SetDetallista10)
VirtualXML_Detallista10AddCustoms (Usar antes SetDetallista10)
VirtualXML_Detallista10AddCurrency (Usar antes SetDetallista10)
VirtualXML_Detallista10AddShipmentDetail (Usar antes SetDetallista10)
VirtualXML_Detallista10AddAllowanceCharge (Usar antes SetDetallista10)
VirtualXML_Detallista10AddTotalAllowanceCharge (Usar antes SetDetallista10)
VirtualXML_Detallista10AddLineItem (Usar antes SetDetallista10)
VirtualXML_Detallista10AddLineItemAlternateTradeItemIdentification (Usar antes Detallista10AddLineItem)
VirtualXML_Detallista10AddLineItemAditionalQuantity (Usar antes Detallista10AddLineItem)
VirtualXML_Detallista10AddLineItemCustoms (Usar antes Detallista10AddLineItem)
VirtualXML_Detallista10AddLineItemExtendedAttributes (Usar antes Detallista10AddLineItem)
VirtualXML_Detallista10AddLineItemAllowanceCharge (Usar antes Detallista10AddLineItem)
VirtualXML_Detallista10AddLineItemTradeItemTaxInformation (Usar antes Detallista10AddLineItem)
VirtualXML_AddComplemento
VirtualXML_AddComplementoConcepto
VirtualXML_AddNameSpace Agrega un namespace al nodo principal XML del CFDI.
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
vxml.cancelaCFDI2022("demo_nodejs", // usuario VirtualPAC
"EKU9003173C9", // rfcemisor
"163feb31-9c01-40f0-b85b-ebe1c771da1f", // UUID
"02", // Motivo
"", // folioSustitucion
"./test/CSD_EKU9003173C9.cer", // CER
"./test/CSD_EKU9003173C9.key", // KEY
"12345678a", // usuario PWD
"./test/out/", // ruta para guardar acuse generado
"prefijo", // prefijo de archivo para acuse generado
"cancelacion") // sufijo de archivo para acuse generado
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'A', '1', FechaCFDI, '99', 'Contado Comercial', '1000.00', '50.00', 'MXN', '', '1102.00', 'I', 'PPD', '53050', '', '01');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionados_cfdi40', '04', 'FF93C8BE-AF7B-4FC5-8854-6DAE18CFB5B4', 'D8E18C2F-2859-4927-A0F0-EA3E93642DDC', '', '', '', '', '', '', '', '');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionado_cfdi40', 'BE1D4B47-E167-47A3-8049-70D4D43BCBE8');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionados_cfdi40', '01', 'FDBA380A-9732-4FB5-A6CB-5FB4BD831697', '', '', '', '', '', '', '', '', '');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE SA DE CV', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'CTE940531F58', 'CIBERNETICA Y TECNOLOGIA SA DE CV', '', '', 'G01', '53050', '601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', 'SEFXXX', '1', 'H87', 'Unidad', 'Paquete X - ObjetoImp2', '500.00', '500.00', '', '02');
vxml.addFunctionCall('VirtualXML_AddConceptoTraslado_cfdi40', '500.00', '002', 'Tasa', '0.160000', '80.00');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', 'SEFXXX', '2', 'H87', 'Unidad', 'Paquete X - ObjetoImp2', '250.00', '500.00', '50.00', '02');
vxml.addFunctionCall('VirtualXML_AddConceptoTraslado_cfdi40', '450.00', '002', 'Tasa', '0.160000', '72.00');
vxml.addFunctionCall('VirtualXML_SetImpuestosInfo_cfdi40', '152.00', '');
vxml.addFunctionCall('VirtualXML_AddTraslado_cfdi40', '002', 'Tasa', '0.160000', '152.00', '950.00');
vxml.addFunctionCall('VirtualXML_SetAddenda', '<MyOwnNode name="CFDI40"><AnyChildNode data="BASICO" /></MyOwnNode>');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_Basico_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40','RogueOne','HNFK231',FechaCFDI,'01','','25000.00','','MXN','1','28000.00','I','PUE','06300','','01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40','EKU9003173C9','ESCUELA KEMPER URGATE SA DE CV','601','');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40','CTE940531F58','CIBERNETICA Y TECNOLOGIA SA DE CV','','','G03','53050','601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40','78101500','01','1','E48','SERVICIO','FLETE','25000.00','25000.00','','02');
vxml.addFunctionCall('VirtualXML_AddConceptoRetencion_cfdi40','25000.00','002','Tasa','0.040000','1000.00');
vxml.addFunctionCall('VirtualXML_AddConceptoTraslado_cfdi40','25000.00','002','Tasa','0.160000','4000.00');
vxml.addFunctionCall('VirtualXML_SetImpuestosInfo_cfdi40','4000.00','1000.00');
vxml.addFunctionCall('VirtualXML_AddRetencion_cfdi40','002','1000.00');
vxml.addFunctionCall('VirtualXML_AddTraslado_cfdi40','002','Tasa','0.160000','4000.00','25000.00');
vxml.addFunctionCall('VirtualXML_SetCartaPorte20','No','','','','2');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddUbicacion','Origen','OR101010','EKU9003173C9','','','','','','','2021-11-01T00:00:00','','','calle','211','','0347','23','casa blanca 1','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddUbicacion','Destino','DE202020','EKU9003173C9','','','','','','','2021-11-01T01:00:00','','1','calle','214','','0347','23','casa blanca 2','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddUbicacion','Destino','DE202021','EKU9003173C9','','','','','','','2021-11-01T02:00:00','','1','calle','220','','0347','23','casa blanca 3','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_CartaPorte20SetMercancias','2.0','XBX','','2','');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddMercancia','11121900','','Productos de perfumería','1.0','XBX','','','Sí','1266','4H2','','1.0','','','','','','','','','');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddMercanciaCantidadTransporta','1','OR101010','DE202020','');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddMercancia','11121900','','Productos de perfumería','1.0','XBX','','','Sí','1266','4H2','','1.0','','','','','','','','','');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddMercanciaCantidadTransporta','1','OR101010','DE202021','');
vxml.addFunctionCall('VirtualXML_CartaPorte20SetMercanciasAutotransporte','TPAF01','NumPermisoSCT','VL','plac892','2020','SW Seguros','123456789','SW Seguros Ambientales','123456789','SW Seguros','','','CTR003','PAX1234','','');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddFiguraTransporteTiposFigura','01','VAAM130719H60','a234567890','','','','','calle','423','','0347','23','casa azul 1','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddFiguraTransporteTiposFigura','02','VAAM130719H60','','','','','PT01','calle','523','','0347','23','casa azul 2','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddFiguraTransporteTiposFiguraPartesTransporte','PT02');
vxml.addFunctionCall('VirtualXML_CartaPorte20AddFiguraTransporteTiposFigura','04','VAAM130719H60','','','','','','calle','623','','0347','23','casa azul 3','004','COA','MEX','25350');
vxml.addFunctionCall('VirtualXML_SetAddenda', '<MyOwnNode name="CFDI40"><AnyChildNode data="CartaPorte20" /></MyOwnNode>');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_Pagos20_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionados_cfdi40', '01', '', '00000000-0000-0000-0000-000000000002', '', '00000000-0000-0000-0000-000000000004', '', '00000000-0000-0000-0000-000000000006', '', '00000000-0000-0000-0000-000000000008', '', '00000000-0000-0000-0000-000000000010');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionado_cfdi40', '00000000-0000-0000-0000-111111111111');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionados_cfdi40', '02', '00000000-0000-0000-0000-000000000001', '', '00000000-0000-0000-0000-000000000003', '', '00000000-0000-0000-0000-000000000005', '', '00000000-0000-0000-0000-000000000007', '', '00000000-0000-0000-0000-000000000009', '');
vxml.addFunctionCall('VirtualXML_AddCfdiRelacionado_cfdi40', '00000000-0000-0000-0000-222222222222');
vxml.addFunctionCall('VirtualXML_SetInformacionGlobal_cfdi40', '01', '10', '2021');
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', '', '12629', FechaCFDI, '', '', '0', '', 'XXX', '', '0', 'P', '', '53000', '', '01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE SA DE CV', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'CTE940531F58', 'CIBERNETICA Y TECNOLOGIA SA DE CV', '', '', 'P01', '53050', '601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111506', '', '1', 'ACT', '', 'Pago', '0', '0', '', '01');
vxml.addFunctionCall('VirtualXML_SetPagos20', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '34925.52');
vxml.addFunctionCall('VirtualXML_Pagos20AddPago', '2021-01-01T01:01:01', '03', 'USD', '1.00', '13144.66', '0000842', '', '', '', '', '', '', '', '', '');
vxml.addFunctionCall('VirtualXML_Pagos20AddPagoDoctoRelacionado', '88888888-4444-4444-4444-121212121212', 'Serie', 'Folio', 'USD', '1', '2', '13144.66', '13144.66', '0.00', '01');
vxml.addFunctionCall('VirtualXML_Pagos20AddPago', '2021-02-02T02:02:02', '03', 'USD', '1.00', '21780.86', '0000842', '', '', '', '', '', '', '', '', '');
vxml.addFunctionCall('VirtualXML_Pagos20AddPagoDoctoRelacionado', '333-22-999999999', 'Serie2', 'Folio2', 'USD', '1', '3', '14430.86', '14430.86', '0.00', '01');
vxml.addFunctionCall('VirtualXML_Pagos20AddPagoDoctoRelacionado', 'AAAAAAAA-BBBB-CCCC-DDDD-666666666666', 'Serie3', 'Folio3', 'USD', '1', '4', '7350.00', '7350.00', '0.00', '03');
vxml.addFunctionCall('VirtualXML_SetAddenda', '<MyOwnNode name="CFDI40"><AnyChildNode data="Pagos20" /></MyOwnNode>');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_Pagos20_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'N', '1', FechaCFDI, '99', '', '5000.00', '123.90', 'MXN', '', '4876.10', 'N', 'PUE', '53050', '', '01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'AEKU9003173C9', 'NombreDelReceptorPersonaFisica', '', '', 'CN01', '52955', '605');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '84111505', '', '1', 'ACT', '', 'Pago de nómina', '5000.00', '5000.00', '123.90', '01');
vxml.addFunctionCall('VirtualXML_SetNomina12', 'O', '2016-10-31', '2016-10-16', '2016-10-31', '15', '5000.00', '123.90', '');
vxml.addFunctionCall('VirtualXML_Nomina12SetEmisor', '', 'B5510768108', '', '', '');
vxml.addFunctionCall('VirtualXML_Nomina12SetReceptor', 'FOLR670417HDFLPN00', '04078873454', '2016-06-01', 'P21W', '01', 'No', '01', '02', '060', 'Sistemas', 'Director', '2', '04', '021', '', '435.50', '435.50', 'JAL');
vxml.addFunctionCall('VirtualXML_Nomina12SetPercepciones', '5000.00', '', '', '5000.00', '0.00');
vxml.addFunctionCall('VirtualXML_Nomina12AddPercepcion', '001', '001', 'Sueldos, Salarios Rayas y Jornales', '5000.00', '0.00', '', '', '', '', '', '');
vxml.addFunctionCall('VirtualXML_Nomina12SetDeducciones', '123.90', '');
vxml.addFunctionCall('VirtualXML_Nomina12AddDeduccion', '005', '201', 'ISR SALARIOS', '81.00');
vxml.addFunctionCall('VirtualXML_Nomina12AddDeduccion', '001', '202', 'IMSS', '42.90');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_Nomina12_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'CE', '1', FechaCFDI, '', '', '0.00', '', 'MXN', '', '0', 'T', '', '42501', '', '01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '', '', 'S01', '42501', '601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101602', 'A-123LFM', '1', 'DPC', 'Pieza', 'Bombilla 150W', '1000.00', '1000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101600', 'A-123JKL', '1', 'DPC', 'Servicio', 'Bombilla 100W', '2000.00', '2000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101600', 'A-123WHX', '1', 'DPC', 'Servicio', 'Bombilla 75W', '2000.00', '2000.00', '', '01');
vxml.addFunctionCall('VirtualXML_SetComercioExterior20', '02', 'A1', '0', '', '', 'FOB', '', '17.2957', '400.00');
vxml.addFunctionCall('VirtualXML_CCE20AddMercancia', 'A-123LFM', '0101299999', '32', '06', '2.50', '80.00', '', '', '', '');
vxml.addFunctionCall('VirtualXML_CCE20AddMercancia', 'A-123JKL', '0101299999', '100', '06', '1.60', '160.00', '', '', '', '');
vxml.addFunctionCall('VirtualXML_CCE20AddMercanciaDescripcionesEspecificas', 'Sony', 'CD Ray', 'Sax', '478382');
vxml.addFunctionCall('VirtualXML_CCE20AddMercanciaDescripcionesEspecificas', 'Sony', 'PlaystationRay', 'Loc', '023982');
vxml.addFunctionCall('VirtualXML_CCE20AddMercancia', 'A-123WHX', '0101299999', '20', '06', '8.00', '160.00', 'Samsung', 'Grand Prime', 'Mid', '394821');
vxml.addFunctionCall('VirtualXML_CCE20AddMercanciaDescripcionesEspecificas', 'Panasonic', 'TV LCD', 'Noc', '958372');
vxml.addFunctionCall('VirtualXML_CCE20AddMercanciaDescripcionesEspecificas', 'Steeler', 'PC', 'Uta', '847657');
vxml.addFunctionCall('VirtualXML_CCE20SetReceptor', '', 'Avenue Sahara', '74', '', 'BIG DESERT', '', '', '', 'NV', 'USA', '89316');
vxml.addFunctionCall('VirtualXML_CCE20SetEmisor', '', 'Hidalgo', '1000', '', '0716', '03', '', '021', 'NLE', 'MEX', '66050');
vxml.addFunctionCall('VirtualXML_CCE20AddDestinatario', '', '', 'Arquimides', '', '', '', '', '', '', 'YUC', 'ESP', '37284');
vxml.addFunctionCall('VirtualXML_CCE20AddDestinatarioDomicilio', 'Arquimides', '', '', '', '', '', '', 'OAX', 'ESP', '68020');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_ComercioExterior20_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'IEDU', '1', FechaCFDI, '01', 'CondiciónDePago', '5000.00', '', 'MXN', '', '5000.00', 'I', 'PUE', '68025', '', '01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'VEME800513DU2', 'NombreDelReceptorRazónSocial', '', '', 'G03', '62621', '612');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '86121503', 'PCOLMDAN', '1', 'ZZ', '', 'Colegiatura Anual Secundaria', '4000.00', '4000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConceptoComplementoIedu10', 'NOMBRE ALUMNO1', 'AUPA901028HDFRLXA9', 'Secundaria', '0737', '');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '86121503', 'COL_BS', '1', 'E48', '', 'Colegiatura MAR 2024', '1000.00', '1000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConceptoComplementoIedu10', 'NOMBRE ALUMNO2', 'TAZR030610HCSNBDA2', 'Primaria', '07TPR0004R', '');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_iedu10_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
const VirtualXML = require('virtualxml-cfdi');
let vxml = new VirtualXML();
let ts = Date.now() - (new Date().getTimezoneOffset()) * 60000; // GMT-6
let FechaCFDI = (new Date(ts)).toISOString().substring(0, 19); // Fecha formato 2018-03-29T14:22:10
vxml.addFunctionCall('VirtualXML_SetComprobanteInfo_cfdi40', 'CCE20', '1', FechaCFDI, '', '', '0.00', '', 'MXN', '', '0', 'T', '', '42501', '', '01');
vxml.addFunctionCall('VirtualXML_SetEmisorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '601', '');
vxml.addFunctionCall('VirtualXML_SetReceptorInfo_cfdi40', 'EKU9003173C9', 'ESCUELA KEMPER URGATE', '', '', 'S01', '42501', '601');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101602', 'A-123LFM', '1', 'DPC', 'Pieza', 'Bombilla 150W', '1000.00', '1000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101600', 'A-123JKL', '1', 'DPC', 'Servicio', 'Bombilla 100W', '2000.00', '2000.00', '', '01');
vxml.addFunctionCall('VirtualXML_AddConcepto_cfdi40', '39101600', 'A-123WHX', '1', 'DPC', 'Servicio', 'Bombilla 75W', '2000.00', '2000.00', '', '01');
// El fragmentoXML debera contiener la definicion de los namespaces en caso de usarlos
// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
// xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20"
// xsi:schemaLocation="http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd"
vxml.addFunctionCall('VirtualXML_AddComplemento', '<cce20:ComercioExterior xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20" xsi:schemaLocation="http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd" Version="2.0" MotivoTraslado="02" ClaveDePedimento="A1" CertificadoOrigen="0" Incoterm="FOB" TipoCambioUSD="17.2957" TotalUSD="400.00"><cce20:Emisor>...</cce20:Emisor><cce20:Receptor>...</cce20:Receptor><cce20:Destinatario>...</cce20:Destinatario><cce20:Mercancias>...</cce20:Mercancias></cce20:ComercioExterior>');
vxml.emiteCFDI40("demo_nodejs",
"EKU9003173C9",
"./test/CSD_EKU9003173C9.cer",
"./test/CSD_EKU9003173C9.key",
"12345678a",
"./test/out/",
"CFDI40_Complemento_" + (new Date(ts)).toISOString().substring(0, 10),
"nodejs", true, true, true, true)
.then((response) => {
// Handle Response
}).catch((err) => {
// Handle Error
});
1.4.0
1.3.0
1.2.3, 1.2.2, 1.2.1
1.2.0
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
FAQs
Modulo para generar, firmar, sellar, timbrar y cancelar comprobantes fiscales digitales en Mexico (CFDI 4.0)
We found that virtualxml-cfdi demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.