Addenda para Pemex

1,132 views
Skip to first unread message

Arturo Ramos

unread,
Jul 20, 2011, 5:30:15 PM7/20/11
to vfp-factura-ele...@googlegroups.com
Hola foro,

Alguien sabe si SAE o COMPAQ hace CFD/CFDI con Addenda para Pemex ?

Saludos.

Arturo Ramos
www.ircsasoftware.com.mx
Cancún, México.

Arturo Ramos

unread,
Jul 25, 2011, 3:15:16 PM7/25/11
to vfp-factura-ele...@googlegroups.com
Hola,

Bueno, lo de SAE y CONTPAQ ya no no importa... alguien tendrá la Addenda para Pemex ?

Si alguien me puede pasar ese dato se lo agradecería mucho.

Victor Lopez

unread,
Jul 25, 2011, 5:07:54 PM7/25/11
to vfp-factura-ele...@googlegroups.com
Hola Arturo
Fíjate que yo estoy en las mismas que tú, he estado batallando para conseguir el addenda de PEMEX, sin embargo investigando con los mismos de PEMEX me dijeron que por el momento no es necesario la addenda y no han dicho desde que fecha la van a obligar, mi cliente es taller mecánico que tiene varias sucursales de PEMEX en GDL, Sonora, Rosarito, Sinaloa, etc.

Si sabes algo te encargo mucho el dato al igual si yo obtengo información te la haré saber


Saludos !




______________________
Ing. Victor Gerardo López
Director de desarrollo
POSMEX, Guadalajara



--
Has recibido este mensaje porque estás suscrito al grupo "vfp-factura-electronica-mexico" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/vfp-factura-electronica-mexico/-/kFaDk4QuE_8J.

Para publicar una entrada en este grupo, envía un correo electrónico a vfp-factura-ele...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a vfp-factura-electroni...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/vfp-factura-electronica-mexico?hl=es.




Arturo Ramos

unread,
Jul 26, 2011, 6:37:10 PM7/26/11
to vfp-factura-ele...@googlegroups.com
Hola Victor,

Mira este documento que encontré, ahí indica lo que he visto en otros foros, que la addenda sólo es una línea de valores, 10 valores que se deben incluir en el XML.

Te paso y al foro este dato por si alguien lo necesita; si alguien ya sabe con más detalle lo que Pemex pide ojala lo comparta; si observan es de un documento con fecha de Sep 2010; no creo que esto lo cambien a cada rato.

Saludos.

NOTA: Estoy viendo mi lapsus-brutus del primer post de este tema, escribí COMPAQ cuando me refería a CONTPAQi... ustedes disculpen... jaja
pemex_addenda.pdf

Arturo Ramos

unread,
Oct 10, 2011, 1:26:22 PM10/10/11
to vfp-factura-ele...@googlegroups.com
Hola Foro,

Alguien ya tiene algo de addenda de PEMEX, si me pueden ayudar con un ejemplo,

Gracias

Saludos

Arturo Ramos

unread,
Nov 3, 2011, 2:26:53 PM11/3/11
to vfp-factura-ele...@googlegroups.com
Algún ejemplo de addenda para PEMEX ??, nadie ??

Saludos.

Arturo Ramos.
www.ircsasoftware.com.mx
Cancún, México.

Cesar Esquivel

unread,
Nov 3, 2011, 2:39:41 PM11/3/11
to vfp-factura-ele...@googlegroups.com
Tengo el complemento detallista, no se si es lo que pide PEMEX, lo pide Liverpool y funciona bien, espero les sirva de algo

Saludos!

=====================================================================
nComplemento = CFDXml.CreateNode(1, "Complemento", "")

             &&encabezado
             shemdeta = CFDXml.CreateElement("detallista:detallista")
             shemdeta.setAttribute("type","SimpleInvoiceType")
             shemdeta.setAttribute("documentStructureVersion","AMC8.1")
     shemdeta.setAttribute("documentStatus","ORIGINAL")
             shemdeta.setAttribute("contentVersion","1.3.1")
            
             &&tipo de transaccion a utilizar
               requestForPaymentIdentification = CFDXml.CreateElement("detallista:requestForPaymentIdentification")
