Foros del Web » Programación para mayores de 30 ;) » .NET »

Facturación electrónica 2011. Codigo vb.net 2008

Estas en el tema de Facturación electrónica 2011. Codigo vb.net 2008 en el foro de .NET en Foros del Web. ESTE ES MI PRIMER POST, ESPERO Q A ALGUIEN LE PUEDA SER DE UTILIDAD, PUESTO QUE YO BATALLE MUCHO MUCHO EN ESTO DE LA FACTURACION ...
  #1 (permalink)  
Antiguo 13/10/2011, 16:30
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Facturación electrónica 2011. Codigo vb.net 2008

ESTE ES MI PRIMER POST, ESPERO Q A ALGUIEN LE PUEDA SER DE UTILIDAD, PUESTO QUE YO BATALLE MUCHO MUCHO EN ESTO DE LA FACTURACION ELECTRONICA, Y SI, SI HAY MUCHO DE DONDE SACAR, PERO IO LO QUE QUERIA ERA UN EJEMPLO FUNCIONAL Y COMPLETO, LA VERDAD NO PUDE ENCONTRAR (TAL VEZ POR Q NO SE BUSCAR) ENTONCES PARA LOS QUE ESTAN EN LAS MISMAS QUE IO, ACA LES DEJO EL CODIGO COMPLETO QUE VA DESDE LA EMISION DE LOS SELLOS, EL NUMERO DE CERTIFICADO, ETC ETC HASTA LA GENERACION DEL XML FUNCIONAL, ESTA PROBADO EN LA PAGINA DE HACIENDA (SAT MEXICO)
[URL="https://www.consulta.sat.gob.mx/sicofi_web/moduloECFD_plus/ValidadorCFDI/Validador%20cfdi.html"]https://www.consulta.sat.gob.mx/sicofi_web/moduloECFD_plus/ValidadorCFDI/Validador%20cfdi.html[/URL]
COMENTEN EL CODIGO, Y SI TIENEN ALGUNA DUDA PUES ESTAMOS PARA APOYARLOS EN LO Q SE PUEDA, OBVIO ESTE CODIGO PUEDE SER MEJORADO EN MUCHO. LO QUE NECESITAN ES UN WINDOWS FORM, UN BOTON Y TENER INSTALADO EL OPENSSL (IO UTILIZE LA VERSION 0.9) Y ME FUNCIONA A LA PERFECCION. BUENO YA SIN MAS PREÁMBULOS EH AQUI EL CODIGO:





  #2 (permalink)  
Antiguo 13/10/2011, 16:34
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Imports System.IO
Imports OpenSSL.Crypto 'esto no lo he utilizado, pero creo q
Imports System
Imports System.Runtime.InteropServices
Imports System.Security.Cryptography
Imports System.Text
Imports System.Xml
Public Class Form1
Dim s As New metodo
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try

Dim horaFecha As String = ""
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 = año & "-" & mes & "-" & dia & "T" & hora & ":" & minuto & ":" & segundo
'creamos una cadena original
Dim cadenaoriginal As String = "||3.0|2011-10-13T12:09:19|ingreso|Pago en una sola exhibición|161.2100|MXN|187.0000|DEMO000002FEL|Dem o2 FEL SA de CV|Insurgentes|45|San Federico|Benito Juarez|DF|Mexico|51200|Insurgentes|45|FJS9405196IA |Razon Social Random|calle|122|3-X|San Simon|G.A.M|Tultitlan|Distrito Federal|Mexico|52100|1.0000|Cosa para vender|100.0000|100.0000|25.7900||"

'A continuacion guardaremos la cadena en un archivo con su formato UTF-8 como lo pide SAT
System.IO.File.WriteAllText("D:\cadena.txt", cadenaoriginal)

