Node js + Signati = CFDI 3.3

para poder realizar un factura en mexico CFDI 3.3 se necesita crear el xml para poder ser firmado por un pack certificado externno, lo mas detalloso es crear y firmar el xml por parte del emisor.

Para eso existe una herramienta creada por el grupo Signati

Esta herramienta permite la creacion y sellado mas facil del xml.

Estructura General CFDI 3.

npm i --save @signati/core

1.Importar las clases a utilizar

import { CFDI, Comprobante, Concepts, Emisor, Impuestos, Receptor, Relacionado } from '@signati/core'; 

2.Obtener los Certificados de Sello Digital

Esta se puede obtener en la pagia de signati

const key = 'CSD_Pruebas_CFDI_TCM970625MB1.key'; 
const cer = 'CSD_Pruebas_CFDI_TCM970625MB1.cer';
    const comprobanteAttribute: Comprobante = { 
    Serie: 'E',
    Folio: 'ACACUN-27', -
    Fecha: '2014-07-08T12:16:50',
    Sello: '',
    FormaPago: 'Pago en una sola exhibición',
    NoCertificado: '',
    Certificado: '',
    condicionesDePago: 'Contado',
    SubTotal: '16148.04',
    Descuento: '645.92',
    Moneda: 'MXN',
    Total: '17207.35',
    TipoDeComprobante: 'I',
    MetodoPago: 'En efectivo',
    LugarExpedicion: 'México'
};

3.Definir el nuevo objeto de la clase de CFDI

const cfd = new CFDI(comprobanteAttribute); 

await cfd.setAttributesXml({version: '1.0', encoding: 'utf-8'});

Para tener la relacion de un factura a otra se realizar con la siguiente clase y se envia al objeto de cfd

const relation = new Relacionado({ TipoRelacion: '01' }); relation.addRelation('');
await cfd.relacionados(relation);

4.-Definir el Emisor

El Emisor es quien emite la factura y se declara de la siguiente manera

const emisor = new Emisor({ Rfc: '', Nombre: '', RegimenFiscal: 601});
await cfd.emisor(emisor);

5.-Definir el Receptor

El Receptor es quien recibe o solicita la factura y se declara de la siguiente manera

const receptor = new Receptor({ Rfc: 'XAXX010101000', Nombre: 'PUBLICO EN GENERAL', UsoCFDI: 'G01' }); 
await cfd.receptor(receptor);

6.-Definir los conceptos

Los conceptos son los articulos o servicios obtenidos del emisor, productos que adquirimos que pueden tener o no tener impuesto dependiento de que tipo de producto es.

const concepto = new Concepts({ 
ClaveProdServ: '', 
NoIdentificacion: '', 
Cantidad: '',
ClaveUnidad: '', 
Unidad: '', 
Descripcion: '',
ValorUnitario: '', 
Importe: '', 
Descuento: '', 
}); 

concepto.traslado({ 
Base: '', 
Impuesto: '', 
TipoFactor: '',
TasaOCuota:'', 
Importe: '', 
});

concepto.retencion({ 
Base: '', 
Impuesto: '', 
TipoFactor: '', 
TasaOCuota: '', 
Importe: '', 
});

await cfd.concepto(concepto);

7.-Dfinir Impuestos

En la factura la parte mas importante es saber como poner los impuesto y signati nos facilita para conocer la estrutura

const impuesto: Impuestos = new Impuestos({ 
TotalImpuestosRetenidos: '', 
TotalImpuestosTrasladados: ''
}); 

impuesto.traslados({ 
Impuesto: '', 
TipoFactor: '', 
TasaOCuota: '',
 Importe: '',
 });

impuesto.retenciones({ 
Impuesto: '', 
TipoFactor: '', 
TasaOCuota: '', 
Importe: '', 
});
 await cfd.impuesto(impuesto);

8.-Sella y Certificar

La factura se tiene que sella con el sello del emisor para poder hacer valida por parte de el y agregar el certificado expedido por el SAT, esta herramienta permite hacerlo de una manera mas sencilla ya que hace todo ese proceso por nosotros.

await cfd.certificar(cer); 
await cfd.sellar(key, '12345678a');

9.- Obtener el Xml

Una vez finalizado todo lo anterior ya podemos obtener el xml ya sellado y certificado pero aun no es valido es necesario enviarlo al algun pack certificado por parte del sat para validarlo y ponerle el sello de aprobacion

 const xml = await cfd.getXmlCdfi();

<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd" Version="3.3" Serie="" Folio="" Fecha="" Sello="" FormaPago="" NoCertificado="" Certificado="" CondicionesDePago="" SubTotal="" Descuento="" Moneda="" TipoCambio="" Total="" TipoDeComprobante="" MetodoPago="" LugarExpedicion="" Confirmacion="">
  <cfdi:CfdiRelacionados TipoRelacion="">
    <cfdi:CfdiRelacionado UUID=""/>
  </cfdi:CfdiRelacionados>
  <cfdi:Emisor Rfc="" Nombre="" RegimenFiscal=""/>
  <cfdi:Receptor Rfc="" Nombre="" ResidenciaFiscal="" NumRegIdTrib="" UsoCFDI=""/>
  <cfdi:Conceptos>
    <cfdi:Concepto ClaveProdServ="" NoIdentificacion="" Cantidad="" ClaveUnidad="" Unidad="" Descripcion="" ValorUnitario="" Importe="" Descuento="">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Base="" Impuesto="" TipoFactor="" TasaOCuota="" Importe=""/>
        </cfdi:Traslados>
        <cfdi:Retenciones>
          <cfdi:Retencion Base="" Impuesto="" TipoFactor="" TasaOCuota="" Importe=""/>
        </cfdi:Retenciones>
      </cfdi:Impuestos>
    </cfdi:Concepto>
  </cfdi:Conceptos>
  <cfdi:Impuestos TotalImpuestosRetenidos="" TotalImpuestosTrasladados="">
    <cfdi:Retenciones>
      <cfdi:Retencion Impuesto="" Importe=""/>
    </cfdi:Retenciones>
    <cfdi:Traslados>
      <cfdi:Traslado Impuesto="" TipoFactor="" TasaOCuota="" Importe=""/>
    </cfdi:Traslados>
  </cfdi:Impuestos>
  <cfdi:Complemento/>
</cfdi:Comprobante>

Etiquetas: , , , , , , ,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.