entityType = CFDXml.CreateElement("detallista:entityType")
               ttext=cfdxml.CreateTextNode(IIF(this.qtarchrinval(Gral.tipoDeComp)="ingreso","INVOICE","CREDIT_NOTE"))
               entityType.Appendchild(ttext) &&agrega texto
              
                requestForPaymentIdentification.AppendChild(entityType)
             shemdeta.AppendChild(requestForPaymentIdentification)

&&cantidad con letra
IF LEN(this.qtarchrinval(Gral.aatxttoTal)) > 0
    specialInstruction = CFDXml.CreateElement("detallista:specialInstruction")
    specialInstruction.SetAttribute("code","ZZZ")
    dete = CFDXml.CreateElement("detallista:text")
    letras = CFDXml.CreateTextNode(ALLTRIM(gral.aatxttotal))
    dete.AppendChild(letras)
   
    specialInstruction.AppendChild(dete)
             shemdeta.AppendChild(specialInstruction)                   
ENDIF
&&indentificacion de orden de compra
IF LEN(this.qtarchrinval(this.qtarchrinval(Gral.aaodc)))>0
    orderIdentification = CFDXml.CreateElement("detallista:orderIdentification") &&abre elemento

&&abre elemento de orden de compra
    referenceIdentification = CFDXml.CreateElement("detallista:referenceIdentification")
    referenceIdentification.setAttribute("type","ON")
    refoc=cfdxml.CreateTextNode(this.qtarchrinval(Gral.aaodc))
    referenceIdentification.AppendChild(refoc)   
ENDIF

&&fecha de orden de compra
IF LEN(this.qtarchrinval(Gral.aafoc))>0
    ReferenceDate = CFDXml.CreateElement("detallista:ReferenceDate")
    feoc=cfdxml.CreateTextNode(this.qtarchrinval(Gral.aafoc))
    ReferenceDate.AppendChild(feoc)
   
    orderIdentification.AppendChild(referenceIdentification)
    orderIdentification.AppendChild(ReferenceDate)
    shemdeta.AppendChild(orderIdentification)
ENDIF
&&numero de aprobacion serie de factura electronica
IF LEN(this.qtarchrinval(Gral.noAprobaci))>0
    AdditionalInformation = CFDXml.CreateElement("detallista:AdditionalInformation") &&abre elemento
    referenceIdentification = CFDXml.CreateElement("detallista:referenceIdentification")
    referenceIdentification.setAttribute("type","ATZ")
    adap=cfdxml.CreateTextNode(this.qtarchrinval(Gral.noAprobaci))

    referenceIdentification.AppendChild(adap)
    AdditionalInformation.AppendChild(referenceIdentification)
    shemdeta.AppendChild(AdditionalInformation)
ENDIF   
&&numero de contra recibo
IF LEN(this.qtarchrinval(Gral.aacontra))>0
    DeliveryNote = CFDXml.CreateElement("detallista:DeliveryNote") &&abre elemento
    referenceIdentification = CFDXml.CreateElement("detallista:referenceIdentification")
    contrar=CFDXml.CreateTextNode(this.qtarchrinval(Gral.aacontra))
    referenceIdentification.AppendChild(contrar)
ENDIF
&&fecha del contrarecibo
IF LEN(this.qtarchrinval(Gral.aafecon))>0
    rd2= CFDXml.CreateElement("detallista:ReferenceDate")
    rd2_a=CFDXml.CreateTextNode(this.qtarchrinval(Gral.aafecon))
    rd2.AppendChild(rd2_a)
   
    DeliveryNote.AppendChild(referenceIdentification)
    DeliveryNote.AppendChild(rd2)
    shemdeta.AppendChild(DeliveryNote)
ENDIF
&&&&numero gln del comprador
IF LEN(this.qtarchrinval(Gral.aadepa))>0
    buyer = CFDXml.CreateElement("detallista:buyer") &&abre elemento
    gln = CFDXml.CreateElement("detallista:gln")
    ggln = CFDXml.CreateTextNode(Gral.rean)
    gln.AppendChild(ggln)
   
    contactInformation = CFDXml.CreateElement("detallista:contactInformation")
    personOrDepartmentName = CFDXml.CreateElement("detallista:personOrDepartmentName")
    depatext= CFDXml.CreateElement("detallista:text")
    depax= CFDXml.CreateTextNode(this.qtarchrinval(ALLTRIM(Gral.aadepa)))
    depatext.AppendChild(depax)
    personOrDepartmentName.AppendChild(depatext)
    contactInformation.AppendChild(personOrDepartmentName)

    buyer.AppendChild(gln)
    buyer.AppendChild(contactInformation)
    shemdeta.AppendChild(buyer)