'Creamos el proceso para invocar al openssl
'CREAMOS EL SHA1
Dim process As New Process
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process.StartInfo.Arguments = "dgst -SHA1 d:\cadena.txt" 'le madamos solo un parametro. (el nombre del archivo .txt q contiene la cadena original)
process.StartInfo.WorkingDirectory = "C:\OpenSSL\bin" 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)
process.Start() 'iniciamos el proceso
Dim codificado As String 'creamos una varaible q almacenara el resultado encriptado
codificado = process.StandardOutput.ReadToEnd 'el resultado del parametro "dgst -SHA1 d:\cadena.txt" se almacena en esta variable
process.WaitForExit() 'le decimos q se espere el proceso
'ahora, al resultado lo pasamos en un ciclo for para quitarle la
'parte del sha1 y q solo nos quede el resultado
Dim codificado2 As String = ""
For i As Integer = 0 To codificado.Length - 1
If codificado.Chars(i) = "=" Then
codificado2 = Mid(codificado, i + 3) 'seleccionamos desde la psicion en la q se quedo hasta al final de la cadena y eso se lo pasamos a codigificado2
End If
Next
System.IO.File.WriteAllText("D:\codificado.txt", codificado2) 'escribimos el resultado en otro archivo de texto

'CREAMOS EL ARCHIVO .KEY.PEN
Dim process2 As New Process
process2.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process2.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process2.StartInfo.Arguments = "pkcs8 -inform DER -in D:\Cer_Sellos\aaa010101aaa_CSD_01.key -passin pass:a0123456789 -out D:\Cer_Sellos\aaa010101aaa_CSD_01.key.pem" 'le madamos solo un parametro.
process2.StartInfo.WorkingDirectory = s.App_Path() 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process2.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process2.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process2.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)
process2.Start() 'iniciamos el proceso
process2.WaitForExit() 'le decimos q se espere el proceso

'CREAMOS EL SELLO
'C:\OpenSSL\bin>openssl dgst -sign D:\Cer_Sellos\aaa010101aaa_CSD_01.key.pem D:\codificado.txt | openssl enc -base64 -A > D:\sello.txt
Dim process3 As New Process
process3.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process3.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process3.StartInfo.Arguments = "dgst -sign D:\Cer_Sellos\aaa010101aaa_CSD_01.key.pem D:\codificado.txt" 'le madamos solo un parametro.
process3.StartInfo.WorkingDirectory = "C:\OpenSSL\bin" 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process3.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process3.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process3.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)

process3.Start() 'iniciamos el proceso

Dim SelloTxt As String 'creamos una varaible q almacenara el resultado encriptado
SelloTxt = process3.StandardOutput.ReadToEnd
Dim b64 As String = Convert.ToBase64String(Encoding.Default.GetBytes(S elloTxt)) 'decodificamos el resultado en base 64

process3.WaitForExit() 'le decimos q se espere el proceso
System.IO.File.WriteAllText("D:\sello.txt", b64) 'escribimos el resultado en otro archivo de texto
'CREAMOS EL CERTIFICADO .PEM (blahblahblahblah.CER.PEM)
'C:\OpenSSL\bin>openssl dgst -sign D:\Cer_Sellos\aaa010101aaa_CSD_01.key.pem D:\codificado.txt | openssl enc -base64 -A > D:\sello.txt
Dim process4 As New Process
process4.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process4.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process4.StartInfo.Arguments = " x509 -inform DER -outform PEM -in D:\Cer_Sellos\aaa010101aaa_CSD_01.cer -pubkey > D:\Cer_Sellos\aaa010101aaa_CSD_01.cer.pem " 'le madamos solo un parametro.
process4.StartInfo.WorkingDirectory = "C:\OpenSSL\bin" 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process4.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process4.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process4.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)

process4.Start() 'iniciamos el proceso

process4.WaitForExit() 'le decimos q se espere el proceso

'EXTRAEMOS LA CADENA DEL CERTIFICADO MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDAwDQYJKoZ Ih ......
'C:\OpenSSL\bin>openssl.exe x509 -inform DER -outform PEM -in D:\Cer_Sellos\aaa010101aaa_CSD_01.cer
Dim process5 As New Process
process5.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process5.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process5.StartInfo.Arguments = "x509 -inform DER -outform PEM -in D:\Cer_Sellos\aaa010101aaa_CSD_01.cer" 'le madamos solo un parametro.
process5.StartInfo.WorkingDirectory = "C:\OpenSSL\bin" 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process5.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process5.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process5.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)




