diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index e09436df7..f0bd8f5ef 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -3,9 +3,12 @@ Option Strict On Imports Extensiones Imports System.IO -Imports System.Linq +Imports Newtonsoft.Json.Linq +Imports System.Net.Http Imports System.Xml Imports System.Data +Imports System.Xml.Serialization + Public Class Timbrado #Region "P R O P I E D A D E S" @@ -2213,41 +2216,26 @@ Public Class Timbrado ' 'Sucursal matriz de la empresa Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) - Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") - Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") + + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" + Dim ClaveServicio As String = "Facturacion2021#" + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "" ' Produccion + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio Dim SubTotal As Decimal = 0 Dim TimbraProduccion As Boolean = True If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) - Select Case CvePACEspecial - Case 2 - UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" 'productivo - Case 4 - 'UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL" - UrlServicio = "http://alterno.gofac.com.mx/cfdi/timbrado.asmx?WSDL" ' alterno - End Select + If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then - - EmisorRFC = "AAA010101AAA" - ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key" - ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer" + EmisorRFC = "ZUÑ920208KL4" + ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.key" + ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.cer" Clave = "12345678a" TimbraProduccion = False - Select Case CvePACEspecial - Case 2 - UsuarioServicio = "fgomez" - ClaveServicio = "12121212" - UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx" - Case 4 - UsuarioServicio = "UserTest" - ClaveServicio = "1234567890" - UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL" - End Select End If #Region "Valida" @@ -2294,19 +2282,15 @@ Public Class Timbrado End Try #End Region - sw.Stop() swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds sw.Start() - ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E") - ' cfdi.Decimales = 4 #Region "Certificado" cfdi.CertificadoArchivo(ArchivoCertificado) #End Region - sw.Stop() swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds @@ -2379,6 +2363,7 @@ Public Class Timbrado cfdi.Impuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados) End If #End Region + #Region " Traslados y Retenciones" @@ -2582,8 +2567,6 @@ Public Class Timbrado End If #End Region - - #Region "Nomina12" If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then @@ -2676,7 +2659,7 @@ Public Class Timbrado Dim ArchivoGenerado As Boolean = False Try cfdi.GenerarXMLB64(llaveBase64, Clave) - ArchivoGenerado = True + If cfdi.Xml <> "" Then ArchivoGenerado = True Catch ex As Exception Retorno = cfdi.MensajeError If Retorno = "" OrElse IsNothing(Retorno) Then @@ -2694,111 +2677,131 @@ Public Class Timbrado #Region "Timbra" If ArchivoGenerado Then - Dim opciones As String() = New String(0) {"CALCULAR_SELLO"} - Dim pade = New PADE33.PadeTimbradoServiceClient - Dim Respuesta As String = pade.timbradoPrueba("72330711-cac6-4106-8051-cbcda1aef495", "rene.molina@adssistemas.mx", "Facturacion2021#", cfdi.Xml, opciones) + 'Dim opciones As String() = New String(0) {""} + 'Dim pade = New PADETimbrado.PadeTimbradoServiceClient + + 'Dim Respuesta As String = pade.timbradoConCSD("72330711-cac6-4106-8051-cbcda1aef495", UsuarioServicio, ClaveServicio, cfdi.Xml, certByte, llaveByte, Clave, Not TimbraProduccion, opciones) + + Dim TokenAuth As String = $"{UsuarioServicio}:{ClaveServicio}".ToBase64Encode() + + Dim payload As New JObject( + New JProperty("contrato", "72330711-cac6-4106-8051-cbcda1aef495"), + New JProperty("certBase64", certBase64), + New JProperty("keyBase64", llaveBase64), + New JProperty("keyPass", Clave), + New JProperty("xmlBase64", cfdi.Xml.ToBase64Encode()), + New JProperty("prueba", (Not TimbraProduccion).ToString().ToLower), + New JProperty("opciones", New String(0) {""}) + ) + + Dim Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) + ' Aumentamos el timeout de la operación + If Not String.IsNullOrEmpty(Respuesta) Then - Dim FolioFiscal As String - FolioFiscal = obtenerAtributo(Respuesta, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText + Dim result As PADEServicioTimbradoResp = Nothing + Dim serializer As XmlSerializer = New XmlSerializer(GetType(PADEServicioTimbradoResp)) + Try + Using reader As TextReader = New StringReader(Respuesta) + result = CType(serializer.Deserialize(reader), PADEServicioTimbradoResp) + End Using + Catch ex As Exception + OnError("Ocurrió un error al obtener los resultados", ex) + End Try - 'cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, UrlServicio, TimbraProduccion) + If result IsNot Nothing Then + If result.timbradoOk Then + Dim FolioFiscal As String = result.UUID - 'sw.Stop() - 'swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - 'swmili = sw.ElapsedMilliseconds - 'sw.Start() - ''Verifica el error - 'If cfdi.CodigoError = 0 Then + cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) - ' Dim FolioFiscal As String + If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then - ' UUID = cfdi.UUID - ' FolioFiscal = cfdi.UUID 'obtenerAtributo(cfdi.XmlTimbrado, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText + 'Actualiza Estatus Factura + If Ventas.CveVenta > 0 Then - ' If FolioFiscal <> "" Then + Using ObjVentas As New ClsVentas() - ' cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) + If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=CvePACEspecial, RFCReceptor:=ObjCFDITimbre.Receptor.RFC) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using - ' sw.Stop() - ' swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - ' swmili = sw.ElapsedMilliseconds - ' sw.Start() + 'Genero la addenda Ford + If Ventas.Cliente.Ford_GSDB <> "" Then - ' If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then + Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) - ' 'Actualiza Estatus Factura - ' If Ventas.CveVenta > 0 Then + Dim FolioFactura As String = "" + If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura + GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) - ' Using ObjVentas As New ClsVentas() + End If - ' If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=CvePACEspecial) Then - ' Retorno = "" - ' Else - ' Retorno = "Error" - ' End If - ' End Using + End If - ' 'Genero la addenda Ford - ' If Ventas.Cliente.Ford_GSDB <> "" Then + If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then + Using ObjNomina2 As New ClsNominas() - ' Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) + If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + End If - ' Dim FolioFactura As String = "" - ' If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura - ' GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) + If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then + Using ObjInv As New ClsInventarios() + If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + End If + End If - ' End If + If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\") - ' End If + Try + Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg" + Dim b As Byte() = cfdi.QrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}") + File.WriteAllBytes(RutaCBB, b) + Catch ex As Exception + OnError("Ocurrió un error al generar el QR", ex) + End Try + Retorno = "" + Else + If String.IsNullOrEmpty(result.mensaje) Then + Retorno = Respuesta + MensajeErrorCFDI = "" + Else + Retorno = result.mensaje + MensajeErrorCFDI = result.codigo + If cfdi.Xml <> "" Then cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) + End If - ' If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then - ' Using ObjNomina2 As New ClsNominas() - - ' If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then - ' Retorno = "" - ' Else - ' Retorno = "Error" - ' End If - ' End Using - ' End If - - ' If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then - ' Using ObjInv As New ClsInventarios() - ' If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then - ' Retorno = "" - ' Else - ' Retorno = "Error" - ' End If - ' End Using - ' End If - ' End If - - ' If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\") - - ' Try - ' Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg" - ' Dim b As Byte() = cfdi.QrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}") - ' File.WriteAllBytes(RutaCBB, b) - ' Catch ex As Exception - ' OnError("Ocurrió un error al generar el QR", ex) - ' End Try - ' Retorno = "" - ' Else - ' Retorno = "No se pudo timbrar ante el SAT. UUID no generado." - ' End If - ' sw.Stop() - ' swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - ' swmili = sw.ElapsedMilliseconds - ' sw.Start() - - 'Else - ' Retorno = cfdi.MensajeError - ' MensajeErrorCFDI = cfdi.MensajeError - ' If cfdi.Xml <> "" Then cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) - - ' End If + End If + Else + If String.IsNullOrEmpty(Respuesta) Then + Retorno = "Ocurrió un error al obtener la respuesta" + MensajeErrorCFDI = "" + Else + Retorno = Respuesta + MensajeErrorCFDI = "" + End If + End If + Else + Retorno = "Ocurrió un error al obtener la respuesta" + MensajeErrorCFDI = "" + End If + Else + Retorno = "Ocurrió un error al generar el xml" + MensajeErrorCFDI = "" End If #End Region @@ -2806,6 +2809,45 @@ Public Class Timbrado Return Retorno End Function + Private Function EnviarInformacionPADE(url As String, payload As String, tokenAuth As String) As String + Dim Retorno As String = "" + Try + Using httpClient = New HttpClient() + httpClient.Timeout = New TimeSpan(0, 1, 0) + Using request = New HttpRequestMessage(HttpMethod.Post, New Uri(url)) + request.Headers.Add("Authorization", $"Basic {tokenAuth}") + Using content = New StringContent(payload, Encoding.UTF8, "application/json") + request.Content = content + Dim response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result + + Retorno = response.Content.ReadAsStringAsync().Result + End Using + End Using + End Using + Catch ex As Exception + Retorno = "" + OnError("Ocurrió un error al enviar la informacion", ex) + End Try + Return Retorno + End Function + + + Public Class PADEServicioTimbradoResp + + Public Property id As String + + Public Property timbradoOk As Boolean + + Public Property contrato As String + + Public Property codigo As String + + Public Property mensaje As String + + Public Property UUID As String + End Class + + Public Sub GuardaLogTimbrado(Str As String, CvePAC As Integer) Dim ArchivoW As StreamWriter Dim strLineaTMP As String diff --git a/App_Code/modExtensiones.vb b/App_Code/modExtensiones.vb index 95db7694d..24e6e11b6 100644 --- a/App_Code/modExtensiones.vb +++ b/App_Code/modExtensiones.vb @@ -2805,6 +2805,18 @@ Namespace Extensiones Return img End Function + + + Public Function ToBase64Encode(ByVal plainText As String) As String + Dim plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText) + Return System.Convert.ToBase64String(plainTextBytes) + End Function + + + Public Function ToBase64Decode(ByVal base64EncodedData As String) As String + Dim base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData) + Return System.Text.Encoding.UTF8.GetString(base64EncodedBytes) + End Function Public Function DecriptaConexion() As String Dim Salida As String Dim stringtodecrypt As String = ConfigurationManager.ConnectionStrings("Conexion").ConnectionString diff --git a/Ashx/SIGPolizaVirtual.ashx b/Ashx/SIGPolizaVirtual.ashx index 10eab84ae..1ea9302b0 100644 --- a/Ashx/SIGPolizaVirtual.ashx +++ b/Ashx/SIGPolizaVirtual.ashx @@ -57,12 +57,77 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest context.Response.ContentType = "application/json" - Dim usuario = ValidaUsuarioSistema(140, 100) - Dim ObjFactura As New Modelos.Factura(usuario, 898028, 140) - GeneraPolizaVentaWS(context, ObjFactura) - 'GeneraPolizaVentaLTHWSD(context) - 'GeneraIndicadores(context) + Dim UsuarioActual = ValidaUsuarioSistema(1, 100) + 'Dim ObjFactura As New Modelos.Factura(usuario, 898028, 140) + + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" + Dim ClaveServicio As String = "Facturacion2021#" + + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, "Ing") + Dim NombreArchivoXML As String = "test" + + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) + + Dim EmisorRFC As String = "ZUÑ920208KL4" + Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.key" + Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.cer" + Dim Clave = "12345678a" + Dim TimbraProduccion = False + + If Not File.Exists(ArchivoCertificado) Then + context.Response.Write("El archivo de llave privada no existe") + Exit Sub + End If + If Not File.Exists(ArchivoLLave) Then + context.Response.Write("El archivo de llave privada no existe") + Exit Sub + End If + If UsuarioActual.Empresa.ContraseñaKey = "" Then + context.Response.Write("La clave no puede ser vacía") + Exit Sub + End If + + Dim llaveByte As Byte(), certByte As Byte() + Dim llaveBase64 As String = "", certBase64 As String = "" + Dim cfdi As New GoFac.GoCfdi() + Dim complemento As String = "" + Dim complementoConcepto As String = "" + + + Try + llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) + llaveBase64 = Convert.ToBase64String(llaveByte) + Catch ex As Exception + context.Response.Write($"Error al leer la llave privada: {ex.Message}") + Exit Sub + End Try + + + Try + certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) + certBase64 = Convert.ToBase64String(certByte) + Catch ex As Exception + context.Response.Write($"Error al leer el certificado: {ex.Message}") + Exit Sub + End Try + + Dim TokenAuth As String = ToBase64Encode($"{UsuarioServicio}:{ClaveServicio}") + Dim XmlBase64 As String = ToBase64Encode(XMLPrueba) + + Dim payload As New JObject( + New JProperty("contrato", "72330711-cac6-4106-8051-cbcda1aef495"), + New JProperty("certBase64", certBase64), + New JProperty("keyBase64", llaveBase64), + New JProperty("keyPass", Clave), + New JProperty("xmlBase64", XmlBase64), + New JProperty("prueba", (Not TimbraProduccion).ToString().ToLower), + New JProperty("opciones", New String(0) {""}) + ) + + Dim resp = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) + + context.Response.Write(resp) End Sub @@ -72,6 +137,44 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState End Get End Property + Private Function EnviarInformacionPADE(url As String, payload As String, tokenAuth As String) As String + Dim Retorno As String = "{}" + Try + Using httpClient = New HttpClient() + httpClient.Timeout = New TimeSpan(0, 5, 0) + Using request = New HttpRequestMessage(HttpMethod.Post, New Uri(url)) + request.Headers.Add("Authorization", $"Basic {tokenAuth}") + Using content = New StringContent(payload, Encoding.UTF8, "application/json") + request.Content = content + + Dim response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result + Retorno = response.Content.ReadAsStringAsync().Result + End Using + End Using + End Using + Catch ex As Exception + OnError("Ocurrió un error al enviar la informacion", ex) + End Try + Return Retorno + End Function + + + Public Function ToBase64Encode(ByVal plainText As String) As String + Dim plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText) + Return System.Convert.ToBase64String(plainTextBytes) + End Function + + + Public Function ToBase64Decode(ByVal base64EncodedData As String) As String + Dim base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData) + Return System.Text.Encoding.UTF8.GetString(base64EncodedBytes) + End Function + + Public Property XMLPrueba As String = "" + + + +#Region "P O L I Z A - V I R T U A L" Protected Sub GeneraPolizaVentaWS(ByVal context As HttpContext, ObjFactura As Modelos.Factura) Dim obj As New MPolizaVentaWS 'DATOS DEL CLIENTE @@ -320,6 +423,7 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState context.Response.Write(Retorno) End Sub +#End Region End Class