Real Virtual

Manual - Demo PHP


Introducción

El Demo PHP es un pequeño sistema que permite realizar las pruebas necesarias para aprender a cómo timbrar un CFDI con nuestro servicio de timbrado.

Este sistema está compuesto de 3 secciones: Encabezado, Menú de Opciones y Resultados. En este manual se explicarán a detalle las secciones mencionadas y aprenderás todo lo necesario para poder timbrar y cancelar un CFDI, así como obtener su XML y PDF.

De forma general, en este Demo podrás seleccionar cualquiera de los CFDI prestablecidos para timbrarlo. Cada CFDI prestablecido corresponde a un ejemplo de llenado para una Factura Normal, un complemento de Pagos, una Carta Porte, un Recibo de Nómina y muchos más. Una vez que el CFDI ha sido timbrado aparecerán en pantalla el Layout creado del CFDI y el XML timbrado, así como la respuesta de nuestro servicio de timbrado.

Además, podrás guardar en tu computadora el Layout y el XML. También, podrás consultar el estatus del CFDI en el SAT y proceder a su cancelación. Si lo deseas, también podrás enviar el PDF y XML por correo electrónico con una previa configuración que realices y también podrás descargar el PDF en tu computadora.

Seguramente te preguntarás cómo funciona todo a nivel código fuente en PHP. Hemos dedicado una sección al final de este manual para ello, ya que consideramos que es importante comprender primero cómo funciona el sistema externamente antes de adentrarse en su código interno.

En términos generales, el código fuente del Demo consiste en lo siguiente:

Cuando se procede a timbrar un CFDI internamente se crea un Layout, el cual es un texto con un formato establecido que corresponde a la estructura de un CFDI. Posteriormente, se consume nuestro servicio web de Conversión de Layout a XML para convertir el Layout a un XML utilizando el Certificado de Sello Digital, Llave Privada y Contraseña del Emisor. Por úlitmo, se consume el servicio web de Timbrado enviando el XML para timbrarlo y obtenemos la respuesta final del servicio.

Este Demo está configurado para funcionar en Ambiente de Pruebas con el RFC Emisor de pruebas. Una vez que hayas comprendido el Demo y su código fuente, podrás integrar el timbrado de CFDI y otras funciones en tu proyecto, permitiendo su operación en el Ambiente Productivo, es decir, en un entorno de timbrado real.

Deseamos que tu experiencia con este demo sea muy agradable.


Pantalla General

Al iniciar el Demo se visualiza la siguiente pantalla general.




El Demo está dividido en tres secciones:


- Encabezado
Esta sección ubicada en la parte superior contiene información sobre la configuración interna del sistema para llevar a cabo los procesos de timbrado, cancelación y generación de PDF, entre otros.


- Menú de Opciones
Esta sección ubicada al lado izquierdo permite timbrar un CFDI, guardar el Layout, guardar el XML, consultar el estatus del CFDI en el SAT, cancelar el CFDI, descargar el PDF y enviar por correo el XML y PDF.


- Resultados
Esta sección ubicada al lado derecho sirve para mostrar el Layout creado del CFDI y el XML resultante, así como el mensaje de éxito o error durante el proceso de timbrado.


Encabezado

En esta sección se puede visualizar información relacionada con la configuración interna del sistema para llevar a cabo los procesos de timbrado, cancelación y generación de PDF, entre otros.
La información que podemos encontrar corresponde a los siguientes apartados:


Certificados del Emisor
Se muestran las rutas de ubicación en la carpeta del sistema en donde se encuentran los archivos del Certificado de Sello Digital, Llave Privada y Contraseña del RFC Emisor del ambiente de pruebas.




Usuario de Timbrado
Se muestran el Usuario y Clave de timbrado correspondiente al RFC de pruebas. Esta información existe registrada en nuestra base de datos.
Cuando se registra un cliente para timbrar con nuestro servicio, obtiene su Usuario y Clave de timbrado, mismos que deberá utilizar para poder timbrar en producción.



Nota: Una vez comprendido el funcionamiento del Demo, puedes experimentar estableciendo tus propios archivos de Certificado de Sello Digital, Llave Privada y Clave de un RFC Emisor para timbrar en producción en conjunto con el Usuario y Clave de timbrado correspondiente.


Logotipo PDF
Se muestra la ruta de ubicación del archivo de imagen que se utilizará como logotipo en el formato PDF de un CFDI.




URL Servicios Web
Se muestran las URLs de los dos servicios web que se utilizan para el timbrado de CFDI y otras operaciones.



