diff --git a/.gitignore b/.gitignore index 38ef604..8c9d944 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ dist *cache *log *.DS_Store +test.js diff --git a/.npmignore b/.npmignore index b421533..fd22bea 100644 --- a/.npmignore +++ b/.npmignore @@ -3,3 +3,4 @@ node_modules *log *.DS_Store src +test.js diff --git a/package-lock.json b/package-lock.json index 8fd900c..5c4018f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cfdi-to-json", - "version": "1.0.3", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1884,8 +1884,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -9459,8 +9458,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "optional": true + "dev": true }, "pify": { "version": "3.0.0", @@ -11262,14 +11260,14 @@ "dev": true }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", + "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==" }, "xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==" }, "xtend": { "version": "4.0.2", diff --git a/package.json b/package.json index ad34944..f9f175d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cfdi-to-json", - "version": "1.2.5", + "version": "1.3.1", "description": "", "main": "dist/index.js", "scripts": { @@ -19,8 +19,8 @@ "homepage": "https://github.com/onefacture/cfdi-to-json#readme", "dependencies": { "he": "1.2.0", - "xmldom": "0.1.27", - "xpath": "0.0.27" + "xmldom": "0.6.0", + "xpath": "0.0.32" }, "devDependencies": { "@types/he": "1.1.0", diff --git a/src/CfdiExtractData/__test__/index-spec.ts b/src/CfdiExtractData/__test__/index-spec.ts index d27895a..094010b 100644 --- a/src/CfdiExtractData/__test__/index-spec.ts +++ b/src/CfdiExtractData/__test__/index-spec.ts @@ -23,14 +23,14 @@ describe('CfdiExtractData', () => { Version="3.3" xmlns:cfdi="http://www.sat.gob.mx/cfd/3"> - + - + - + @@ -92,9 +92,9 @@ describe('CfdiExtractData', () => { "fecha": "2019-04-02T10:41:20", "formaPago": "04", "impuestos": { - "totalImpuestosTrasladados": "68.83", + "totalImpuestosTrasladados": 68.83, "traslados": [{ - "importe": "68.83", + "importe": 68.83, "impuesto": "002", "tasaOCuota": "0.160000", "tipoFactor": "Tasa", @@ -207,9 +207,9 @@ describe('CfdiExtractData', () => { "fecha": "2019-04-02T10:41:20", "formaPago": "04", "impuestos": { - "totalImpuestosTrasladados": "68.83", + "totalImpuestosTrasladados": 68.83, "traslados": [{ - "importe": "68.83", + "importe": 68.83, "impuesto": "002", "tasaOCuota": "0.160000", "tipoFactor": "Tasa", @@ -258,6 +258,32 @@ describe('CfdiExtractData', () => { }); }); + it('Basic data without namespace cfdi in root tag', () => { + expect(CfdiExtractData.extractGeneralData({ + contentXML: ` + + + + + ` + })) + .toEqual({ + "version": "3.3", + "emisor": { + "nombre": "NOMBRE_DEL_EMISOR", + "regimenFiscal": "612", + "rfc": "RFC_EMISOR" + } + }); + }); + it('Receptor', () => { expect(CfdiExtractData.extractGeneralData({ contentXML: ` @@ -361,9 +387,9 @@ describe('CfdiExtractData', () => { .toEqual({ "version": "3.3", "impuestos": { - "totalImpuestosTrasladados": "68.83", + "totalImpuestosTrasladados": 68.83, "traslados": [{ - "importe": "68.83", + "importe": 68.83, "impuesto": "002", "tasaOCuota": "0.160000", "tipoFactor": "Tasa" diff --git a/src/CfdiExtractData/index.d.ts b/src/CfdiExtractData/index.d.ts index 4c2f546..2db8942 100644 --- a/src/CfdiExtractData/index.d.ts +++ b/src/CfdiExtractData/index.d.ts @@ -18,7 +18,3 @@ export interface tImpuesto { export interface tMinimalData { minimalData: Boolean; } - -export interface tNamespace { - namespace?: any; -} diff --git a/src/CfdiExtractData/index.ts b/src/CfdiExtractData/index.ts index c09e541..ddfc657 100644 --- a/src/CfdiExtractData/index.ts +++ b/src/CfdiExtractData/index.ts @@ -23,7 +23,7 @@ export default class CfdiExtractData { let isRetencion = contentXML.indexOf('retenciones:Retenciones') >= 0; let data: any = {}; let xmlExtract = new XMLExtract(contentXML); - let option :any = CfdiExtractData.getXMLVersion(xmlExtract, { isRetencion }); + let option :any = CfdiExtractData.getXMLVersion(xmlExtract, { isRetencion }); let extractMethod = null; switch (option.version) { @@ -43,20 +43,10 @@ export default class CfdiExtractData { throw `${option.version} Invalid version`; } - if(extractMethod) { - data = extractMethod({ - xmlExtract, - namespace: !isRetencion ? 'cfdi' : 'retenciones', - minimalData: params.minimalData - }); - - if(!data || !Object.keys(data).length) { - data = extractMethod({ - xmlExtract, - minimalData: params.minimalData - }); - } - } + data = extractMethod({ + xmlExtract, + minimalData: params.minimalData + }); if(data.emisor && data.emisor.rfc) { data.emisor.rfc = htmlEntity.decode(data.emisor.rfc); @@ -68,8 +58,8 @@ export default class CfdiExtractData { if(data.nominas && data.nominas.length) { data.nominas = data.nominas.map((nomina: any) => Object.assign({}, nomina, { - emisor: Object.assign({ }, nomina.emisor || { }, { - rfcPatronOrigen: htmlEntity.decode(nomina.emisor ? (nomina.emisor.rfcPatronOrigen || '') : '') + emisor: Object.assign({ }, nomina.emisor || { }, { + rfcPatronOrigen: htmlEntity.decode(nomina.emisor ? (nomina.emisor.rfcPatronOrigen || '') : '') }) })); } @@ -84,6 +74,22 @@ export default class CfdiExtractData { return data; } + public static getByCustomTemplateDefinition(params: {path?: any, contentXML?: any, templateDefinition: any}) { + let contentXML = params.contentXML; + if(params.path) { + if(fs.existsSync(params.path)) { + contentXML = fs.readFileSync(params.path, 'utf8'); + } else { + return { error: 'FILE_NOT_FOUND' }; + } + } + + const xmlExtract = new XMLExtract(contentXML); + const data = xmlExtract.extractData(params.templateDefinition); + + return data; + } + public static getUuidByXML(params: {path?: any, contentXML?: any}) { let contentXML = params.contentXML; if(params.path) { @@ -102,26 +108,13 @@ export default class CfdiExtractData { /* * Algunos XMLs en especial los viejitos tenian estructuras distintas al estandar ***/ - 'cfdi:Comprobante': { + 'Comprobante | cfdi:Comprobante': { nodes: { 'Complemento': { nodes: timbreDefinition }, - 'cfdi:Complemento': { - nodes: timbreDefinition - } } }, - 'Comprobante': { - nodes: { - 'Complemento': { - nodes: timbreDefinition - }, - 'cfdi:Complemento': { - nodes: timbreDefinition - } - } - } } } @@ -130,7 +123,7 @@ export default class CfdiExtractData { return data.uuid; } - public static getXMLVersion(xmlExtract: XMLExtract, params?: { isRetencion: any }) { + public static getXMLVersion(xmlExtract: XMLExtract, params?: { isRetencion: any }) { if(params && params.isRetencion) { if(!__templates_definitions__.getXMLVersionRetencion) { __templates_definitions__.getXMLVersionRetencion = { @@ -145,10 +138,7 @@ export default class CfdiExtractData { if(!__templates_definitions__.getXMLVersion) { __templates_definitions__.getXMLVersion = { - 'cfdi:Comprobante': { - attributes: [ 'version' ] - }, - 'Comprobante': { + 'Comprobante | cfdi:Comprobante': { attributes: [ 'version' ] } }; @@ -157,44 +147,25 @@ export default class CfdiExtractData { return xmlExtract.extractData(__templates_definitions__.getXMLVersion); } - public static extractDataCFDI32(params: { xmlExtract: XMLExtract, namespace?: any, minimalData: Boolean }) { + public static extractDataCFDI32(params: { xmlExtract: XMLExtract, minimalData: Boolean, customTemplateDefinition?: Object }) { let data, complementsDefinition = this.getComplementsDefinition({ minimalData: params.minimalData }); - let templatesDefinitionPosition = `extractDataCFDI32${params.minimalData ? 'Min' : ''}${params.namespace}`; + let templatesDefinitionPosition = `extractDataCFDI32${params.minimalData ? 'Min' : ''}`; if(params.minimalData) { if(!__templates_definitions__[templatesDefinitionPosition]) { __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Comprobante`]: { + 'Comprobante | cfdi:Comprobante': { attributes: [ 'version', 'fecha', 'formaDePago', 'metodoDePago', 'tipoDeComprobante' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { - position: 'emisor', - attributes: ['rfc'], - }, 'Emisor': { position: 'emisor', attributes: ['rfc'], }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { - position: 'receptor', - attributes: ['rfc'], - }, 'Receptor': { position: 'receptor', attributes: ['rfc'], }, - [`${params.namespace ? params.namespace + ':' : ''}Conceptos`]: { - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Concepto`]: { - position: 'conceptos', - strictArrayResponse: true, - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}ComplementoConcepto`]: this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), - } - } - } - }, 'Conceptos': { nodes: { 'Concepto': { @@ -207,7 +178,6 @@ export default class CfdiExtractData { } }, 'Complemento': complementsDefinition, - 'cfdi:Complemento': complementsDefinition } } }; @@ -225,14 +195,10 @@ export default class CfdiExtractData { 'calle','noExterior','noInterior','colonia','municipio','localidad','estado','pais','codigoPostal' ]; - let conceptosNamespaceDefinition = this.getConcepts32Definition( params); - let conceptosDefinition = this.getConcepts32Definition({ - ...params, - namespace: '', - }); + let conceptosDefinition = this.getConcepts32Definition(params); __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Comprobante`]: { + 'Comprobante | cfdi:Comprobante': { attributes: [ 'version', 'serie', 'sello', 'folio', 'fecha', 'formaDePago', 'metodoDePago', 'subTotal', 'total', 'certificado', @@ -240,23 +206,6 @@ export default class CfdiExtractData { 'descuento', 'motivoDescuento', 'lugarExpedicion', 'numCtaPago' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { - position: 'emisor', - attributes: ['nombre', 'rfc'], - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}DomicilioFiscal`]: { - position: 'domicilioFiscal', - attributes: arrayAddress - }, - [`${params.namespace ? params.namespace + ':' : ''}ExpedidoEn`]: { - position: 'expedidoEn', - attributes: arrayAddress - }, - [`${params.namespace ? params.namespace + ':' : ''}RegimenFiscal`]: { - attributes: ['regimen'] - } - } - }, 'Emisor': { position: 'emisor', attributes: ['nombre', 'rfc'], @@ -274,16 +223,6 @@ export default class CfdiExtractData { } } }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { - position: 'receptor', - attributes: ['nombre','rfc'], - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Domicilio`]: { - position: 'domicilio', - attributes: arrayAddress - } - } - }, 'Receptor': { position: 'receptor', attributes: ['nombre','rfc'], @@ -294,11 +233,9 @@ export default class CfdiExtractData { } } }, - [`${params.namespace ? params.namespace + ':' : ''}Conceptos`]: conceptosNamespaceDefinition, 'Conceptos': conceptosDefinition, - [`${params.namespace ? params.namespace + ':' : ''}Impuestos`]: templatesDefinition.getImpuestosDefinition({namespace: params.namespace}), + 'Impuestos': templatesDefinition.getImpuestosDefinition(), 'Complemento': complementsDefinition, - 'cfdi:Complemento': complementsDefinition } } }; @@ -307,38 +244,35 @@ export default class CfdiExtractData { data = params.xmlExtract.extractData(__templates_definitions__[templatesDefinitionPosition]); if(data.impuestos && data.impuestos.traslados) { + if(data.impuestos.totalImpuestosTrasladados) { + data.impuestos.totalImpuestosTrasladados = parseFloat(data.impuestos.totalImpuestosTrasladados); + } + data.impuestos.traslados = CfdiExtractData.getTaxesWithoutDuplicates(data.impuestos.traslados); } if(data.impuestos && data.impuestos.retenciones) { + if(data.impuestos.totalImpuestosRetenidos) { + data.impuestos.totalImpuestosRetenidos = parseFloat(data.impuestos.totalImpuestosRetenidos); + } + data.impuestos.retenciones = CfdiExtractData.getTaxesWithoutDuplicates(data.impuestos.retenciones); } return data; } - public static extractDataCFDI33(params: { xmlExtract: XMLExtract, namespace?: any, minimalData: Boolean }) { + public static extractDataCFDI33(params: { xmlExtract: XMLExtract, minimalData: Boolean, customTemplateDefinition?: Object }) { let data, complementsDefinition = this.getComplementsDefinition({ minimalData: params.minimalData }); - let templatesDefinitionPosition = `extractDataCFDI33${params.minimalData ? 'Min' : ''}${params.namespace}`; + let templatesDefinitionPosition = `extractDataCFDI33${params.minimalData ? 'Min' : ''}`; if(params.minimalData) { if(!__templates_definitions__[templatesDefinitionPosition]) { __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Comprobante`]: { + 'Comprobante | cfdi:Comprobante': { attributes: [ 'version', 'fecha', 'formaPago', 'metodoPago', 'tipoDeComprobante' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CfdiRelacionados`]: { - position: 'relacionados', - attributes: ['tipoRelacion'], - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CfdiRelacionado`]: { - position: 'uuids', - strictArrayResponse: true, - attributes: ['uuid'] - } - } - }, 'CfdiRelacionados': { position: 'relacionados', attributes: ['tipoRelacion'], @@ -350,33 +284,14 @@ export default class CfdiExtractData { } } }, - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { - position: 'emisor', - attributes: ['rfc'], - }, 'Emisor': { position: 'emisor', attributes: ['rfc'], }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { - position: 'receptor', - attributes: ['rfc', 'usoCFDI'], - }, 'Receptor': { position: 'receptor', attributes: ['rfc', 'usoCFDI'], }, - [`${params.namespace ? params.namespace + ':' : ''}Conceptos`]: { - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Concepto`]: { - position: 'conceptos', - strictArrayResponse: true, - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}ComplementoConcepto`]: this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), - } - } - } - }, 'Conceptos': { nodes: { 'Concepto': { @@ -389,7 +304,6 @@ export default class CfdiExtractData { } }, 'Complemento': complementsDefinition, - 'cfdi:Complemento': complementsDefinition } } }; @@ -403,30 +317,15 @@ export default class CfdiExtractData { } if(!__templates_definitions__[templatesDefinitionPosition]) { - let conceptosNamespaceDefinition = this.getConcepts33Definition( params); - let conceptosDefinition = this.getConcepts33Definition({ - ...params, - namespace: '', - }); + let conceptosDefinition = this.getConcepts33Definition(params); __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Comprobante`]: { + 'Comprobante | cfdi:Comprobante': { attributes: [ 'version','serie','folio','fecha','sello','formaPago','noCertificado', 'certificado','condicionesDePago','subTotal','descuento','moneda', 'tipoCambio','total','tipoDeComprobante','metodoPago','lugarExpedicion','confirmacion' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CfdiRelacionados`]: { - position: 'relacionados', - attributes: ['tipoRelacion'], - nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CfdiRelacionado`]: { - position: 'uuids', - strictArrayResponse: true, - attributes: ['uuid'] - } - } - }, 'CfdiRelacionados': { position: 'relacionados', attributes: ['tipoRelacion'], @@ -438,62 +337,69 @@ export default class CfdiExtractData { } } }, - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { - position: 'emisor', - attributes: ['nombre', 'rfc', 'regimenFiscal'] - }, 'Emisor': { position: 'emisor', attributes: ['nombre', 'rfc', 'regimenFiscal'] }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { - position: 'receptor', - attributes: ['nombre', 'rfc', 'residenciaFiscal', 'numRegIdTrib', 'usoCFDI'] - }, 'Receptor': { position: 'receptor', attributes: ['nombre', 'rfc', 'residenciaFiscal', 'numRegIdTrib', 'usoCFDI'] }, - [`${params.namespace ? params.namespace + ':' : ''}Conceptos`]: conceptosNamespaceDefinition, 'Conceptos': conceptosDefinition, - [`${params.namespace ? params.namespace + ':' : ''}Impuestos`]: templatesDefinition.getImpuestosDefinition({namespace: params.namespace}), + 'Impuestos': templatesDefinition.getImpuestosDefinition(), 'Complemento': complementsDefinition, - 'cfdi:Complemento': complementsDefinition } } }; } - return params.xmlExtract.extractData(__templates_definitions__[templatesDefinitionPosition]); + data = params.xmlExtract.extractData(__templates_definitions__[templatesDefinitionPosition]); + + if(data.impuestos && data.impuestos.traslados) { + if(data.impuestos.totalImpuestosTrasladados) { + data.impuestos.totalImpuestosTrasladados = parseFloat(data.impuestos.totalImpuestosTrasladados); + } + + data.impuestos.traslados = CfdiExtractData.getTaxesWithoutDuplicates(data.impuestos.traslados); + } + + if(data.impuestos && data.impuestos.retenciones) { + if(data.impuestos.totalImpuestosRetenidos) { + data.impuestos.totalImpuestosRetenidos = parseFloat(data.impuestos.totalImpuestosRetenidos); + } + + data.impuestos.retenciones = CfdiExtractData.getTaxesWithoutDuplicates(data.impuestos.retenciones); + } + + return data; } - public static extractDataRetencion10(params: { xmlExtract: XMLExtract, namespace?: any, minimalData: Boolean }) { + public static extractDataRetencion10(params: { xmlExtract: XMLExtract, minimalData: Boolean, customTemplateDefinition?: Object }) { let data, complementsDefinition = this.getComplementsRetencionDefinition({ minimalData: params.minimalData }); - let templatesDefinitionPosition = `extractDataRetencion10${params.minimalData ? 'Min' : ''}${params.namespace}`; + let templatesDefinitionPosition = `extractDataRetencion10${params.minimalData ? 'Min' : ''}`; if(params.minimalData) { if(!__templates_definitions__[templatesDefinitionPosition]) { __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Retenciones`]: { + 'Retenciones | retenciones:Retenciones': { attributes: [ 'version' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { + 'Emisor': { position: 'emisor', attributes: ['rfcEmisor', 'nomDenRazSocE'], }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { + 'Receptor': { position: 'receptor', attributes: ['nacionalidad'], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Nacional`]: { + 'Nacional': { attributes: ['rfcRecep'], }, - [`${params.namespace ? params.namespace + ':' : ''}Extranjero`]: { + 'Extranjero': { attributes: ['numRegIdTrib'], } } }, 'Complemento': complementsDefinition, - // 'cfdi:Complemento': complementsDefinition } } }; @@ -504,36 +410,36 @@ export default class CfdiExtractData { if(!__templates_definitions__[templatesDefinitionPosition]) { __templates_definitions__[templatesDefinitionPosition] = { - [`${params.namespace ? params.namespace + ':' : ''}Retenciones`]: { + 'Retenciones | retenciones:Retenciones': { attributes: [ 'version', 'folioInt', 'sello', 'numCert', 'cert', 'fechaExp', 'cveRetenc', 'descRetenc', ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Emisor`]: { + 'Emisor': { position: 'emisor', attributes: ['rfcEmisor', 'nomDenRazSocE', 'curpe'], }, - [`${params.namespace ? params.namespace + ':' : ''}Receptor`]: { + 'Receptor': { position: 'receptor', attributes: ['nacionalidad'], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Nacional`]: { + 'Nacional': { attributes: [ 'rfcRecep', 'nomDenRazSocR', 'curpr' ], }, - [`${params.namespace ? params.namespace + ':' : ''}Extranjero`]: { + 'Extranjero': { attributes: ['numRegIdTrib', 'nomDenRazSocR'], } } }, - [`${params.namespace ? params.namespace + ':' : ''}Periodo`]: { + 'Periodo': { position: 'periodo', attributes: ['mesIni', 'mesFin', 'ejerc'], }, - [`${params.namespace ? params.namespace + ':' : ''}Totales`]: { + 'Totales': { position: 'totales', attributes: ['montoTotOperacion', 'montoTotGrav', 'montoTotExent', 'montoTotRet'], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}ImpRetenidos`]: { + 'ImpRetenidos': { strictArrayResponse: true, position: 'impuestosRetenidos', attributes: [ 'baseRet', 'impuesto', 'montoRet', 'tipoPagoRet' ], @@ -541,7 +447,6 @@ export default class CfdiExtractData { } }, 'Complemento': complementsDefinition, - // 'cfdi:Complemento': complementsDefinition } } }; @@ -555,10 +460,12 @@ export default class CfdiExtractData { for(tax of taxesCopy) { tax.importe = parseFloat(tax.importe); tax.impuesto = tax.impuesto.toUpperCase(); - if(localTaxes[tax.impuesto]) { - localTaxes[tax.impuesto].importe += tax.importe; + let taxPosition = tax.impuesto + (tax.tasa || tax.tasaOCuota); + + if(localTaxes[taxPosition]) { + localTaxes[taxPosition].importe += tax.importe; } else { - localTaxes[tax.impuesto] = tax; + localTaxes[taxPosition] = tax; } } @@ -580,31 +487,31 @@ export default class CfdiExtractData { return result; } - public static getConcepts32Definition(params: { namespace: String, minimalData: Boolean }) { + public static getConcepts32Definition(params: { minimalData: Boolean }) { return { nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Concepto`]: { + 'Concepto': { position: 'conceptos', strictArrayResponse: true, attributes: ['cantidad','unidad', 'descripcion', 'valorUnitario', 'importe'], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CuentaPredial`]: { + 'CuentaPredial': { position: 'cuentaPredial', attributes: ['numero'] }, - [`${params.namespace ? params.namespace + ':' : ''}InformacionAduanera`]: { + 'InformacionAduanera': { position: 'informacionAduanera', attributes: ['numero', 'fecha', 'aduana'] }, - [`${params.namespace ? params.namespace + ':' : ''}ComplementoConcepto`]: this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), - [`${params.namespace ? params.namespace + ':' : ''}Parte`]: { + 'ComplementoConcepto': this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), + 'Parte': { position: 'partes', strictArrayResponse: true, attributes: [ 'cantidad', 'unidad', 'noIdentificacion', 'descripcion', 'valorUnitario', 'importe' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}InformacionAduanera`]: { + 'InformacionAduanera': { position: 'informacionAduanera', attributes: ['numero', 'fecha', 'aduana'] }, @@ -617,10 +524,10 @@ export default class CfdiExtractData { } - public static getConcepts33Definition(params: { namespace: String, minimalData: Boolean }) { + public static getConcepts33Definition(params: { minimalData: Boolean }) { return { nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Concepto`]: { + 'Concepto': { position: 'conceptos', strictArrayResponse: true, attributes: [ @@ -628,43 +535,43 @@ export default class CfdiExtractData { 'unidad','descripcion','valorUnitario','importe','descuento' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}CuentaPredial`]: { + 'CuentaPredial': { position: 'cuentaPredial', attributes: ['numero'] }, - [`${params.namespace ? params.namespace + ':' : ''}InformacionAduanera`]: { + 'InformacionAduanera': { position: 'informacionAduanera', attributes: ['numero', 'fecha', 'aduana'] }, - [`${params.namespace ? params.namespace + ':' : ''}ComplementoConcepto`]: this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), - [`${params.namespace ? params.namespace + ':' : ''}Parte`]: { + 'ComplementoConcepto': this.getConceptsComplementsDefinition({ minimalData: params.minimalData }), + 'Parte': { position: 'partes', strictArrayResponse: true, attributes: [ 'cantidad', 'unidad', 'noIdentificacion', 'descripcion', 'valorUnitario', 'importe' ], nodes: { - [`${params.namespace ? params.namespace + ':' : ''}InformacionAduanera`]: { + 'InformacionAduanera': { position: 'informacionAduanera', attributes: ['numero', 'fecha', 'aduana'] }, } }, - [`${params.namespace ? params.namespace + ':' : ''}Impuestos`]: { + 'Impuestos': { position: 'impuestos', nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Traslados`]: { + 'Traslados': { nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Traslado`]: { + 'Traslado': { position: 'traslados', strictArrayResponse: true, attributes: ['base', 'impuesto', 'tipoFactor', 'tasaOCuota', 'importe'] } } }, - [`${params.namespace ? params.namespace + ':' : ''}Retenciones`]: { + 'Retenciones': { nodes: { - [`${params.namespace ? params.namespace + ':' : ''}Retencion`]: { + 'Retencion': { position: 'retenciones', strictArrayResponse: true, attributes: ['base', 'impuesto', 'tipoFactor', 'tasaOCuota', 'importe'] @@ -719,6 +626,8 @@ export default class CfdiExtractData { ...templatesDefinition.getEstadoCuentaCombustible12Definition({ minimalData: params.minimalData }), // Donatarias v1.0 and v1.1 ...templatesDefinition.getDonatariasDefinition({ minimalData: params.minimalData }), + // Estado de cuenta bancario + ...templatesDefinition.getEstadoCuentaBancario({ minimalData: params.minimalData }), // Divisas v1.0 ...templatesDefinition.getDivisasDefinition({ minimalData: params.minimalData }), // Leyendas fiscales v1.1 diff --git a/src/CfdiExtractData/templates/__test__/estado-cuenta-bancario.ts b/src/CfdiExtractData/templates/__test__/estado-cuenta-bancario.ts new file mode 100644 index 0000000..c63d72b --- /dev/null +++ b/src/CfdiExtractData/templates/__test__/estado-cuenta-bancario.ts @@ -0,0 +1,87 @@ +import ecbEstadoDeCuentaBancario from "../estado-cuenta-bancario"; +describe("Estado de cuenta de combustible 10 data test", () => { + it("Execute without params", () => { + expect(ecbEstadoDeCuentaBancario()).toEqual({ + "ecb:EstadoDeCuentaBancario": { + position: "estadoCuentaBancario", + attributes: ["version", "numeroCuenta", "nombreCliente", "periodo", "sucursal"], + nodes: { + "ecb:Movimientos": { + "ecb:MovimientoECB": { + strictArrayResponse: true, + position: "movimientosECB", + attributes: [ + "fecha", + "referencia", + "descripcion", + "importe", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + "ecb:MovimientoECBFiscal": { + strictArrayResponse: true, + position: "movimientosECBFiscal", + attributes: [ + "fecha", + "referencia", + "descripcion", + "RFCenajenante", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + }, + } + } + }); + }); + it("Execute with minimalData: False", () => { + expect(ecbEstadoDeCuentaBancario({ minimalData: false })).toEqual({ + "ecb:EstadoDeCuentaBancario": { + position: "estadoCuentaBancario", + attributes: ["version", "numeroCuenta", "nombreCliente", "periodo", "sucursal"], + nodes: { + "ecb:Movimientos": { + "ecb:MovimientoECB": { + strictArrayResponse: true, + position: "movimientosECB", + attributes: [ + "fecha", + "referencia", + "descripcion", + "importe", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + "ecb:MovimientoECBFiscal": { + strictArrayResponse: true, + position: "movimientosECBFiscal", + attributes: [ + "fecha", + "referencia", + "descripcion", + "RFCenajenante", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + }, + } + } + }); + }); + it("Execute with minimalData: True", () => { + expect(ecbEstadoDeCuentaBancario({ minimalData: true })).toEqual({ + "ecb:EstadoDeCuentaBancario": { + position: "estadoCuentaBancario", + attributes: ["version"] + } + }); + }); +}); diff --git a/src/CfdiExtractData/templates/__test__/impuestos-spec.ts b/src/CfdiExtractData/templates/__test__/impuestos-spec.ts index 56fe187..e4984ac 100644 --- a/src/CfdiExtractData/templates/__test__/impuestos-spec.ts +++ b/src/CfdiExtractData/templates/__test__/impuestos-spec.ts @@ -1,13 +1,13 @@ import impuestosTemplate from "../impuestos"; describe("Impuestos data test", () => { it("Execute without params", () => { - expect(impuestosTemplate({ namespace: "cfdi" })).toEqual({ + expect(impuestosTemplate()).toEqual({ position: "impuestos", attributes: ["totalImpuestosRetenidos", "totalImpuestosTrasladados"], nodes: { - [`cfdi:Traslados`]: { + 'Traslados': { nodes: { - [`cfdi:Traslado`]: { + 'Traslado': { position: "traslados", strictArrayResponse: true, // Aplica tasa para cfdi v3.2 @@ -21,9 +21,9 @@ describe("Impuestos data test", () => { } } }, - [`cfdi:Retenciones`]: { + 'Retenciones': { nodes: { - [`cfdi:Retencion`]: { + 'Retencion': { position: "retenciones", strictArrayResponse: true, attributes: ["impuesto", "importe"] diff --git a/src/CfdiExtractData/templates/__test__/nomina11-spec.ts b/src/CfdiExtractData/templates/__test__/nomina11-spec.ts index 97669ff..6fc781e 100644 --- a/src/CfdiExtractData/templates/__test__/nomina11-spec.ts +++ b/src/CfdiExtractData/templates/__test__/nomina11-spec.ts @@ -5,6 +5,7 @@ describe("Nomina 11 data test", () => { "nomina:Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.1', attributes: [ "banco", "antiguedad", @@ -71,6 +72,7 @@ describe("Nomina 11 data test", () => { "nomina:Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.1', attributes: [ "banco", "antiguedad", @@ -137,6 +139,7 @@ describe("Nomina 11 data test", () => { "nomina:Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.1', attributes: ["version"] } }); diff --git a/src/CfdiExtractData/templates/__test__/nomina12-spec.ts b/src/CfdiExtractData/templates/__test__/nomina12-spec.ts index 2e12fc0..5bc1b88 100644 --- a/src/CfdiExtractData/templates/__test__/nomina12-spec.ts +++ b/src/CfdiExtractData/templates/__test__/nomina12-spec.ts @@ -2,165 +2,10 @@ import nomina12Template from "../nomina12"; describe("Nomina 12 data test", () => { it("Execute without params", () => { expect(nomina12Template()).toEqual({ - "nomina12:Nomina": { - strictArrayResponse: true, - position: "nominas", - attributes: [ - "version", - "tipoNomina", - "fechaPago", - "fechaInicialPago", - "fechaFinalPago", - "numDiasPagados", - "totalPercepciones", - "totalDeducciones", - "totalOtrosPagos" - ], - nodes: { - "nomina12:Emisor": { - position: "emisor", - attributes: ["curp", "registroPatronal", "rfcPatronOrigen"], - nodes: { - "nomina12:EntidadSNCF": { - position: "entidades", - strictArrayResponse: true, - attributes: ["origenRecurso", "montoRecursoPropio"] - } - } - }, - "nomina12:Receptor": { - position: "receptor", - attributes: [ - "curp", - "tipoContrato", - "tipoRegimen", - "numEmpleado", - "periodicidadPago", - "claveEntFed", - "numSeguridadSocial", - "fechaInicioRelLaboral", - "antigüedad", - "sindicalizado", - "tipoJornada", - "departamento", - "puesto", - "riesgoPuesto", - "banco", - "cuentaBancaria", - "salarioBaseCotApor", - "salarioDiarioIntegrado" - ], - nodes: { - "nomina12:SubContratacion": { - position: "subContrataciones", - strictArrayResponse: true, - attributes: ["rfcLabora", "porcentajeTiempo"] - } - } - }, - "nomina12:Percepciones": { - position: "percepciones", - attributes: [ - "totalGravado", - "totalExento", - "totalJubilacionPensionRetiro", - "totalSeparacionIndemnizacion", - "totalSueldos" - ], - nodes: { - "nomina12:Percepcion": { - position: "arrayPercepciones", - strictArrayResponse: true, - attributes: [ - "tipoPercepcion", - "clave", - "concepto", - "importeGravado", - "importeExento" - ], - nodes: { - "nomina12:HorasExtra": { - position: "horasExtra", - strictArrayResponse: true, - attributes: [ - "dias", - "tipoHoras", - "horasExtra", - "importePagado" - ] - } - } - }, - "nomina12:JubilacionPensionRetiro": { - position: "arrayJubilacionPensionRetiro", - strictArrayResponse: true, - attributes: [ - "totalUnaExhibicion", - "totalParcialidad", - "montoDiario", - "ingresoAcumulable", - "ingresoNoAcumulable" - ] - }, - "nomina12:SeparacionIndemnizacion": { - position: "arraySeparacionIndemnizacion", - strictArrayResponse: true, - attributes: [ - "totalPagado", - "numAñosServicio", - "ultimoSueldoMensOrd", - "ingresoAcumulable", - "IngresoNoAcumulable" - ] - } - } - }, - "nomina12:OtrosPagos": { - nodes: { - "nomina12:OtroPago": { - position: "otrosPagos", - strictArrayResponse: true, - attributes: ["tipoOtroPago", "clave", "concepto", "importe"], - nodes: { - "nomina12:SubsidioAlEmpleo": { - attributes: ["subsidioCausado"], - }, - "nomina12:CompensacionSaldosAFavor": { - attributes: ["saldoAFavor", "remanenteSalFav"], - } - } - } - } - }, - "nomina12:Deducciones": { - position: "deducciones", - attributes: ["totalOtrasDeducciones", "totalImpuestosRetenidos"], - nodes: { - "nomina12:Deduccion": { - position: "arrayDeducciones", - strictArrayResponse: true, - attributes: ["tipoDeduccion", "clave", "concepto", "importe"] - } - } - }, - "nomina12:Incapacidades": { - nodes: { - "nomina12:Incapacidad": { - position: "incapacidades", - strictArrayResponse: true, - attributes: [ - "diasIncapacidad", - "tipoIncapacidad", - "importeMonetario" - ] - } - } - } - } - }, "Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.2', attributes: [ "version", "tipoNomina", @@ -318,165 +163,10 @@ describe("Nomina 12 data test", () => { }); it("Execute with minimalData: False", () => { expect(nomina12Template({ minimalData: false })).toEqual({ - "nomina12:Nomina": { - strictArrayResponse: true, - position: "nominas", - attributes: [ - "version", - "tipoNomina", - "fechaPago", - "fechaInicialPago", - "fechaFinalPago", - "numDiasPagados", - "totalPercepciones", - "totalDeducciones", - "totalOtrosPagos" - ], - nodes: { - "nomina12:Emisor": { - position: "emisor", - attributes: ["curp", "registroPatronal", "rfcPatronOrigen"], - nodes: { - "nomina12:EntidadSNCF": { - position: "entidades", - strictArrayResponse: true, - attributes: ["origenRecurso", "montoRecursoPropio"] - } - } - }, - "nomina12:Receptor": { - position: "receptor", - attributes: [ - "curp", - "tipoContrato", - "tipoRegimen", - "numEmpleado", - "periodicidadPago", - "claveEntFed", - "numSeguridadSocial", - "fechaInicioRelLaboral", - "antigüedad", - "sindicalizado", - "tipoJornada", - "departamento", - "puesto", - "riesgoPuesto", - "banco", - "cuentaBancaria", - "salarioBaseCotApor", - "salarioDiarioIntegrado" - ], - nodes: { - "nomina12:SubContratacion": { - position: "subContrataciones", - strictArrayResponse: true, - attributes: ["rfcLabora", "porcentajeTiempo"] - } - } - }, - "nomina12:Percepciones": { - position: "percepciones", - attributes: [ - "totalGravado", - "totalExento", - "totalJubilacionPensionRetiro", - "totalSeparacionIndemnizacion", - "totalSueldos" - ], - nodes: { - "nomina12:Percepcion": { - position: "arrayPercepciones", - strictArrayResponse: true, - attributes: [ - "tipoPercepcion", - "clave", - "concepto", - "importeGravado", - "importeExento" - ], - nodes: { - "nomina12:HorasExtra": { - position: "horasExtra", - strictArrayResponse: true, - attributes: [ - "dias", - "tipoHoras", - "horasExtra", - "importePagado" - ] - } - } - }, - "nomina12:JubilacionPensionRetiro": { - position: "arrayJubilacionPensionRetiro", - strictArrayResponse: true, - attributes: [ - "totalUnaExhibicion", - "totalParcialidad", - "montoDiario", - "ingresoAcumulable", - "ingresoNoAcumulable" - ] - }, - "nomina12:SeparacionIndemnizacion": { - position: "arraySeparacionIndemnizacion", - strictArrayResponse: true, - attributes: [ - "totalPagado", - "numAñosServicio", - "ultimoSueldoMensOrd", - "ingresoAcumulable", - "IngresoNoAcumulable" - ] - } - } - }, - "nomina12:OtrosPagos": { - nodes: { - "nomina12:OtroPago": { - position: "otrosPagos", - strictArrayResponse: true, - attributes: ["tipoOtroPago", "clave", "concepto", "importe"], - nodes: { - "nomina12:SubsidioAlEmpleo": { - attributes: ["subsidioCausado"], - }, - "nomina12:CompensacionSaldosAFavor": { - attributes: ["saldoAFavor", "remanenteSalFav"], - } - } - } - } - }, - "nomina12:Deducciones": { - position: "deducciones", - attributes: ["totalOtrasDeducciones", "totalImpuestosRetenidos"], - nodes: { - "nomina12:Deduccion": { - position: "arrayDeducciones", - strictArrayResponse: true, - attributes: ["tipoDeduccion", "clave", "concepto", "importe"] - } - } - }, - "nomina12:Incapacidades": { - nodes: { - "nomina12:Incapacidad": { - position: "incapacidades", - strictArrayResponse: true, - attributes: [ - "diasIncapacidad", - "tipoIncapacidad", - "importeMonetario" - ] - } - } - } - } - }, "Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.2', attributes: [ "version", "tipoNomina", @@ -634,14 +324,10 @@ describe("Nomina 12 data test", () => { }); it("Execute with minimalData: True", () => { expect(nomina12Template({ minimalData: true })).toEqual({ - "nomina12:Nomina": { - strictArrayResponse: true, - position: "nominas", - attributes: ["version"] - }, "Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.2', attributes: ["version"] } }); diff --git a/src/CfdiExtractData/templates/__test__/pagos-spec.ts b/src/CfdiExtractData/templates/__test__/pagos-spec.ts index 3d1d75b..f53726b 100644 --- a/src/CfdiExtractData/templates/__test__/pagos-spec.ts +++ b/src/CfdiExtractData/templates/__test__/pagos-spec.ts @@ -1,51 +1,29 @@ -import pagosTemplate, { __getInnerNodesWithCustomNamespace } from "../pagos"; +import pagosTemplate, { __getInnerNodes } from "../pagos"; describe("Pagos data test", () => { it("Execute without params", () => { expect(pagosTemplate()).toEqual({ - "pago10:Pagos": { - position: "pagos", - attributes: ["version"], - nodes: Object.assign( - __getInnerNodesWithCustomNamespace(), - __getInnerNodesWithCustomNamespace({ namespace: "pago10" }) - ) - }, "Pagos": { position: "pagos", attributes: ["version"], nodes: Object.assign( - __getInnerNodesWithCustomNamespace(), - __getInnerNodesWithCustomNamespace({ namespace: "pago10" }) + __getInnerNodes(), ) }, }); }); it("Execute with minimalData: False", () => { expect(pagosTemplate({ minimalData: false })).toEqual({ - "pago10:Pagos": { - position: "pagos", - attributes: ["version"], - nodes: Object.assign( - __getInnerNodesWithCustomNamespace(), - __getInnerNodesWithCustomNamespace({ namespace: "pago10" }) - ) - }, "Pagos": { position: "pagos", attributes: ["version"], nodes: Object.assign( - __getInnerNodesWithCustomNamespace(), - __getInnerNodesWithCustomNamespace({ namespace: "pago10" }) + __getInnerNodes(), ) }, }); }); it("Execute with minimalData: True", () => { expect(pagosTemplate({ minimalData: true })).toEqual({ - "pago10:Pagos": { - position: "pagos", - attributes: ["version"] - }, "Pagos": { position: "pagos", attributes: ["version"] diff --git a/src/CfdiExtractData/templates/__test__/timbre-spec.ts b/src/CfdiExtractData/templates/__test__/timbre-spec.ts index e00eb0a..7dbe392 100644 --- a/src/CfdiExtractData/templates/__test__/timbre-spec.ts +++ b/src/CfdiExtractData/templates/__test__/timbre-spec.ts @@ -2,17 +2,6 @@ import timbreTemplate from "../timbre"; describe("Timbre data test", () => { it("Execute without params", () => { expect(timbreTemplate()).toEqual({ - "tfd:TimbreFiscalDigital": { - position: "timbreFiscal", - attributes: [ - "fechaTimbrado", - "uuid", - "noCertificadoSAT", - "selloSAT", - "selloCFD", - "RFCProvCertif" - ] - }, "TimbreFiscalDigital": { position: "timbreFiscal", attributes: [ @@ -28,17 +17,6 @@ describe("Timbre data test", () => { }); it("Execute with minimalData: False", () => { expect(timbreTemplate({ minimalData: false })).toEqual({ - "tfd:TimbreFiscalDigital": { - position: "timbreFiscal", - attributes: [ - "fechaTimbrado", - "uuid", - "noCertificadoSAT", - "selloSAT", - "selloCFD", - "RFCProvCertif" - ] - }, "TimbreFiscalDigital": { position: "timbreFiscal", attributes: [ @@ -54,10 +32,6 @@ describe("Timbre data test", () => { }); it("Execute with minimalData: True", () => { expect(timbreTemplate({ minimalData: true })).toEqual({ - "tfd:TimbreFiscalDigital": { - position: "timbreFiscal", - attributes: ["fechaTimbrado", "uuid"] - }, "TimbreFiscalDigital": { position: "timbreFiscal", attributes: ["fechaTimbrado", "uuid"] diff --git a/src/CfdiExtractData/templates/estado-cuenta-bancario.ts b/src/CfdiExtractData/templates/estado-cuenta-bancario.ts new file mode 100644 index 0000000..87f0d4a --- /dev/null +++ b/src/CfdiExtractData/templates/estado-cuenta-bancario.ts @@ -0,0 +1,50 @@ +import { tMinimalData } from "../index.d"; + +export const minimalDataDefinition = { + "ecb:EstadoDeCuentaBancario": { + position: "estadoCuentaBancario", + attributes: ["version"] + } +}; + +export const allDataDefinition = { + "ecb:EstadoDeCuentaBancario": { + position: "estadoCuentaBancario", + attributes: ["version", "numeroCuenta", "nombreCliente", "periodo", "sucursal"], + nodes: { + "ecb:Movimientos": { + "ecb:MovimientoECB": { + strictArrayResponse: true, + position: "movimientosECB", + attributes: [ + "fecha", + "referencia", + "descripcion", + "importe", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + "ecb:MovimientoECBFiscal": { + strictArrayResponse: true, + position: "movimientosECBFiscal", + attributes: [ + "fecha", + "referencia", + "descripcion", + "RFCenajenante", + "moneda", + "saldoInicial", + "saldoAlCorte", + ], + }, + }, + } + } +}; + +export default (params?: tMinimalData) => + params && params.minimalData + ? minimalDataDefinition + : allDataDefinition; diff --git a/src/CfdiExtractData/templates/impuestos.ts b/src/CfdiExtractData/templates/impuestos.ts index 85ff373..774ad8f 100644 --- a/src/CfdiExtractData/templates/impuestos.ts +++ b/src/CfdiExtractData/templates/impuestos.ts @@ -1,32 +1,31 @@ -import { tMinimalData, tNamespace } from "../index.d"; -export default (params?: tNamespace) => { - var finalNamespace = params && params.namespace ? params.namespace + ":" : ""; +import { tMinimalData } from '../index.d'; +export default () => { return { - position: "impuestos", - attributes: ["totalImpuestosRetenidos", "totalImpuestosTrasladados"], + position: 'impuestos', + attributes: ['totalImpuestosRetenidos', 'totalImpuestosTrasladados'], nodes: { - [`${finalNamespace}Traslados`]: { + 'Traslados': { nodes: { - [`${finalNamespace}Traslado`]: { - position: "traslados", + 'Traslado': { + position: 'traslados', strictArrayResponse: true, // Aplica tasa para cfdi v3.2 attributes: [ - "impuesto", - "tipoFactor", - "tasaOCuota", - "importe", - "tasa" + 'impuesto', + 'tipoFactor', + 'tasaOCuota', + 'importe', + 'tasa' ] } } }, - [`${finalNamespace}Retenciones`]: { + 'Retenciones': { nodes: { - [`${finalNamespace}Retencion`]: { - position: "retenciones", + 'Retencion': { + position: 'retenciones', strictArrayResponse: true, - attributes: ["impuesto", "importe"] + attributes: ['impuesto', 'importe'] } } } diff --git a/src/CfdiExtractData/templates/index.ts b/src/CfdiExtractData/templates/index.ts index 81d20a6..0f06a36 100644 --- a/src/CfdiExtractData/templates/index.ts +++ b/src/CfdiExtractData/templates/index.ts @@ -12,6 +12,7 @@ export { default as getEstadoCuentaCombustible10Definition } from './estado-cuen export { default as getEstadoCuentaCombustible11Definition } from './estado-cuenta-combustible11'; export { default as getEstadoCuentaCombustible12Definition } from './estado-cuenta-combustible12'; export { default as getDonatariasDefinition } from './donatarias'; +export { default as getEstadoCuentaBancario } from './estado-cuenta-bancario'; export { default as getDivisasDefinition } from './divisas'; export { default as getAerolineasDefinition } from './aerolineas'; export { default as getLeyendasFiscalesDefinition } from './leyendas-fiscales'; diff --git a/src/CfdiExtractData/templates/nomina11.ts b/src/CfdiExtractData/templates/nomina11.ts index 9cf9b31..17a67ed 100644 --- a/src/CfdiExtractData/templates/nomina11.ts +++ b/src/CfdiExtractData/templates/nomina11.ts @@ -4,6 +4,7 @@ export const minimalDataDefinition = { "nomina:Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.1', attributes: ["version"] } }; @@ -12,6 +13,7 @@ export const allDataDefinition = { "nomina:Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.1', attributes: [ "banco", "antiguedad", diff --git a/src/CfdiExtractData/templates/nomina12.ts b/src/CfdiExtractData/templates/nomina12.ts index b5ac57c..153b983 100644 --- a/src/CfdiExtractData/templates/nomina12.ts +++ b/src/CfdiExtractData/templates/nomina12.ts @@ -1,25 +1,20 @@ import { tMinimalData } from "../index.d"; export const minimalDataDefinition = { - "nomina12:Nomina": { - strictArrayResponse: true, - position: "nominas", - attributes: ["version"] - }, "Nomina": { strictArrayResponse: true, position: "nominas", + version: '1.2', attributes: ["version"] } }; -function getNominaDefinition(params: { useNamespace: any }) { - let { useNamespace } = params; - +function getNominaDefinition() { return { - [`${useNamespace ? 'nomina12:' : ''}Nomina`]: { + 'Nomina': { strictArrayResponse: true, position: "nominas", + version: '1.2', attributes: [ "version", "tipoNomina", @@ -32,18 +27,18 @@ function getNominaDefinition(params: { useNamespace: any }) { "totalOtrosPagos" ], nodes: { - [`${useNamespace ? 'nomina12:' : ''}Emisor`]: { + 'Emisor': { position: "emisor", attributes: ["curp", "registroPatronal", "rfcPatronOrigen"], nodes: { - [`${useNamespace ? 'nomina12:' : ''}EntidadSNCF`]: { + 'EntidadSNCF': { position: "entidades", strictArrayResponse: true, attributes: ["origenRecurso", "montoRecursoPropio"] } } }, - [`${useNamespace ? 'nomina12:' : ''}Receptor`]: { + 'Receptor': { position: "receptor", attributes: [ "curp", @@ -66,14 +61,14 @@ function getNominaDefinition(params: { useNamespace: any }) { "salarioDiarioIntegrado" ], nodes: { - [`${useNamespace ? 'nomina12:' : ''}SubContratacion`]: { + 'SubContratacion': { position: "subContrataciones", strictArrayResponse: true, attributes: ["rfcLabora", "porcentajeTiempo"] } } }, - [`${useNamespace ? 'nomina12:' : ''}Percepciones`]: { + 'Percepciones': { position: "percepciones", attributes: [ "totalGravado", @@ -83,7 +78,7 @@ function getNominaDefinition(params: { useNamespace: any }) { "totalSueldos" ], nodes: { - [`${useNamespace ? 'nomina12:' : ''}Percepcion`]: { + 'Percepcion': { position: "arrayPercepciones", strictArrayResponse: true, attributes: [ @@ -94,7 +89,7 @@ function getNominaDefinition(params: { useNamespace: any }) { "importeExento" ], nodes: { - [`${useNamespace ? 'nomina12:' : ''}HorasExtra`]: { + 'HorasExtra': { position: "horasExtra", strictArrayResponse: true, attributes: [ @@ -106,7 +101,7 @@ function getNominaDefinition(params: { useNamespace: any }) { } } }, - [`${useNamespace ? 'nomina12:' : ''}JubilacionPensionRetiro`]: { + 'JubilacionPensionRetiro': { position: "arrayJubilacionPensionRetiro", strictArrayResponse: true, attributes: [ @@ -117,7 +112,7 @@ function getNominaDefinition(params: { useNamespace: any }) { "ingresoNoAcumulable" ] }, - [`${useNamespace ? 'nomina12:' : ''}SeparacionIndemnizacion`]: { + 'SeparacionIndemnizacion': { position: "arraySeparacionIndemnizacion", strictArrayResponse: true, attributes: [ @@ -130,37 +125,37 @@ function getNominaDefinition(params: { useNamespace: any }) { } } }, - [`${useNamespace ? 'nomina12:' : ''}OtrosPagos`]: { + 'OtrosPagos': { nodes: { - [`${useNamespace ? 'nomina12:' : ''}OtroPago`]: { + 'OtroPago': { position: "otrosPagos", strictArrayResponse: true, attributes: ["tipoOtroPago", "clave", "concepto", "importe"], nodes: { - [`${useNamespace ? 'nomina12:' : ''}SubsidioAlEmpleo`]: { + 'SubsidioAlEmpleo': { attributes: ["subsidioCausado"], }, - [`${useNamespace ? 'nomina12:' : ''}CompensacionSaldosAFavor`]: { + 'CompensacionSaldosAFavor': { attributes: ["saldoAFavor", "remanenteSalFav"], } } } } }, - [`${useNamespace ? 'nomina12:' : ''}Deducciones`]: { + 'Deducciones': { position: "deducciones", attributes: ["totalOtrasDeducciones", "totalImpuestosRetenidos"], nodes: { - [`${useNamespace ? 'nomina12:' : ''}Deduccion`]: { + 'Deduccion': { position: "arrayDeducciones", strictArrayResponse: true, attributes: ["tipoDeduccion", "clave", "concepto", "importe"] } } }, - [`${useNamespace ? 'nomina12:' : ''}Incapacidades`]: { + 'Incapacidades': { nodes: { - [`${useNamespace ? 'nomina12:' : ''}Incapacidad`]: { + 'Incapacidad': { position: "incapacidades", strictArrayResponse: true, attributes: [ @@ -177,8 +172,7 @@ function getNominaDefinition(params: { useNamespace: any }) { } export const allDataDefinition = { - ...getNominaDefinition({ useNamespace: false }), - ...getNominaDefinition({ useNamespace: true }), + ...getNominaDefinition(), }; export default (params?: tMinimalData) => diff --git a/src/CfdiExtractData/templates/pagos.ts b/src/CfdiExtractData/templates/pagos.ts index cd1055c..b6c3b02 100644 --- a/src/CfdiExtractData/templates/pagos.ts +++ b/src/CfdiExtractData/templates/pagos.ts @@ -1,10 +1,9 @@ import getImpuestosDefinition from "./impuestos"; -import { tMinimalData, tNamespace } from "../index.d"; +import { tMinimalData } from "../index.d"; -export function __getInnerNodesWithCustomNamespace(params?: tNamespace) { - let localNamespace = params && params.namespace ? `${params.namespace}:` : ""; +export function __getInnerNodes() { return { - [`${localNamespace}Pago`]: { + 'Pago': { position: "arrayPagos", strictArrayResponse: true, attributes: [ @@ -25,7 +24,7 @@ export function __getInnerNodesWithCustomNamespace(params?: tNamespace) { "selloPago" ], nodes: { - [`${localNamespace}DoctoRelacionado`]: { + 'DoctoRelacionado': { strictArrayResponse: true, position: "docsRelacionados", attributes: [ @@ -41,9 +40,7 @@ export function __getInnerNodesWithCustomNamespace(params?: tNamespace) { "impSaldoInsoluto" ] }, - [`${localNamespace}Impuestos`]: getImpuestosDefinition({ - namespace: localNamespace - }) + 'Impuestos': getImpuestosDefinition() } } }; @@ -58,18 +55,15 @@ const allDataPagos = { position: "pagos", attributes: ["version"], nodes: Object.assign( - __getInnerNodesWithCustomNamespace(), - __getInnerNodesWithCustomNamespace({ namespace: "pago10" }) + __getInnerNodes(), ) }; export const minimalDataDefinition = { - "pago10:Pagos": minimalDataPagos, "Pagos": minimalDataPagos, }; export const allDataDefinition = { - "pago10:Pagos": allDataPagos, "Pagos": allDataPagos, }; diff --git a/src/CfdiExtractData/templates/timbre.ts b/src/CfdiExtractData/templates/timbre.ts index 4513829..9cb944c 100644 --- a/src/CfdiExtractData/templates/timbre.ts +++ b/src/CfdiExtractData/templates/timbre.ts @@ -1,10 +1,6 @@ import { tMinimalData } from "../index.d"; export const minimalDataDefinition = { - "tfd:TimbreFiscalDigital": { - position: "timbreFiscal", - attributes: ["fechaTimbrado", "uuid"] - }, "TimbreFiscalDigital": { position: "timbreFiscal", attributes: ["fechaTimbrado", "uuid"] @@ -12,17 +8,6 @@ export const minimalDataDefinition = { }; export const allDataDefinition = { - "tfd:TimbreFiscalDigital": { - position: "timbreFiscal", - attributes: [ - "fechaTimbrado", - "uuid", - "noCertificadoSAT", - "selloSAT", - "selloCFD", - "RFCProvCertif" - ] - }, "TimbreFiscalDigital": { position: "timbreFiscal", attributes: [ diff --git a/src/XmlExtractData/index.ts b/src/XmlExtractData/index.ts index c89d8b5..786ee5c 100644 --- a/src/XmlExtractData/index.ts +++ b/src/XmlExtractData/index.ts @@ -12,7 +12,7 @@ export default class XMLExtractData { this.doc = domParser.parseFromString(xml); } - public extractData(extractConfig: any) { + public extractData(extractConfig: any) { return this.extractNodes(extractConfig); } @@ -50,6 +50,17 @@ export default class XMLExtractData { if(!nodeElements.length) { continue; } nodeValue = this.extractNodes({[nodeName]: nodes[i].nodes[nodeName]}, nodeElements); + + if( + nodes[i].nodes[nodeName].position + && nodes[i].nodes[nodeName].position == 'nominas' + ) { + let versions = nodeValue.map((item: any) => item.version); + if(nodes[i].nodes[nodeName].version != versions[0]) { + continue; + } + } + if(nodes[i].nodes[nodeName].position) { tempAttributes[nodes[i].nodes[nodeName].position] = nodeValue; } else { diff --git a/src/index.ts b/src/index.ts index 865a133..872428e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,19 @@ import CfdiExtractData from './CfdiExtractData'; -const { extractGeneralData: parse } = CfdiExtractData; +const { + getUuidByXML, + getXMLVersion, + getConcepts32Definition, + getConcepts33Definition, + extractGeneralData: parse, + getByCustomTemplateDefinition: parseByCustomTemplate, +} = CfdiExtractData; export { - parse + parse, + getUuidByXML, + getXMLVersion, + parseByCustomTemplate, + getConcepts32Definition, + getConcepts33Definition, };