'hasta aqui son los datos "complicados" sigue el posts ...
  #3 (permalink)  
Antiguo 13/10/2011, 16:35
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

process5.Start() 'iniciamos el proceso

process5.WaitForExit() 'le decimos q se espere el proceso
Dim CertificadoCadena As String 'creamos una varaible q almacenara el resultado encriptado
CertificadoCadena = process5.StandardOutput.ReadToEnd
CertificadoCadena = Mid(CertificadoCadena, 28)
'quitamos los guiones
Dim RespCertificadoCadena As String = ""
For i As Integer = 0 To CertificadoCadena.Length - 1
If CertificadoCadena.Chars(i) <> "-" Then
RespCertificadoCadena = RespCertificadoCadena & CertificadoCadena.Chars(i)
Else
Exit For
End If
Next


'OBTENEMOS EL NUMERO DE NO. DE CERTIFICADO
'C:\OpenSSL\bin>openssl.exe x509 -in D:\Cer_Sellos\aaa010101aaa_CSD_01.cer.pem -serial
Dim process6 As New Process
process6.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
process6.StartInfo.FileName = "C:\OpenSSL\bin\openssl.exe" 'le ponemos el nombre del archivo q hara la encriptacion (la ruta del openssl.exe)
process6.StartInfo.Arguments = " x509 -in D:\Cer_Sellos\aaa010101aaa_CSD_01.cer.pem -serial " 'le madamos solo un parametro.
process6.StartInfo.WorkingDirectory = "C:\OpenSSL\bin" 'esto es para poner el direcctorio inicial en el q iniciara el proceso
process6.StartInfo.UseShellExecute = False 'esto es para decirle q no usaremos el shell del sistema operativo
process6.StartInfo.ErrorDialog = False 'esto es para omitir cualquier mensaje de error del proceso a ejecutar
process6.StartInfo.RedirectStandardOutput = True 'esto es para decirle q vamos a escribir (o utiliar) el resultado de la secuencia (o sea el resultado encriptado)

process6.Start() 'iniciamos el proceso

process6.WaitForExit() 'le decimos q se espere el proceso
Dim NoCertificado As String 'creamos una varaible q almacenara el resultado NoCertificado (el string completo)
NoCertificado = Mid(process6.StandardOutput.ReadToEnd, 8)

Dim NoCertificadoR As String = ""
'le aplicamos el ciclo estraemos solo las pociciones pares
For i As Integer = 0 To NoCertificado.Length - 1
If NoCertificado(i) <> "-" Then
If ((i + 1) Mod 2) = 0 Then
NoCertificadoR = NoCertificadoR & NoCertificado(i)
End If
Else
Exit For
End If
Next



'NO TE DESESPERES AUN CONTINUA EL POST!!! MAS ABAJO, SIGUE LA PARTE EN EL Q SE ARMA EL XML ;)
  #4 (permalink)  
Antiguo 13/10/2011, 16:36
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

'ARMAMOS EL EQUIS EME ELE

Dim W As New XmlTextWriter("D:\factura2.xml", Encoding.UTF8)

W.WriteStartDocument()

W.WriteStartElement("cfdi:Comprobante")

W.WriteStartAttribute("xmlns:cfdi")
W.WriteValue("http://www.sat.gob.mx/cfd/3")
W.WriteEndAttribute()

W.WriteStartAttribute("xmlns:xsi")
W.WriteValue("http://www.w3.org/2001/XMLSchema-instance")
W.WriteEndAttribute()

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("version")
W.WriteValue("3.0")
W.WriteEndAttribute()

W.WriteStartAttribute("serie") ' opcional
W.WriteValue("E123456789")
W.WriteEndAttribute()

W.WriteStartAttribute("folio")
W.WriteValue("1234567890")
W.WriteEndAttribute()

W.WriteStartAttribute("fecha")
W.WriteValue(horaFecha)
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("Pago en una sola exhibición")
W.WriteEndAttribute()

W.WriteStartAttribute("noCertificado")
W.WriteValue(NoCertificadoR)
W.WriteEndAttribute()