- Timbrado. Es el servicio web que permite timbrar un CFDI a partir de un XML.

- Conversión de Layout a XML y creación de PDF. Es el servicio web que permite convertir un Layout a XML para su posterior timbrado y también sirve para crear el PDF a partir de un XML previamente timbrado.

Nota: La información de los servicios web no se debe editar.


Archivo XSLT para crear Cadena Original de CFDI
Aquí se muestra por defecto que el XSLT a utilizar para la creación de la cadena original de un CFDI será el que ya está incluído en nuestro servicio de Conversión de Layout a XML.
Sin embargo, puedes elegir utilizar el XSLT local que se encuentra ubicado en la carpeta "XSLT" del Demo.



La diferencia entre ambas opciones consiste en que para la primera opción, se utiliza el XSLT incluído en nuestro servicio web e internamente dicho archivo XLST consume a otros archivos XSLT correspondientes a los diversos complementos que existen para el CFDI. La conexión con esos archivos se realiza mediante URL de internet para asegurar que siempre se consultarán los archivos XSLT actualizados por parte del SAT.

Por otro lado, si eliges utilizar el XSLT local significa que se utilizará un archivo XSLT ubicado en la carpeta "XSLT" interna del Demo y éste archivo consume de igual manera a otros archivos XSLT mediante rutas que se dirigen a la subcarpeta "Complementos" en donde también se encuentran los XSLT de cada complemento que existen para el CFDI.

Nota: Te recomendamos siempre utilizar el XSLT incluído en nuestro servicio web de Conversión de Layout a XML. En cambio, si deseas tener un control total de los archivos XSLT, entonces selecciona la opción para usar el XSLT que se encuentra dentro del Demo.

Nota: Si decides utilizar los archivos XSLT ubicados dentro del Demo, te darás cuenta de que puedes incluso definir una URL que apunte a tu servidor en donde se encuentre una copia de la carpeta "XSLT" y su contenido obtenida del Demo. De esta forma, le estarías indicando a nuestro servicio web de Conversión de Layout a XML que utilice tus XSLT mediante la URL que establezcas para crear la cadena original del CFDI.


Menú de Opciones

En esta sección se encuentran todas las operaciones que se pueden realizar con el Demo para el timbrado de CFDI y su gestión posterior.



A continuación, se explica a detalle cada una de las operaciones que se pueden realizar en esta sección.


Timbrar
Permite timbrar un CFDI. Puedes seleccionar la versión disponible del CFDI y establecer una fecha de emisión diferente a la que aparece por defecto. Por último, selecciona un ejemplo de un tipo de CFDI (Factura Normal, Pagos, Carta Porte, etc.) para timbrarlo.

Nota: Encontrarás todos los tipos de CFDI y sus complementos que tenemos disponibles para realizar las pruebas de timbrado. Si exploras el código fuente del Demo podrás encontrar a detalle cómo se llenan el CFDI mediante la creación de un Layout para su posterior conversión a XML y proceder al timbrado del mismo.


Guardar Layout
Permite guardar el Layout del CFDI creado en un archivo TXT que se descarga en tu computadora.

Nota: Cuando timbras un CFDI aparecerá el Layout creado en la sección Resultados ubicada en el lado derecho del Demo.


Guardar XML
Permite guardar el XML del CFDI timbrado o no en un archivo TXT que se descarga en tu computadora.

Nota: Cuando timbras un CFDI aparecerá el XML resultante en la sección Resultados ubicada en el lado derecho del Demo. El XML puede estar timbrado o no debido a un error durante el proceso de timbrado.


Estatus SAT
Permite consultar el estatus del CFDI timbrado en el SAT para saber si está vigente o cancelado.

Nota: No existe ambiente de pruebas para esta función, por lo que únicamente funcionará cuando estés en modo productivo.


Cancelar
Permite cancelar el CFDI timbrado.

Nota: No existe ambiente de pruebas para esta función, por lo que únicamente funcionará cuando estés en modo productivo.


Enviar Correo
Permite enviar por correo electrónico los archivos XML y PDF del CFDI timbrado.
Es importante primero generar el archivo PDF para que sea creado internamente en el Demo y el envío de correo pueda funcionar.

Nota: Es necesario que edites el código fuente del Demo en EnvioCorreo/EnvioCorreo.php para que establezcas la configuración SMTP para que PHP pueda conectarse con el proveedor de correo electrónico que utilizarás. Este código fuente es un ejemplo genérico de PHP, por lo que en caso de algún error con el envío de correo o falla de dicho servicio queda fuera de nuestro alcance una solución. Por ello, te recomendamos documentarte acerca de la configuración SMTP que debes utilizar y asegurarte de que establezcas la configuración correcta para tener éxito en el envío de correo.


