<%@ WebHandler Language="VB" Class="E141" %> Option Strict On Option Explicit On Imports System.Data Imports System.Net.Http Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq Imports Extensiones Public Class E141 : Implements IHttpHandler Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property Private ReadOnly Property CveEmpresa As Integer = 141 Public ReadOnly Property EsProduccion As Boolean Get If IsNothing(System.Configuration.ConfigurationManager.AppSettings("EsProduccion")) Then Return False Else Return (System.Configuration.ConfigurationManager.AppSettings("EsProduccion").ToString() = "1") End If End Get End Property Public ReadOnly Property UsuarioWSE141 As String Get If IsNothing(System.Configuration.ConfigurationManager.AppSettings("UsuarioWSE141")) Then Return "" Else Return System.Configuration.ConfigurationManager.AppSettings("UsuarioWSE141").ToString() End If End Get End Property Public ReadOnly Property PasswordWSE141 As String Get If IsNothing(System.Configuration.ConfigurationManager.AppSettings("PasswordWSE141")) Then Return "" Else Return System.Configuration.ConfigurationManager.AppSettings("PasswordWSE141").ToString() End If End Get End Property Public ReadOnly Property TokenAutorizacion As String Get If EsProduccion Then Return "$2y$10$8Mk3YeIkJESilIwD.U5dG.SsA4JloycJKbaGls8TNEw/AKBE1qane" Else Return "$2y$10$8Mk3YeIkJESilIwD.U5dG.SsA4JloycJKbaGls8TNEw/AKBE1qane" End If End Get End Property Public ReadOnly Property URLBase As String Get If EsProduccion Then Return "https://econollantas-pruebas.fidelityapps.mx" Else Return "https://econollantas-pruebas.fidelityapps.mx/" End If End Get End Property Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest Dim retorno As String = "" Try Dim Params = If(context.Request("P") = Nothing, "", context.Request("P").ToString()) 'DESCARGA DEL PDF If Not String.IsNullOrEmpty(Params) Then Dim UrlParametros As Hashtable = Parametros(Decripta(Params)) Dim File As String = UrlParametros("FILE").ToString() If Not String.IsNullOrEmpty(File) Then ImprimirbytesPDF(context, DescargarFactura(File), File) End If Else Dim Metodo = If(context.Request("Metodo") = Nothing, "", context.Request("Metodo").ToString()) 'OBTENER EXISTENCIAS If Metodo = "GetExistencia" Then context.Response.ContentType = "application/json" Dim Codigo = If(context.Request("Sku") = Nothing, "", context.Request("Sku").ToString()) retorno = GetExistencia(context, Codigo) Else context.Response.ContentType = "text/html" Dim FiltrarTodos = If(context.Request("FiltrarTodos") = Nothing, "", context.Request("FiltrarTodos").ToString()) Dim respuesta As Boolean = False 'TAREAS PROGRAMADAS Select Case Metodo Case "CrearActualizarProductos" respuesta = CrearActualizarProductos(If(FiltrarTodos = "1", True, False)) Case "ActualizarPrecios" respuesta = ActualizarPrecios(If(FiltrarTodos = "1", True, False)) Case "ActualizarExistencias" respuesta = ActualizarExistencias() Case "ActualizarVendedores" respuesta = ActualizarVendedores(If(FiltrarTodos = "1", True, False)) End Select If respuesta Then retorno = "True" Else retorno = "False" End If End If context.Response.Write(retorno) End If Catch ex As Exception context.Response.ContentType = "text/html" retorno = ex.ToString() ex.GuardaLog(ex.ToString()) context.Response.Write(retorno) End Try End Sub Private Function GetExistencia(ByVal context As HttpContext, Codigo As String) As String Dim respuesta = New With {.isSuccess = False, .message = "", .products = New JArray} If String.IsNullOrEmpty(Codigo) OrElse Codigo = "-1" Then respuesta.message = "el parametro 'Sku' es invalido" respuesta.isSuccess = False Return JsonConvert.SerializeObject(respuesta) End If Dim unauthorized As Boolean = True Dim authHeader = context.Request.Headers("Authorization") If authHeader IsNot Nothing Then Dim basicAuth As String = authHeader.Replace("Basic ", "") Dim usernamePasswordArray = Encoding.UTF8.GetString(Convert.FromBase64String(basicAuth)).Split(":"c) Dim userName = usernamePasswordArray(0) Dim password = usernamePasswordArray(1) unauthorized = Not (userName = Me.UsuarioWSE141 AndAlso password = Me.PasswordWSE141) Else respuesta.message = "el usuario y/o contraseña son requeridos" respuesta.isSuccess = False 'context.Response.StatusCode = 401 Return JsonConvert.SerializeObject(respuesta) End If If unauthorized Then respuesta.message = "el usuario y/o contraseña no son validos" respuesta.isSuccess = False 'context.Response.StatusCode = 401 Return JsonConvert.SerializeObject(respuesta) End If Using ObjPS As New ClsProductosServicios() If ObjPS.GetExistenciasEmpresa(Codigo, CveEmpresa) Then Dim ArrayPS As New JArray If ObjPS.DtResultados.Rows.Count > 0 Then For Each RowPS As DataRow In ObjPS.DtResultados.Rows Dim producto As New JObject( New JProperty("sku", RowPS("Codigo")), New JProperty("stock", RowPS("Existencia")) ) ArrayPS.Add(producto) Next respuesta.isSuccess = True respuesta.message = "La existencia se obtuvo correctamente" Else respuesta.isSuccess = True respuesta.message = "No se encontro ningun producto" End If respuesta.products = ArrayPS Else respuesta.isSuccess = False respuesta.message = "Ocurrió un error al obtener la existencia" End If End Using Return JsonConvert.SerializeObject(respuesta) End Function Private Function EnviarInformacion(url As String, payload 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("token", TokenAutorizacion) Using content = New StringContent(payload, Encoding.UTF8, "application/json") request.Content = content Dim response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result If response.StatusCode = Net.HttpStatusCode.OK Then Retorno = response.Content.ReadAsStringAsync().Result End If End Using End Using End Using Catch ex As Exception Retorno = New JObject(New JProperty("Error", ex.ToString())).ToString() OnError("Ocurrió un error al enviar la informacion", ex) End Try Return Retorno End Function 'Private Function EnviarInformacion2(url As String, payload As String) As String ' Dim Retorno As String = "{}" ' Try ' Dim Request As WebRequest = WebRequest.Create(url) ' Request.Method = "post" ' Request.ContentType = "application/json" ' Request.Headers.Add("token", TokenAutorizacion) ' Dim byteArray As Byte() = Encoding.UTF8.GetBytes(payload) ' Request.ContentLength = byteArray.Length ' Using dataStream As Stream = Request.GetRequestStream() ' dataStream.Write(byteArray, 0, byteArray.Length) ' Using tResponse As WebResponse = Request.GetResponse() ' Using dataStreamResponse As Stream = tResponse.GetResponseStream() ' Using tReader As New StreamReader(dataStreamResponse) ' Retorno = tReader.ReadToEnd() ' End Using ' End Using ' End Using ' End Using ' Catch ex As Exception ' Retorno = New JObject(New JProperty("Error", ex.ToString())).ToString() ' OnError("Ocurrió un error al enviar la informacion", ex) ' End Try ' Return Retorno 'End Function #Region "C R E A C I Ó N / A C T U A L I Z A C I Ó N - P R O D U C T O S" Private Function CrearActualizarProductos(Todos As Boolean) As Boolean Dim Retorno As Boolean = False Dim CountPeticiones As Integer = 0, CountPeticionesExitosas As Integer = 0 Dim DtPS As DataTable = Nothing Using ObjPS As New ClsProductosServicios 'OBTERNER PRECIOS DE PUBLICO GENERAL If ObjPS.GetProductosModificados(CveEmpresa, 44, If(Todos, -1, 1)) Then DtPS = ObjPS.DtResultados.Copy() End If End Using If DtPS IsNot Nothing Then If DtPS.Rows.Count > 0 AndAlso DtPS.Rows.Count = 1 Then Dim Dt As DataTable = DtPS.FiltraPorIndices(0, 0) Dim payload = New JObject() payload.Add(New JProperty("products", GenerarPayloadProductos(Dt))) Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/import", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Else Dim TotalIndex As Integer = DtPS.Rows.Count - 1 Dim TotaRegistrosPorPeticion As Integer = 500 Dim PrevIndex As Integer = 0 Dim CurrentIndex As Integer = 0 While PrevIndex < TotalIndex CurrentIndex += TotaRegistrosPorPeticion If CurrentIndex > TotalIndex Then CurrentIndex = TotalIndex End If Dim Dt As DataTable = DtPS.FiltraPorIndices(PrevIndex, CurrentIndex) Dim payload = New JObject() 'If Not EsProduccion Then ' payload.Add(New JProperty("deleteNotIncluded", True)) 'End If payload.Add(New JProperty("products", GenerarPayloadProductos(Dt))) PrevIndex = CurrentIndex Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/import", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Threading.Thread.Sleep(3000) End While End If End If If CountPeticionesExitosas = CountPeticiones Then Retorno = True End If Return Retorno End Function Private Function GenerarPayloadProductos(DtPS As DataTable) As JArray Dim ArrayPS As New JArray For Each RowPS As DataRow In DtPS.Rows Dim PSData As String() = RowPS("PS").ToString().Split(" ".ToCharArray()) Dim Measurement As String = "", Size As String = "", alt_code As String = "" If PSData.Length > 0 Then Measurement = PSData(0) End If If PSData.Length > 1 Then Size = PSData(1) End If alt_code = String.Concat(Measurement, Size) Dim producto As New JObject( New JProperty("clasificacion", RowPS("Clasificacion")), New JProperty("category", "Prod"), New JProperty("pza", RowPS("Unidad")), New JProperty("sku", RowPS("Codigo")), New JProperty("name", RowPS("PS")), New JProperty("measurement", Measurement), New JProperty("size", Size), New JProperty("brand", RowPS("Marca")), New JProperty("price", RowPS("Precio")), New JProperty("active", RowPS("Estado")), New JProperty("user", RowPS("UsuarioModifico")), New JProperty("alt_code", alt_code), New JProperty("short_description", ""), New JProperty("description", ""), New JProperty("currency", 1), New JProperty("promo_price", RowPS("PrecioPromocion")) ) ArrayPS.Add(producto) Next Return ArrayPS End Function #End Region #Region "A C T U A L I Z A R - P R E C I O S" 'Private Function ActualizarPrecios(Todos As Boolean) As String ' Return EnviarInformacion($"{Me.URLBase}api/services/products/price-import", GetPreciosModificados(Todos)) 'End Function Private Function ActualizarPrecios(Todos As Boolean) As Boolean Dim Retorno As Boolean = False Dim CountPeticiones As Integer = 0, CountPeticionesExitosas As Integer = 0 Dim DtPS As DataTable = Nothing Using ObjPS As New ClsProductosServicios 'OBTERNER PRECIOS DE PUBLICO GENERAL If ObjPS.GetPreciosModificados(CveEmpresa, 44, If(Todos, -1, 1)) Then DtPS = ObjPS.DtResultados.Copy() End If End Using If DtPS IsNot Nothing Then If DtPS.Rows.Count > 0 AndAlso DtPS.Rows.Count = 1 Then Dim Dt As DataTable = DtPS.FiltraPorIndices(0, 0) Dim payload = New JObject() payload.Add(New JProperty("products", GenerarPayloadPrecios(Dt))) Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/price-import", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Else Dim TotalIndex As Integer = DtPS.Rows.Count - 1 Dim TotaRegistrosPorPeticion As Integer = 500 Dim PrevIndex As Integer = 0 Dim CurrentIndex As Integer = 0 While PrevIndex < TotalIndex CurrentIndex += TotaRegistrosPorPeticion If CurrentIndex > TotalIndex Then CurrentIndex = TotalIndex End If Dim Dt As DataTable = DtPS.FiltraPorIndices(PrevIndex, CurrentIndex) Dim payload = New JObject() payload.Add(New JProperty("products", GenerarPayloadPrecios(Dt))) PrevIndex = CurrentIndex Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/price-import", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Threading.Thread.Sleep(3000) End While End If End If Return Retorno End Function Private Function GenerarPayloadPrecios(DtPS As DataTable) As JArray Dim ArrayPS As New JArray For Each RowPS As DataRow In DtPS.Rows Dim producto As New JObject( New JProperty("sku", RowPS("Codigo")), New JProperty("price", RowPS("Precio")), New JProperty("promo_price", RowPS("PrecioPromocion")) ) ArrayPS.Add(producto) Next Return ArrayPS End Function #End Region #Region "A C T U A L I Z A R - E X I S T E N C I A S" 'Private Function ActualizarExistencias() As String ' Return EnviarInformacion($"{Me.URLBase}api/services/products/stock", GetPSExistencias()) 'End Function Private Function ActualizarExistencias() As Boolean Dim Retorno As Boolean = False Dim CountPeticiones As Integer = 0, CountPeticionesExitosas As Integer = 0 Dim DtPS As DataTable = Nothing Using ObjPS As New ClsProductosServicios 'OBTERNER PRECIOS DE PUBLICO GENERAL If ObjPS.GetExistenciasEmpresa("-1", CveEmpresa) Then DtPS = ObjPS.DtResultados.Copy() End If End Using If DtPS IsNot Nothing Then If DtPS.Rows.Count > 0 AndAlso DtPS.Rows.Count = 1 Then Dim Dt As DataTable = DtPS.FiltraPorIndices(0, 0) Dim payload = New JObject() payload.Add(New JProperty("stock", GenerarPayloadExistencias(Dt))) Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/stock", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Else Dim TotalIndex As Integer = DtPS.Rows.Count - 1 Dim TotaRegistrosPorPeticion As Integer = 500 Dim PrevIndex As Integer = 0 Dim CurrentIndex As Integer = 0 While PrevIndex < TotalIndex CurrentIndex += TotaRegistrosPorPeticion If CurrentIndex > TotalIndex Then CurrentIndex = TotalIndex End If Dim Dt As DataTable = DtPS.FiltraPorIndices(PrevIndex, CurrentIndex) Dim payload = New JObject() payload.Add(New JProperty("stock", GenerarPayloadExistencias(Dt))) PrevIndex = CurrentIndex Dim resp = EnviarInformacion($"{Me.URLBase}api/services/products/stock", payload.ToString()) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If Threading.Thread.Sleep(3000) End While End If End If If CountPeticionesExitosas = CountPeticiones Then Retorno = True End If Return Retorno End Function Private Function GenerarPayloadExistencias(DtPS As DataTable) As JArray Dim ArrayPS As New JArray For Each RowPS As DataRow In DtPS.Rows Dim producto As New JObject( New JProperty("sku", RowPS("Codigo")), New JProperty("branch_office_code", "01"), New JProperty("stock", RowPS("Existencia").ToString()) ) ArrayPS.Add(producto) Next Return ArrayPS End Function #End Region #Region "A C T U A L I Z A R - E X I S T E N C I A S" Private Function ActualizarVendedores(Todos As Boolean) As Boolean Dim Retorno As Boolean = False Dim CountPeticiones As Integer = 0, CountPeticionesExitosas As Integer = 0 Dim DtVendedores As DataTable = Nothing Using ObjPS As New ClsProductosServicios 'OBTERNER PRECIOS DE PUBLICO GENERAL If ObjPS.GetVendedoresModificados(CveEmpresa, If(Todos, -1, 1)) Then DtVendedores = ObjPS.DtResultados.Copy() End If End Using If DtVendedores IsNot Nothing Then Dim ArrayVendedores As New JArray For Each RowVendedor As DataRow In DtVendedores.Rows Dim VendedorData As String() = RowVendedor("Vendedor").ToString().Split(" ".ToCharArray()) Dim Nombre As String = "", Apellido As String = "" Select Case VendedorData.Length Case 1 Nombre = VendedorData(0) Case 2 Nombre = VendedorData(1) Apellido = VendedorData(0) Case 3 Nombre = VendedorData(2) Apellido = String.Concat(VendedorData(0), " ", VendedorData(1)) Case 4 Nombre = String.Concat(VendedorData(2), " ", VendedorData(3)) Apellido = String.Concat(VendedorData(0), " ", VendedorData(1)) End Select If VendedorData.Length > 4 Then Nombre = String.Concat(VendedorData(VendedorData.Length - 1), " ", VendedorData(VendedorData.Length)) Apellido = String.Concat(VendedorData(0), " ", VendedorData(1)) End If Dim vendedor As New JObject( New JProperty("email", RowVendedor("Correo")), New JProperty("password", RowVendedor("Correo")), New JProperty("name", Nombre), New JProperty("last_name", Apellido), New JProperty("type_seller", "Administrador"), New JProperty("state", RowVendedor("Estado")), New JProperty("city", RowVendedor("Municipio")), New JProperty("age", 0), New JProperty("gender", 0), New JProperty("address", ""), New JProperty("code", "") ) ArrayVendedores.Add(vendedor) Next Dim payload = New JObject(New JProperty("sellers", ArrayVendedores)).ToString() Dim resp = EnviarInformacion($"{Me.URLBase}api/v1/sellers/import", payload) CountPeticiones += 1 If IsValidJson(resp) Then Dim respuesta = JObject.Parse(resp) If respuesta("status").ToString() = "success" Then CountPeticionesExitosas += 1 End If End If End If Return Retorno End Function #End Region #Region "D E S C A R G A - P D F" Private Function DescargarFactura(FilePDF As String) As Byte() Dim Url = New Uri(String.Format("{0}Compras/PopUpVerFactura.aspx?TipoDocto=Ing&File={1}&TipoArchivo=PDF", "http://localhost/", FilePDF)) Dim File As Byte() = Nothing Try Using httpClient = New HttpClient() httpClient.Timeout = New TimeSpan(0, 1, 0) Using request = New HttpRequestMessage(HttpMethod.Get, Url) request.Headers.Add("ADSToken", Encripta(String.Format("CVEEMPRESA={0}&TICKS={1}&CVEUSUARIO=100", CveEmpresa, DateTime.UtcNow.Ticks))) Dim response = httpClient.SendAsync(request).Result If response.StatusCode = Net.HttpStatusCode.OK Then File = response.Content.ReadAsByteArrayAsync().Result End If End Using End Using Catch ex As Exception File = Nothing OnError("Ocurrió un error al descargar la factura", ex) End Try Return File End Function Public Sub ImprimirbytesPDF(ByVal context As HttpContext, bytes As Byte(), NombreArchivo As String) 'limpio ReportViwer Dim mimeType As String = Nothing Dim extension As String = Nothing Try bytes = bytes context.Response.Buffer = True context.Response.Clear() context.Response.ContentType = mimeType context.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", NombreArchivo)) context.Response.BinaryWrite(bytes) ' create the file context.Response.Flush() ' send it to the client to download context.Response.SuppressContent = True context.ApplicationInstance.CompleteRequest() context.Response.End() Catch ex As Exception End Try End Sub #End Region Private Function Parametros(Cadena As String) As Hashtable Dim P1() As String = Cadena.Split("&"c) Dim Tmp As String Dim P2() As String Dim URLParametros As New Hashtable For Each Tmp In P1 P2 = Tmp.Replace("%26%", "&").Split("="c) URLParametros.Add(P2(0).ToString.ToUpper, P2(1)) Next Return URLParametros End Function Private Shared Function IsValidJson(ByVal strInput As String) As Boolean If String.IsNullOrWhiteSpace(strInput) Then Return False End If strInput = strInput.Trim() If (strInput.StartsWith("{") AndAlso strInput.EndsWith("}")) OrElse (strInput.StartsWith("[") AndAlso strInput.EndsWith("]")) Then Try Dim obj = JToken.Parse(strInput) Return True Catch jex As JsonReaderException Console.WriteLine(jex.Message) Return False Catch ex As Exception Console.WriteLine(ex.ToString()) Return False End Try Else Return False End If End Function End Class