W.WriteStartAttribute("certificado")
W.WriteValue(RespCertificadoCadena)
W.WriteEndAttribute()

W.WriteStartAttribute("subTotal")
W.WriteValue("161.2100")
W.WriteEndAttribute()

W.WriteStartAttribute("Moneda")
W.WriteValue("MXN")
W.WriteEndAttribute()

W.WriteStartAttribute("total")
W.WriteValue("187.0000")
W.WriteEndAttribute()

W.WriteStartAttribute("metodoDePago")
W.WriteValue("Efectivo") 'Efectivo o Parcialidades
W.WriteEndAttribute()

W.WriteStartAttribute("tipoDeComprobante")
W.WriteValue("ingreso") 'ingreso o egreso
W.WriteEndAttribute()

'nodo emisor............................................ ..........

W.WriteStartElement("cfdi:Emisor")

W.WriteStartAttribute("rfc")
W.WriteValue("DEMO000002FEL")
W.WriteEndAttribute()

W.WriteStartAttribute("nombre")
W.WriteValue("Demo2 FEL SA de CV")
W.WriteEndAttribute()



'subnodo Direccion emisor

W.WriteStartElement("cfdi:DomicilioFiscal")

W.WriteStartAttribute("calle")
W.WriteValue("Insurgentes")
W.WriteEndAttribute()

W.WriteStartAttribute("noExterior")
W.WriteValue("45")
W.WriteEndAttribute()

W.WriteStartAttribute("colonia")
W.WriteValue("San Federico")
W.WriteEndAttribute()

W.WriteStartAttribute("municipio")
W.WriteValue("Benito Juarez")
W.WriteEndAttribute()

W.WriteStartAttribute("estado")
W.WriteValue("DF")
W.WriteEndAttribute()

W.WriteStartAttribute("pais")
W.WriteValue("Mexico")
W.WriteEndAttribute()

W.WriteStartAttribute("codigoPostal")
W.WriteValue("51200")
W.WriteEndAttribute()

W.WriteEndElement() 'finaliza direccion

'subnodo ExpedidoEn

W.WriteStartElement("cfdi:ExpedidoEn")

W.WriteStartAttribute("estado")
W.WriteValue("Insurgentes")
W.WriteEndAttribute()

W.WriteStartAttribute("pais")
W.WriteValue("45")
W.WriteEndAttribute()


W.WriteEndElement() 'finaliza expedido en

W.WriteEndElement() 'finaliza emisor

'nodo receptor.......................................... ..........

W.WriteStartElement("cfdi:Receptor")

W.WriteStartAttribute("rfc")
W.WriteValue("FJS9405196IA")
W.WriteEndAttribute()

W.WriteStartAttribute("nombre")
W.WriteValue("Razon Social Random")
W.WriteEndAttribute()



'subnodo direccion receptor


W.WriteStartElement("cfdi:Domicilio")

W.WriteStartAttribute("calle")
W.WriteValue("calle")
W.WriteEndAttribute()

W.WriteStartAttribute("noExterior")
W.WriteValue("122")
W.WriteEndAttribute()

W.WriteStartAttribute("noInterior")
W.WriteValue("3-X")
W.WriteEndAttribute()

W.WriteStartAttribute("colonia")
W.WriteValue("San Simon")
W.WriteEndAttribute()

W.WriteStartAttribute("localidad")
W.WriteValue("G.A.M")
W.WriteEndAttribute()

W.WriteStartAttribute("municipio")
W.WriteValue("Tultitlan")
W.WriteEndAttribute()

W.WriteStartAttribute("estado")
W.WriteValue("Distrito Federal")
W.WriteEndAttribute()

W.WriteStartAttribute("pais")
W.WriteValue("Mexico")
W.WriteEndAttribute()

W.WriteStartAttribute("codigoPostal")
W.WriteValue("52100")
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
W.WriteStartElement("cfdi:Concepto")

W.WriteStartAttribute("cantidad") 'Cantidad
W.WriteValue("1.0000")
W.WriteEndAttribute()
W.WriteStartAttribute("descripcion") 'Descripcion
W.WriteValue("Cosa para vender")
W.WriteEndAttribute()
W.WriteStartAttribute("valorUnitario") 'ValorUnitario
W.WriteValue("100.0000")
W.WriteEndAttribute()
W.WriteStartAttribute("importe") 'importe
W.WriteValue("100.0000")
W.WriteEndAttribute()