Descargar PDF
Permite crear el archivo PDF del CFDI timbrado y lo descarga en tu computadora.



Es posible seleccionar el formato del PDF correspondiente al tipo de CFDI que fue timbrado. Por defecto, está seleccionado el formato de una Factura Electrónica, mismo que abarca otros tipos de CFDI con complementos. Sin embargo, existen CFDI con complementos que tienen su formato para poder visualizar todos los datos de dichos complementos.


Resultados

En esta sección se encuentran tres recuadros que muestran el Layout creado, el XML timbrado (también no timbrado en caso de un error) y la respuesta del servicio web de timbrado.

La siguiente imagen muestra la apariencia de estos recuadros después de timbrar un CFDI.



A continuación, se explica cada recuadro de esta sección.


Resultado Layout
Permite visualizar el Layout creado internamente dependiendo del CFDI seleccionado para timbrar.

Nota: Los códigos fuentes de cada ejemplo de CFDI que puedes timbrar están dentro del Demo en la carpeta "TimbradoCFDI" que contiene archivos PHP que corresponden a cada ejemplo. En esos archivos podrás visualizar cómo se crea un Layout mediante PHP y cómo son convertidos a XML para su posterior timbrado.


Resultado XML (timbrado o no)
Permite visualizar el XML timbrado. El XML también puede no estar timbrado debido a un error en el proceso de timbrado.

Nota: Para efectos de visualizacion en este recuadro incluímos un componente JavaScript/CSS llamado CodeMirror que se puede encontrar en internet. Este componente es ajeno a nosotros, por lo que queda fuera de nuestro alcance cualquier modificación al mismo.


Respuesta del Servicio
Permite visualizar la respuesta de nuestro servicio web de Conversión de Layout a XML y del servicio web de Timbrado. De igual manera, permite visualizar los mensajes de éxito o error de cada una de las operaciones de la sección Menú de Opciones.


Funcionamiento Interno

Comenzaremos explicando el funcionamiento interno del Demo detallando todas las carpetas y archivos que contiene. Algunas de esas carpetas y archivos únicamente son para darle estilo visual al sistema y alguno que otro retoque, por lo que no entraremos en detalle en esos aspectos. Posteriormente, explicaremos el flujo de los procesos de timbrado y todas las funcionalidades del sistema a nivel código fuente de forma general. Para profundizar a detalle podrás ver el código fuente directamente explorando los archivos del sistema.

A continuación, se muestra el principio general de comunicación de las funciones del sistema para llevar a cabo las operaciones de timbrado, cancelación, descarga de PDF y demás en los tres lenguajes de programación en que está hecho este Demo.

HTML <---> JavaScript <---> PHP


Como se puede observar, cualquier acción que se ejecute desde la interfaz gráfica del Demo hecha en HTML realizará una llamada al código JavaScript. En el código JavaScript se realizan algunas validaciones y preparativos para poder realizar una llamada a PHP. En PHP se llevan a cabo los procesos más detallados. Por ejemplo, para el timbrado de un CFDI es en el código PHP en donde se crea el Layout, se consumen los servicios web de Conversión de Layout a XML y de Timbrado. Una vez que el proceso en PHP finalizó, entonces se devuelve una respuesta a JavaScript quien se encarga de mostrar los resultados en la interfaz gráfica HTML del Demo.


Estructura de archivos


El Demo está compuesto por diferentes carpetas y archivos. Existen algunos archivos y carpetas que no serán explicadas a detalle porque no tienen relevancia para tu objetivo de principal interés que es la integración del timbrado y otras operaciones en tu proyecto.




Archivo - index.html
Contiene el código fuente HTML de la interfaz gráfica que se visualiza en el navegador de internet. Encontrarás la organización de las secciones del sistema, así como sus botones de acción y leyendas descriptivas.




Archivo - RVLogo.png
Es el archivo de imagen que aparece como logotipo en la pantalla general y que también se utiliza como logotipo por defecto del formato PDF de un CFDI.




Archivo - Script.js
Contiene el código fuente JavaScript que se encarga de responder a las acciones que el usuario realiza desde la interfaz gráfica. Por ejemplo, al pulsar el botón para Timbrar se ejecuta un proceso específico dentro del código JavaScript, quien se encarga de realizar algunas validaciones y preparativos para entonces llamar al código PHP y completar el proceso deseado.