ENDIF
               
&&datos de identificacion del proveedor gln y numero de proveedor
IF LEN(this.qtarchrinval(Gral.eean))>0
    seller = CFDXml.CreateElement("detallista:seller") &&abre elemento
    d_gln = CFDXml.CreateElement("detallista:gln")
    d_ggln = CFDXml.CreateTextNode(this.qtarchrinval(Gral.eean))
    d_gln.AppendChild(d_ggln)
ENDIF

IF LEN(this.qtarchrinval(Gral.aaprove))>0
    alternatePartyIdentification = CFDXml.CreateElement("detallista:alternatePartyIdentification")
    alternatePartyIdentification.setAttribute("type","SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY")
    noprox=CFDXml.CreateTextNode(this.qtarchrinval(Gral.aaprove))
    alternatePartyIdentification.AppendChild(noprox)
   
    seller.AppendChild(d_gln)
    seller.AppendChild(alternatePartyIdentification)
    shemdeta.AppendChild(seller)
ENDIF

    &&atributo que especifica si tiene un cargo o descuento opcional
    allowanceCharge = CFDXml.CreateElement("detallista:allowanceCharge")
    allowanceCharge.setAttribute("allowanceChargeType","ALLOWANCE_GLOBAL")
    allowanceCharge.setAttribute("settlementType","OFF_INVOICE")

    &&atributo specialServicesType   
    specialServicesType = CFDXml.CreateElement("detallista:specialServicesType")
    No_u=CFDXml.CreateTextNode("AJ")
    specialServicesType.AppendChild(No_u)
    allowanceCharge.AppendChild(specialServicesType)

               
    &&se abre monetaryAmountOrPercentage
    monetaryAmountOrPercentage = CFDXml.CreateElement("detallista:monetaryAmountOrPercentage")
    rate = CFDXml.CreateElement("detallista:rate")
    rate.setAttribute("base","INVOICE_VALUE")
    monetaryAmountOrPercentage.AppendChild(rate)

    porcedes = CFDXml.CreateElement("detallista:percentage")
    porcedes_v=CFDXml.CreateTextNode("0.00")
    porcedes.AppendChild(porcedes_v)

    rate.AppendChild(porcedes)
    monetaryAmountOrPercentage.AppendChild(rate)       
    allowanceCharge.AppendChild(monetaryAmountOrPercentage)
    shemdeta.AppendChild(allowanceCharge)


    &&ciclo de detalle de factura
    SELECT Cnspts
    GO TOP
    DO WHILE !EOF()
        IF LEN(this.qtarchrinval(Cnspts.regg))>0
            lineItem = CFDXml.CreateElement("detallista:lineItem")
            lineItem.setAttribute("type","SimpleInvoiceLineItemType")
            lineItem.setAttribute("number",this.qtarchrinval(Cnspts.regg))
        ENDIF
       
    &&sku o ean
        IF LEN(this.qtarchrinval(Cnspts.noId))>0
            tradeItemIdentification = CFDXml.CreateElement("detallista:tradeItemIdentification")
            gtin = CFDXml.CreateElement("detallista:gtin")
            itsku = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.noId))
            gtin.AppendChild(itsku)
            tradeItemIdentification.AppendChild(gtin)
            lineItem.AppendChild(tradeItemIdentification)
        ENDIF   
       
    &&codigo alterno asignado
        IF LEN(this.qtarchrinval(Cnspts.noId))>0
            alternateTradeItemIdentification = CFDXml.CreateElement("detallista:alternateTradeItemIdentification")
            alternateTradeItemIdentification.setAttribute("type","SUPPLIER_ASSIGNED")
            itsku_d = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.noId))
            alternateTradeItemIdentification.AppendChild(itsku_d)
            lineItem.AppendChild(alternateTradeItemIdentification)
        ENDIF
       
    &&idioma y descripcion de la partida
        tradeItemDescriptionInformation = CFDXml.CreateElement("detallista:tradeItemDescriptionInformation")
        tradeItemDescriptionInformation.setAttribute("language","ES")
   
    &&descripcion
        IF LEN(this.qtarchrinval(Cnspts.ddescripci))>0
            longText = CFDXml.CreateElement("detallista:longText")
            descrip = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.ddescripci))
            longText.AppendChild(descrip)
            tradeItemDescriptionInformation.AppendChild(longText)
            lineItem.AppendChild(tradeItemDescriptionInformation)
        ENDIF
       
    &&cantidad de la partida
        IF LEN(this.qtarchrinval(Cnspts.cantidad))>0
            invoicedQuantity = CFDXml.CreateElement("detallista:invoicedQuantity")
            invoicedQuantity.setAttribute("unitOfMeasure","PCE")
            num = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.cantidad))
            invoicedQuantity.AppendChild(num)
            lineItem.AppendChild(invoicedQuantity)
        ENDIF
                           
    &&precio de la partida
        IF LEN(this.qtarchrinval(Cnspts.valorUnita))>0
            grossPrice = CFDXml.CreateElement("detallista:grossPrice")
            Amount = CFDXml.CreateElement("detallista:Amount")
            precio_u = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.valorUnita))
            Amount.AppendChild(precio_u)
            grossPrice.AppendChild(Amount)
            lineItem.AppendChild(grossPrice)
        ENDIF                   
   
    &&precio neto de la partida
        IF LEN(this.qtarchrinval(Cnspts.valorUnita))>0
            netPrice = CFDXml.CreateElement("detallista:netPrice")
            Amount_D = CFDXml.CreateElement("detallista:Amount")
            precio_D = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.valorUnita))
            Amount_D.AppendChild(precio_D)
            netPrice.AppendChild(Amount_D)
            lineItem.AppendChild(netPrice)
        ENDIF
   
    &&precio total de la partida
        IF LEN(this.qtarchrinval(Cnspts.valorUnita))>0
            totalLineAmount = CFDXml.CreateElement("detallista:totalLineAmount")
            Amount_T = CFDXml.CreateElement("detallista:grossAmount")
            precio_T = CFDXml.CreateElement("detallista:Amount")
            precio_T_ch = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.valorUnita))
            precio_T.AppendChild(precio_T_ch)
            Amount_T.AppendChild(precio_T)
        ENDIF               
    &&importe de la partida
        IF LEN(this.qtarchrinval(Cnspts.importe))>0
            netAmount= CFDXml.CreateElement("detallista:netAmount")
            Amount_c = CFDXml.CreateElement("detallista:Amount")
            precio_c = CFDXml.CreateTextNode(this.qtarchrinval(Cnspts.importe))
            Amount_c.AppendChild(precio_c)
            netAmount.AppendChild(Amount_c)
           
            totalLineAmount.AppendChild(Amount_T)
            totalLineAmount.AppendChild(netAmount)
        ENDIF
        lineItem.AppendChild(totalLineAmount)
   
    &&el resumen se agrega al complemento detallista
        shemdeta.AppendChild(lineItem)
   
    SELECT Cnspts
    SKIP
