Cadena original.
La cadena original es la secuencia de datos formada con parte de la información contenida dentro del comprobante fiscal digital.
Con la cadena original y tu certificado, podrás generar el sello que también debes colocar en el comprobante.
Para generarla puedes utilizar un transformador xslt o construirla manualmente.
Construcción automática con xslt
Para la construcción de la cadena original automática, necesitas:
- El cfdi con toda la información (ejemplo)
- El xslt de transformación
- Instalar la herramienta xsltproc (Incluida en Linux y OS X. Para windows descargarla aquí).
Desde la linea de comando deberás ejecutar:
>xsltproc cadenaoriginal_3_2.xslt cfd_ejemplo.xml
Recibirás la cadena original:
||3.2|2013-12-02T22:18:24|ingreso|PAGO EN UNA SOLA EXHIBICION|1000.00|1160.00|TRANSFERENCIA ELECTRONICA|D.F.,MEXICO|DESCONOCIDO|AAA010101AAA|EMPRESA DEMO|REFORMA|BENITO JUAREZ|DISTRITO FEDERAL|MEXICO|34343|PERSONA FISCA|XAXX010101000|PUBLICO EN GENERAL|INSURGENTES|MEXICO|1|CANT|PZA|1000.00|1000.00|IVA|160.00|160.00||~
Construcción manual
Si deseas construirla manualmente, estas son las reglas generales:
- Ninguno de los atributos que conforman al comprobante fiscal digital deberá contener el caracter | (“pipe”) debido a que este será utilizado como caracter de control en la formación de la cadena original.
- El inicio de la cadena original se encuentra marcado mediante una secuencia de caracteres || (doble “pipe”).
- Se expresará únicamente la información del dato sin expresar el atributo al que hace referencia. Esto es, si la serie del comprobante es la “A” solo se expresará |A| y nunca |Serie A|.
- Cada dato individual se encontrará separado de su dato subsiguiente, en caso de existir, mediante un carácter | (“pipe” sencillo).
- Los espacios en blanco que se presenten dentro de la cadena original serán tratados de la siguiente manera:
- Se deberán remplazar todos los tabuladores, retornos de carro y saltos de línea por espacios en blanco.
- Acto seguido se elimina cualquier caracter en blanco al principio y al final de cada separador | (“pipe” sencillo).
- Finalmente, toda secuencia de caracteres en blanco intermedias se sustituyen por un único caracter en blanco.
- Los datos opcionales no expresados, no aparecerán en la cadena original y no tendrán delimitador alguno.
- El final de la cadena original será expresado mediante una cadena de caracteres || (doble “pipe”).
- Toda la cadena original se expresará en el formato de codificación UTF-8.
- El nodo o nodos adicionales
se integrarán a la cadena original como se indica en la secuencia de formación en su numeral 10, respetando la secuencia de formación y número de orden del ComplemetoConcepto. - El nodo o nodos adicionales
se integraran al final de la cadena original respetando la secuencia de formación para cada complemento y número de orden del Complemento.
Secuencia de formación
La secuencia de formación será siempre en el orden que se expresa a continuación, tomando en cuenta las reglas generales expresadas en el párrafo anterior.
**||version|fecha|tipoDeComprobante|formaDePago|condicionesDePago|subTotal|descuento|TipoCambio|Moneda|total|metodoDePago|LugarExpedicion|NumCtaPago|FolioFiscalOrig|SerieFolioFiscalOrig|FechaFolioFiscalOrig|MontoFolioFiscalOrig|Emisor:rfc|Emisor:nombre|Emisor:DomicilioFiscal:calle|Emisor:DomicilioFiscal:noExterior|Emisor:DomicilioFiscal:noInterior|Emisor:DomicilioFiscal:colonia|Emisor:DomicilioFiscal:localidad|Emisor:DomicilioFiscal:referencia|Emisor:DomicilioFiscal:municipio|Emisor:DomicilioFiscal:estado|Emisor:DomicilioFiscal:referencia|Emisor:DomicilioFiscal:estado|Emisor:DomicilioFiscal:pais|Emisor:DomicilioFiscal:codigoPostal|Emisor:ExpedidoEn:calle|Emisor:ExpedidoEn:noExterior|Emisor:ExpedidoEn:noInterior|Emisor:ExpedidoEn:colonia|Emisor:ExpedidoEn:localidad|Emisor:ExpedidoEn:referencia|Emisor:ExpedidoEn:municipio|Emisor:ExpedidoEn:estado|Emisor:ExpedidoEn:referencia|Emisor:ExpedidoEn:estado|Emisor:ExpedidoEn:pais|Emisor:ExpedidoEn:codigoPostal|Emisor:RegimenFiscal:Regimen|Receptor:rfc|Receptor:nombre|Receptor:DomicilioFiscal:calle|Receptor:DomicilioFiscal:noExterior|Receptor:DomicilioFiscal:noInterior|Receptor:DomicilioFiscal:colonia|Receptor:DomicilioFiscal:localidad|Receptor:DomicilioFiscal:referencia|Receptor:DomicilioFiscal:municipio|Receptor:DomicilioFiscal:estado|Receptor:DomicilioFiscal:referencia|Receptor:DomicilioFiscal:estado|Receptor:DomicilioFiscal:pais|Receptor:DomicilioFiscal:codigoPostal|Concepto:cantidad|Concepto:unidad|Concepto:noIdentificacion|Concepto:descripcion|Concepto:valorUnitario|Concepto:importe|Concepto:InformacionAduanera:numero|Concepto:InformacionAduanera:fecha|Concepto:InformacionAduanera:aduana|Concepto:CuentaPredial:numero|ComplementoConcepto|Impuestos:Retencion:impuesto|Impuestos:Retencion:importe|Impuestos:totalImpuestosRetenidos|Impuestos:Traslado:impuesto|Impuestos:Traslado:importe|Impuestos:totalImpuestosTrasladados||
* Los campos no obligatorios en la definición del CFDI, se podrían ignorar en la cadena. Como Emisor:ExpedidoEn Receptor:ExpedidoEn
* Para cada uno de los nodos de Emisor:RegimenFiscal, se deberá incluir cada valor Regimen
* Para cada uno de los nodos de Concepto:InformacionAduanera deberá incluir cada valor numero, fecha, aduana
* Para todos los nodos de Impuestos:Trasladado e Impuestos:Retencion impuesto, importe
Puedes consultar el detalle en el Anexo 20, página 48