Carpeta - Archivos
En esta carpeta se crean los archivos de Layout, XML, PDF y demás. Estos archivos son temporales y el Demo los utiliza para completar diferentes procesos que el usuario ejecuta a través de los botones de la interfaz gráfica. Por ejemplo, al timbrar un CFDI, en esta carpeta se crea el archivo Layout y el archivo XML, mismos que se utilizan cuando solicitas la descarga de ellos desde la interfaz gráfica. De igual manera, en esta carpeta se crea el archivo PDF cuando solicitas la descarga del mismo.


Nota: Los archivos temporales se eliminan automáticamente cada vez que se timbra un nuevo CFDI.


Carpeta - CancelacionCFDI
Esta carpeta contiene el archivo CancelarCFDI.php que contiene el código fuente para llevar a cabo el proceso de cancelación de un CFDI.




Carpeta - CertificadoPruebas
Esta carpeta contiene los archivos de Certificado de Sello Digital, Llave Privada y Contraseña para el timbrado en ambiente de pruebas.




Carpeta - ConsultaEstatusCFDI
Esta carpeta contiene el archivo ConsultarEstatusCFDISAT.php que contiene el código fuente para llevar a cabo el proceso de consulta de estatus de un CFDI en el SAT.




Carpeta - DescargaArchivos
Esta carpeta contiene el archivo DescargaArchivos.php que contiene el código fuente para llevar a cabo el proceso de descarga de archivos Layout, XML y PDF de un CFDI.




Carpeta - EnvioCorreo
Esta carpeta contiene el archivo EnvioCorreo.php que contiene el código fuente para llevar a cabo el proceso de envío de los archivos XML y PDF de un CFDI por correo electrónico.




Carpeta - icons
Esta carpeta contiene archivos de imágenes que son utilizados como iconos para los botones de la interfaz gráfica.




Carpeta - Librerias
Esta carpeta contiene 4 elementos que ayudan al funcionamiento del sistema.



- Carpeta PHPMailer
Librería nativa de PHP que el Demo utiliza para poder llevar a cabo el envío de correo electrónico.
- Archivo editor_style.css
CSS personalizado para representar con colores el contenido de un XML en el visor de la librería externa CodeMirror importada por internet desde el archivo index.html.
- Archivo estilos.css
CSS creado para el Demo para aplicar estilos visuales a diferentes componentes de la interfaz gráfica.
- Archivo jquery-1.11.3.min.js
Librería de JavaScript con JQuery. La utilizamos para poder realizar llamadas al código PHP desde el archivo Script.js mediante funciones Ajax.


Carpeta - TimbradoCFDI
Esta carpeta contiene archivos PHP que corresponden a cada uno de los ejemplos de CFDI que puedes timbrar con el Demo. Cada archivo contiene el código fuente para crear el Layout, realizar su conversión a XML y el timbrado del mismo.




Carpeta - XSLT
Esta carpeta contiene la carpeta Complementos y el archivo cadenaoriginal_4_0.xslt para la creación de la cadena original de un CFDI. Dentro de este archivo, se pueden observar conexiones con la carpeta Complementos que a su vez contiene más archivos XSLT correspondientes a los diferentes complementos para CFDI.



Recordemos que por defecto el Demo utiliza los archivos XSLT que ya están incluídos en nuestro servicio de Conversión de Layout a XML, por lo que esta carpeta y su contenido no son utilizados. Sin embargo, si el usuario lo requiere puede indicar en la interfaz gráfica que se utilicen los archivos XSLT de esta carpeta. Esto provocará que el servicio de Conversión de Layout a XML se conecte a través de la URL de internet del Demo para utilizarlos.

Esta característica es importante para tu proyecto en caso de que desees tener el control total de los archivos XLST. Para ello, tendrás que copiar la carpeta XSLT y su contenido en tu servidor en donde se encuentra tu proyecto o en cualquier otro e indicarle a nuestro servicio de Conversión de Layout a XML la URL de internet para poder acceder a ellos.


Timbrar CFDI


El proceso de timbrado de un CFDI al inicio puede resultar algo complejo, pero se vuelve sencillo una vez que se ha revisado el código fuente a detalle. En términos generales, al pulsar el botón Timbrar en la interfaz gráfica se llama a Script.js en una función específica que se encargará de revisar qué ejemplo de CFDI fue seleccionado para timbrar y después realiza la llamada al archivo PHP correspondiente al ejemplo de CFDI seleccionado. Dentro del código PHP se crea el Layout, se convierte a XML y se timbra. Por último, se obtiene la respuesta del servicio y se devuelve a Script.js para que se encargue de mostrarlo en la interfaz gráfica junto con el XML timbrado y el Layout creado.


