hola que tal, nuevamente gracias por responder, creo que ya se en donde podría estar mi error, lo que pasa es que mi sistema trabaja de manera distinta (tal vez ahi es donde esta el error) tu primero generas el archivo xml. y en base a ese generas tu cadena original, yo lo hago de manera contrario, genero mi cadena original, y después genero mi xml. Tal vez ahi es donde este mi problema, yo genero mi cadena original con los datos que tengo en mi windowsform, (PROGRAMO EN VB.NET) y lo voy concatenando, y despues genero mi xml con mis datos que también están en mi windows form, mira, te pongo la parte de mi codigo donde hago mi cadena original, y tambien te pongo mi codigo donde hago mi archivo xml.
'GENERAMOS LAS CADENA ORIGINAL CON ALGUNAS VARIABLES
'VOY A DECLARAR VARIABLES Y YA DESPUES LAS CONCATENO
'DECLARAMOS LAS VARABLES DEL ENCABEZADO
Dim version As String
Dim horafecha As String
Dim horafecha_2 As String
Dim tipo_transaccion As String
Dim forma_de_pago As String
Dim nombre_transaccion As String
Dim subtotal As String
Dim retenciones As String
Dim total As String
'DESPUES SIGUEN LOS DATOS DEL EMISOR PERO ESOS YA LOS TENEMOS EN LA BASE DE DATOS
'PERO A FUERZA NECESITAMOS CONCATENARLAS, ENTONCES LAS ASIGNAMOS A UNAS VARIABLES DE RESPALDO
Dim rfcER As String
Dim nombreER As String
Dim calleER As String
Dim noextER As String
Dim nointER As String
Dim coloniaER As String
Dim localidadER As String
Dim municipioER As String
Dim estadoER As String
Dim cpER As String
Dim paisER As String = "MÉXICO"
'AHORA LAS DEL RECEPTOR
Dim rfcR As String
Dim nombreR As String
Dim calleR As String
Dim noextR As String
Dim nointR As String
Dim coloniaR As String
Dim localidadR As String
Dim municipioR As String
Dim estadoR As String
Dim cpR As String
Dim paisr As String
'AHORA LOS DATOS DE LOS CONCEPTOS
Dim cantidad As String
Dim tipo As String
Dim descripcion As String
Dim precio_unitario As String
Dim total_prod As String
'AHORA LOS TRASLADOS
Dim concepto As String
Dim tasa As String
Dim total_impuesto As String
'YA TENIENDO TODOS LOS DATOS, AHORA PROCEDEMOS A GENERAR LA CADENA
'PRIMERO, LAS VARIABLES ESAS LES DAMOS VALOR (A LAS QUE LES HAGA FALTA)
Dim año As String = ""
Dim mes As String = ""
Dim dia As String = ""
Dim hora As String = ""
Dim minuto As String = ""
Dim segundo As String = ""
año = Format(Date.Now.Year, "00")
mes = Format(Date.Now.Month, "00")
dia = Format(Date.Now.Day, "00")
hora = Format(Date.Now.Hour, "00")
minuto = Format(Date.Now.Minute, "00")
segundo = Format(Date.Now.Second, "00")
horafecha_2 = año & "-" & mes & "-" & dia & "T" & hora & ":" & minuto & ":" & segundo
version = "|3.0"
horafecha = "|" & horafecha_2
tipo_transaccion = "|ingreso"
forma_de_pago = "|" & Me.ComboBox3.Text
If Me.CheckBox2.Checked = True Then
nombre_transaccion = "|Parcialidades"
Else
nombre_transaccion = "|Pago en una sola exhibición"
End If
subtotal = "|" & Format(CDbl(Me.txtsubtotal.Text), "0.0000")
Dim moneeeda As String
moneeeda = "|MXN"
retenciones = "|0.0000"
total = "|" & Format(CDbl(Me.txttotal.Text), "0.0000")
'LO CONCATENAMOS TODA ESTA PRIMERA PARTE EN UNA SOLA CADENA
Dim cadena_original_encabezado As String
cadena_original_encabezado = "|" & version & horafecha & tipo_transaccion & nombre_transaccion & subtotal & moneeeda & total
'HASTA AQUI YA TENEMOS EL ENCABEZADO LISTO PARA CONCATENAR
'AHORA GENERAMOS EL EMISIOR
rfcER = "|" & rfcE
nombreER = "|" & nombreE
calleER = "|" & calleE
noextER = "|" & noextE
coloniaER = "|" & coloniaE
municipioER = "|" & muicipioE
estadoER = "|" & estadoE
paisER = "|" & paisER
cpER = "|" & cpE
'GUARDAMOS TODO EN UNA SOLA CADENA
Dim cadena_original_emisior As String
cadena_original_emisior = rfcER & nombreER & calleER & noextER & nointER & coloniaER & localidadER & municipioER & estadoER & paisER & cpER & estadoER & paisER
'LISTO, AHORA EL RECEPTOR
rfcR = "|" & Me.txtRFC.Text
nombreR = "|" & Me.ComboBox2.Text
calleR = "|" & Me.txtDireccion.Text
noextR = "|" & Me.txtNumExt.Text
nointR = "|" & Me.txtnumInt.Text
coloniaR = "|" & Me.txtcolonia.Text
localidadR = "|" & Me.txtxLocalidad.Text
municipioR = "|" & Me.txtMunicipio.Text
estadoR = "|" & Me.txtLugar.Text
paisr = "|" & pais
cpR = "|" & Me.txtCP.Text
'LO GUARDAMOS EN UNA CADENA LO DEL RECEPTOR
Dim cadena_original_receptor As String
cadena_original_receptor = rfcR & nombreR & calleR & noextR & nointR & coloniaR & localidadR & municipioR & estadoR & paisr & cpR
'AHORA SOLO RESTAN LOS PRODUCTOS
Dim cadena_prod As String = ""
Dim zzzzZZZZ As Integer
For zzzzZZZZ = 0 To Me.GridVentas.RowCount - 1 Step 1
cantidad = "|" & Format(CDbl(Me.GridVentas.Item(3, zzzzZZZZ).Value), "0.0000")
tipo = "|" & Me.GridVentas.Item(4, zzzzZZZZ).Value
descripcion = "|" & Me.GridVentas.Item(1, zzzzZZZZ).Value
precio_unitario = "|" & Format(CDbl(Me.GridVentas.Item(5, zzzzZZZZ).Value), "0.0000")
total_prod = "|" & Format(CDbl(Me.GridVentas.Item(6, zzzzZZZZ).Value), "0.0000")
cadena_prod = cadena_prod & cantidad & descripcion & precio_unitario & total_prod
Next
'AHORA LO DE EL IMPUESTO, ESE ESTA FACILITO
concepto = "|IVA"
Dim tasaiva As Double
tasaiva = CDbl(ini.IniGet(s.App_Path() & "Config.ini", "IVA", "Clave1", ""))
tasaiva = tasaiva * 100
tasa = "|" & Format(tasaiva, "0.0000")
total_impuesto = "|" & Format(CDbl(Me.txtIVa.Text), "0.0000")
'LO CONCATENAMOS EN UNA SOLA CADENA DE IMPUESTOS
Dim cadena_original_impuesto As String
cadena_original_impuesto = concepto & tasa & total_impuesto & total_impuesto
'FIN TERMINAMOS TODO LO DE LOS DATOS NECESARIOS PARA LA CADENA ORIGINAL
'AHORA YA SOLO SE CONCATENA
cadena_original = cadena_original_encabezado & cadena_original_emisior & cadena_original_receptor & cadena_prod & cadena_original_impuesto & "||"
'QUITAMOS TODO LO QUE TENGA DOBLE ESPACIO: " " (doble espacio)
cadena_original = Replace(cadena_original, " ", " ")
'A continuacion guardaremos la cadena en un archivo con su formato UTF-8 como lo pide SAT -------------------------------------
System.IO.File.WriteAllText(s.App_Path() & "cadena.txt", cadena_original, System.Text.Encoding.UTF8)
'A continuacion GENERO EL XML.
Dim rz As String
rz = ini.IniGet(s.App_Path() & "Config.ini", "E-FACT", "Ruta", "")
Dim rut As String
If rz.Chars(rz.Length - 1) = "\" Then
rut = rz & "MiXML_Timbrado" & Me.txtFolio.Text & ".xml"
Else
rut = rz & "\MiXML_Timbrado" & Me.txtFolio.Text & ".xml"
End If
'ARMAMOS EL EQUIS EME ELE
Dim W As XmlTextWriter = New XmlTextWriter(rut, System.Text.Encoding.UTF8)
Dim xmldoc As New XmlDocument
W.Formatting = System.Xml.Formatting.Indented
Dim xmlString As String
W.WriteStartDocument()
W.WriteStartElement("cfdi:Comprobante")
W.WriteStartAttribute("xsi:schemaLocation")
W.WriteValue("
http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd")
W.WriteEndAttribute()
W.WriteStartAttribute("xmlns:xsi")
W.WriteValue("
http://www.w3.org/2001/XMLSchema-instance")
W.WriteEndAttribute()
W.WriteStartAttribute("xmlns:cfdi")
W.WriteValue("
http://www.sat.gob.mx/cfd/3")
W.WriteEndAttribute()
W.WriteStartAttribute("version")
W.WriteValue("3.0")
W.WriteEndAttribute()
W.WriteStartAttribute("serie") ' opcional
W.WriteValue("E123456789")
W.WriteEndAttribute()
W.WriteStartAttribute("folio")
W.WriteValue(Me.txtFolio.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("fecha")
W.WriteValue(horafecha_2)
W.WriteEndAttribute()
W.WriteStartAttribute("sello")
W.WriteValue(b64)
W.WriteEndAttribute()
W.WriteStartAttribute("formaDePago")
'Aqui esta lo de el tipo de pago (ya sabes cabron lo del chetsbots)
W.WriteValue(Mid(nombre_transaccion, 2))
W.WriteEndAttribute()
W.WriteStartAttribute("noCertificado")
W.WriteValue(NoCertificadoR)
W.WriteEndAttribute()
W.WriteStartAttribute("certificado")
W.WriteValue(certificadoE)
W.WriteEndAttribute()
W.WriteStartAttribute("subTotal")
W.WriteValue(Format(CDbl(Me.txtsubtotal.Text), "0.0000"))
W.WriteEndAttribute()
W.WriteStartAttribute("Moneda")
W.WriteValue("MXN")
W.WriteEndAttribute()
W.WriteStartAttribute("total")
W.WriteValue(Format(CDbl(Me.txttotal.Text), "0.0000"))
W.WriteEndAttribute()
W.WriteStartAttribute("metodoDePago")
W.WriteValue(Me.ComboBox3.Text) 'DEL COMBO SELECCIONO LA TRANSACCION
W.WriteEndAttribute()
W.WriteStartAttribute("tipoDeComprobante")
W.WriteValue("ingreso") 'ingreso o egreso
W.WriteEndAttribute()
'nodo emisor......................................................
W.WriteStartElement("cfdi:Emisor")
W.WriteStartAttribute("rfc")
W.WriteValue(rfcE)
W.WriteEndAttribute()
W.WriteStartAttribute("nombre")
W.WriteValue(nombreE)
W.WriteEndAttribute()
'subnodo Direccion emisor
W.WriteStartElement("cfdi:DomicilioFiscal")
W.WriteStartAttribute("calle")
W.WriteValue(calleE)
W.WriteEndAttribute()
W.WriteStartAttribute("noExterior")
W.WriteValue(noextE)
W.WriteEndAttribute()
W.WriteStartAttribute("colonia")
W.WriteValue(coloniaE)
W.WriteEndAttribute()
W.WriteStartAttribute("municipio")
W.WriteValue(muicipioE)
W.WriteEndAttribute()
W.WriteStartAttribute("estado")
W.WriteValue(estadoE)
W.WriteEndAttribute()
W.WriteStartAttribute("pais")
W.WriteValue(Mid(paisER, 2))
W.WriteEndAttribute()
W.WriteStartAttribute("codigoPostal")
W.WriteValue(cpE)
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza direccion
'subnodo ExpedidoEn
W.WriteStartElement("cfdi:ExpedidoEn")
W.WriteStartAttribute("estado")
W.WriteValue(estadoE)
W.WriteEndAttribute()
W.WriteStartAttribute("pais")
W.WriteValue(Mid(paisER, 2))
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza expedido en
W.WriteEndElement() 'finaliza emisor
'nodo receptor....................................................
W.WriteStartElement("cfdi:Receptor")
W.WriteStartAttribute("rfc")
W.WriteValue(Me.txtRFC.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("nombre")
W.WriteValue(Me.ComboBox2.Text)
W.WriteEndAttribute()
'subnodo direccion receptor
W.WriteStartElement("cfdi:Domicilio")
W.WriteStartAttribute("calle")
W.WriteValue(Me.txtDireccion.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("noExterior")
W.WriteValue(Me.txtNumExt.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("noInterior")
W.WriteValue(Me.txtnumInt.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("colonia")
W.WriteValue(Me.txtcolonia.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("localidad")
W.WriteValue(Me.txtxLocalidad.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("municipio")
W.WriteValue(Me.txtMunicipio.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("estado")
W.WriteValue(Me.txtLugar.Text)
W.WriteEndAttribute()
W.WriteStartAttribute("pais")
W.WriteValue(pais)
W.WriteEndAttribute()
W.WriteStartAttribute("codigoPostal")
W.WriteValue(Me.txtCP.Text)
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza direccion receptor
W.WriteEndElement() 'finaliza receptor
'nodo CONCEPTOS....................................................
W.WriteStartElement("cfdi:Conceptos")
'Esto debe de ir en un Ciclo For o while...
'subNodo del la descripcion de los conceptos
For jj As Integer = 0 To Me.GridVentas.RowCount - 1
W.WriteStartElement("cfdi:Concepto")
W.WriteStartAttribute("cantidad") 'Cantidad
W.WriteValue(Format(CDbl(Me.GridVentas.Item(3, jj).Value), "0.0000"))
W.WriteEndAttribute()
W.WriteStartAttribute("descripcion") 'Descripcion
W.WriteValue(Me.GridVentas.Item(1, jj).Value)
W.WriteEndAttribute()
W.WriteStartAttribute("valorUnitario") 'ValorUnitario
W.WriteValue(Format(CDbl(Me.GridVentas.Item(5, jj).Value), "0.0000"))
W.WriteEndAttribute()
W.WriteStartAttribute("importe") 'importe
W.WriteValue(Format(CDbl(Me.GridVentas.Item(6, jj).Value), "0.0000"))
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza elemento conceptos este va antes de terminar el ciclo for o while
Next
W.WriteEndElement() 'finaliza elemento conceptos (padre) este va fuera del ciclo for o while
'nodo IMPUESTOS....................................................
W.WriteStartElement("cfdi:Impuestos")
W.WriteStartAttribute("totalImpuestosTrasladados") 'totalImpuestosTrasladados
W.WriteValue(Format(CDbl(Me.txtIVa.Text), "0.0000"))
W.WriteEndAttribute()
W.WriteStartElement("cfdi:Traslados") 'Nodo Traslados
W.WriteStartElement("cfdi:Traslado") 'Nodo Traslado
W.WriteStartAttribute("impuesto") 'totalImpuestosTrasladados
W.WriteValue("IVA")
W.WriteEndAttribute()
W.WriteStartAttribute("tasa") 'taza
W.WriteValue(Format(tasaiva, "0.0000"))
W.WriteEndAttribute()
W.WriteStartAttribute("importe") 'totalImpuestosTrasladados
W.WriteValue(Format(CDbl(Me.txtIVa.Text), "0.0000"))
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza elemento Transaldo
W.WriteEndElement() 'finaliza elemento Translados
W.WriteEndElement() 'finaliza elemento IMPUESTOS
'nodo COMPLEMENTO....................................................
W.WriteStartElement("cfdi:Complemento")
W.WriteEndElement() 'finaliza elemento comeplemento
W.WriteEndElement() 'finaliza comprobante
W.WriteEndDocument() 'finaliza documento
W.Flush()
W.Close()
entonces asi es como yo genero mis "cosas" mmm pero me gustaria saber como es que tu lo haces, me refiero a esa parte en la que utilizas el xslt. (la verdad es que esa parte no la comprendi) de antemano muchas muchas gracias..
NOTA: CON RESPECTO A LO DE s.App_Path() es un metodo que utilizo pero que bien traducido seria exactamente q eso
Public Function App_Path() As String
Return System.AppDomain.CurrentDomain.BaseDirectory()
End Function
esta funcion esta en una clase en la que estan todos mis metodos que utilizo