ENDDO


&&suma de importes de las partidas
    totalAmount = CFDXml.CreateElement("detallista:totalAmount")
    Amount_t = CFDXml.CreateElement("detallista:Amount")
    precio_t = CFDXml.CreateTextNode(this.qtarchrinval(Gral.subtotal)) &&&&&&&&&&&&&&&&&&&&&&&&&&&
    Amount_t.AppendChild(precio_t)
    totalAmount.AppendChild(Amount_t)
    lineItem.AppendChild(totalAmount)

&&el resumen se agrega al complemento detallista
    shemdeta.AppendChild(totalAmount)


&&resumen final complemento detallista
    TotalAllowanceCharge = CFDXml.CreateElement("detallista:TotalAllowanceCharge")
    TotalAllowanceCharge.SetAttribute("allowanceOrChargeType","ALLOWANCE")
   
    specialServicesType_s = CFDXml.CreateElement("detallista:specialServicesType")
    AA = CFDXml.CreateTextNode("AA")
    specialServicesType_s.AppendChild(AA)
   
    CCFi_u = CFDXml.CreateElement("detallista:Amount")
    CCFi = CFDXml.CreateTextNode("0.0")
    CCFi_u.AppendChild(CCFi)
   
    TotalAllowanceCharge.AppendChild(specialServicesType_s)
    TotalAllowanceCharge.AppendChild(CCFi_u)