W.WriteEndElement() 'finaliza elemento conceptos este va antes de terminar el ciclo for o while

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("25.7900")
W.WriteEndAttribute()

W.WriteStartElement("cfdi:Retenciones") 'Nodo Retenciones
W.WriteStartElement("cfdi:Retencion") 'Nodo Retencion
W.WriteStartAttribute("impuesto") 'totalImpuestosTrasladados
W.WriteValue("IVA")
W.WriteEndAttribute()
W.WriteStartAttribute("importe") 'totalImpuestosTrasladados
W.WriteValue("5.0000")
W.WriteEndAttribute()
W.WriteEndElement() 'finaliza elemento RETENCION
W.WriteEndElement() 'finaliza elemento RETENCIONES


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()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class
  #5 (permalink)  
Antiguo 13/10/2011, 16:38
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

ahora todo el codigo puedes copiarlo y pegarlo en un nuevo proyecto VB.NET i outilize 2008, no se si funcione bien en 2003 o en 2010, supongo q si, bueno, sin mas por el momento, solo espero sus comentarios y sugerencias, saludos a todos desde YA!

MAS VALE UN BOTON CON 50 LINEAS DE CODIGO PERO Q ESTA COMPARTIDO CON TODOS, QUE UN BOTON DE 10000 LINEAS DE CODIGO GUARDADO EN UN CAJON DE CELOS Y EGOISMO, Y CERRADO CON CANDADO DE ENVIDA
  #6 (permalink)  
Antiguo 17/10/2011, 15:13
 
Fecha de Ingreso: abril-2011
Ubicación: Distrito Federal
Mensajes: 112
Antigüedad: 13 años, 6 meses
Puntos: 17
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Hola, yo no he manejado openssl para esto de la facturación electrónica, pero cuando tenga la necesidad tomaré de referencia tu código.

Gratuitamente te paso ejemplo de código de cómo se debe validar un XML ya terminado para ver si está correctamente estructurada la información. En este ejemplo se usan directamente los XSD del SAT y se agrega un XSD adicional para una Addenda propia. Espero te sirva.


Código VB.NET:
Ver original
  1. Private Sub ValidarEsquema()
  2.         Dim va As XmlReader
  3.         Dim sc As XmlSchemaSet
  4.         If Not File.Exists(strArchivoSalida) Then
  5.             strMensajeError = "Error: No se generó el archivo de salida"
  6.             Exit Sub
  7.         End If
  8.         If Not File.Exists(strPath + "cfdv3.xsd") Then
  9.             strMensajeError = "Error: No existe el archivo de esquema cfdv3.xsd"
  10.             Exit Sub
  11.         End If
  12.         If Not File.Exists(strPath + "TimbreFiscalDigital.xsd") Then
  13.             strMensajeError = "Error: No existe el archivo de esquema TimbreFiscalDigital.xsd"
  14.             Exit Sub
  15.         End If
  16.         If Not File.Exists(strPath + "miempresa.xsd") Then
  17.             strMensajeError = "Error: No existe el archivo de esquema miempresa.xsd"
  18.             Exit Sub
  19.         End If
  20.         rs = New XmlReaderSettings()
  21.         rs.ValidationType = ValidationType.Schema
  22.         sc = New XmlSchemaSet()
  23.         rs.Schemas = sc
  24.         sc.Add("http://www.sat.gob.mx/cfd/3", strPath + "cfdv3.xsd")
  25.         sc.Add("http://www.sat.gob.mx/TimbreFiscalDigital", strPath + "TimbreFiscalDigital.xsd")
  26.         sc.Add("http://www.credicam.com/XSD", strPath + "miempresa.xsd")
  27.         va = XmlReader.Create(strArchivoSalida, rs)
  28.         Try
  29.             While va.Read
  30.             End While
  31.         Catch ex As Exception
  32.             strMensajeError = "Error: (" + strSerie + " " & intFolio & ") " + ex.Message
  33.         End Try
  34.         va.Close()
  35.         sc = Nothing
  36.         rs = Nothing
  37.     End Sub
  #7 (permalink)  
