Complementos y Addendas - swpyme.net€¦ · En este documento se describen los elementos...
-
Upload
vuongkhanh -
Category
Documents
-
view
218 -
download
0
Transcript of Complementos y Addendas - swpyme.net€¦ · En este documento se describen los elementos...
GRUPO EXECOM DE CHIAPAS SA DE CV
Complementos y Addendas
Definición y uso en MaxiComercio
Última actualización
23/05/2011
En este documento se describen los elementos adicionales que se pueden incluir en la estructura XML del comprobante fiscal digital.
2
Contenido Objetivo ............................................................................................................................................... 3
Complemento ...................................................................................................................................... 3
Integración del Complemento en MaxiComercio ........................................................................... 3
Nombre y ubicación del archivo .................................................................................................. 3
Código de ejemplo para integrar el Complemento para CFD ..................................................... 4
Código de ejemplo para integrar el Complemento para CFDI .................................................... 5
Activar integración del complemento ............................................................................................. 7
Complemento concepto ...................................................................................................................... 9
Integración del Complemento concepto en MaxiComercio ........................................................... 9
Nombre y ubicación del archivo .................................................................................................. 9
Código de ejemplo para integrar el Complemento concepto para CFD ................................... 10
Código de ejemplo para integrar el Complemento concepto para CFDI .................................. 11
Activar integración del complemento concepto ........................................................................... 13
Addenda ............................................................................................................................................ 14
¿Qué es? ........................................................................................................................................ 14
¿Para qué sirve? ............................................................................................................................ 14
¿Qué información contiene? ......................................................................................................... 14
Ejemplo en MaxiComercio ............................................................................................................ 15
Script para integración de la Addenda ...................................................................................... 15
Activar Addenda ........................................................................................................................ 23
Generar CFD/CFDI ..................................................................................................................... 23
Addenda MaxiComercio ................................................................................................................ 25
Elementos que conforman la Addenda de MaxiComercio ....................................................... 25
Activar Addenda de MaxiComercio ........................................................................................... 32
Especificaciones descritas en el anexo 20 de la Resolución Miscelánea Fiscal publicado el 23 de
septiembre de 2010 .......................................................................................................................... 34
3
Objetivo Describir las características de los elementos adicionales que se pueden integrar en el
comprobante fiscal digital y ejemplificar su uso con MaxiComercio, mostrando la configuración y la
creación de scripts que permiten manipular los nuevos nodos. El código fuente en este documento
es únicamente un ejemplo de uso, el contenido depende de cada usuario respetando las reglas
establecidas por el SAT.
Complemento El complemento es un nodo adicional dentro de la estructura principal del comprobante, el cual
deberá incluir elementos que estan reglamentados por el SAT solo para aquellos contribuyentes
que tengan la obligación de acuerdo a la Resolución Miscelánea Fiscal vigente. Este nodo se
integrará de la siguiente manera:
Para CFD:
<Comprobante>
…
<Complemento>
</ Complemento>
</Comprobante>
Para CFDI:
<cfdi:Comprobante>
…
<cfdi:Complemento>
</cfdi:Complemento>
</cfdi:Comprobante>
Las reglas de uso de los complementos se deben consultar en el portal del SAT
http://www.sat.gob.mx.
Integración del Complemento en MaxiComercio
Nombre y ubicación del archivo
Para crear el contenido del Complemento deberá programar sus características a través de un
script de la siguiente manera:
Cree un nuevo archivo JavaScript con el siguiente nombre: complemento.js.
Coloque el archivo en la carpeta del repositorio:
MaxiComercio\CFD\Complemento para CFD o MaxiComercio\CFDI\Complemento para
CFDI.
Escriba el código necesario para crear el Complemento. Podrá usar todos los objetos del
script cfd.js para CFD y cfdi.js para CFDI.
4
Código de ejemplo para integrar el Complemento para CFD //estan disponibles todos los objetos de cfd.js
//más las siguientes variables globales
/*
venta; //objeto EDOFX.Venta //Si el cfd es de una CxC entonces el objeto sera nulo
pkventa;//clave primaria de la tabla venta //Si el cfd es de una CxC entonces el objeto sera
nulo
cxc; //objeto EDOFX.DCXC //Si el cfd es de una Venta entonces el objeto sera nulo
pkcxc; //clave primaria de la tabla DCXC //Si el cfd es de una Venta entonces el objeto
sera nulo
cfd; //objeto geCFD.cCFD actual
*/
//llamada para la ejecución de la función
integrarComplemento();
//Contenido de la función principal
function integrarComplemento(){
//retornar verdadero para continuar
var complemento,element,e2;
//Nodo Complemento
complemento=nuevoElemento("Complemento");
if(complemento==null) return 0;
//Nodo Adicional
element=nuevoElemento("NodoEjemplo")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("Atributo1","valor del atributo");
complemento.Elements.Add(element);
element=nuevoElemento("NodoDos")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("AtributoEj2","valor del atributo");
complemento.Elements.Add(element);
//Definir los NamceSpaces necesarios:
// cfd.new_xmlns(name,value);
// cfd.new_schemaLocation(location);
cfd.new_xmlns("xmlns:ecc","http://www.sat.gob.mx/ecc");
cfd.new_schemaLocation("http://www.sat.gob.mx/ecc");
cfd.new_schemaLocation("http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xsd");
//Agregar complemento al comprobante
cfd.Complemento=complemento.getElement(cfd.cfdXmlDocument);
return -1;
5
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
Código de ejemplo para integrar el Complemento para CFDI //estan disponibles todos los objetos de cfdi.js
//más las siguientes variables globales
/*
venta; //objeto EDOFX.Venta //Si el cfdi es de una CxC entonces el objeto sera nulo
pkventa;//clave primaria de la tabla venta //Si el cfd es de una CxC entonces el objeto sera
nulo
cxc; //objeto EDOFX.DCXC //Si el cfdi es de una Venta entonces el objeto sera nulo
pkcxc; //clave primaria de la tabla DCXC //Si el cfd es de una Venta entonces el objeto
sera nulo
ocfd; //objeto geCFD.cCFD actual
*/
//llamada para la ejecución de la función
integrarComplemento();
//Contenido de la función principal
function integrarComplemento(){
//retornar verdadero para continuar
var complemento,element,e2;
//Nodo Complemento
complemento=nuevoElemento("Complemento");
if(complemento==null) return 0;
complemento.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
complemento.URI=proccess.getDefault_cfdi_URI(); //namespace asociado al
prefijo
//Nodo Adicional
element=nuevoElemento("NodoEjemplo")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("Atributo1","valor del atributo");
complemento.Elements.Add(element);
element=nuevoElemento("NodoDos")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("AtributoEj2","valor del atributo");
complemento.Elements.Add(element);
6
//Definir los NamceSpaces necesarios:
// ocfd.new_xmlns(name,value);
// ocfd.new_schemaLocation(location);
ocfd.new_xmlns("xmlns:ecc","http://www.sat.gob.mx/ecc");
ocfd.new_schemaLocation("http://www.sat.gob.mx/ecc");
ocfd.new_schemaLocation("http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xsd");
//Agregar complemento al comprobante
ocfd.Complemento=complemento.getElement(ocfd.cfdXmlDocument);
return -1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
7
Activar integración del complemento Para activar la integración del Complemento ingrese al panel de control/Facturación electrónica.
En la siguiente ventana haga clic en el botón General.
En la siguiente ventana seleccione la pestaña Adicionales y marque la casilla Incluir elemento
<Complemento>. Haga clic en el botón Aceptar y reinicie la conexión del sistema, con esta
configuración el complemento se incluira para cada comprobante generado de tipo CFD o CFDI.
9
Complemento concepto El complemento concepto es un nodo adicional dentro de la estructura del comprobante que se
incluye en el nodo Concepto, el cual deberá incluir elementos que estan reglamentados por el SAT
solo para aquellos contribuyentes que tengan la obligación de acuerdo a la Resolución Miscelánea
Fiscal vigente. Este nodo se integrará de la siguiente manera:
Para CFD:
<Comprobante>
…
<Conceptos>
<Concepto>
< ComplementoConcepto >
</ComplementoConcepto >
</Concepto >
</Conceptos >
</Comprobante>
Para CFDI:
<cfdi:Comprobante>
…
<cfdi:Conceptos>
<cfdi:Concepto>
<cfdi:ComplementoConcepto >
</cfdi:ComplementoConcepto >
</cfdi:Concepto >
</cfdi:Conceptos >
</cfdi:Comprobante>
Las reglas de uso de los complementos para conceptos se deben consultar en el portal del SAT
http://www.sat.gob.mx.
Integración del Complemento concepto en MaxiComercio
Nombre y ubicación del archivo
Para crear el contenido del Complemento concepto deberá programar sus características a través
de un script de la siguiente manera:
Cree un nuevo archivo JavaScript y asigne el nombre con el siguiente formato:
cconcepto_CodigoProducto. El código del producto deberá ser el que está registrado en el
sistema. Por ejemplo si el producto al que se requiere agregar el complemento tiene el
código 1000800, entonces el nombre del archivo deberá ser cconcepto_1000800.js.
Coloque el archivo en la carpeta del repositorio:
MaxiComercio\CFD\Producto para CFD o MaxiComercio\CFDI\Producto para CFDI.
Escriba el código necesario para crear el Complemento del concepto. Podrá usar todos los
objetos del script cfd.js para CFD y cfdi.js para CFDI.
10
Código de ejemplo para integrar el Complemento concepto para CFD
//estan disponibles todos los objetos de cfd.js
//más las siguientes variables globales
/*
venta; //objeto EDOFX.Venta //Si el cfd es de una CxC entonces el objeto sera nulo
pkventa;//clave primaria de la tabla venta //Si el cfd es de una CxC entonces el objeto sera
nulo
cxc; //objeto EDOFX.DCXC //Si el cfd es de una Venta entonces el objeto sera nulo
pkcxc; //clave primaria de la tabla DCXC //Si el cfd es de una Venta entonces el objeto
sera nulo
cfd; //objeto geCFD.cCFD actual
concepto; //objeto geCFD.cConceoto actual
*/
// OPCIONAL: concepto.ComplementoConcepto //O MIN 0 MAX 1
//concepto.ComplementoConcepto.complemento=null;
//llamada para la ejecución de la función
integrarComplementoConcepto();
//Contenido de la función principal
function integrarComplementoConcepto(){
//retornar verdadero para continuar
var ComplementoConcepto,element,e2;
//Nodo ComplementoConcepto
ComplementoConcepto=nuevoElemento("ComplementoConcepto");
if(ComplementoConcepto==null) return 0;
//Nodo Adicional
element=nuevoElemento("NodoEjemplo")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("Atributo1","valor del atributo");
ComplementoConcepto.Elements.Add(element);
element=nuevoElemento("NodoDos")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("AtributoEj2","valor del atributo");
ComplementoConcepto.Elements.Add(element);
//Definir los NamceSpaces necesarios:
// cfd.new_xmlns(name,value);
// cfd.new_schemaLocation(location);
cfd.new_xmlns("xmlns:ecc","http://www.sat.gob.mx/ecc");
cfd.new_schemaLocation("http://www.sat.gob.mx/ecc");
cfd.new_schemaLocation("http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xsd");
11
//Agregar complementoConcepto al concepto actual
concepto.ComplementoConcepto.complemento=ComplementoConcepto.getElement(cfd.cfdXmlDo
cument);
return -1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
Código de ejemplo para integrar el Complemento concepto para CFDI
//estan disponibles todos los objetos de cfdi.js
//más las siguientes variables globales
/*
venta; //objeto EDOFX.Venta //Si el cfdi es de una CxC entonces el objeto sera nulo
pkventa;//clave primaria de la tabla venta //Si el cfd es de una CxC entonces el objeto sera
nulo
cxc; //objeto EDOFX.DCXC //Si el cfdi es de una Venta entonces el objeto sera nulo
pkcxc; //clave primaria de la tabla DCXC //Si el cfd es de una Venta entonces el objeto
sera nulo
ocfd; //objeto geCFD.cCFD actual
concepto; //objeto geCFD.cConceoto actual
*/
// OPCIONAL: concepto.ComplementoConcepto //O MIN 0 MAX 1
//concepto.ComplementoConcepto.complemento=null;
//llamada para la ejecución de la función
integrarComplementoConcepto();
//Contenido de la función principal
function integrarComplementoConcepto(){
//retornar verdadero para continuar
var ComplementoConcepto,element,e2;
//Nodo ComplementoConcepto
ComplementoConcepto=nuevoElemento("ComplementoConcepto");
if(ComplementoConcepto==null) return 0;
ComplementoConcepto.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
ComplementoConcepto.URI=proccess.getDefault_cfdi_URI(); //namespace
asociado al prefijo
12
//Nodo Adicional
element=nuevoElemento("NodoEjemplo")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("Atributo1","valor del atributo");
ComplementoConcepto.Elements.Add(element);
element=nuevoElemento("NodoDos")
if(element==null) return 0;
element.Prefix="ecc"; //prefijo
element.URI="http://www.sat.gob.mx/ecc"; //namespace
//Agregar atributos
element.SetMyAttribute("AtributoEj2","valor del atributo");
ComplementoConcepto.Elements.Add(element);
//Definir los NamceSpaces necesarios:
// cfd.new_xmlns(name,value);
// cfd.new_schemaLocation(location);
ocfd.new_xmlns("xmlns:ecc","http://www.sat.gob.mx/ecc");
ocfd.new_schemaLocation("http://www.sat.gob.mx/ecc");
ocfd.new_schemaLocation("http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xsd");
//Agregar complementoConcepto al concepto actual
concepto.ComplementoConcepto.complemento=ComplementoConcepto.getElement(ocfd.cfdXmlD
ocument);
return -1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
13
Activar integración del complemento concepto Seleccione el producto en el módulo de inventarios dentro del BackOffice del sistema. Haga clic en
editar y seleccione la pestaña Inventario y suministro. Maque la casilla Incluir complemento
concepto en Comprobante Fiscal Digital y guarde los cambios. Esto activará la generación del
complemento del concepto actual.
14
Addenda
¿Qué es? La Addenda es un elemento adicional que se puede agregar a la estructura principal del XML de
un CFD o CFDI. Este elemento se crea como <Addenda></Addenda> para el caso de CFD y
<cfdi:Addenda></cfdi:Addenda> para un comprobante de tipo CFDI.
El contenido dentro del elemento Addenda puede ser XML, texto plano o formato binario.
Para el caso de XML en el contenido de la Addenda se deberá tomar en cuenta las especificaciones
para la generación de contenido XML. La especificación de namespaces es opcional.
Si el contenido es texto plano se ingresará dentro del nodo Addenda sin usar caracteres
reservados en las especificaciones para XML. Para evitar posibles conflictos el contenido deberá
estar en formato UTF8.
Si se desea agregar datos en formato binario, este puede ser un archivo por ejemplo, se deberá
convertir en formato Base64 para poder ingresarlo como una cadena imprimible de caracteres.
¿Para qué sirve? El nodo opcional Addenda se puede usar para agregar cualquier tipo de información adicional que
se quiera compartir en el comprobante. El principal propósito es controlar mejor la información a
través de medios digitales y facilitar la carga de información a los sistemas a través del XML del
comprobante.
La Addenda es útil para enviar información usando el mismo comprobante XML sin necesidad de
enviar archivos digitales por separado cuando necesitamos compartir mas información.
¿Qué información contiene? El contenido de la Addenda puede ser el que se desee sin restricciones ya que no tiene validez
fiscal. La información puede ser del Proveedor (Emisor) o del Cliente (Receptor), como por
ejemplo: información de la dirección de envío de la mercancía, datos adicionales del producto
como números de series y lotes, datos del vendedor, número de orden de compra del cliente,
fechas de vencimiento del documento, etc.
15
Ejemplo en MaxiComercio
Script para integración de la Addenda
Nombre y ubicación del archivo
Para crear una Addenda deberá programar sus características a través de un script de la siguiente
manera:
Cree un nuevo archivo JavaScript y asigne el nombre con el siguiente formato:
addenda_CodigoCliente. El código del cliente deberá ser el que está registrado en el
sistema. Por ejemplo si el cliente al que se requiere agregar una Addenda tiene el código
1000500, entonces el nombre del archivo deberá ser addenda_1000500.js.
Coloque el archivo en la carpeta del repositorio:
MaxiComercio\CFD\Cliente para CFD o MaxiComercio\CFDI\Cliente para CFDI.
Escriba el código necesario para crear la Addenda. Podrá usar todos los objetos del script
cfd.js para CFD y cfdi.js para CFDI.
Código de ejemplo para agregar addenda en formato XML para CFD:
1. Addenda XML sin definición de namespace
//están disponibles todos los objetos de cfd.js
//más las siguientes variables globales
/*
venta; //objeto EDOFX.Venta //Si el cfd es de una CxC entonces el objeto sera nulo
pkventa;//clave primaria de la tabla venta //Si el cfd es de una CxC entonces el
objeto sera nulo
cxc; //objeto EDOFX.DCXC //Si el cfd es de una Venta entonces el objeto sera nulo
pkcxc; //clave primaria de la tabla DCXC //Si el cfd es de una Venta entonces el
objeto sera nulo
cfd; //objeto geCFD.cCFD actual
*/
//llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
//Nodo <MiCliente>
//Nuevo nodo
element=nuevoElemento("MiCliente");
if(element==null) return 0;
addenda.Elements.Add(element);
//Nodo <InfomacionAdicional>
//Nodo dentro de <MiCliente>
16
e2=nuevoElemento("InfomacionAdicional");
if(e2==null) return 0;
//Agregar atributos
e2.SetMyAttribute("NumProveedor","850001254");
e2.SetMyAttribute("Notas","Ejemplo de addenda");
element.Elements.Add(e2);
//agregar la addenda al comprobante
cfd.Addenda=addenda.getElement(cfd.cfdXmlDocument);
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear
objeto geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
2. Addenda XML con definición de namespace
//llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
//Nodo <MiCliente>
//Nuevo nodo
element=nuevoElemento("MiCliente");
if(element==null) return 0;
element.Prefix="otro"; //todos los nodos internos del elemento Addenda deben
tener el prefijo
element.URI="http://www.misitio.mx/miNameSpace"; //todos los nodos internos
del elemento Addenda deben el valor URI
//agrear NameSpaces
element.SetMyAttribute("xmlns:otro","http://www.misitio.mx/miNameSpace");
element.SetMyAttribute("schemaLocation","http://www.misitio.mx/miNameSpace
http://www.misitio.mx/miNameSpace/miNameSpace.xsd");
element.getAttribute("schemaLocation").schemaLocation=true;
addenda.Elements.Add(element);
//Nodo <InfomacionAdicional>
//Nodo dentro de <MiCliente>
17
e2=nuevoElemento("InfomacionAdicional");
if(e2==null) return 0;
e2.Prefix="otro";
e2.URI="http://www.misitio.mx/miNameSpace";
//Agregar atributos
e2.SetMyAttribute("NumProveedor","850001254");
e2.SetMyAttribute("Notas","Ejemplo de addenda");
element.Elements.Add(e2);
//agregar la addenda al comprobante
cfd.Addenda=addenda.getElement(cfd.cfdXmlDocument);
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear
objeto geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
Código de ejemplo para agregar addenda en Texto plano para CFD //llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
//Nuevo nodo de texto
element=nuevoElemento("");
if(element==null) return 0;
element.textNode=true;
element.Value="Texto de ejemplo en addenda. & <El contenido> puede tener caracteres
especiales ya que se transformará a UTF-8";
addenda.Elements.Add(element);
//agregar la addenda al comprobante
cfd.Addenda=addenda.getElement(cfd.cfdXmlDocument);
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
18
Código de ejemplo para agregar Addenda en Base64 para formato binario en CFD //llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
var archivo;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
//Nuevo nodo de texto
element=nuevoElemento("");
if(element==null) return 0;
element.textNode=true;
//Cargar el contenido binario desde un archivo
archivo="C:\\Miarchivo.pdf";
element.Value=proccess.doBase64FromFile(archivo);
if(element.Value=="") {
eBasic.eMsgbox("El contenido del archivo para incluir en addenda esta
vacío",6);
return 0;
}
//Cargar el contenido binario desde una cadena
//element.Value=proccess.doBase64FromString("Contenido de la addenda");
addenda.Elements.Add(element);
//agregar la addenda al comprobante
cfd.Addenda=addenda.getElement(cfd.cfdXmlDocument);
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
19
Código de ejemplo para agregar addenda en formato XML para CFDI
1. Addenda XML sin definición de namespace
//estan disponibles todos los objetos de cfdi.js
//mas las siguientes variables globales
/*
TIPO; //1=venta 2=cxc
archivoXML_timbrado; //ubicacion del archivo xml del cfdi timbrado
pkcfd;
pkventa;
pkcxc;
pkcliente;
codigocliente;
nombrecliente;
*/
//llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
addenda.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
addenda.URI=proccess.getDefault_cfdi_URI(); //namespace asociado al prefijo
//Nodo <MiCliente>
//Nuevo nodo
element=nuevoElemento("MiCliente");
if(element==null) return 0;
addenda.Elements.Add(element);
//Nodo <InfomacionAdicional>
//Nodo dentro de <MiCliente>
e2=nuevoElemento("InfomacionAdicional");
if(e2==null) return 0;
//Agregar atributos
e2.SetMyAttribute("NumProveedor","850001254");
e2.SetMyAttribute("Notas","Ejemplo de addenda");
element.Elements.Add(e2);
//agregar la addenda al comprobante
if(proccess.setAddendaInXMLCFDI(archivoXML_timbrado,addenda)){
return -1;
}else{
return 0;
}
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
20
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
1. Addenda XML con definición de namespace
//llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
addenda.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
addenda.URI=proccess.getDefault_cfdi_URI(); //namespace asociado al prefijo
//Nodo <MiCliente>
//Nuevo nodo
element=nuevoElemento("MiCliente");
if(element==null) return 0;
element.Prefix="otro"; //todos los nodos internos del elemento Addenda deben tener
el prefijo
element.URI="http://www.misitio.mx/miNameSpace"; //todos los nodos internos del
elemento Addenda deben el valor URI
//agrear NameSpaces
element.SetMyAttribute("xmlns:otro","http://www.misitio.mx/miNameSpace");
element.SetMyAttribute("schemaLocation","http://www.misitio.mx/miNameSpace
http://www.misitio.mx/miNameSpace/miNameSpace.xsd");
element.getAttribute("schemaLocation").schemaLocation=true;
addenda.Elements.Add(element);
//Nodo <InfomacionAdicional>
//Nodo dentro de <MiCliente>
e2=nuevoElemento("InfomacionAdicional");
if(e2==null) return 0;
e2.Prefix="otro";
e2.URI="http://www.misitio.mx/miNameSpace";
//Agregar atributos
e2.SetMyAttribute("NumProveedor","850001254");
e2.SetMyAttribute("Notas","Ejemplo de addenda");
element.Elements.Add(e2);
//agregar la addenda al comprobante
if(proccess.setAddendaInXMLCFDI(archivoXML_timbrado,addenda)){
return -1;
}else{
return 0;
}
21
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
Código de ejemplo para agregar addenda en Texto plano para CFDI //llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
addenda.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
addenda.URI=proccess.getDefault_cfdi_URI(); //namespace asociado al prefijo
//Nuevo nodo de texto
element=nuevoElemento("");
if(element==null) return 0;
element.textNode=true;
element.Value="Texto de ejemplo en addenda. & <El contenido> puede tener caracteres
especiales ya que se transformará a UTF-8";
addenda.Elements.Add(element);
//agregar la addenda al comprobante
if(proccess.setAddendaInXMLCFDI(archivoXML_timbrado,addenda)){
return -1;
}else{
return 0;
}
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
22
Código de ejemplo para agregar Addenda en Base64 para formato binario en CFDI //llamada par la ejecución de la función
integrarAddenda();
//Contenido de la función principal
function integrarAddenda(){
//retornar verdadero para continuar
var addenda,element,e2;
var archivo;
//Nodo <Addenda>
//Nodo principal necesario
addenda=nuevoElemento("Addenda");
if(addenda==null) return 0;
addenda.Prefix=proccess.getDefault_cfdi_Prefix(); //prefijo para cfdi
addenda.URI=proccess.getDefault_cfdi_URI(); //namespace asociado al prefijo
//Nuevo nodo de texto
element=nuevoElemento("");
if(element==null) return 0;
element.textNode=true;
//Cargar el contenido binario desde un archivo
archivo="C:\\Miarchivo.pdf";
element.Value=proccess.doBase64FromFile(archivo);
if(element.Value=="") {
eBasic.eMsgbox("El contenido del archivo para incluir en addenda esta
vacío",6);
return 0;
}
//Cargar el contenido binario desde una cadena
//element.Value=proccess.doBase64FromString("Contenido de la addenda");
addenda.Elements.Add(element);
//agregar la addenda al comprobante
if(proccess.setAddendaInXMLCFDI(archivoXML_timbrado,addenda)){
return -1;
}else{
return 0;
}
return 1;
}
//función para crear un nuevo nodo
function nuevoElemento(Nombre){
if(Nombre==null) Nombre="";
var newE=eBasic.eCreateObject("geCFD.cMyElement");
if(esInvalido(newE,"No se pudo crear el elemento "+Nombre+". Error al crear objeto
geCFD.cMyElement.")) return null;
newE.Name=Nombre;
return newE;
}
23
Activar Addenda
Para activar la integración de la addenda deberá editar los datos del cliente y marcar la casilla:
Incluir addenda en Comprobante Fiscal Digital.
Generar CFD/CFDI
Después de haber creado el archivo para la Addenda y activarla en el formulario de clientes podrá
generar el comprobante y se incluirá la Addenda en el nodo <Addenda> del comprobante. La
addenda no se toma en cuenta en la validación del comprobante, sin embargo, deberá estar
creada correctamente y tener el formato adecuado de acuerdo al tipo de contenido: XML, texto o
binario.
El resultado de la integración de la Addenda usando datos de ejemplo con el código indicado
arriba para XML sin namespaces sería el siguiente:
25
Addenda MaxiComercio La Addenda de MaxiComercio incluye información general de la venta la cual permitirá el registro
rápido de compras en el sistema MaxiComercio del cliente.
Elementos que conforman la Addenda de MaxiComercio
A continuación se describen los nodos y sus respectivos atributos contenidos en la Addenda de
MaxiComercio.
Definición de cada uno de los elementos
*El valor depende del tipo dato.
**El valor depende del tipo de entidad de MaxiComercio.
R: El nodo o atributo es Requerido.
O: El nodo o atributo es Opcional.
<Maxicomercio>
Atributos
Nombre Tipo Valores Descripción
Version R:Double * Versión de la addenda
Nodos
Nombre Descripción
Info R:Información general del comprobante y addenda
Venta R:Datos de la venta
<Info>
Atributos
Nombre Tipo Valores Descripción
Notas_partida_concepto R:Bool 1/0 Indica que la descripción del concepto tiene incluidas las notas de la partida.
Serie_lote_parte R:Bool 1/0 Indica que en el nodo <Parte> del concepto se incluyen los números de lotes o series del producto. Si el producto tiene serie y lotes únicamente se integran las series.
<Venta>
Atributos
Nombre Tipo Valores Descripción
Documento R:Long ** Tipo de documento (entidad cDocumentos).
Referencia R:String * Referencia de la venta
Fecha R:Date * Fecha de la venta
Subtotal R:Double * Sumatoria del Precio*Cantidad del detalle de
26
venta.
Descuento1 R:Double * Sumatoria de Descuento1 del detalle de venta
Descuento2 R:Double * Sumatoria de Descuento2 del detalle de venta
Impuesto1 R:Double * Sumatoria de Impuesto1 del detalle de venta
Impuesto2 R:Double * Sumatoria de Impuesto2 del detalle de venta
Impuesto3 R:Double * Sumatoria de Impuesto3 del detalle de venta
Impuesto4 R:Double * Sumatoria de Impuesto4 del detalle de venta
Tipocambio R:Double * Tipo de cambio de la divisa usada.
Domicilioentrega O:String * Domicilio de entrega capturado al realizar la venta.
Txtguia O:String * Numero de guía especificado en la venta.
Fembarque R:Date * Fecha de embarque
Fentrega R:Date * Fecha de entrega
Vencimiento R:Date * Fecha de vencimiento del documento
Formapago R:Long ** Forma de pago (entidad cFormasPago)
Statusentrega R:Long ** Status de entrega de la mercancía (entidad cStatusEnrega)
Statusfinanciero R:Long ** Status financiero del documento (entidad cSatatusFinancieros)
Notas O:String * Notas de la venta
Nodos
Nombre Descripción
Divisa R:Divisa de la venta
Folio R:Datos del folio
Cconsumo R:Centro de consumo asignado a la venta
Cliente R:Información del cliente
Agente O:Información del agente
Repartidor O:Información del repartidor
Porteador O:Información del porteador
Movcaja O:Información del cobro en caja
Detalles R:Detalles de la venta
<Venta.Divisa>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código de la divisa asignada a la venta
Descripcion R:String * Descripción de la divisa asignada a la venta
27
<Venta.Folio>
Atributos
Nombre Tipo Valores Descripción
Numero R:Long * Número de folio del sistema
Serie R:String * Serie del sistema
<Venta.Cconsumo>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Identificador del centro de consumo
Descripcion R:String * Descripción
Notas O:String * Notas
Nodos
Nombre Descripción
Almacen R: Almacén asociado al centro de consumo
<Venta.Cconsumo.Almacen>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
Email O:String * E-mail
Fax O:String * Fax
Telefonos O:String * Teléfonos
Website O:String * Pagina web
<Venta.Cliente>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Identificador del cliente
Nombre R:String * Nombre del cliente
Rfc R:String * RFC del cliente
Monedero R:Double * Saldo en monedero electrónico
Limitecredito R:Double * Monto límite de crédito
Puntos R:Double * Cantidad de puntos
Saldo R:Double * Saldo actual del cliente
Saldopuntos R:Double * Saldo actual en puntos
Nodos
28
Nombre Descripción
Tipocliente R: Información del tipo de cliente.
<Venta.Cliente.Tipocliente>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
Notas O:String * Notas
<Venta.Agente>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Nombre R:String * Nombre
Email O:String * E-mail
Telefono O:String * Teléfono
Notas O:String * Notas
<Venta.Repartidor>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Nombre R:String * Nombre
Email O:String * E-mail
Telefono O:String * Teléfono
Notas O:String * Notas
<Venta.Porteador>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
Notas O:String * Notas
29
<Venta.Movcaja>
Atributos
Nombre Tipo Valores Descripción
Efectivo R:Double * Cantidad pagada en efectivo
Tarjetas R:Double * Cantidad pagada en tarjetas de crédito o debito
Vales R:Double * Cantidad pagada en vales
Depositos R:Double * Cantidad pagada en depósitos
Cheques R:Double * Cantidad pagada en cheques
Tipocambio R:Double * Valor del tipo de cambio de la divisa del pago.
<Venta.Detalles>
Nodos
Nombre Descripción
Dventa R: Información del producto vendido.
<Venta.Detalles.Dventa>
Atributos
Nombre Tipo Valores Descripción
Cantidad R:Double * Cantidad vendida de producto asociado
Unidad R:String * Unidad de venta
Factor R:Double * Factor correspondiente a la unidad
Precio R:Double * Precio del producto
Descuento1 R:Double * Descuento1
Descuento2 R:Double * Descuento2
Impuesto1 R:Double * Impuesto1
Impuesto2 R:Double * Impuesto2
Impuesto3 R:Double * Impuesto3
Impuesto4 R:Double * Impuesto4
Tipocambio R:Double * Tipo de cambio correspondiente a la divisa de la venta
Notas O:String * Notas de la partida
Nodos
Nombre Descripción
Producto R: Información del producto vendido.
<Venta.Detalles.Dventa.Producto>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
30
Codbar1 O:String * Código de barras 1
Codbar2 O:String * Código de barras 2
Codbar3 O:String * Código de barras 3
Diasentrega R:Double * Número de días de entrega del producto
Ppuntos R:Double * Precio en puntos
Reqlote R:Bool 1/0 Indica si requiere lote o no.
Reqserie R:Bool 1/0 Indica si requiere serie o no.
Iclase R:Long ** Clase de elemento (entidad cClaseProducto)
Notas O:String * Notas del producto
Nodos
Nombre Descripción
Tipoimpuesto R: Información del impuesto asociado al producto
Linea O: Información de la línea del producto
Marca O: Información de la marca del producto
Departamento O: Información del departamento del producto
Lotes O: Información de los números de lote. Se incluye solo si el producto tiene lote.
Series O: Información de los números de serie. Se incluye solo si el producto tiene serie y no tiene lote.
<Venta.Detalles.Dventa.Producto.Tipoimpuesto>
Atributos
Nombre Tipo Valores Descripción
Nombre R:String * Nombre del impuesto
I1Venta R:String * Porcentajes de impuesto para interior y frontera, por ejemplo: %p1|%p2. P1 es el impuesto para interior y p2 es el impuesto para frontera.
I2Venta R:String * Porcentajes de impuesto para interior y frontera, por ejemplo: %p1|%p2. P1 es el impuesto para interior y p2 es el impuesto para frontera.
I3Venta R:String * Porcentajes de impuesto para interior y frontera, por ejemplo: %p1|%p2. P1 es el impuesto para interior y p2 es el impuesto para frontera.
I4Venta R:String * Porcentajes de impuesto para interior y frontera, por ejemplo: %p1|%p2. P1 es el impuesto para interior y p2 es el impuesto para frontera.
<Venta.Detalles.Dventa.Producto.Linea>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
31
*
<Venta.Detalles.Dventa.Producto.Marca>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
<Venta.Detalles.Dventa.Producto.Departamento>
Atributos
Nombre Tipo Valores Descripción
Codigo R:String * Código
Descripcion R:String * Descripción
<Venta.Detalles.Dventa.Producto.Lotes>
Nodos
Nombre Descripción
Lote R:Información del lote del producto vendido
<Venta.Detalles.Dventa.Producto.Lotes.Lote>
Atributos
Nombre Tipo Valores Descripción
Numero R:String * Número del lote
Fcaducidad R:String * Fecha de caducidad del lote (puede que no se haya capturado por lo que tendrá la misma fecha de creación de la venta)
Cantidad R:Double * Cantidad de productos
Nodos
Nombre Descripción
Series O: Información de números de serie del producto vendido.
<Venta.Detalles.Dventa.Producto.Lotes.Lote.Series>
<Venta.Detalles.Dventa.Producto.Series>
Nodos
32
Nombre Descripción
Serie R:Información de la serie
<Venta.Detalles.Dventa.Producto.Lotes.Lote.Series.Serie>
o
<Venta.Detalles.Dventa.Producto.Series.Serie>
Atributos
Nombre Tipo Valores Descripción
Numero R:String * Número de serie vendido
Notas O:String * Notas de la serie
Activar Addenda de MaxiComercio
Para activar la integración de la Addenda de MaxiComercio ingrese al panel de control/Facturación
electrónica. En la siguiente ventana haga clic en el botón General.
33
Seleccione la pestaña Adicionales y haga clic en el botón Configuración avanzada. Se mostrará una
ventana donde podrá marcar la casilla “Incluir Addenda de MaxiComercio si el cliente no tiene
asignada una”. Reinicie la conexión de MaxiComercio para que los cambios tengan efecto. Esta
opcion activará la integración de la addenda de MaxiComercio, y ésta solo se agregará en el XML
cuando el cliente no tenga una Addenda configurada.
34
Especificaciones descritas en el anexo 20 de la Resolución
Miscelánea Fiscal publicado el 23 de septiembre de 2010
B. Uso de la facilidad de nodos opcionales <Complemento> y <ComplementoConcepto>
El estándar del comprobante fiscal digital incluye dos elementos definidos como de tipo abierto que servirán para integrar nodos adicionales, definidos por el Servicio de Administración Tributaria al cuerpo del comprobante. A diferencia del nodo Addenda, estos nodos si son de uso fiscal por lo que su contenido será reglamentado por la autoridad para ser utilizados por los contribuyentes que cuenten con alguna facilidad particular dispuesta en la Resolución Miscelánea Fiscal vigente, incluyendo los datos complementarios solicitados en dichos nodos de acuerdo al sector o actividad específica. Las reglas de uso de aquellos complementos disponibles estarán publicados en el sitio de Comprobantes Fiscales Digitales dentro del portal del SAT “http://www.sat.gob.mx” Reglas generales de uso: 1. Dentro de estos nodos de complemento se integrarán al comprobante los elementos adicionales
necesarios de acuerdo con el formato definido por el SAT como requerido por la actividad específica del contribuyente.
2. La integración de estos elementos adicionales se hará siguiendo los siguientes lineamientos: a. Se integrarán idénticos los nodos complementarios requeridos dentro del nodo designado,
según sea el caso requerido en la regla de la Resolución Miscelánea Fiscal aplicable. b. El Contribuyente deberá sujetarse a la estructura de estos nodos complementarios,
teniendo cuidado de especificar las referencias necesarias al “namespace” del complemento que se utilice, de acuerdo a los estándares definidos y publicados por el SAT.
c. Esto implica que si el contribuyente requiere utilizar esta funcionalidad complementaria deberá definir el namespace correspondiente dentro del nodo Comprobante, así como referenciar la ubicación pública del esquema xsd correspondiente. Por ejemplo, asumiendo que el contribuyente requiere integrar el namespace http://www.sat.gob.mx/cfd/ecc el cual se define mediante el esquema público definido en http://www.sat.gob.mx/schemas/cfd/ecc/ecc.xsd se vincularía de la siguiente forma:
< cfdi:Comprobante … xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:cfdi=”http://www.sat.gob.mx/cfd/3”
xmlns:ecc="http://www.sat.gob.mx/ecc" xsi:schemaLocation="
http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd http://www.sat.gob.mx/ecc http://www.sat.gob.mx/sitio_internet/cfd/ecc/ecc.xsd"
…. </ cfdi:Comprobante>
Nota: El ejemplo mostrado es para un CFDI, en el caso de un CFD no se incluirá el encabezado del namespace “cfdi” en el cuerpo del comprobante. La línea que especifica xml:xsi=”http://www.w3.org/2001/XMLSchema-instance” indica que se está usando validación mediante el estándar de esquema XSD. La línea que especifica xmlns:cfdi=”http://www.sat.gob.mx/cfd/3” hace referencia al namespace de comprobantes. La línea que especifica xmlns:ecc=”http://www.sat.gob.mx/ecc/” hace referencia al namespace adicional del complemento. Finalmente la línea que especifica xsi:schemaLocation hace referencia a los dos namespaces usados, marcando adicionalmente la ubicación de los esquemas xsd que definen las especificaciones de cada namespace. En caso de que se requiriera agregar otros namespaces adicionales, el mecanismo sería agregar una línea tipo xmlns definiendo el namespace y expresando nuevamente el namespace y ubicación de su definición dentro del atributo xsi:schemaLocation Cabe aclarar que los nodos básicos del comprobante fiscal digital por internet (CFDI) a diferencia de un CFD deberán llevar el encabezado del namespace publicado por el SAT. Por ejemplo el siguiente: <cfdi:Comprobante> <cfdi:Emisor/>
35
</cfdi:Comprobante>
Cada complemento tendrá definida su propia regla para inclusión en la cadena original, la cual, en caso de existir, se integrará en el lugar correspondiente de acuerdo a lo expresado en los rubros I.C y II.B del presente anexo.
C. Uso de la facilidad de ensobretado <Addenda>
La facilidad de ensobretado consiste en ofrecer un mecanismo a aquellos contribuyentes que desean utilizar otros formatos electrónicos de forma adicional y no substituta al establecido dentro del Anexo 20 Rubro I.B y II.A. Su objeto es permitir que el envío de dichos formatos adicionales se integre dentro del cuerpo del estándar de comprobante fiscal digital definido por el SAT, facilitando el transporte de los formatos e información adicional, evitando con ello envíos paralelos. Su mecánica de uso es el siguiente:
1. Se genera la información adicional en el formato particular del contribuyente. 2. Se genera el comprobante fiscal digital en el estándar definido por el SAT y se agregará el nodo o
elemento de < cfdi:Addenda>posterior a que el servicio de certificación de los proveedores autorizados sea exitoso, como información adicional.
3. Dentro del nodo de <cfdi:Addenda> se expresa el formato particular del contribuyente siguiendo los siguientes lineamientos:
a. Si el formato es XML se transcriben idénticos los nodos adicionales requeridos dentro del nodo < cfdi:Addenda>. Si el contribuyente desea sujetar estos nodos adicionales a un diccionario o estándar específico, podrá hacerlo teniendo cuidado de especificar las referencias necesarias al “namespace” del formato utilizado, de acuerdo a los estándares definidos por el consorcio W3. Esto implica que si el contribuyente desea utilizar esta funcionalidad adicional deberá definir su nuevo namespace dentro del propio nodo de la Addenda publicando la ruta del esquema XSD para validación, por ejemplo: <cfdi:Comprobante … xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cfdi=”http://www.sat.gob.mx/cfd/3” xsi:schemaLocation=" http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd …. <cfdi:Addenda>
xmlns:otro="http://www.misitio.mx/miNS" xsi:schemaLocation="
http://www.misitio.mx/miNS http://www.misitio.mx/miNS/miNS.xsd" <otro:MiNodo miAtributo=”valor”/> </cfdi:Addenda> </cfdi:Comprobante> Nota: El ejemplo mostrado es para un CFDI, en el caso de un CFD no se incluirá el encabezado del namespace “cfdi” en el cuerpo del comprobante.
La línea que especifica xml:xsi=”http://www.w3.org/2001/XMLSchema-instance” indica que se está usando validación mediante el estándar de esquema XSD. La línea que especifica xmlns:cfdi=”http://www.sat.gob.mx/cfd/3” hace referencia al namespace de comprobantes fiscales digitales por internet, la línea que especifica xmlns=http://www.sat.gob.mx/cfd/2 hace referencia al namespace de comprobantes fiscales digitales. La línea que especifica xmlns:otro=”http://www.misitio.mx/miNS” hace referencia al namespace adicional definido por el contribuyente La línea que especifica xsi:schemaLocation hace referencia a los dos namespaces usados, marcando adicionalmente la ubicación de los esquemas xsd que definen las especificaciones de cada namespace. El primer par corresponde al namespace y ubicación del esquema definido por el SAT y el segundo par corresponde al namespace y ubicación definido por el contribuyente para sus propios fines. Finalmente, el nodo que aparece en la Addenda tiene el encabezado otro: que corresponde al encabezado definido dentro de sí mismo. En caso de que se requiriera agregar otros namespaces adicionales, el mecanismo sería agregar una línea tipo xmlns definiendo el namespace y expresando nuevamente el namespace y ubicación de su definición dentro del atributo xsi:schemaLocation Cabe aclarar que los nodos básicos del comprobante deberán llevar encabezado del namespace publicado por el SAT al ser estos basados en el namespace por omisión (sólo para un CFDI). Por ejemplo el siguiente: <cfdi:Comprobante> <cfdi:Emisor/> </cfdi:Comprobante>
b. Si el formato es texto plano, se expresa idéntico dentro del nodo “Addenda” teniendo