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,
};