Antiguo 18/10/2011, 17:09
 
Fecha de Ingreso: octubre-2011
Mensajes: 1
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Gracias por e codigo pero me surgen dudas de entrada la variable metodo y tambien la declaracion de impoortacion al ssl no he conseguido hacer que la vea, gracias de antemano.
  #8 (permalink)  
Antiguo 18/10/2011, 17:29
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

A SI CLARO LO DE LA VARIABLE "METODO", RESULTA QUE "METODO" ES UNA CLASE Q UTILIZO PARA PODER ACCESAR A UNOS MÉTODOS Q UTILIZO CON FRECUENCIA EN VARIOS DE MIS PROYECTOS, BIEN PUEDES QUITARLA, Y SOLO SALDRÁ UN MENSAJE DE ERROR EN ESTA LINEA

s.App_Path()

LA CUAL ES PARA PODER ACCESAR A TU DIRECTORIO DE TRABAJO ACTUAL (O SEA DE DONDE ESTA EL PROYECTO) PERO BIEN PUEDES REEMPLAZAR ESA LINEA "s.App_Path()" POR ESTA OTRA PARA NO UTILIZAR A MI OBJETO "s" POR ESTA INSTRUCCION

System.AppDomain.CurrentDomain.BaseDirectory()

SALUDOS, ESPERO HABER SIDO ELOCUENTE.
  #9 (permalink)  
Antiguo 18/10/2011, 17:31
Avatar de MardanCorp  
Fecha de Ingreso: octubre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 2
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Cita:
Iniciado por maln79 Ver Mensaje
Gracias por e codigo pero me surgen dudas de entrada la variable metodo y tambien la declaracion de impoortacion al ssl no he conseguido hacer que la vea, gracias de antemano.

A SI CLARO LO DE LA VARIABLE "METODO", RESULTA QUE "METODO" ES UNA CLASE Q UTILIZO PARA PODER ACCESAR A UNOS MÉTODOS Q UTILIZO CON FRECUENCIA EN VARIOS DE MIS PROYECTOS, BIEN PUEDES QUITARLA, Y SOLO SALDRÁ UN MENSAJE DE ERROR EN ESTA LINEA

s.App_Path()

LA CUAL ES PARA PODER ACCESAR A TU DIRECTORIO DE TRABAJO ACTUAL (O SEA DE DONDE ESTA EL PROYECTO) PERO BIEN PUEDES REEMPLAZAR ESA LINEA "s.App_Path()" POR ESTA OTRA PARA NO UTILIZAR A MI OBJETO "s" POR ESTA INSTRUCCION

System.AppDomain.CurrentDomain.BaseDirectory()

SALUDOS, ESPERO HABER SIDO ELOCUENTE.

AHORA LO DEL LA IMPROTACION DE LA CLASE OPENSSL ES CON UN DLL QUE SE DESCARGA DE INTERNET, CON ESE NOMBRE LO PUEDES BUSCAR
OpenSSL.Crypto
PERO EN NINGUNA PARTE DE MI CODIGO LO UTILIZO, ASI Q SI NO LO QUIERES PONER NO PUEDES TAMBIEN QUITAR ESA LINEA
  #10 (permalink)  
Antiguo 07/04/2012, 13:33
Avatar de carvajalacolt  
Fecha de Ingreso: abril-2012
Ubicación: London, United Kingdom, United Kingdom
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

hola mi estimao olle estoy confundido jeje podrias enviear el codigo en proyecto vb.net para compilarlo he copiado el codigo para hacer pruebas pero me manda errores en las referencias webno se si habria inconveniente en enviarme el código a [email protected] o [email protected] soy nuevo en prog .net y es confuso lo que no deveria ser confuso jeje
  #11 (permalink)  
Antiguo 25/07/2012, 20:50
 
Fecha de Ingreso: julio-2012
Ubicación: Veracruz
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Hola que tal compañero he copiado tu codigo hoy en dia julio/2012
y el validador del SAT me dise que el sello no es valido.
por que sera?
Y no se como manejar este foro aun
  #12 (permalink)  