Primeros pasos
Comenzamos ubicando el botón Timbrar dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función TimbrarCFDI ubicada en el archivo Script.js.



Veamos la función TimbrarCFDI de Script.js.



Lo primero que hace la función es borrar el contenido de los recuadros del Layout, XML y Respuesta del Servicio de la sección de Resultados.
Después, establece una variable que contendrá la ruta del archivo PHP que se va a ejecutar dependiendo del ejemplo de CFDI seleccionado para timbrar.
También, obtiene el identificador del ComboBox del CFDI seleccionado y procede a hacer una validación para determinar la ruta del archivo PHP mencionada.



Una vez definida la ruta del archivo PHP, procede a verificar si se utilizará el XSLT incluído en el servicio de Conversión de Layout a XML o si se utilizarán los que están de manera local en el Demo. Por defecto, se utilizará el XSLT incluído en el Servicio de Conversión de Layout a XML.

Después, se realiza la llamada al archivo PHP mediante una función Ajax. En ella, podemos observar que indicamos la ruta del PHP que queremos ejecutar y los parámetros que le vamos a enviar: la fecha de emisión y la configuración del XSLT. Una vez que PHP nos devuelva una respuesta, se hace una validación para determinar si se creó el Layout y el XML para ser mostrados junto con la respuesta del servicio en los recuadros de la sección de Resultados.


Creación del Layout
A continuación, vamos a darle un vistazo general al archivo PHP FacturaNormal.php suponiendo que seleccionamos timbrar un CFDI de tipo Factura Normal.

Únicamente veremos lo más relevante del código PHP, ya que dependiendo del tipo de CFDI puede resultar extenso. Por tal motivo, te recomendamos abrir el archivo PHP para que puedas ver su código fuente para obtener más detalles.



Lo primero que observamos es que se realiza un borrado de los archivos temporales de la carpeta Archivos.
Después, lee los archivos de Certificado de Sello Digital y Llave Privada del Emisor y los convierte a formato Base64.
También, se declaran las variables que nos servirán para ir creando el Layout y para establecer cualquier mensaje que se vaya a devolver a Script.js.



Después de otros pequeños preparativos, podemos observar cómo se empieza a crear el Layout concatenando todos los datos del CFDI en un texto con una estructura definida con la finalidad de que nuestro servicio web de Conversión de Layout a XML pueda reconocerlo, leerlo y convertirlo a XML de manera exitosa.

En este ejemplo, nuestro Layout creado es el siguiente.




Conversión del Layout a XML
Una vez que terminamos de crear nuestro Layout, el código PHP procede a consumir el servicio web de Conversión de Layout a XML como se muestra a continuación.



Podemos ver que se envían al servicio web los parámetros que contienen el Layout, el Certificado de Sello Digital y Llave Privada en Base64, la contraseña de la Llave Privada y la ruta del XSLT que se va a utilizar para crear la cadena original del CFDI, la cual por defecto se enviará vacía para indicar que se utilizará el XSLT incluído en el servicio web.

Si la conversión fue exitosa, entonces obtenemos el XML sin timbrar en Base64. En caso contrario, obtenemos el mensaje de error que respondió el servicio web. Con este resultado, se determina si se procede o no a timbrar el XML. Si no se procede al timbrado, entonces se devuelve la respuesta de este archivo PHP al archivo Script.js para que éste último muestre los resultados en la interfaz gráfica.


Timbrado del XML
Una vez que tenemos el XML sin timbrar en Base64, se procede al timbrado del mismo. En el código fuente PHP podrás encontrar que se hace una validación para determinar cómo consumir el servicio de Timbrado dependiendo de si estamos en ambiente de pruebas o ambiente productivo. En este caso, nos encontramos en ambiente de pruebas, por lo que el consumo del servicio de Timbrado se realiza de la siguiente manera a través del método TestCfd33 enviando como parámetros el Usuario y Clave de timbrado junto con el XML en Base64.



Suponiendo que estuviéramos timbrando en ambiente productivo, el consumo del servicio de Timbrado se realiza de la siguiente manera a través del método GetTicket enviando como parámetros el Usuario y Clave de timbrado junto con el XML en Base64.



En ambos casos, se obtiene la respuesta del servicio web y validamos la variable $codigo para determinar si el timbrado se realizó con éxito y guardar el XML timbrado en la variable $xmlTimbrado. En caso de error, se obtiene el mensaje de error que respondió el servicio web y se guarda en la variable $mensajeError. El XML timbrado que devuelve el servicio web está codificado en Base64.

