Archivo de folios

Como muy bien sabrán el SAT pública en su sitio FTP un archivo en donde está contenida la información de los folios autorizados; en dicho archivo podremos encontrar:

  • El RFC a quien se le autorizo
  • El numero de aprobación
  • E año de aprobación
  • La serie en caso de que hubiera solicitado folios para una serie en particular.
  • El rango de folios asignados.

Dicho archivo es utilizado por la librería para validar que el folio del CFD (versión 1.0 o 2.0) hubiera sido autorizado por el SAT.

Este archivo puede ser utilizado de 2 formas:

  • Directamente, esto es, se asigna el archivo a la librería y una vez que la validación es requerida se carga el archivo a memoria y se realiza el proceso de validación.
  • En una base de datos, para esto la librería ofrece clases que permiten leer el archivo y cargarlo a una base de datos; cuando la validación es requerid se dispara un evento al cual se pueden suscribir y realizar una búsqueda en la base de datos. Para este caso se incluye un ejemplo dentro del conjunto de ejemplos con lo que se libera la librería.

El día ayer tratamos de descargar la última versión del archivo y que sorpresa nos llevamos al ver que dicho archivo pesaba 2.06 GB, así es mis queridos lectores, inicialmente creíamos que era un error, así que decidimos descargarlo y que sorpresa nos llevamos al ver que el archivo era correcto.

Al pregunta del millón es ¿Por qué creció tanto dicho archivo?, realmente desconocemos el motivo, es algo extremadamente extraño, ya que la última vez que lo vimos, hace como 1 semana, estaba en 24 megas si no estamos mal.

El día de hoy hemos vuelto a revisar el archivo y su tamaño ya cambio, ahora esta de 1.1 GB.

Ahora tratamos de descargarlo usando el famosísimo FileZilla y resulta que la descarga siempre se corta a las 67 MB.

Vamos a tratar de verificar con la gente del SAT a ver qué está pasando, mientras, nuestra teoría de todo esto, es el SAT está haciendo algo mal al momento de generarlo, ya que no es lógico un crecimiento de esa magnitud de una semana a otra.

 

Caracteres especiales

El carácter apostrofe

Como todos saben existen ciertos caracteres que no se pueden representar directamente en XML , deben ser codificados; el SAT en el anexo 20 ha establecido como deben se codificados:

En particular se deberá tener cuidado de que aquellos casos especiales que se presenten en los valores especificados dentro de los atributos del archivo XML como aquellos que usan el carácter &, el carácter “, el carácter ‘, el carácter < y el carácter > que requieren del uso de secuencias de escape.

■       En el caso del & se deberá usar la secuencia &amp;

■       En el caso del “ se deberá usar la secuencia &quot;

■       En el caso del < se deberá usar la secuencia &lt;

■       En el caso del > se deberá usar la secuencia &gt;

■       En el caso del ‘ se deberá usar la secuencia &apos;

Ejemplos:

Para representar nombre=“Juan & José & “Niño”” se usará nombre=”Juan &amp; José &amp; &quot;Niño&quot;”

Actualmente la librería ya contempla la codificación de casi todos los caracteres, menos el carácter apostrofe, el cual es totalmente válido en XML, este carácter podría usarse directamente en el XML a diferencia de los otros (< > “ &).

Algunos de nuestros lectores se preguntan cómo trata la librería dicho carácter cuando está contenido en alguna parte del XML, y la respuesta es, depende de la versión:

  • En la versión de C# es representado como apostrofe ( ‘ )
  • En la versión de Delphi es representado como &amp;apos;

Lo curioso de todo esto es que un XML generado de cualquiera de las dos formas es reportado como válido por el validador del SAT.

Ya modificamos la librería para que el XML salga como lo solicita el SAT y dicho carácter ( ‘ ) sea codificado cumpliendo el anexo 20; esto saldrá en la siguiente versión, que esperamos que sea la versión 2011.03.19.

Personalmente no estamos de acuerdo con la codificación de dicho carácter por dos motivos:

  • Es totalmente válido usarlo directamente en el XML, el validador del SAT ni otros validadores que he usado reporta problemas con este aspecto.
  • Afecta los tiempos de generación del CFD, ya que incrementa algunas milésimas de segundo el proceso, no es algo importante, pero soy fanático del  performance.

Es por eso que hemos dejado activada la codificación por default, pero se puede desactivar, esto a través de un parámetro.

 

El carácter asterisco (*)

