Introducción al XML Fiscal
Alguna vez te has preguntado ¿por qué XML es el formato elegido por el SAT para almacenar la información de los CFDIs (Comprobante Fiscal Digital a través de Internet)? ¿Por qué no fue un TXT, PDF, DOC, etc?
La respuesta a estas preguntas es muy sencilla e intuitiva, las bondades del XML (eXtensible Markup Language) o Lenguaje de Marcas Extensible. Pero antes de analizarlas debemos entender ¿Qué es el eXtensible Markup Language, para qué sirve y cómo funciona?
Comenzamos con la premisa de que se trata de un Lenguaje, con esto entendemos que se trata de un conjunto de símbolos que tienen un significado y sirve para transferir datos por parte del emisor e interpretarlos por parte del receptor. Para entender lo podemos comparar con el proceso de la comunicación alguien emite datos (ya sea de forma oral o escrita) a un receptor, para que éste lo entienda necesita conocer el lenguaje en que el emisor está codificando la información. En resumen el lenguaje se refiere a la codificación que se le da a un mensaje.
Entonces ahora sabemos que XML no se refiere al archivo con terminación .xml si no al lenguaje en que está codificada la información que contiene éste.
Para comprender su uso hay que explorar un poco de dónde proviene dicho lenguaje. El origen está en los años 70’s cuando la compañía IBM creó el lenguaje GML (General Markup Language / Lenguaje de Marcado General) por la necesidad de almacenar gran cantidad de información de una amplia variedad de temas. Era básicamente una forma rápida para clasificar el volumen de información.
Cerca de 1986 la organización internacional de normalización (ISO por sus siglas en inglés) se encargó de estandarizar el GML creando así el SGML (Standard GML / GML Estándar). De éste se derivaron varios lenguajes entre ellos los más importantes el HTML y XML.
En resumen el Lenguaje XML lo que hace es etiquetar la información para así agilizar su organización, almacenamiento y acceso.
Su funcionamiento es muy simple y sencillo de entender, como lo dije en la premisa anterior basta con escribir la información deseada y etiquetarla, para esto necesitamos entender un poco cómo funcionan las etiquetas. A continuación un ejemplo del uso de una etiqueta:
<etiqueta> Información </etiqueta>
<auto>
<color> Verde </color>
<tipo> Deportivo </tipo>
</auto>
Otra forma de presentación sería:
<etiqueta atributo=”valor“/>
<auto color=”verde” tipo=”deportivo“/>
En el primer ejemplo podemos ver que la etiqueta “encierra” a la información (le da un formato). Entonces podemos interpretar que Verde está etiquetado como un color y Deportivo como un tipo. En esta forma identificamos los símbolos < y > que delimitan a nuestra etiqueta de apertura y la combinación </ y > que delimitan a nuestra etiqueta de cierre.
El segundo ejemplo es distinto al primero ya que aquí no se encuentran etiquetas de apertura ni de cierre, más bien todo se encuentra dentro de la etiqueta delimitada por los símbolos < y /> sin embargo dentro de la etiqueta encontramos su nombre (auto), sus atributos (color y tipo) y el valor de estos atributos (verde y deportivo).
Podemos así concluir que ambos ejemplos tendrán un resultado similar, pero la forma en que se presenta puede variar dependiendo de la complejidad, largo, entre otros factores del código y de quién lo escribe.
Para mí la mayor virtud de un XML, y el factor que debió ser definitivo para que las autoridades lo eligieran como medio de transferencia y almacenamiento de la información de un CFDI, es que se puede utilizar “cualquier” etiqueta siempre y cuando se haya especificado previamente su significado, valor o efecto. Esto permite a cualquier organismo como el SAT o a cualquier persona común crear su propio código para explotar al máximo la información de un XML.
He aquí, probablemente, la parte más complicada y maravillosa de un XML, ya que no basta con comenzar a codificar a nuestro entendimiento y antojo antes debemos definir los parámetros, algo así como crear un diccionario para poder interpretar el código.
Su nombre técnico es Declaración de Tipo de Documento (DTD) o podemos encontrar también el Esquema de XML (XML Schema).
En un XML se debe incluir en alguna parte del documento el ya mencionado “diccionario”, ahí nos encontramos con un gran problema porque probablemente si se trata de un esquema muy amplio puede llegar a ser mucha información y esto haría que en todos los documentos se deba repetir esa cantidad enorme de datos que harían mucho más pesados, tediosos y de difícil procesamiento nuestros archivos.
La solución a este problema es que se puede optar por incluir todo el diccionario dentro del documento o subirlo a internet y apuntar a esa dirección desde el documento, así cuando se necesite conocer el diccionario se puede acceder a él a través de internet.
Para mejor entendimiento les dejaré un ejemplo de XML (modificado) creado a través del sistema de Mis Cuentas del SAT con su respectiva interpretación. Para esto voy a separar por partes el archivo para analizarlo de esa forma.
- Esta es la etiqueta de apertura de un XML.
<?xml version=”1.0” encoding=”utf-8” standalone=”yes“?>
- Aquí es donde inicia el documento y encontramos información general sobre éste. Podemos ver, entre otras cosas, la versión del comprobante (3.2) la fecha, la forma de pago, subtotal y total, tipo (ingreso), método de pago, lugar de expedición y lo interesante aquí es la localización del Schema (Diccionario) que es el último atributo de la etiqueta.
<cfdi:Comprobante xmlns:cfdi=”http://www.sat.gob.mx/cfd/3” xmlns:registrofiscal=”http://www.sat.gob.mx/registrofiscal” xmlns:donat=”http://www.sat.gob.mx/donat” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” version=”3.2” fecha=”2015-06-17T22:05:52Z” sello=”lorem” formaDePago=”Pago en una sola exhibición” noCertificado=”001” certificado=”certif” subTotal=”690.00” total=”800.40” tipoDeComprobante=”ingreso” metodoDePago=”Efectivo” LugarExpedicion=”Mexico” xsi:schemaLocation=”http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd“>
- Aquí está la información del Emisor, como atributo tenemos su RFC y dentro de la etiqueta encontramos otra con el Régimen Fiscal.
<cfdi:Emisor rfc=”XXXX010101000“>
<cfdi:RegimenFiscal Regimen=”Régimen de Incorporación Fiscal” />
</cfdi:Emisor> - En esta etiqueta sola tenemos la información del Receptor (RFC) es curioso pues no usa la misma composición que la etiqueta anterior.
<cfdi:Receptor rfc=”ABC020202345” />
- Llegamos a la información de la transacción podemos ver que tenemos “1 venta/servicio de SERVICIO DE TAXI” con un valor unitario e importe de $690.00.
<cfdi:Conceptos>
<cfdi:Concepto cantidad=”1” unidad=”venta/servicio” descripcion=”SERVICIO DE TAXI” valorUnitario=”690.00” importe=”690.00” />
</cfdi:Conceptos> - Por separado tenemos la sección de los impuestos, en donde podemos observar que no hay retenciones, pero sí hay un traslado de IVA al 16% con un valor de 110.40.
<cfdi:Impuestos>
<cfdi:Retenciones>
<cfdi:Retencion impuesto=”IVA” importe=”0.00” />
<cfdi:Retencion impuesto=”ISR” importe=”0.00” />
</cfdi:Retenciones>
<cfdi:Traslados>
<cfdi:Traslado impuesto=”IVA” tasa=”16.00” importe=”110.40” />
<cfdi:Traslado impuesto=”IEPS” tasa=”0.00” importe=”0.00” />
</cfdi:Traslados>
</cfdi:Impuestos> - Esta es la última parte del CFDI en donde podemos encontrar información como el UUID y la fecha de timbrado.
<cfdi:Complemento>
<registrofiscal:CFDIRegistroFiscal Version=”1.0” Folio=”002” />
<tfd:TimbreFiscalDigital xmlns:tfd=”http://www.sat.gob.mx/TimbreFiscalDigital” xsi:schemaLocation=”http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd” version=”1.0” UUID=”AAAAAAAA-BBBB-1111-CCCC-222222222222” FechaTimbrado=”2015-06-17T22:05:53” selloCFD=”ipso” noCertificadoSAT=”003” selloSAT=”ncia” />
</cfdi:Complemento> - Esta etiqueta de cierre nos indica que es el final del comprobante.
</cfdi:Comprobante>
Si pudieramos hacer un diagrama con las etiquetas (sin la información) y jerarquizado quedaría así:
<?xml ?>
<cfdi:Comprobante>
<cfdi:Emisor>
<cfdi:RégimenFiscal />
</cfdi:Emisor>
<cfdi:Receptor />
<cfdi:Conceptos>
<cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos>
<cfdi:Retenciones>
<cfdi:Retención />
<cfdi:Retención />
</cfdi:Retenciones>
<cfdi:Traslados>
<cfdi:Traslado />
<cfdi:Traslado />
</cfdi:Traslados>
</cfdi:Impuestos>
<cfdi:Complemento>
<registrofiscal:CFDIRegistroFiscal />
<tfd:TimbreFiscalDigital />
</cfdi:Complemento>
</cfdi:Comprobante>
Por último, si son curiosos y quieren explorar un poco más sus XMLs les recomiendo usar el programa Notepad++ el cuál al abrirlo nos muestra la información de forma más ordenada. Igualmente si tienen alguna duda sobre esta entrada o en general de los XMLs no duden en dejarla en los comentarios
Bibliografía:
Álvarez, M. Á. (23 de 06 de 2015). Introducción a XML. Obtenido de Desarrollo Web: http://www.desarrolloweb.com/manuales/18/