Saltearse al contenido

@nodecfdi/cfdi-to-json

Esta es una herramienta que sigue sus propias convenciones para convertir los archivos de CFDI (XML de SAT) a formato JSON.

Algunas de las convenciones que se siguen son:

  • Los elementos con objetos que contienen los atributos y sus elementos hijos.
  • Los elementos que pueden aparecer más de una vez, son manejados como arreglos.
  • La librería guarda un registro interno de los elementos que pueden aparecer más de una vez.

Libreria inspirada por la versión para php https://github.com/phpcfdi/cfdi-to-json

Primeros pasos

Está libreria depende estrictamente de @nodecfdi/cfdi-core por lo que es recomendable instalarla previo a instalar la libreria cfdi-cleaner.

Instalación

Para comenzar a utilizar la libreria lo primero que hay que hacer es instalarla, corre el siguiente comando en tu terminal:

Ventana de terminal
npm i @nodecfdi/cfdi-to-json --save

Con esto ya tendremos la libreria instalada y lista para ser usada.

Uso básico

Convirtiendo de CFDI (string) a JSON (string)

import { readFileSync } from 'node:fs';
import { JsonConverter } from '@nodecfdi/cfdi-to-json';
// Accedemos al contenido en nuestro archivo XML
const xml = readFileSync('archivo-cfdi.xml').toString('utf8');
const jsonConverter = new JsonConverter();
const json = jsonConverter.convertToJson(xml);
console.info(json);

Convirtiendo de Document a Object

import { Factory } from '@nodecfdi/cfdi-to-json';
// Accedemos al contenido en nuestro archivo XML
let xmlDoc: Document;
const factory = new Factory();
const dataConverter = factory.createConverter();
const rootNode = dataConverter.convertXmlDocument(xmlDoc);
const object = rootNode.toRecord();
console.info(object);

Ejemplo de Salida

Note que:

  • Emisor parece una propiedad más del objeto principal, pero el contenido es un objeto y no una cadena de caracteres.
  • Concepto contiene un arreglo de objetos, cada uno es una representación de un nodo concepto.
  • Traslado contiene un arreglo a pesar de que solo contenga un objeto, se conoce que es múltiple.
  • Complemento es un arreglo a pesar de lo definido en el Anexo 20 porque el XSD dice que puede tener múltiples apariciones.
{
"Certificado": "MIIGH...imAyX",
"CondicionesDePago": "CONTADO",
"Fecha": "2018-01-12T08:15:01",
"Folio": "11541",
"FormaPago": "04",
"LugarExpedicion": "76802",
"MetodoPago": "PUE",
"Moneda": "MXN",
"NoCertificado": "00001000000401220451",
"Sello": "Xt7tK...gdg==",
"Serie": "H",
"SubTotal": "1709.12",
"TipoDeComprobante": "I",
"Total": "2010.01",
"Version": "3.3",
"xsi:schemaLocation": "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd",
"Emisor": {
"Nombre": "PROMOTORA OTIR SA DE CV",
"RegimenFiscal": "601",
"Rfc": "POT9207213D6"
},
"Receptor": {
"Nombre": "DAY INTERNATIONAL DE MEXICO SA DE CV",
"Rfc": "DIM8701081LA",
"UsoCFDI": "G03"
},
"Conceptos": {
"Concepto": [
{
"Cantidad": "2.00",
"ClaveProdServ": "90111501",
"ClaveUnidad": "E48",
"Descripcion": "Paquete",
"Importe": "1355.67",
"Unidad": "UNIDAD DE SERVICIO",
"ValorUnitario": "677.83",
"Impuestos": {
"Traslados": {
"Traslado": [
{
"Base": "1355.67",
"Importe": "216.91",
"Impuesto": "002",
"TasaOCuota": "0.160000",
"TipoFactor": "Tasa"
}
]
}
}
},
{
"Cantidad": "1.00",
"ClaveProdServ": "90101501",
"ClaveUnidad": "E48",
"Descripcion": "Restaurante",
"Importe": "353.45",
"Unidad": "UNIDAD DE SERVICIO",
"ValorUnitario": "353.45",
"Impuestos": {
"Traslados": {
"Traslado": [
{
"Base": "353.45",
"Importe": "56.55",
"Impuesto": "002",
"TasaOCuota": "0.160000",
"TipoFactor": "Tasa"
}
]
}
}
}
]
},
"Impuestos": {
"TotalImpuestosTrasladados": "273.46",
"Traslados": {
"Traslado": [
{
"Importe": "273.46",
"Impuesto": "002",
"TasaOCuota": "0.160000",
"TipoFactor": "Tasa"
}
]
}
},
"Complemento": [
{
"ImpuestosLocales": {
"TotaldeRetenciones": "0.00",
"TotaldeTraslados": "27.43",
"version": "1.0",
"TrasladosLocales": [
{
"ImpLocTrasladado": "IH",
"Importe": "27.43",
"TasadeTraslado": "2.50"
}
]
},
"TimbreFiscalDigital": {
"FechaTimbrado": "2018-01-12T08:17:54",
"NoCertificadoSAT": "00001000000406258094",
"RfcProvCertif": "DCD090706E42",
"SelloCFD": "Xt7tK...gdg==",
"SelloSAT": "IRy7w...6Zg==",
"UUID": "CEE4BE01-ADFA-4DEB-8421-ADD60F0BEDAC",
"Version": "1.1",
"xsi:schemaLocation": "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"
}
}
]
}