Buscar en este blog

lunes, 24 de septiembre de 2018

(VirtualXML) Como poner un "namespace" en la seccion Comprobante de un CFDI con VirtualXML

Con la entrada del nuevo Complemento de Recepción de Pagos 1.0, algunos de nuestros usuarios nos han comentado que ciertos validadores de terceros marcan un error en la ubicación de los "namespace" del complemento de pagos (o de otros complementos).

De acuerdo a la Wikipedia, un "namespace" o "espacio de nombres" es un contexto en el que un grupo de uno o más identificadores pueden existir. En términos generales podríamos decir que un namespace, es una forma de agrupar clases, funciones, tipos de datos, etc. que están relacionadas entre sí.


Para que te des una idea de lo que es un namespace, estas son las lineas que lo definen para un CFDI:


xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"




En el caso del CFDI un "namespace" nos sirve para ubicar en internet la definción que establece las reglas de como debe de conformarse un CFDI en cualquiera de sus variantes.

Un namespace consta básicamente de 3 partes:
  • Nombre del namespace
  • URL en internet del namespace
  • Schema Location, que es la ubicación del archivo XSD que define las reglas de conformación del XML.

Si bien no existe una regla general que obligue a un namespace a colocarlo en alguna parte específica del XML, usualmente este se define en el punto donde sus reglas van a aplicarse, en el caso de un CFDI este lugar puede ser el nodo principal <cfdi:Comprobante> o bien cualquiera de sus subnodos en el caso de los complementos.

Algunos validadores de terceros requieren que los namespaces de los complementos usados en un CFDI se coloquen al nivel del nodo <cfdi:Comprobante> y no a nivel del nodo que define el complemento, que es como lo hace VirtualXML.

En todo caso, tu puedes editar manualmente el XML con cualquier editor de textos y mover los namespaces de la definición del complemento a la definción del nodo <cfdi:Comprobante> y no tendrá repercusión alguna ya que los namespaces no se utilizan para la generación de los sellos digitales por lo tanto pueden ir en cualquier parte del documento XML.

Debido a que entendemos que tener que editar un XML manualmente, mover namespaces y luego guardar el XML es un tarea tediosa, sobre todo si tienes muchos XMLs que requieran mover los namespaces, hemos desempolvado del baúl de los recuerdos de VirtualXML una función que hacía mucho tiempo no utilizabamos.:

VirtualXML_AddNameSpace()

Esta función, como su nombre lo indica te permitirá añadir un namespace directo en la definición de namespaces del nodo <cfdi:Comprobante>, solucionando con esto el problema de la ubicación que algunos validadores te pueden marcar.

Esta función NO MUEVE LOS NAMESPACES DE LUGAR, crea nuevos namespaces a la altura del nodo <cfdi:Comprobante> pero los namespaces definidos en los complementos se van a mantener, esta duplicidad de namespaces NO AFECTA LA INTEGRIDAD DEL XML, por lo que será timbrado sin problema por el PAC y reconocido por los validadores.

Sintaxis:

VirtualXML_AddNameSpace (
<hHandle>, 
<cNombre>, 
<cUrl>,
<cSchemaLocation>)

Donde:

<hHandle> Identificador en memoria devuelto por la función VirtualXML_New()
<cNombre> Cadena de caracteres con el nombre del namespace
<cUrl>  Cadena de caracteres con el URL del namespace
<cSchemaLocation> Cadena de caracteres con la URL del archivo XSD que define la estructura del XML.

Ejemplo:

Supongamos que queremos poner los namespaces del Timbre Fiscal Digital y del complemento de pagos a nivel del nodo <cfdi:Comprobante>, haríamos lo siguiente:

nHandler := VirtualXML_New("3.3")

/* Agregamos el namespace del TFD */
VirtualXML_AddNameSpace(nHandler,;
"xmlns:tfd",;
"http://www.sat.gob.mx/TimbreFiscalDigital","http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd")

/* Agregamos el namespace del Complemento de pagos*/
VirtualXML_AddNameSpace(nHandler,;
"xmlns:pago10",;
"http://www.sat.gob.mx/Pagos","http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd")

Y de esta manera agregamos 2 namespaces nuevos dentro la definición del nodo <cfdi:Comprobante> y aunque estos se van a repetir cuando agreguemos los complementos correspondientes, no afectarán la integridad del XML.

¿ Hasta cuantos namespace puedo agregar usando esta función ? Todos los que tu quieras o consideres necesarios, si quieres agregar TODOS los namespaces de TODOS los complementos lo puedes hacer sin ningún problema.

Esperamos que esta función te solucione los problemas que alguno que otro validador de CFDI te pueda dar.