diff --git a/Ashx/SIGPolizaVirtual.ashx b/Ashx/SIGPolizaVirtual.ashx index 1ea9302b0..5119765e9 100644 --- a/Ashx/SIGPolizaVirtual.ashx +++ b/Ashx/SIGPolizaVirtual.ashx @@ -3,6 +3,7 @@ Imports Fluent Imports System Imports System.Web +Imports System.Net Imports System.Net.Http Imports System.Web.Http Imports System.Data @@ -11,6 +12,9 @@ Imports Newtonsoft.Json.Linq Imports Extensiones Imports System.IO Imports System.Runtime.CompilerServices +Imports System.Xml +Imports System.Xml.Serialization +Imports System.Linq Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState @@ -56,11 +60,19 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState #End Region Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest - context.Response.ContentType = "application/json" + context.Response.ContentType = "application/xml" Dim UsuarioActual = ValidaUsuarioSistema(1, 100) 'Dim ObjFactura As New Modelos.Factura(usuario, 898028, 140) + CancelarFacturaPADE(context, UsuarioActual) + + + End Sub + + + Private Sub TimbrarFacturaPADE(ByVal context As HttpContext, UsuarioActual As Usuario) + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" Dim ClaveServicio As String = "Facturacion2021#" @@ -125,11 +137,189 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState New JProperty("opciones", New String(0) {""}) ) - Dim resp = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) + Dim Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) - context.Response.Write(resp) + If Not String.IsNullOrEmpty(Respuesta) Then + 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 + + If result IsNot Nothing Then + Dim xmlGuardar = result.xmlBase64.ToBase64Decode() + context.Response.Write(xmlGuardar) + Else + context.Response.Write(Respuesta) + End If + Else + context.Response.Write(Respuesta) + End If End Sub + Private Sub CancelarFacturaPADE(ByVal context As HttpContext, UsuarioActual As Usuario) + + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" + Dim ClaveServicio As String = "Facturacion2021#" + + 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 Contrato As String = "72330711-cac6-4106-8051-cbcda1aef495" + + Dim FolioFiscal As String = "9A46AD71-560B-4048-8B40-80ADC57C1CDC" + + 'Dim Respuesta As String = EnviarInformacionCancelacionPADE("https://timbrado.pade.mx/servicio/rest/cancelacion/cancelar", TokenAuth, Contrato, EmisorRFC, certBase64, llaveBase64, Clave, FolioFiscal) + + 'context.Response.Write(Respuesta) + + Dim Respuesta As String = EnviarInformacionCancelacionPADESOAP("https://timbrado.pade.mx/servicio/Timbrado3.3?wsdl", UsuarioServicio, ClaveServicio, Contrato, EmisorRFC, certBase64, llaveBase64, Clave, FolioFiscal, TimbraProduccion) + + If Not String.IsNullOrEmpty(Respuesta) Then + Dim result As PADEServicioCancelacionResp = Nothing + Dim serializer As XmlSerializer = New XmlSerializer(GetType(PADEServicioCancelacionResp)) + + Try + Using reader As TextReader = New StringReader(Respuesta) + result = CType(serializer.Deserialize(reader), PADEServicioCancelacionResp) + End Using + Catch ex As Exception + OnError("Ocurrió un error al obtener los resultados", ex) + End Try + + If result IsNot Nothing Then + context.Response.ContentType = "application/json" + context.Response.Write(JsonConvert.SerializeObject(result)) + Else + context.Response.Write(Respuesta) + End If + Else + context.Response.Write(Respuesta) + End If + + 'Dim arrayFolioFiscal = New String(0) {FolioFiscal} + 'Dim arrayOpciones = New List(Of String) + 'If Not TimbraProduccion Then + ' arrayOpciones.Add("MODO_PRUEBA:1") + 'End If + + 'Dim pade = New PADE33.PadeTimbradoServiceClient() + + 'Dim Res = pade.cancelarConOpciones(Contrato, UsuarioServicio, ClaveServicio, EmisorRFC, arrayFolioFiscal, certByte, llaveByte, Clave, arrayOpciones.ToArray()) + + 'context.Response.Write(Res) + End Sub + + + Private Function EnviarInformacionCancelacionPADESOAP(ByVal url As String, UsuarioServicio As String, PassServicio As String, contrato As String, rfcEmisor As String, + certBase64 As String, keyBase64 As String, keyPass As String, arregloUUID As String, TimbraProduccion As Boolean) As String + Dim retorno = "" + Try + + Dim request As HttpWebRequest = CType(WebRequest.Create($"{url}"), HttpWebRequest) + 'request.Headers.Add("SOAPAction:http://tempuri.org/TestCfd33 ") + request.ContentType = "text/xml;charset=""utf-8""" + request.Accept = "text/xml" + request.Method = "POST" + + Dim XMLString As String = $" + + + {contrato} + {UsuarioServicio} + {PassServicio} + {rfcEmisor} + {arregloUUID} + {certBase64} + {keyBase64} + {keyPass} + {If(TimbraProduccion, "", "MODO_PRUEBA:3")} + + + " + + Dim SOAPReqBody As XmlDocument = New XmlDocument() + SOAPReqBody.LoadXml(XMLString) + + Using stream As Stream = request.GetRequestStream() + SOAPReqBody.Save(stream) + End Using + + Dim response As String = "" + + Using Serviceres As WebResponse = request.GetResponse() + Using rd As StreamReader = New StreamReader(Serviceres.GetResponseStream()) + response = rd.ReadToEnd() + End Using + End Using + + If Not String.IsNullOrEmpty(response) Then + Dim xmlRetorno = New XmlDocument() + xmlRetorno.LoadXml(response) + Dim elemList As XmlNodeList = xmlRetorno.GetElementsByTagName("return") + + If elemList.Count > 0 Then + If elemList(0).ChildNodes.Count > 0 Then + retorno = elemList(0).ChildNodes(0).Value + End If + End If + + End If + + Catch ex As Exception + retorno = "" + OnError("Ocurrió un error al cancelar", ex) + End Try + + Return retorno + End Function Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get @@ -159,6 +349,46 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState End Function + Private Function EnviarInformacionCancelacionPADE(url As String, tokenAuth As String, contrato As String, rfcEmisor As String, + certBase64 As String, keyBase64 As String, keyPass As String, arregloUUID As String) As String + Dim Retorno As String = "" + Try + Dim urlParametros As String = String.Format("contrato={0}&rfcEmisor={1}&certBase64={2}&keyBase64={3}&keyPass={4}&arregloUUID={5}&opciones={6}", contrato, rfcEmisor, certBase64, keyBase64, keyPass, arregloUUID, "MODO_PRUEBA:1") + + Dim urlRequest As String = String.Format("{0}?{1}", url, urlParametros) + + Using httpClient = New HttpClient() + httpClient.Timeout = New TimeSpan(0, 1, 0) + Using request = New HttpRequestMessage(HttpMethod.Post, New Uri(urlRequest)) + request.Headers.Add("Authorization", $"Basic {tokenAuth}") + + Dim response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result + Retorno = response.Content.ReadAsStringAsync().Result + 'Dim Parametros = New List(Of KeyValuePair(Of String, String)) + + 'Parametros.Add(New KeyValuePair(Of String, String)("contrato", contrato)) + 'Parametros.Add(New KeyValuePair(Of String, String)("rfcEmisor", rfcEmisor)) + 'Parametros.Add(New KeyValuePair(Of String, String)("certBase64", certBase64)) + 'Parametros.Add(New KeyValuePair(Of String, String)("keyBase64", keyBase64)) + 'Parametros.Add(New KeyValuePair(Of String, String)("keyPass", keyPass)) + 'Parametros.Add(New KeyValuePair(Of String, String)("arregloUUID", arregloUUID)) + + 'Using content = New FormUrlEncodedContent(Parametros) + ' request.Content = content + + + '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 Function ToBase64Encode(ByVal plainText As String) As String Dim plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText) Return System.Convert.ToBase64String(plainTextBytes) @@ -170,6 +400,53 @@ Public Class SIGPolizaVirtual : Implements IHttpHandler, IRequiresSessionState Return System.Text.Encoding.UTF8.GetString(base64EncodedBytes) 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 + + Public Property FechaTimbrado As DateTime + + Public Property xmlBase64 As String + End Class + + + Public Class PADEServicioCancelacionResp + + Public Property statusOk As Boolean + + Public Property codigo As String + + Public Property mensaje As String + + Public Property procesados As Integer + + Public Property cancelados As Integer + + + Public Property cancelaciones As List(Of PADECancelacion) + End Class + + + Public Class PADECancelacion + + Public Property uuid As String + + Public Property codigo As String + + Public Property mensaje As String + End Class + Public Property XMLPrueba As String = "" diff --git a/GPS/TrayectoDetalle.aspx b/GPS/TrayectoDetalle.aspx index a10fc8071..c977aaab9 100644 --- a/GPS/TrayectoDetalle.aspx +++ b/GPS/TrayectoDetalle.aspx @@ -644,7 +644,10 @@ }, 250); } - function creaPoligono(coords, color, Geocerca, Estatus, InicioFin, CveEstatus, CveEstatusAnterior, cruzo) { + var geoReferenciaSeguir = ''; + var estatusSiguiente = ''; + + function creaPoligono(coords, color, Geocerca, Estatus, InicioFin, CveEstatus, CveEstatusAnterior, cruzo, geocercaASeguir, estatusaSeguir) { var polygon = new google.maps.Polygon({ paths: coords, strokeColor: color, @@ -656,6 +659,11 @@ polygon.setMap(map); polygons.push(polygon); + if (geocercaASeguir != '') { + geoReferenciaSeguir = geocercaASeguir; + estatusSiguiente = estatusaSeguir; + } + CreaMarcadorPoligono(coords, Geocerca, Estatus, InicioFin, CveEstatus, CveEstatusAnterior, cruzo) } @@ -935,7 +943,7 @@ } } - LblETA.innerText = formatETA(duracionTotal); + LblETA.innerHTML = formatETA(duracionTotal) + '
Geocerca: ' + geoReferenciaSeguir + '.
Estatus: ' + estatusSiguiente; }) .catch((error) => { alert('Error:' + error); diff --git a/GPS/TrayectoDetalle.aspx.vb b/GPS/TrayectoDetalle.aspx.vb index dc4fc125d..7153f6f10 100644 --- a/GPS/TrayectoDetalle.aspx.vb +++ b/GPS/TrayectoDetalle.aspx.vb @@ -50,6 +50,15 @@ Partial Class GPS_TrayectoDetalle ViewState("CveEstatusActual") = value End Set End Property + + Private Property OrdenActual As Integer + Get + Return CType(ViewState("OrdenActual"), Integer) + End Get + Set(value As Integer) + ViewState("OrdenActual") = value + End Set + End Property #End Region @@ -148,6 +157,7 @@ Partial Class GPS_TrayectoDetalle LblTitulo.Text = $"Trayecto: {RowEstatus("Trayecto")}" LtlEstatusActual.Text = RowEstatus("Estatus").ToString() CveEstatusActual = RowEstatus("CveEstatusActual").ToString().ToEntero() + OrdenActual = RowEstatus("OrdenActual").ToString().ToEntero() If CBool(RowEstatus("EsFin")) Then BtnTerminarTrayeto.Visible = False @@ -158,7 +168,7 @@ Partial Class GPS_TrayectoDetalle LtlDispositivo.Text = RowEstatus("Vehiculo").ToString() LtlFechaI.Text = If(String.IsNullOrEmpty(RowEstatus("FechaInicio").ToString()), "No ha ingresado a la geocerca de inicio", String.Format("{0:dd/MM/yyyy HH:mm tt}", RowEstatus("FechaInicio").ToString().ToDateTime())) - LtlFechaF.Text = If(String.IsNullOrEmpty(RowEstatus("FechaFin").ToString()), "No ha Terminado", String.Format("{0:dd/MM/yyyy HH:mm tt}", RowEstatus("FechaFin").ToString().ToDateTime())) + LtlFechaF.Text = If(String.IsNullOrEmpty(RowEstatus("FechaFin").ToString()), "No ha terminado", String.Format("{0:dd/MM/yyyy HH:mm tt}", RowEstatus("FechaFin").ToString().ToDateTime())) LtlVMedia.Text = String.Format("{0:N2} KM/H", RowEstatus("VMedia")) LtlVMax.Text = String.Format("{0:N2} KM/H", RowEstatus("VMax")) LtlTiempo.Text = String.Format("{0}", RowEstatus("TiempoOperativo")) @@ -214,18 +224,41 @@ Partial Class GPS_TrayectoDetalle Dim CoordAnterior As String = "" Dim CveEstatus As Integer = -1 Dim CveEstatusAnterior As Integer = -1 + Dim GeoreferenciaASeguir As String = "" + Dim EstatusSiguiente As String = "" + Dim OrdenEstatus As Integer = 0 + 'GEOCERCAS For Each Row As DataRow In DtGeocercas.Rows count += 1 Coord = SQLToGmaps(Row("Geom").ToString, "POLYGON") CveEstatus = Row("CveEstatusTrayecto").ToString.ToEntero CveEstatusAnterior = Row("CveEstatusAnterior").ToString.ToEntero + OrdenEstatus = Row("OrdenEstatus").ToString.ToEntero + Dim EsInicio As Boolean = CBool(IfNull(Row("EsInicio"), 0)) Dim EsFin As Boolean = CBool(IfNull(Row("EsFin"), 0)) Dim InicioFin As Integer = If(EsInicio, 1, If(EsFin, 2, 0)) Dim Cruzo As String = IfNull(Row("Cruzo"), "0").ToString() - RegistraScript($"creaPoligono({Coord}, '{Row("Color").ToString}', '{Row("GeoReferencia")}', '{Row("EstatusTrayecto")}',{InicioFin},{CveEstatus},{CveEstatusAnterior},{Cruzo})", count.ToString()) + 'MARCA PARA QUE NO CALCULE EL TIEMPO DE LAS GEOCERCAS RESTANTES + If Not String.IsNullOrEmpty(GeoreferenciaASeguir) Then + Cruzo = "1" + End If + + 'VERIFICA SI SE ACTUALIZO MANUALMENTE + If Cruzo = "0" Then + If OrdenEstatus <= OrdenActual Then + Cruzo = "1" + End If + End If + + If Cruzo = "0" Then + GeoreferenciaASeguir = Row("GeoReferencia").ToString() + EstatusSiguiente = Row("EstatusTrayecto").ToString() + End If + + RegistraScript($"creaPoligono({Coord}, '{Row("Color").ToString}', '{Row("GeoReferencia")}', '{Row("EstatusTrayecto")}',{InicioFin},{CveEstatus},{CveEstatusAnterior},{Cruzo},'{GeoreferenciaASeguir}','{EstatusSiguiente}')", count.ToString()) Next End If @@ -324,11 +357,16 @@ Partial Class GPS_TrayectoDetalle Dim ObjGPS As New ClsGPS Try - If ObjGPS.GetEstatusTrayectos(-1, UsuarioActual.CveCliente) Then - DtEstatus = ObjGPS.DtResultados.Copy() + Dim CveEstatusFinal As Integer = -1 + If ObjGPS.GetTrayectosGeoReferencias(CveTrayecto) Then + 'TOMA LA GEOCERCA FINAL + Dim Row As DataRow = ObjGPS.DtResultados.FiltroPrimero($"EsFin = True") + If Row IsNot Nothing Then + CveEstatusFinal = Row("CveEstatusTrayecto").ToString().ToEntero() + End If + End If - Dim CveEstatusFinal As Integer = DtEstatus.FiltroPrimeroValor("CveEstatusTrayecto", "EsFin = True").ToEntero() If CveEstatusFinal > 0 Then If ObjGPS.UpdateTrayectoEstatus(CveTrayecto, CveEstatusFinal) Then Alert("El trayecto se finalizo correctamente", JSBtnAceptar:="RefrescarPagina();", ShowCloseButton:=False) @@ -336,6 +374,19 @@ Partial Class GPS_TrayectoDetalle Else Alert("No se pudo obtener el estatus final", TipoMensaje.MsgError) End If + + 'If ObjGPS.GetEstatusTrayectos(-1, UsuarioActual.CveCliente) Then + ' DtEstatus = ObjGPS.DtResultados.Copy() + 'End If + + 'Dim CveEstatusFinal As Integer = DtEstatus.FiltroPrimeroValor("CveEstatusTrayecto", "EsFin = True").ToEntero() + 'If CveEstatusFinal > 0 Then + ' If ObjGPS.UpdateTrayectoEstatus(CveTrayecto, CveEstatusFinal) Then + ' Alert("El trayecto se finalizo correctamente", JSBtnAceptar:="RefrescarPagina();", ShowCloseButton:=False) + ' End If + 'Else + ' Alert("No se pudo obtener el estatus final", TipoMensaje.MsgError) + 'End If Catch ex As Exception OnError("Ocurrió un error al actualizar el trayecto", ex) End Try diff --git a/GPS/Trayectos.aspx b/GPS/Trayectos.aspx index 89eba625b..c07974719 100644 --- a/GPS/Trayectos.aspx +++ b/GPS/Trayectos.aspx @@ -322,6 +322,40 @@ +
+ Notificar: + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + + + + + +
+
+
+
+ Enviar Liga: + +
+
+
+
+
" style="display: inline-block; margin-right: -20px; width: 150px;" /> diff --git a/GPS/Trayectos.aspx.vb b/GPS/Trayectos.aspx.vb index cfae9a0d3..e473a0319 100644 --- a/GPS/Trayectos.aspx.vb +++ b/GPS/Trayectos.aspx.vb @@ -113,8 +113,8 @@ Partial Class GPS_Trayectos Dim ObjGPS As New ClsGPS If ObjGPS.GetEstatusTrayectos(-1, UsuarioActual.CveCliente) Then GvEstatus.DataSource = ObjGPS.DtResultados.FiltraParametros("CveCliente > 0") - GvEstatusNuevo.DataSource = ObjGPS.DtResultados - DdlEstatusTrayecto.DataSource = ObjGPS.DtResultados + GvEstatusNuevo.DataSource = ObjGPS.DtResultados.FiltraParametros("CveCliente > 0") + DdlEstatusTrayecto.DataSource = ObjGPS.DtResultados.FiltraParametros("CveCliente > 0") End If ObjGPS.Dispose() GvEstatus.DataBind() @@ -237,7 +237,9 @@ Partial Class GPS_Trayectos Dim Nombre As String = TxtNombreNuevo.Text Dim CveDispositivo As Integer = DdlDispositivoNuevo.SelectedValue.ToEntero If CveDispositivo > 0 Then - Dim CveTrayectoNuevo As Integer = ObjGPS.AddTrayecto(Nombre, DateTime.Now, "", CveDispositivo, UsuarioActual.CveCliente) + Dim CveTrayectoNuevo As Integer = ObjGPS.AddTrayecto(Nombre, DateTime.Now, "", CveDispositivo, UsuarioActual.CveCliente, EnviarNotificacion:=ChkNotificarApartirDe.Checked, + CorreosNotificacion:=TxtCorreNotApartidDe.Text, Intervalo:=If(ChkNotificarApartirDe.Checked, DdlIntervaloAPartirDe.SelectedValue.ToEntero(), 0), + EnviarLiga:=ChkEnviarLigaApartirDe.Checked) If CveTrayectoNuevo > 0 Then For Each Row As GridViewRow In GvEstatusNuevo.Rows If Row.RowType = DataControlRowType.DataRow Then @@ -413,6 +415,10 @@ Partial Class GPS_Trayectos DivNotificaciones.Visible = ChkNotificacion.Checked UpAgregar.Update() End Sub + Protected Sub ChkNotificacionApartirDe_CheckedChanged(sender As Object, e As EventArgs) + DivNotificarApartirDe.Visible = ChkNotificarApartirDe.Checked + UpDdlTrayecto.Update() + End Sub Protected Sub LnkEnviar_Click(sender As Object, e As EventArgs) Dim GvRow As GridViewRow = DirectCast(DirectCast(sender, LinkButton).NamingContainer, GridViewRow)