&&nodo final se agrega a complemento detallista
shemdeta.AppendChild(TotalAllowanceCharge)


             &&nodo encabezado se agrega a complemento
             nComplemento.AppendChild(shemdeta)   
            
nComprobante.AppendChild(nComplemento)































Arturo Ramos

unread,
Nov 3, 2011, 3:52:01 PM11/3/11
to vfp-factura-ele...@googlegroups.com
Gracias Cesar,

Lo que necesito es un XML con addenda de PEMEX, de hecho, amigo Cesar, foro... necesitamos XMLs con addendas para integrar a la clase CFD del foro, Victor Espina está haciendo la base para integrar las funciones para agregar addendas pero se necesitan ejemplos de XMLs con addendas válidas para definir las necesidades de las mismas.

Gracias por su apoyo.

Saludos.

Baltazar Moreno

unread,
Nov 3, 2011, 5:48:24 PM11/3/11
to vfp-factura-ele...@googlegroups.com
Yo creo que lo mejor sería hacer una Rutina configurable.. para que cada quien haga la addenda que requiera.

Yo tengo varias addendas desarrolladas, cada una me tuve que leer y entender documentos de hasta más de 100 hojas, lo cual se me hace injusto poner aquí el resultado de ese análisis...

En nuestra solución, tenemos siempre 3 archivos por addenda 100% configurables.. encabezado, detalle y pie.. donde con el bloc de notas puedes editarlos y especificar la estructura de la addenda que requiera el cliente (es variable).

Creo que deben saber que la addenda, por ejemplo de Chedraui.. te pide unos datos si le vendes muebles a si le vendes leche.. por que unos conceptos tienen fechas de caducidad y cosas por el estilo.

No creo que sea buena idea.. estar creando código para cada addenda que salga.. porque van a salir infinidad de ellas.. Recomiendo que sea así pero solo para los Complementos, como el detallista, Estado de cuenta bancario, escuelas privadas, impuestos locales, etc. que esos NO cambian y la estructura la regula el SAT.

Si quieren puedo publicar documentos de algunas addendas, pero el resultado del análisis no. Disculpen mi terquedad, pero "un pedazo de cerebro es un pedazo de cerebro".

Saludos!

--
Baltazar Moreno
VFP9SP2 - Win7
Guadalajara, Jalisco, México

Arturo Ramos

unread,
Nov 3, 2011, 7:38:37 PM11/3/11
to vfp-factura-ele...@googlegroups.com
Hola Baltazar,

El esquema propuesto por Victor Espina, autor de la clase y quien definió la estructura de su funcionamiento es lo que yo considero la mejor manera de hacerlo; esto es lo que Victor propuso el 8 de Octubre:

--- De Victor Espina:
Yo sugeriria un esquema mas ordenado.

1. Se deberia crear una interfaz o clase abstracta que represente a una addenda cualquiera, digamos CFDAddenda.  Esta clase solo contendria un metodo cuya funcion seria la de devolver el XML completo de la adenda en forma de una cadena. Llamemos a ese metodo, recordando a .NET, ToString().

2. Cada addenda especifica se deberia representar como una clase que herede de CFDAddenda y que se almacene en un PRG externo al PRG principal de la libreria CFD Esto permitira a terceros crear addendas especificas y distribuirlas sin necesidad de modificar la libreria principal. Por ejemplo, para la addenda de Pemex se crearia un archivo PRG llamado CFDPEMEX.PRG que contendria el codigo:

DEFINE CLASS CFDPemexAddenda AS CFDAddenda
ENDDEFINE

Esta clase deberia contener las propiedades necesarias para definir la addenda de Pemex y tener una implementacion del metodo ToString() que devuelva el XML especifico de esa addenda con los datos indicados en las propiedades. De esta forma, el usuario final haria algo asi:

