Imports System.Data Imports Extensiones Imports System.Web.Services Imports Newtonsoft.Json Imports ADSNetLibrary.SIGAPI.Models.CRM.Request Imports ADSNetLibrary.SIGAPI.Services.CRM Imports MoreLinq Imports System.Globalization Partial Class General_Dashboard Inherits ClsPaginas Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not IsPostBack Then BindDropdown() ddlDashboardOption.SelectedValue = "1" ' Opción por defecto: Ingresos LoadDashboard() End If End Sub Protected Sub ddlDashboardOption_SelectedIndexChanged(sender As Object, e As EventArgs) LoadDashboard() End Sub Private Sub BindDropdown() ' Actualmente las opciones están definidas en el markup ' Aquí podrías cargar dinámicamente si lo deseas en el futuro End Sub Private Sub LoadDashboard() Dim opcion As Integer = Integer.Parse(ddlDashboardOption.SelectedValue) Dim hoy As DateTime = DateTime.Now Dim inicio As DateTime = New DateTime(hoy.Year, 1, 1) Dim Gral As New ClsGenerales Gral.GetDashboardData(opcion, UsuarioActual.CveEmpresa, inicio, hoy) Dim ds As DataSet = Gral.DSResultados If ds Is Nothing Then Return ' Selecciona la vista según la opción elegida mvDashboard.ActiveViewIndex = opcion - 1 ' Asume que la primera opción = ViewIndex 0 Select Case opcion Case 1 ' Ingresos ProcesarDatosIndicadores(ds.Tables("Indicadores")) CargarResumenSucursales(ds.Tables("DetalleDia")) CargarVentasMensuales(ds.Tables("DetalleAnualesMes")) CargarVentasPorSucursal(ds.Tables("DetalleDia")) CargarVentasPorVendedor(ds.Tables("VentasPorVendedor")) CargarVentasPorClasificacion(ds.Tables("VentasPorClasificacion")) CargarVentasPorMarca(ds.Tables("VentasPorMarca")) CargarVentasPorPS(ds.Tables("VentasPorPS")) CargarVentasPorCliente(ds.Tables("VentasPorCliente")) CargarVentasPorProveedor(ds.Tables("VentasPorProveedor")) Case 2 ' Recuperación ' TODO: Implementar carga de indicadores, gráficas y grids para Recuperación Case 3 ' Compras ' TODO: Implementar carga para Compras Case 4 ' Gasto ' TODO: Implementar carga para Gasto Case 5 ' Cuentas por Pagar ' TODO: Implementar carga para CxP Case 6 ' Inventario ' TODO: Implementar carga para Inventario Case 7 ' Utilidad ' TODO: Implementar carga para Utilidad Case 8 ' Impuestos ' TODO: Implementar carga para Impuestos Case 9 ' CRM ' TODO: Implementar carga para CRM Case 10 ' RH ' TODO: Implementar carga para RH Case 11 ' AF ' TODO: Implementar carga para AF End Select End Sub Protected Sub LnkExportarPDF_Click(sender As Object, e As EventArgs) Handles LnkExportarPDF.Click UPDashboard.Update() ' Clonar todo el UpdatePanel Dim clonedPanel As New UpdatePanel() clonedPanel.ID = "ClonedDashboard" clonedPanel.ContentTemplateContainer.Controls.Add(UPDashboard.ContentTemplateContainer) ' Usar el método mejorado clonedPanel.GenerarReportePDF("Reporte_Dashboard") End Sub Private Sub CargarIndicadores(dt As DataTable) If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then ProcesarDatosIndicadores(dt) End If End Sub Private Sub ProcesarDatosIndicadores(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dr As DataRow = dt.Rows(0) ' Indicador Año MuestraIndicador(DivIndicadoresLeft, "blue", "fa fa-calendar", "Año Actual", dr("AcumAño").ToString.FormatoNumero(0), "#", "Acumulado", dr("AcumAñoPromedio").ToString.FormatoNumero(0), "#", "Ticket Promedio", dr("AcumAñoContado").ToString.FormatoNumero(0), "#", "Contado", dr("AcumAñoCredito").ToString.FormatoNumero(0), "#", "Crédito") ' Indicador Mes MuestraIndicador(DivIndicadoresLeft, "green", "fa fa-calendar-check-o", "Mes Actual", dr("AcumMes").ToString.FormatoNumero(0), "#", "Acumulado", dr("AcumMesPromedio").ToString.FormatoNumero(0), "#", "Ticket Promedio", dr("AcumMesContado").ToString.FormatoNumero(0), "#", "Contado", dr("AcumMesCredito").ToString.FormatoNumero(0), "#", "Crédito") ' Indicador Semana MuestraIndicador(DivIndicadoresRight, "purple", "fa fa-calendar-minus-o", "Semana Actual", dr("AcumSemana").ToString.FormatoNumero(0), "#", "Acumulado", dr("AcumSemanaPromedio").ToString.FormatoNumero(0), "#", "Ticket Promedio", dr("AcumSemanaContado").ToString.FormatoNumero(0), "#", "Contado", dr("AcumSemanaCredito").ToString.FormatoNumero(0), "#", "Crédito") MuestraIndicador(DivIndicadoresRight, "red", "fa fa-sun-o", "Hoy", "0".FormatoNumero(0), "#", "Acumulado", "0".FormatoNumero(0), "#", "Ticket Promedio", "0".FormatoNumero(0), "#", "Contado", "0".FormatoNumero(0), "#", "Crédito") End Sub Private Sub CargarVentasMensuales(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim mesesOrdenados = ObtenerMesesOrdenados() Dim años = dt.AsEnumerable() _ .Select(Function(r) r.Field(Of Integer)("Año")) _ .Distinct() _ .OrderBy(Function(y) y) _ .ToList() Dim seriesData As New List(Of Dictionary(Of String, Object)) For Each año In años Dim añoData = dt.AsEnumerable() _ .Where(Function(r) r.Field(Of Integer)("Año") = año) _ .OrderBy(Function(r) r.Field(Of DateTime)("Fecha")) _ .ToList() Dim dataPoints As New List(Of Object()) For Each dr In añoData Dim fecha = dr.Field(Of DateTime)("Fecha") Dim mesIndex = fecha.Month - 1 dataPoints.Add({mesIndex, dr("Total").ToString.ToDecimal()}) Next seriesData.Add(New Dictionary(Of String, Object) From { {"name", año.ToString}, {"data", dataPoints}, {"color", GetColorForYear(años.IndexOf(año))} }) Next Dim chartOptions = New With { .chart = New With {.type = "line"}, .title = New With {.text = "Ventas Mensuales por Año"}, .xAxis = New With { .type = "category", .categories = mesesOrdenados, .title = New With {.text = "Mes"} }, .yAxis = New With { .title = New With {.text = "Ventas (MXN)"}, .labels = New With {.format = "${value:,.0f}"} }, .tooltip = New With { .headerFormat = "{series.name}
", .pointFormat = "Mes: {point.category}
Total: ${point.y:,.2f} MXN" }, .series = seriesData } Dim script = $" Highcharts.chart('divVentasMensuales', {JsonConvert.SerializeObject(chartOptions)}); " ScriptManager.RegisterStartupScript(Me, Me.GetType(), "graficaVentas", script, True) End Sub Private Sub CargarResumenSucursales(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If ' Crear estructura para el GridView Dim dtGrid = New DataTable() dtGrid.Columns.Add("Sucursal", GetType(String)) dtGrid.Columns.Add("VentaAnual", GetType(Decimal)) dtGrid.Columns.Add("UtilidadAnual", GetType(Decimal)) dtGrid.Columns.Add("VentaMensual", GetType(Decimal)) dtGrid.Columns.Add("UtilidadMensual", GetType(Decimal)) ' Solo agregar filas que no sean el total For Each row As DataRow In dt.Rows If row("Sucursal").ToString() <> "Total" Then Dim newRow = dtGrid.NewRow() newRow("Sucursal") = row("Sucursal") newRow("VentaAnual") = If(IsDBNull(row("Año Actual")), 0D, row("Año Actual")) newRow("UtilidadAnual") = If(IsDBNull(row("Utilidad")), 0D, row("Utilidad")) newRow("VentaMensual") = If(IsDBNull(row("Mes Actual")), 0D, row("Mes Actual")) newRow("UtilidadMensual") = If(IsDBNull(row("UtilidadMes")), 0D, row("UtilidadMes")) dtGrid.Rows.Add(newRow) End If Next gvResumenSucursales.DataSource = dtGrid gvResumenSucursales.DataBind() End Sub Private Sub CargarVentasPorSucursal(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("Sucursal", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("Sucursal").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("Sucursal") = row("Sucursal") nr("Año") = If(IsDBNull(row("Año Actual")), 0D, row("Año Actual")) nr("Mes") = If(IsDBNull(row("Mes Actual")), 0D, row("Mes Actual")) nr("Semana") = If(IsDBNull(row("Semana Actual")), 0D, row("Semana Actual")) nr("Día") = If(IsDBNull(row("Vendido")), 0D, row("Vendido")) dtGrid.Rows.Add(nr) End If Next gvVentasPorSucursal.DataSource = dtGrid gvVentasPorSucursal.DataBind() End Sub Private Sub CargarVentasPorVendedor(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("Vendedor", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("Vendedor").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("Vendedor") = row("Vendedor") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorVendedor.DataSource = dtGrid gvVentasPorVendedor.DataBind() End Sub Private Sub CargarVentasPorClasificacion(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("Clasificacion", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("Clasificacion").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("Clasificacion") = row("Clasificacion") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorClasificacion.DataSource = dtGrid gvVentasPorClasificacion.DataBind() End Sub Private Sub CargarVentasPorMarca(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("Marca", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("Marca").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("Marca") = row("Marca") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorMarca.DataSource = dtGrid gvVentasPorMarca.DataBind() End Sub Private Sub CargarVentasPorPS(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("ProductoServicio", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("ProductoServicio").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("ProductoServicio") = row("ProductoServicio") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorPS.DataSource = dtGrid gvVentasPorPS.DataBind() End Sub Private Sub CargarVentasPorCliente(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("NombreCliente", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("NombreCliente").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("NombreCliente") = row("NombreCliente") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorCliente.DataSource = dtGrid gvVentasPorCliente.DataBind() End Sub Private Sub CargarVentasPorProveedor(dt As DataTable) If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return End If Dim dtGrid = New DataTable() dtGrid.Columns.Add("NombreProveedor", GetType(String)) dtGrid.Columns.Add("Año", GetType(Decimal)) dtGrid.Columns.Add("Mes", GetType(Decimal)) dtGrid.Columns.Add("Semana", GetType(Decimal)) dtGrid.Columns.Add("Día", GetType(Decimal)) For Each row As DataRow In dt.Rows If row("NombreProveedor").ToString() <> "Total" Then Dim nr = dtGrid.NewRow() nr("NombreProveedor") = row("NombreProveedor") nr("Año") = If(IsDBNull(row("Año")), 0D, row("Año")) nr("Mes") = If(IsDBNull(row("Mes")), 0D, row("Mes")) nr("Semana") = If(IsDBNull(row("Semana")), 0D, row("Semana")) nr("Día") = If(IsDBNull(row("Dia")), 0D, row("Dia")) dtGrid.Rows.Add(nr) End If Next gvVentasPorProveedor.DataSource = dtGrid gvVentasPorProveedor.DataBind() End Sub Private Function ObtenerMesesOrdenados() As List(Of String) Return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames _ .Take(12) _ .Select(Function(m) m) _ .ToList() End Function Private Function GetColorForYear(index As Integer) As String ' Paleta de colores para las series Dim colors = {"#3598dc", "#32c5d2", "#8e44ad", "#e7505a", "#1bbc9b", "#f3c200"} Return colors(index Mod colors.Length) End Function Private Sub MuestraIndicador(DIV As HtmlGenericControl, Color As String, Icono As String, Titulo As String, Comentario As String, Link As String, TitleComentario As String) Dim htmldiv As New StringBuilder htmldiv.AppendFormat("{0}
", DIV.InnerHtml, Color, Icono) htmldiv.AppendFormat("
{0}
Ver Más
", Link) DIV.InnerHtml = htmldiv.ToString End Sub Private Sub MuestraIndicador(DIV As HtmlGenericControl, Color As String, Icono As String, Titulo As String, C1 As String, CL1 As String, CT1 As String, C2 As String, CL2 As String, CT2 As String) Dim htmldiv As New StringBuilder htmldiv.AppendFormat("{0}
", DIV.InnerHtml, Color, Icono) htmldiv.AppendFormat("
{0}
", Titulo) htmldiv.AppendFormat("", CT1, C1) htmldiv.AppendFormat("", CT2, C2) htmldiv.Append("
Ver Más ") htmldiv.AppendFormat("
") DIV.InnerHtml = htmldiv.ToString End Sub Private Sub MuestraIndicador(DIV As HtmlGenericControl, Color As String, Icono As String, Titulo As String, C1 As String, CL1 As String, CT1 As String, C2 As String, CL2 As String, CT2 As String, C3 As String, CL3 As String, CT3 As String) Dim htmldiv As New StringBuilder htmldiv.AppendFormat("{0}
", DIV.InnerHtml, Color, Icono) htmldiv.AppendFormat("
{0}
", Titulo) htmldiv.AppendFormat("", CT1, C1) htmldiv.AppendFormat("", CT2, C2) htmldiv.AppendFormat("", CT3, C3) htmldiv.Append("
Ver Más ") htmldiv.AppendFormat("
") DIV.InnerHtml = htmldiv.ToString End Sub Private Sub MuestraIndicador(DIV As HtmlGenericControl, Color As String, Icono As String, Titulo As String, C1 As String, CL1 As String, CT1 As String, C2 As String, CL2 As String, CT2 As String, C3 As String, CL3 As String, CT3 As String, C4 As String, CL4 As String, CT4 As String) Dim htmldiv As New StringBuilder htmldiv.AppendFormat("{0}
", DIV.InnerHtml, Color, Icono) htmldiv.AppendFormat("
{0}
", Titulo, CT1, C1) htmldiv.AppendFormat("", CT2, C2) htmldiv.AppendFormat("", CT3, C3) htmldiv.AppendFormat("", CT4, C4) htmldiv.AppendFormat("
Ver Más
", CL1) DIV.InnerHtml = htmldiv.ToString End Sub End Class