Por último, se devuelve la respuesta de este archivo PHP al archivo Script.js para que éste último muestre los resultados en la interfaz gráfica.


Guardar Layout


El proceso de guardado del Layout es muy pequeño. Se requiere haber timbrado un CFDI para que se haya creado internamente el archivo del Layout en formato TXT en la carpeta Archivos.


Primeros pasos
Comenzamos ubicando el botón Guardar Layout dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función GuardarLayout ubicada en el archivo Script.js.



Veamos la función GuardarLayout de Script.js.



Lo primero que hace la función es obtener el identificador del ComboBox del CFDI seleccionado que fue timbrado porque lo utilizará como nombre para el archivo del Layout que se va a descargar en tu computadora.
Después, se realiza la llamada al archivo DescargaArchivos.php mediante una función Ajax. En ella, podemos observar que enviamos como parámetro la opción para verificar si existe o no el archivo del Layout en la carpeta Archivos. En caso de que sí exista el archivo del Layout, entonces se procede a descargarlo realizando una segunda llamada al mismo archivo PHP a través de location.href. En caso de error, se muestra el mensaje correspondiente en la interfaz gráfica.


Descarga del Layout
Cuando se procede a realizar la descarga del Layout, se llama al archivo DescargaArchivos.php enviando como parámetros una opción y el nombre que tendrá el archivo a descargar.

A continuación, podemos ver el código PHP correspondiente a la opción DescargarLayout que se indicó en la llamada.



Básicamente, esta función lee el archivo Layout existente en la carpeta Archivos y realiza la descarga utilizando el nombre recibido para el archivo.


Guardar XML


El proceso de guardado del XML es muy pequeño. Se requiere haber timbrado un CFDI para que se haya creado internamente el archivo XML en la carpeta Archivos.


Primeros pasos
Comenzamos ubicando el botón Guardar XML dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función GuardarXML ubicada en el archivo Script.js.



Veamos la función GuardarXML de Script.js.



Lo primero que hace la función es obtener el identificador del ComboBox del CFDI seleccionado que fue timbrado porque lo utilizará como nombre para el archivo del XML que se va a descargar en tu computadora.
Después, se realiza la llamada al archivo DescargaArchivos.php mediante una función Ajax. En ella, podemos observar que enviamos como parámetro la opción para verificar si existe o no el archivo del XML en la carpeta Archivos. En caso de que sí exista el archivo del XML, entonces se procede a descargarlo realizando una segunda llamada al mismo archivo PHP a través de location.href. En caso de error, se muestra el mensaje correspondiente en la interfaz gráfica.


Descarga del XML
Cuando se procede a realizar la descarga del XML, se llama al archivo DescargaArchivos.php enviando como parámetros una opción y el nombre que tendrá el archivo a descargar.

A continuación, podemos ver el código PHP correspondiente a la opción DescargarXML que se indicó en la llamada.



Básicamente, esta función lee el archivo XML existente en la carpeta Archivos y realiza la descarga utilizando el nombre recibido para el archivo.


Estatus SAT


El proceso de consulta del estatus en el SAT de un CFDI es pequeño. Se requiere haber timbrado un CFDI para que se haya creado internamente el archivo de XML en la carpeta Archivos. En términos generales, se utiliza el archivo XML de un CFDI timbrado para obtener la información con la que se realizará una consulta al servicio web de Timbrado y así conocer su estatus en el SAT.


Primeros pasos
Comenzamos ubicando el botón Estatus SAT dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función ConsultarEstatusCFDISAT ubicada en el archivo Script.js.



Veamos la función ConsultarEstatusCFDISAT de Script.js.



Como podemos observar, la función realiza una llamada al archivo ConsultarEstatusCFDISAT.php y evalúa la respuesta que recibe para determinar si hubo un error o no. En caso de éxito, procede a revisar si obtuvimos el acuse de cancelación en caso de que el estatus del CFDI en el SAT sea Cancelado y lo muestra en la sección de Resultados de la interfaz gráfica. De igual manera, el mensaje descriptivo del estatus siempre es mostrado también en la sección de Resultados.


Consulta del Estatus SAT
Cuando se procede a realizar la consulta del Estatus en el SAT del CFDI, se llama al archivo ConsultarEstatusCFDISAT.php.

A continuación, veremos lo más relevante del código PHP.



Podemos observar que se lee el archivo XML existente en la carpeta Archivos y se obtiene la información mostrada con ayuda de la función ObtenerDatosXml que también existe en el mismo código PHP.