SET PROCEDURE TO CFDPemex ADDITIVE
oAddenda = CREATEOBJECT("CFDPemexAddenda")
oAddenda.Prop1 = valor1
oAddenda.Prop2 = valor2
...
oAddenda.PropN = valorN


3. La clase CFD deberia contener un metodo llamado addAddenda() el cual reciba como parametro una instancia de una clase derivada de CFDAddenda, y este metodo se deberia encargar de invocar el metodo ToString() del objeto recibido e incluir el resultado dentro del XML del certificado.  

Si todo lo que hara el metodo es invocar a ToString(), porque no pasarle directamente el XML en lugar de la instancia de la clase?  Por que eso nos daria la posibilidad de ampliar la interfaz base de CFDAddenda en el futuro si fuese necesario, y estas modificaciones a la clase serian manejadas directamente dentro del metodo addAddenda() de CFD, sin afectar la firma del metodo y por tanto sin requerir cambios a nivel del codigo del usuario.


Se que es mas laborioso, pero me parece un mejor esquema que permite la creacion de nuevas addendas sin requerir la modificacion constante de la libreria para incluir ess nuevas addendas.

Saludos

Victor Espina
---  Referencia: https://groups.google.com/forum/#!topic/vfp-factura-electronica-mexico/RCknmcqGBCk

Ya quedamos en hacerlo de esta manera, incluso Victor ya trabajo sobre esto, lo puedes ver en el repositorio del código.