Hace algunos días un usuario nos reporto que un CFD generado usando la librería y que contenida el carácter en cuestión marca como inválido en el validador del SAT; nosotros  que siempre estamos pendientes de cada problema, decidimos hacer nuestras pruebas y efectivamente, el problema reportado existía.

Decidimos  resolver el problema, hicimos una revisión profunda al código de la librería, pero no encontramos nada, entonces decidímos validar el CFD con otros validadores www.admincfd.com.mx y lo curioso fue que dichos validadores nos reportaron que el CFD estaba bien; en ese momento empezamos a sospechar que el problema no estaba en la librería, ni en el XML generado, el problema estaba en el validador del SAT.

Al día siguiente hablamos con mi contacto en el SAT para saber si el tenia algún reporte sobre el problema, nos indicio que no, que el XML debería ser validado correctamente, nos pidió que le enviáramos un ejemplo y él lo iba a ver con la gente de tecnología, entonces decidimos resolver este enigma, preparamos unos ejemplos y decidímos probarlo en el SAT y capturar las imágenes para demostrar que nos estaba reportando el validador, que sorpresa nos llevamos que ahora el validador nos decía que el CFD que contenía ( * ) y que nos había reportado mal, hace un tiempo atrás, ahora estaba bien; pensando que nosotros estaba haciendo algo mal, le pedímos a otras 3 personas que validaran el XML y que sorpresa nos llevamos cuando ellos nos reportaron que a ellos también se los estaba dando como valido.

Para nosotros este caso muere ahí, pero nos quedan ciertas dudas acerca de la efectividad del validador del SAT ya que no es la primera vez que escuchamos este tipo de historias, que para ser honestos es la primera vez que nos pasa.

 

Liberación 2011.03.15

Es un gusto para nosotros liberar esta nueva versión que incluye cambios importantes, siendo el más relevante la capacidad de generar el código de barras bidimensional o CBB, el cual puede ser generado en diferentes formatos y sin necesidad de almacenarlo en el disco duro; el proceso de generación optimizado de tal forma que el mismo es generado en un tiempo de 14 milisegundos.

En esta liberación hemos eliminado la palabra BETA de la misma, ya que considero que la librería ha alcanzado un buen nivel de maduración y han sido corregidos los pocos errores que han reportado los usuarios.

Se hicieron algunas correcciones, mejoras y se agrego funcionalidad; para mayor información pueden leer el archivo de historial de cambios.

Versión para C#

Versión para Delphi

Campos vacios

Escribimos este post para aclarar, por lo que vemos han sido varios usuarios los que nos han reportado problemas con el manejo de los campos opcionales del CFD y cuando decimos CFD nos referimos al CFD y CFDI.

Cada atributo del CFD dentro de la librería, tiene diferentes métodos que permite ejecutar diferentes opciones y de las al parecer no son muy conocidas, y creemos que esto se debe más que nada a que hemos hecho poco eco sobre las mismas; así que trataremos de proporcionar una explicación sobre las mismas.

Como decía, todos los atributos, un ejemplo es Folio, Serie, RFC del emisor, etc tienen una serie de métodos que debemos usar si queremos generar correctamente el CFD.

Algunos de estos son:

  • Método Clear(): Permite limpiar un campo, si el atributo es de tipo numérico le asigna cero, si es de tipo fecha le asigna la fecha mínima soportado por Net y si es de tipo string asigna vacio, es importante notar que es vacio y no nulo.

La importancia de este método, que es no solo limpia el campo sino que además le indica a la librería que ese campo no lo debe de usar en la generación del CFD.

Nuestra recomendación es que usen dicho método cuando quieran que un atributo no sea tomado en cuenta en la generación del CFD.

  • Propiedad IsAssigned: Indica si el atributo tiene algún valor, aunque sea cero o vacio; es de solo lectura y se ve afectado cuando se asigna un valor al atributo o cuando se ejecuta el método Clear().
  • Método AsString(): Permite obtener le valor almacenado en el atributo como una cadena de texto, en el caso de los tipos de datos numérico y de tipo fecha el valor obtenido es como se almacena en el XML.
  • Método AsXML(): Permite obtener le valor almacenado en el atributo como una cadena de texto en el formato que es requerido por el SAT.
  • Método FillWithRandomData(): Llena el campo con un valor aleatorio, es mas de  uso interno.
  • Método SetData(): Es de uso interno y NUNCA debe ser utilizado.

Como conclusión, cuando quieran que un atributo no salga en el XML usen el método Clear().

Hasta la próxima.