1.3. Cadena Original
De acuerdo con el SAT la cadena original se entiende como:
La cadena original se genera procesando la factura electrónica en formato XML (o cualquier otro comprobante fiscal digital CFD) con una plantilla XSL o XSLT (es el mismo tipo de archivo, se le conoce como XSLT, pero se acostumbra dejar las extensiones de archivos con 3 letras por eso el XSL) que brinda el SAT de acuerdo a la versión de CFD que se quiera obtener.
La cadena original es un elemento muy importante y delicado de el comprobante fiscal digital, en ésta se incluye información que integra a la factura es por eso que su generación debe ser con sumo cuidado y para esto es preferible usar herramientas previamente aprobadas como librerías (JAR o DLL).
A continuación se muestra un ejemplo de como obtener la cadena original en versión 3.3 usando los siguientes elementos que brinda el SAT:
El Sistema de Administración Tributaria (SAT) prevé el cambio de su versión de CFDI 3.3 a la Nueva versión de CFDI 3.3.
En Solución Factible®
reiteramos nuestro compromiso de servirle preparando los escenarios y presentando la documentación existente relacionada sobre este tema,
para que así, usted tome sus precauciones y la transición a este nuevo esquema de facturación sea para usted lo más simple posible.
Más información Aquí
Nota: nuestro ambiente de "Testing" ya se encuentra disponible para recibir comprobantes en versión 3.3 le recomendamos realizar las pruebas que considere necesarias.
Para obtener el resultado de cadena original en el ejemplo anterior se uso xsltproc:
- Windows: descargar las herramientas en el siguiente enlace. libxml
- Linux: ya estan instaladas por defecto.
$ xsltproc cadenaoriginal_3_3.xslt ejemplo1cfdv33.xml
1.3.1. Diagrama del proceso de generación
1.3.2. Ejemplos de Código
Generar Cadena Original con Java
import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.File; import java.io.IOException; public class CadenaOriginalGen { public static void main(String[] args) throws TransformerException, IOException { // cargar el archivo XSLT File xslt = new File("C:/SAT/cadenaoriginal_3_3.xslt"); StreamSource sourceXSL = new StreamSource(xslt); // cargar el CFDI File cfdi = new File("C:/SAT/ejemplo1cfdv33.xml"); StreamSource sourceXML = new StreamSource(cfdi); // crear el procesador XSLT que nos ayudará a generar la cadena original // con base en las reglas del archivo XSLT TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(sourceXSL); // aplicar las reglas del XSLT con los datos del CFDI y escribir el resultado en output transformer.transform(sourceXML, new StreamResult(System.out)); } }
Generar Cadena Original con PHP (Cortesía de Julián May)
<?php //ruta al archivo XML del CFDI $xmlFile="C:/SAT/ejemplo1cfdv33.xml"; // Ruta al archivo XSLT $xslFile = "C:/SAT/cadenaoriginal_3_3.xslt"; // Crear un objeto DOMDocument para cargar el CFDI $xml = new DOMDocument("1.0","UTF-8"); // Cargar el CFDI $xml->load($xmlFile); // Crear un objeto DOMDocument para cargar el archivo de transformación XSLT $xsl = new DOMDocument(); $xsl->load($xslFile); // Crear el procesador XSLT que nos generará la cadena original con base en las reglas descritas en el XSLT $proc = new XSLTProcessor; // Cargar las reglas de transformación desde el archivo XSLT. $proc->importStyleSheet($xsl); // Generar la cadena original y asignarla a una variable $cadenaOriginal = $proc->transformToXML($xml); echo $cadenaOriginal; ?>
Generar Cadena Original con C# (CSharp)
using System; using System.Xml.XPath; using System.Xml.Xsl; using System.Xml; using System.IO; namespace pruebas { public class GeneradorCadenas { public GeneradorCadenas() { //Cargar el XML StreamReader reader = new StreamReader(@"C:/SAT/ejemplo1cfdv33.xml"); XPathDocument myXPathDoc = new XPathDocument(reader); //Cargando el XSLT XslCompiledTransform myXslTrans = new XslCompiledTransform(); myXslTrans.Load(@"C:/SAT/cadenaoriginal_3_3.xslt"); StringWriter str = new StringWriter(); XmlTextWriter myWriter = new XmlTextWriter(str); //Aplicando transformacion myXslTrans.Transform(myXPathDoc, null, myWriter); //Resultado string result = str.ToString(); //Fin del programa. } } }
1.3.3. Herramienta
Generador de Cadena Original
Ésta herramienta toma una factura electrónica (CFD) (.xml) y obtiene su cadena original aplicando el XSLT que haya elegido en: version de cadena
- Modalidad "Generar", Procesa un XML previamente seleccionado, calcula su cadena original y la muestra
- Modalidad "Descargar", Procesa un XML previamente seleccionado, calcula su cadena original y descarga un archivo .txt con la cadena