Entiendo tu postura y la respeto, sinceramente espero que no todos piensen igual =( ... sabes que aprecio muchos tus aportaciones al foro, eres preciso, constante y participas en todo lo que se pregunta o discute; siempre tienes información devidamente documentada y sustentada, muchas gracias por eso; estoy seguro que más de uno aquí también lo agradece.

Yo estoy en lo de CFD desde apenas hace un año (unos días antes de la reunion de ZorrosMexicanos en la Cd. de México). Hice desde mis aplicaciones el primer CFD real a mediados de Diciembre 2010, estoy haciendo CFDI reales desde hace algunos meses, de todos mis clientes ninguno ha necesitado una addenda pero sé que tarde o temprano se van a necesitar.

La propuesta no es hacer cientos de addendas, como dices, sería un cuento de no terminar; No, la idea es definir desde la clase la forma como crear y procesas una addenda; Victor se propuso para hacer esto y seleccionamos la addenda de PEMEX que sabemos que lo que esta requiere es una cadena de 10 valores separados por pipes; un ejemplo simple de cómo hacerla y procesarla en la clase con la intención de dejar definida la forma cómo se deben hacer otras; Así se puede ir recolectando otras addendas, todas las addendas que sean posibles como extensiones de la clase.

Si se requiere una addenda que no se ha desarrollado, la puedes desarrollar bajo ese esquema para la clase, la pueda compartir con el foro o integrarla directamente para que este disponible para los que la puedan llegar a necesitar.

Ahora, lo que pido, si quieren y pueden compartir las addendas que ya tienen para que una vez que Victor tenga el 'modelo' de addenda yo las pueda ir integrando a la clase, claro, poco a poco pues entiendo lo que tu dices, hay que entenderlas, estudiarlas, etc, etc. y eso requiere un trabajo y tiempo. Estoy seguro que entre todos podemos dejar las addendas más comunes listas y funcionales para la clase en poco tiempo.

Si puedes compartir esos documentos estaría genial, se que si después de estudiarlos tengo alguna duda te puedo preguntar y estarás dispuesto a ayudar como siempre; tu experiencia en addendas y tu idea en complementos son bien recibidos también.

Bien, perdón por el rollo, que opinas Baltazar, foro ?

Baltazar Moreno

unread,
Nov 4, 2011, 11:58:52 AM11/4/11
to vfp-factura-ele...@googlegroups.com
La verdad, no había leído lo que expuso Victor.. ni he actualizado el código, por lo que tengo tarea pendiente.

Yo estoy en ésto de Factura Electrónica desde  2006, por lo que he pasado desde la CFD v1, CFD v2 y ahora CFDI con todas las variantes que han surgido. Y uno de los puntos que más dolor de cabeza dan son éstas benditas addendas, porque el Receptor crea la estructura que se le ocurre y luego cuando menos lo esperas, saca una "versión nueva" que tienes que actualizar de inmediato o si no.. no te pagan! (al emisor por supuesto)

He sufrido, he batallado, en ésto de comprobantes fiscales, pero también he aprendido mucho! y eso es lo que más me da satisfacción, mi SW http://disxii.com comenzó como un proyecto de Tesis de Maestría (Que no he redactado aún :(  ) y ha crecido bastante! desde lo que diseñe en un principio a lo que es actualmente y espero siga creciendo.

Volviendo al tema... Tengo la información.. no sé si sea la actual porque insisto el receptor saca versiones nuevas cada que se le ocurre, pero pues podría tomarse de base. Puedo subir la info a algún lado y tal vez con algún ejemplo de addenda.

Las que recuerdo que tengo desarrolladas por ahí son las addendas de:

Chrysler,Comercial Mexicana,Elektra,FEMSA,Soriana,Walmart,AMECE,Chedraui,Coppel,Corvi,Farmacias Guadalajara,HEB,MABE,Mapfre,Oxxo,Sanborns, Tiendas Garces, y alguna más que no recuerdo.

Complementos: Detallista e Impuestos Locales

El complemento detallista es usado entre otros por Chedraui, liverpool y no me acuerdo quien más. (Chedraui tiene la recepcion del complemento detallista y de una addenda horrible por cierto)

Lo importante en las addendas es darle la información que requiere y como la requiere el receptor. Luego te piden cosas extrañas, pero eso lo verán caso a caso

¿Dónde subo los documentos? ¿Tienen algun lugar como una página de Google SITES?

Insisto en los complementos, cuando se utilizan, terminan modificando la Cadena Original y el sello digital, por lo que creo que es importante estructurarlo correctamente.

Disculpen mi terquedad, pero como es algo que cobramos en cada implementación, sería injusto para mis clientes que acá regale esto, espero lo comprendan.

Victor Espina

unread,
Nov 5, 2011, 2:19:27 PM11/5/11
to vfp-factura-ele...@googlegroups.com
Ok, lo que necesitaria realmente no es COMO generar el complemento sino el XML del CFD COMPLETO, incluyendo el complemento. Esto es porque la CFDAddenda no genera especificamente el contenido del complemento; eso lo debera hacer la subclase especifica, digamos CFDAddendaPemex, en si metodo ToString(). Lo que si hara la clase es, una vez obtenido el XML especifico de la addenda, lo insertara en el CFD original de la forma adecuada.

De esta forma, las personas podran concentrarse en la ADDENDA y no en como INSERTAR la addenda en el XML.

Saludos

Victor Espina

Baltazar Moreno

unread,
Nov 7, 2011, 10:39:42 AM11/7/11
to vfp-factura-ele...@googlegroups.com
Ok.. ahí les van unos ejemplos.. no todos son correctos, puesto que lo que yo tengo son pruebas, ojalá les sirva para darse una idea.

Saludos y quedo a sus órdenes.
ComplementoDetallista.xml
Coppel.xml
Soriana.xml
WalMart.xml
Elektra.xml
ALSUPER.xml

Arturo Ramos

unread,
Nov 7, 2011, 11:14:34 AM11/7/11
to vfp-factura-ele...@googlegroups.com
Gracias Baltazar si sirven...

Una pregunta, dices que no son correctos, te refieres a que no son válidos pero estan correctamente armado o cómo ?

Baltazar Moreno

unread,
Nov 7, 2011, 11:18:40 AM11/7/11
to vfp-factura-ele...@googlegroups.com
La estructura es válida, pero tal vez faltan datos y los datos de emisor.. son ficticios..  la verdad, los tomé al azar.. Por lo que no estoy seguro si están bien o no, pero seguro les pueden dar una idea de los tipos de addendas que hay que generar.

Saludos!

Victor Espina

unread,
Nov 7, 2011, 2:09:20 PM11/7/11
to vfp-factura-ele...@googlegroups.com
A ver.

Lo que pude sacar en claro de todos los ejemplos que enviaste, es que hay basicamente tres (3) formas de incluir data particular en un CFD:

a) Usando el nodo Documento, el cual basicamente puede contener un string con cualquier data que se requiera, caso Wallmart.