Después, se realiza el consumo al servicio web de Timbrado en el método EstatusCFDI enviando como parámetros los datos obtenidos del XML y el Usuario y Clave de timbrado del Emisor.



Una vez que el servicio web devuelve una respuesta, se hace una evaluación con una serie de IF-ELSE para las acciones a realizar dependiendo del estatus del CFDI que recibimos. En este caso, vamos a continuar el flujo del código en el supuesto de que el estatus del CFDI sea Cancelado.



Dentro de esta condición, podemos observar que de manera opcional está la consulta del Acuse de Cancelación del CFDI cuyo estatus en el SAT es Cancelado. Para ello se realiza el consumo a un servicio web de consultas enviando como parámetros la información del CFDI. Por último, se recibe la respuesta del servicio web y con ella se devuelve una respuesta al Script.js para que muestre el mensaje descriptivo del estatus en el SAT y el XML de Acuse de Cancelación en la sección de Resultados de la interfaz gráfica.

Nota: No existe ambiente de pruebas para la consulta de estatus de un CFDI en el SAT porque los CFDI timbrados en ambiente de pruebas no existen en el SAT, por lo que no es posible realizar una consulta de estatus. Una vez que nuestro servicio web recibe los datos del CFDI para la consulta del estatus, se realiza internamente el consumo de un servicio web del SAT quien nos devuelve como respuesta el resultado de la consulta.



Cancelar CFDI


El proceso de cancelación de un CFDI al inicio puede resultar algo complejo, pero se vuelve sencillo una vez que se ha revisado el código fuente a detalle. Se requiere haber timbrado un CFDI para que se haya creado internamente el archivo de XML en la carpeta Archivos. En términos generales, se utiliza el archivo XML de un CFDI timbrado para obtener la información con la que se creará un archivo XML de Solicitud de Cancelación para posteriormente enviarlo a un servicio web que realizará el proceso de cancelación. Por último, si hubo éxito en el proceso de cancelación, el servicio web devuelve el XML de Acuse de Cancelación del CFDI.


Primeros pasos
Comenzamos ubicando el botón Cancelar dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función Cancelar ubicada en el archivo Script.js.



Veamos la función Cancelar de Script.js.



Como podemos observar, la función realiza una llamada al archivo CancelarCFDI.php enviando como parámetro si el proceso de cancelación es en ambiente de pruebas o en ambiente productivo.

Después, evalúa la respuesta que recibe para determinar si hubo un error o no. En caso de éxito, procede a revisar si obtuvimos el acuse de cancelación y lo muestra en la sección de Resultados de la interfaz gráfica. De igual manera, el mensaje de la respuesta del servicio web siempre es mostrado también en la sección de Resultados.

Nota: No existe ambiente de pruebas para la cancelación de CFDI porque los CFDI timbrados en ambiente de pruebas no existen en el SAT, por lo que no es posible realizar una cancelación. Sin embargo, al intentar cancelar en ambiente de pruebas obtendremos un mensaje de error que nos indica que el flujo del proceso funciona correctamente y está listo para ser utilizado en ambiente productivo. El mensaje de error mencionado consiste en la leyenda "Error al cancelar: El token debe contener 3 partes".



Creación del XML de Solicitud de Cancelación
A continuación, vamos a darle un vistazo a lo más relevante del archivo PHP al archivo CancelarCFDI.php.



Lo primero que observamos es la obtención de información del XML.
Después, lee los archivos de Certificado de Sello Digital y Llave Privada del Emisor y los convierte a formato Base64.
También, se declaran las variables que nos servirán como datos adicionales de la cancelación a realizar y para establecer cualquier mensaje que se vaya a devolver a Script.js.



Se procede a consumir el servicio web de Timbrado en el método CrearXMLSolicitudCancelacion enviando como parámetros el Usuario y Clave de timbrado, el Certificado de Sello Digital, Llave Privada, Contraseña de la Llave Privada, los datos obtenidos del XML y los datos adicionales de la cancelación.

Si hubo éxito, entonces obtenemos el XML de Solicitud de Cancelación que nos devuelve el servicio codificado en Base64. Si ocurrió un error, entonces obtenemos el mensaje de error con el objetivo de devolverlo a Script.js.


Cancelación del CFDI
Una vez que se creó con éxito el XML de Solicitud de Cancelación, se procede a consumir el servicio web de Timbrado en el método CancelTest para ambiente de pruebas o CancelTicket para ambiente productivo.



Como podemos observar, se envía como parámetro el XML de Solicitud de Cancelación codificado en Base64. También, se evalúa la respuesta recibida para determinar si se devuelve a Script.js un mensaje de error o un mensaje de éxito junto con el XML de Acuse de Cancelación.


