cfdi40
Version:
Libreria para crear y sellar xml cfdi V4.0
453 lines (395 loc) • 9.57 kB
Markdown
[![MIT License][license-image]][license-url]
[![Greenkeeper badge][green-image]][green-url]
[![Known Vulnerabilities][snyk-image]][snyk-url]
[![NPM version][npm-version-image]][npm-url]
[![NPM downloads][npm-downloads-image]][npm-url]
[![dependencies status][dev-image]][dev-url]
[green-image]: https://badges.greenkeeper.io/PolygonTechMX/CFDI.svg
[green-url]: https://greenkeeper.io/
[snyk-image]: https://snyk.io/test/github/polygontechmx/cfdi/badge.svg?targetFile=package.json
[snyk-url]: https://snyk.io/test/github/polygontechmx/cfdi?targetFile=package.json
[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
[license-url]: LICENSE
[npm-url]: https://npmjs.org/package/cfdi
[npm-version-image]: http://img.shields.io/npm/v/cfdi.svg?style=flat
[npm-downloads-image]: http://img.shields.io/npm/dt/cfdi.svg?style=flat
[dev-image]: https://img.shields.io/david/mgcrea/node-openssl-wrapper.svg?style=flat
[dev-url]: https://david-dm.org/mgcrea/node-openssl-wrapper
Libreria para crear y sellar documendos xml cfdi.
Por el momento solo funciona para windows y no requiere instalacion de OpenSSL ni Libxml2 ya que vienen integrados en el paquete.
<!-- toc -->
- [Instalación](#Instalación)
- [Metodos](#Glosario)
* [`Init`](#init)
* [`Comprobante`](#comprobante)
* [`CFDI Relacionados`](#relacionados)
* [`Emisor`](#emisor)
* [`Receptor`](#receptor)
* [`Concepto`](#concepto)
* [`Traslados`](#concepto.traslado)
* [`Retenciones`](#concepto.retencion)
* [`Agregar`](#concepto.agregar)
* [`Impuestos`](#impuestos)
* [`Certificar`](#certificar)
* [`Generar XML`](#xml)
* [`Generar XML Sellado`](#xmlSellado)
- [Ejemplos]()
* [`Ejemplo básico`](#basico)
* [`Ejemplo simplificado`](#simplificado)
* [`Complemento de Pago`](#complementopago)
<!-- tocstop -->
## Instalación
NPM:
* npm install cfdi40 --save
YARN:
* yarn add cfdi40
## Glosario
### `init`
```javascript
const CFDI = require('cfdi40');
const key = './LAN7008173R5.key';
const cer = './LAN7008173R5.cer';
const cfdi = new CFDI()
```
### `comprobante`
```javascript
cfdi.comprobante({
Serie: 'A',
Folio: '167ABC',
Fecha: '2018-01-16T09:33:43',
SubTotal: '369.83',
Moneda: 'MXN',
Total: '429.00',
TipoDeComprobante: 'I',
FormaPago: '01',
MetodoPago: 'PUE',
CondicionesDePago: 'CONDICIONES',
Descuento: '0.00',
TipoCambio: '1',
LugarExpedicion: '45079'
});
```
### `relacionados`
```javascript
cfdi.CfdiRelacionados({
TipoRelacion: '',
CfdiRelacionados: ['UUID_____________1', 'UUID_____________2', 'UUID_____________3']
});
```
### `emisor`
```javascript
cfdi.emisor({
Rfc: 'SAT',
Nombre: 'SAT SA DE CV',
RegimenFiscal: '601'
});
```
### `receptor`
```javascript
cfdi.receptor({
Rfc: 'MALD930428US2',
Nombre: 'DAVID ISAAC MARTINEZ LOPEZ',
UsoCFDI: 'G01'
});
```
### `concepto`
```javascript
const concepto = cfdi.concepto({
ClaveProdServ: '52121500',
ClaveUnidad: 'E48',
NoIdentificacion: '3031130179',
Cantidad: '1',
Unidad: 'PZ',
Descripcion: 'BATITA UNICORNIO',
ValorUnitario: '369.83',
Importe: '369.83'
});
```
### `concepto.traslado`
```javascript
concepto.traslado({
Base: '369.83',
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
});
```
### `concepto.retencion`
```javascript
concepto.retencion({
Base: '369.83',
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
});
```
### `concepto.agregar`
```javascript
concepto.agregar(cfdi),
```
### `impuestos`
```javascript
cfdi.impuestos({
TotalImpuestosTrasladados: '59.17',
Traslados: [
{
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
}
]
});
```
### `certificar`
```javascript
const cer = path.join(__dirname, 'LAN7008173R5.cer');
cfdi.certificar(cer);
```
### xml
```javascript
cfdi
.xml()
.then(xml => console.log(xml))
.catch(err => console.log(err));
```
### `xmlSellado`
```javascript
const key = path.join(__dirname, 'LAN7008173R5.key');
cfdi.xmlSellado(key, '12345678a')
.then(xml => console.log(xml))
.catch(err => console.log(err));
```
### `basico`
```javascript
const fs = require('fs');
const CFDI = require('../src/CFDI');
const key = './LAN7008173R5.key';
const cer = './LAN7008173R5.cer';
const cfdi = new CFDI({
Serie: 'A',
Folio: '167ABC',
Fecha: '2018-01-16T09:33:43',
SubTotal: '369.83',
Moneda: 'MXN',
Total: '429.00',
TipoDeComprobante: 'I',
FormaPago: '01',
MetodoPago: 'PUE',
CondicionesDePago: 'CONDICIONES',
Descuento: '0.00',
TipoCambio: '1',
LugarExpedicion: '45079'
});
cfdi.emisor({
Rfc: 'SAT',
Nombre: 'SAT SA DE CV',
RegimenFiscal: '601'
});
cfdi.receptor({
Rfc: 'MALD930428US2',
Nombre: 'DAVID ISAAC MARTINEZ LOPEZ',
UsoCFDI: 'G01'
});
const concepto = cfdi.concepto({
ClaveProdServ: '52121500',
ClaveUnidad: 'E48',
NoIdentificacion: '3031130179',
Cantidad: '1',
Unidad: 'PZ',
Descripcion: 'BATITA UNICORNIO',
ValorUnitario: '369.83',
Importe: '369.83'
});
concepto.traslado({
Base: '369.83',
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
});
concepto.agregar(cfdi);
cfdi.impuestos({
TotalImpuestosTrasladados: '59.17',
Traslados: [
{
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
}
]
});
cfdi.certificar(cer);
cfdi.xmlSellado(key, '12345678a')
.then(xml => console.log(xml))
.catch(err => console.log(err));
```
### `simplificado`
```javascript
const fs = require('fs');
const CFDI = require('../src/CFDI');
const key = './LAN7008173R5.key';
const cer = './LAN7008173R5.cer';
const cfdi = new CFDI({
Serie: 'A',
Folio: '167ABC',
Fecha: '2018-01-16T09:33:43',
SubTotal: '369.83',
Moneda: 'MXN',
Total: '429.00',
TipoDeComprobante: 'I',
FormaPago: '01',
MetodoPago: 'PUE',
CondicionesDePago: 'CONDICIONES',
Descuento: '0.00',
TipoCambio: '1',
LugarExpedicion: '45079'
}).emisor({
Rfc: 'SAT',
Nombre: 'SAT SA DE CV',
RegimenFiscal: '601'
}).receptor({
Rfc: 'MALD930428US2',
Nombre: 'DAVID ISAAC MARTINEZ LOPEZ',
UsoCFDI: 'G01'
}).impuestos({
TotalImpuestosTrasladados: '59.17',
Traslados: [
{
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
}
]
});
cfdi.concepto({
ClaveProdServ: '52121500',
ClaveUnidad: 'E48',
NoIdentificacion: '3031130179',
Cantidad: '1',
Unidad: 'PZ',
Descripcion: 'BATITA UNICORNIO',
ValorUnitario: '369.83',
Importe: '369.83'
}).retencion({
Base: '369.83',
Impuesto: '002',
TipoFactor: 'Tasa',
TasaOCuota: '0.16',
Importe: '59.17'
}).agregar(cfdi);
cfdi
.certificar(cer)
.xmlSellado(key, '12345678a')
.then(xml => console.log(xml))
.catch(err => console.log(err));
```
## `Complemento.pago`
```javascript
const cfdi = new CFDI({
Serie: 'A',
Folio: '167ABC',
Fecha: '2018-01-16T09:33:43',
SubTotal: '369.83',
Moneda: 'MXN',
Total: '429.00',
TipoDeComprobante: 'I',
FormaPago: '01',
MetodoPago: 'PUE',
CondicionesDePago: 'CONDICIONES',
Descuento: '0.00',
TipoCambio: '1',
LugarExpedicion: '45079'
}).emisor({
Rfc: 'SAT',
Nombre: 'SAT SA DE CV',
RegimenFiscal: '601'
}).receptor({
Rfc: 'MALD930428US2',
Nombre: 'DAVID ISAAC MARTINEZ LOPEZ',
UsoCFDI: 'G01'
})
cfdi.concepto({
ClaveProdServ: '52121500',
ClaveUnidad: 'E48',
NoIdentificacion: '3031130179',
Cantidad: '1',
Unidad: 'PZ',
Descripcion: 'BATITA UNICORNIO',
ValorUnitario: '369.83',
Importe: '369.83'
}).agregar(cfdi);
cfdi.Pago({
FechaPago: '2018-01-16T09:33:43',
FormaDePagoP: '03',
MonedaP: 'MXN',
Monto: '429.00'
}).Totales({
MontoTotalPagos: '112.00',
TotalRetencionesIVA: '4.00',
TotalTrasladosBaseIVA16: '100.00',
TotalTrasladosImpuestoIVA16: '16.00'
}).DoctoRelacionado({
IdDocumento: '83805D05-4538-5C99-BC5C-5C73AEB7D0EB',
MonedaDR: 'MXN',
NumParcialidad: '1',
ImpSaldoAnt: '112.00',
ImpSaldoInsoluto: '0.00'
}).RetencionesDR({
BaseDR:"100.00",
ImporteDR:"4.00",
ImpuestoDR:"002",
TasaOCuotaDR:"0.040000",
TipoFactorDR:"Tasa"
})
.TrasladosDR({
BaseDR:"100.00",
ImporteDR:"16.00",
ImpuestoDR:"002",
TasaOCuotaDR:"0.160000",
TipoFactorDR:"Tasa"
}).agregar(cfdi);
cfdi.Pago({
FechaPago: '2018-01-16T09:33:43',
FormaDePagoP: '03',
MonedaP: 'MXN',
Monto: '429.00'
}).DoctoRelacionado({
IdDocumento: '--------------------------------',
MonedaDR: 'MXN',
NumParcialidad: '1',
ImpSaldoAnt: '112.00',
ImpSaldoInsoluto: '0.00'
}).agregar(cfdi);
cfdi.impuestosP({
TrasladoP: [
{
BaseP:"100.00",
ImporteP:"16.00",
ImpuestoP:"002",
TasaOCuotaP:"0.160000",
TipoFactorP:"Tasa"
}
],
RetencionP: [
{
ImporteP:"4.00",
ImpuestoP:"002"
}
]
})
cfdi
.certificar(cer)
.xmlSellado(key, '12345678a')
.then(xml => fs.writeFileSync('./test/testCRP.xml', xml))
.catch(err => console.log(err));
```
## Utilidades
Windows build tools
* npm install --global windows-build-tools
OpenSSL Windows X64
* https://slproweb.com/download/Win64OpenSSL-1_0_2n.exe