b) Usando el nodo Addenda o Complemento sin un XLST asociado, en cuyo caso los subnodos dentro de Addenda o Complemento no llevan un NameSpace y el contenido no es validado por el SAT. Ejemplo: Coppel, Soriana.

c) Usando el nodo Addenda o Complemento con un XLST asociado. En este caso, los subnodos de Addenda o Complemento deben ir identificados con un NameSpace el cual se debe definir o bien en el nodo Comprobante o bien en el primer subnodo de Addenda o Complemento. Ejemplo: Elektra, Detallista, ALSuper.

Por favor, confirmen estas conclusiones para entonces proceder a hacer los cambios que faltan en la nueva clase CFDAddenda.

Saludos

Victor Espina

Baltazar Moreno

unread,
Nov 7, 2011, 2:49:50 PM11/7/11
to vfp-factura-ele...@googlegroups.com
Ups.. ese nodo documento, debe estar dentro de addenda.. ese xml no es válido, perdón.

sobre b) y c)  Es correcto... el a) queda incluido dentro del b)

Pero ojo.. en la addenda de WM, la addenda es el contenido del elemento Documento. en él está el encabezado, detalle y pie.. por lo que no es un dato "normal"

Otra cosa, a que te refieres con XSLT ¿al namespace? Hay que tener cuidado, porque el complemento, re-genera la cadena original y por ende el sello digital. Diferente a las addendas, donde no se modifica nada de lo anterior.

Saludos!
--

Victor Espina

unread,
Nov 8, 2011, 7:29:18 AM11/8/11
to vfp-factura-ele...@googlegroups.com
Ok. Todo esto es para determinar que cosas debe hacer la clase CFDAddenda y cuales no. Hasta ahora, la cosa quedaria asi:

a) La clase CFDAddenda tendria propiedades que permitirian indicar si se desea generar un nodo Addenda o Complemento, el NameSpace y url del XSLT (opcional) y un boolean que indicaria si el namespace se define en el elemento Comprobante o no.

b) Un metodo ToString() que devolveria el texto que iria dentro del nodo Addenda o Complemento. Este metodo estaria vacio en la clase CFDAddenda, y la idea es que sea implementado en la subclase particular para cada tipo de Addenda, por ejemplo CFDAddendaPemex.  A su vez, cada sub clase especifica podria definir nuevas propiedades y metodos que sean necesarios para la generacion del contenido de la addenda o complemento.


Con esto, modificaria la rutina que genera el CFD para que en el caso de que existiera una addenda definida, se invocara su metodo ToString() para obtener el contenido de dicha addenda, y usar las propiedades base de CFDAddenda para determinar la forma correcta de insertar la addenda en el CFD.

Si estan de acuerdo, empezaria con los cambios tan pronto me sea posible. Sin embargo, necesitare que alguien se encargue de implementar una addenda especifica con esta clase, para ver que todo funcione bien.

Saludos

Victor Espina

Arturo Ramos

unread,
Nov 8, 2011, 11:50:02 AM11/8/11
to vfp-factura-ele...@googlegroups.com
Ok Victor,

En cuanto lo tengas le meto la de PEMEX a ver que tal nos va.

Gracias por tu apoyo.

Baltazar Moreno

unread,
Nov 8, 2011, 2:47:00 PM11/8/11
to vfp-factura-ele...@googlegroups.com
No han comentado del re-sellado cuando es complemento, si lo estan previendo?

Saludos!!

El 08/11/11, Victor Espina <vesp...@gmail.com> escribió:

> --
> Has recibido este mensaje porque estás suscrito al grupo
> "vfp-factura-electronica-mexico" de Grupos de Google.
> Para ver este debate en la Web, visita

> https://groups.google.com/d/msg/vfp-factura-electronica-mexico/-/OKUUCfnDrb8J.


> Para publicar una entrada en este grupo, envía un correo electrónico a
> vfp-factura-ele...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> vfp-factura-electroni...@googlegroups.com
> Para tener acceso a más opciones, visita el grupo en
> http://groups.google.com/group/vfp-factura-electronica-mexico?hl=es.
>
>

--
Enviado desde mi dispositivo móvil

Baltazar Moreno

Reply all
Reply to author
Forward
0 new messages