Antiguo 26/07/2012, 07:33
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 14 años, 4 meses
Puntos: 267
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Hola refaceuropeas, en otro post han colocado un ejemplo de facturación electronica, eh resubido el proyecto que anteriormente estaba en megaupload.
http://www.forosdelweb.com/f29/progr...2008-a-922070/
Si bien está en C# espero les sea útil.
Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #13 (permalink)  
Antiguo 26/07/2012, 19:55
 
Fecha de Ingreso: julio-2012
Ubicación: Veracruz
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Que tal amigos les comento lo que me esta pasando con la Factura digital.
Y a mi pareser no es el codigo sino el CERTIFICADO que esta caducado,
Es un certificado que baje de la pagina del SAT.
A continuacion les pongo un poco de lo que me nanda el Validador del SAT:
De entrada cuando cargo el XML me muestra una ventanita que me dice
INFORMACION DE SEGURIDAD:
La firma digital de la aplicacion tiene un error. Desea ejecutar la aplicacion?
La firma digital se ha generado con un certificado de confianza pero a caducado
le pido mas informacion y me pone que
Validez Feb 21 2007 hasta Feb 21 2010 DETALLES DEL CERTIFICADO
MAS INFORMACION LA FIRMA DIGITAL A CADUCADO
despues le doy aseptar a la aplicacion y me pone lo siguiente:
Estructura del CFD correcta
CFD codificado en UTF-8
El comprobante incluye un certificado codificado
El sello del comprobante es invalido
Resultado de la Digestion SHA1: El algoritmo utilizado en el sello no es correcto

Y POSTERIOR MENTE ME PONE LA CADENA ORIGINAL
Y TAMBIEN EL No. DE SERIE.

LES PIDO POR FAVOR QUE ME ESPLIQUEN POR QUE PASA ESTO.
  #14 (permalink)  
Antiguo 15/08/2012, 14:57
Avatar de NetFcruz  
Fecha de Ingreso: agosto-2012
Ubicación: Reynosa
Mensajes: 32
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

Hola veo tu codigo y las correciones, la verdad estoy medio espandato con la factura electronica, ya que en la empresa esta uno hecho en Visual Fox Pro, el cual no lo hice yo , yo estoy en un 50 % de Programacion en VB.NET 2010, compilare el code y vere el resultado, pero mi problema exactamente es como podria integrar una addenda a un sistema de facturacion que actualmente ya esta en VFP, ahora, se factura actualmente, surgio lo de addendas y por eso encontre este post, puesto que quiero crear una aplicacion ke permita incluir la addenda facturando electronicamente desde VB.NET 2010.
El code de aqui supongamos que ya me quedo y solo me faltaria incluirle la addenda x.
Podrian Ayudarme realmente necesito como hacerlo.
Saludos.
__________________
!El conocimiento se LIMITA cuando dices NO PUEDO!

By NetFcruz
  #15 (permalink)  
Antiguo 17/08/2012, 18:50
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 22 años
Puntos: 37
Respuesta: Facturación electrónica 2011. Codigo vb.net 2008

La idea para agregarle la addenda es cargar el XML a una variable.



Luego, cuando ya tengas la addenda formada en una cadena como <addenda>nodos como lo especifica el sat</addenda>

'//Obtenemos el nodo raiz del documento.
Dim comprobante As XmlElement = xmlTimbrado.DocumentElement
Dim nodoComprobante As XmlNode = comprobante.Item("Comprobante") '.ChildNodes(0)

Se agrega un nodo a otro:
NdDomFis = Doc.CreateNode(XmlNodeType.Element, "DomicilioFiscal", Me.xmlns) nodoComprobante .AppendChild(NdDomFis) 'agreagar al nodo emisor

Manipulas el XML para agregarle el nodo de la addenda y listo.. la addenda y su informacion no se encripta en el sello x lo que puedes agregarselo o quitarlo de un XML y eso no invalida un sello en el XML

Etiquetas: cfdi, comprobantes, electronica, facturacion, fiscales, sat, vb, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 08:14.