Enviar Correo


El proceso de envío de correo consiste en utilizar los archivos PDF y XML existentes en la carpeta Archivos para adjuntarlos en un mensaje que se envía por correo electrónico a través de la librería PHPMailer. Se requiere primero haber timbrado un CFDI y haber descargado el archivo PDF.


Primeros pasos
Comenzamos ubicando el botón Enviar Correo dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función EnviarCorreo ubicada en el archivo Script.js.



Veamos la función EnviarCorreo de Script.js.



Como podemos observar, la función obtiene el identificador del ComboBox del CFDI seleccionado porque lo utilizará como el nombre que tendrán los archivos XML y PDF como archivos adjuntos del correo. Después, realiza una llamada al archivo EnvioCorreo.php enviando como parámetro una opción y el nombre para los archivos adjuntos.

Después, evalúa la respuesta que recibe para determinar si se muestra un mensaje de éxito o de error en la sección de Resultados de la interfaz gráfica.


Envío de Correo
En el archivo EnvioCorreo.php podemos observar que la función EnviarCorreo lee los archivos XML y PDF existentes en la carpeta Archivos.
Después, establece las variables correspondientes a la configuración SMTP para que la librería PHPMailer pueda conectarse con el servicio del proveedor del correo electrónico del Remitente.
Por último, podemos observar la importación de la librería PHPMailer y la creación del objeto de esa librería con la que realizaremos el envío de correo.



A continuación, se procede a establecer la información de envío y la configuración SMTP en el objeto creado. Por último, se ejecuta el envío del correo y verifica si hubo éxito o error para devolver una respuesta a Script.js y muestre el resultado del proceso en la sección de Resultados de la interfaz gráfica.




Descargar PDF


El proceso de descarga de PDF consiste en utilizar el archivo XML existente en la carpeta Archivos para enviarlo a nuestro servicio web de Creación de PDF. Se requiere haber timbrado un CFDI para que se haya creado internamente el archivo XML en la carpeta Archivos.


Primeros pasos
Comenzamos ubicando el botón Descargar PDF dentro de la interfaz gráfica en el archivo index.html y podremos observar que tiene definido el evento onclick, lo cual significa que cuando se haga clic en este botón se ejecutará la función DescargarPDF ubicada en el archivo Script.js.

También, podemos ver el ComboBox de los formatos PDF disponibles para que se le indique al servicio web de Creación de PDF que utilice el que hayamos seleccionado.



Veamos la función DescargarPDF de Script.js.



Como podemos observar, la función obtiene el identificador del ComboBox del CFDI seleccionado porque lo utilizará como el nombre que tendrá el archivo PDF a descargar.
También, obtiene el identificador del ComboBox del Formato PDF seleccionado para indicarle al servicio web de Creacion de PDF que utilice el formato establecido al crear el PDF.
Después, podemos ver una validación para definir el valor que representará al formato PDF seleccionado para ser enviado al servicio web.



Se procede a realizar una llamada al archivo DescargaArchivos.php mediante una función Ajax enviando como parámetro una opción y el valor representativo del formato PDF seleccionado.
Si hubo éxito, entonces el archivo PDF se habrá creado con éxito y se procede a la descarga del mismo con ayuda de la función location.href enviando como parámetros una opción y el nombre del archivo PDF a descargar.
Si no hubo éxito, entonces muestra el mensaje de error en la sección de Resultados de la interfaz gráfica.


Creación y descarga del PDF
En el archivo DescargaArchivos.php podemos observar dos funciones para este proceso. La primera es GenerarPDF para la creación del PDF y su guardado en la carpeta Archivos y la segunda es DescargarPDF para leer y descargar el archivo PDF previamente creado.

A continuación, podemos ver la función GenerarPDF.



Podemos observar que primero lee el XML existente en la carpeta Archivos y lo codifica en Base64.
Después, obtiene el valor representativo del formato PDF y se establece el logotipo que aparecerá en el PDF.
Entonces, se realiza el consumo al servicio web de Creación de PDF en el método GenerarPdf33 enviando como parámetros los datos mencionados previamente.
Por último, se verifica si hubo éxito en la creación del PDF para proceder a guardarlo en la carpeta Archivos y se devuelve una respuesta con un mensaje de éxito o error.

A continuación, podemos ver la función DescargarPDF.



Básicamente, esta función lee el archivo PDF existente en la carpeta Archivos y realiza la descarga utilizando el nombre recibido para el archivo.