Cambios en Dashboard Opcion 4
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -25,8 +25,7 @@ Partial Class General_Dashboard
|
||||
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
|
||||
|
||||
Public Overrides Sub VerifyRenderingInServerForm(control As Control)
|
||||
@@ -49,7 +48,7 @@ Partial Class General_Dashboard
|
||||
|
||||
Select Case opcion
|
||||
Case 1 ' Ingresos
|
||||
ProcesarDatosIndicadores(ds.Tables("Indicadores"))
|
||||
IndicadoresIngresos(ds.Tables("Indicadores"))
|
||||
CargarResumenSucursales(ds.Tables("DetalleDia"))
|
||||
CargarVentasMensuales(ds.Tables("DetalleAnualesMes"))
|
||||
|
||||
@@ -63,79 +62,88 @@ Partial Class General_Dashboard
|
||||
|
||||
|
||||
Case 2 ' Recuperación
|
||||
' TODO: Implementar carga de indicadores, gráficas y grids para Recuperación
|
||||
IndicadoresRecuperacionCxc(ds.Tables("CarteraPorSubproyecto"), ds.Tables("RecuperacionPorSubproyecto"))
|
||||
|
||||
CargarCarteraPorSucursal(ds.Tables("CarteraPorSubproyecto"))
|
||||
CargarCarteraPorVendedor(ds.Tables("CarteraPorVendedor"))
|
||||
CargarRecuperacionPorSucursal(ds.Tables("RecuperacionPorSubproyecto"))
|
||||
CargarRecuperacionPorCliente(ds.Tables("RecuperacionPorCliente"))
|
||||
CargarCxCMensual(ds.Tables("CxCMensual"))
|
||||
|
||||
Case 3 ' Compras
|
||||
' TODO: Implementar carga para Compras
|
||||
CargarComprasPorClasificacion(ds.Tables("ComprasPorClasificación"))
|
||||
CargarComprasPorMarca(ds.Tables("ComprasPorMarca"))
|
||||
CargarComprasPorPS(ds.Tables("ComprasPorPS"))
|
||||
CargarComprasPorProveedor(ds.Tables("ComprasPorProveedor"))
|
||||
|
||||
Case 4 ' Gasto
|
||||
' TODO: Implementar carga para Gasto
|
||||
Case 4 ' Cuentas por Pagar
|
||||
IndicadoresCxP(ds.Tables("CxPPorSubproyecto"), ds.Tables("PagosPorSubproyecto"))
|
||||
|
||||
Case 5 ' Cuentas por Pagar
|
||||
' TODO: Implementar carga para CxP
|
||||
' Cargar GridViews
|
||||
CargarCxPPorSucursal(ds.Tables("CxPPorSubproyecto"))
|
||||
CargarCxPPorProveedor(ds.Tables("CxPPorProveedor"))
|
||||
CargarPagosPorSucursal(ds.Tables("PagosPorSubproyecto"))
|
||||
CargarPagosPorProveedor(ds.Tables("PagosPorProveedor"))
|
||||
CargarCxPMensual(ds.Tables("CxPMensual"))
|
||||
|
||||
Case 6 ' Inventario
|
||||
Case 5 ' Inventario
|
||||
' TODO: Implementar carga para Inventario
|
||||
|
||||
Case 7 ' Utilidad
|
||||
Case 6 ' Utilidad
|
||||
' TODO: Implementar carga para Utilidad
|
||||
|
||||
Case 8 ' Impuestos
|
||||
Case 7 ' Impuestos
|
||||
' TODO: Implementar carga para Impuestos
|
||||
|
||||
Case 9 ' CRM
|
||||
Case 8 ' CRM
|
||||
' TODO: Implementar carga para CRM
|
||||
|
||||
Case 10 ' RH
|
||||
Case 9 ' RH
|
||||
' TODO: Implementar carga para RH
|
||||
|
||||
Case 11 ' AF
|
||||
Case 10 ' AF
|
||||
' TODO: Implementar carga para AF
|
||||
End Select
|
||||
End Sub
|
||||
|
||||
Protected Sub LnkExportarPDF_Click(sender As Object, e As EventArgs) Handles LnkExportarPDF.Click
|
||||
DivIndicadoresLeft.InnerHtml &= DivIndicadoresRight.InnerHtml
|
||||
DivIndicadoresRight.InnerHtml = String.Empty
|
||||
DivIndicadoresIngresosLeft.InnerHtml &= DivIndicadoresIngresosRight.InnerHtml
|
||||
DivIndicadoresIngresosRight.InnerHtml = String.Empty
|
||||
pnlDashboard.GenerarReportePDF("Reporte Resumen de Indicadores")
|
||||
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)
|
||||
Private Sub IndicadoresIngresos(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",
|
||||
DivIndicadoresIngresosLeft.InnerHtml = String.Empty
|
||||
DivIndicadoresIngresosRight.InnerHtml = String.Empty
|
||||
|
||||
' Indicador Año
|
||||
MuestraIndicador(DivIndicadoresIngresosLeft, "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",
|
||||
' Indicador Mes
|
||||
MuestraIndicador(DivIndicadoresIngresosLeft, "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",
|
||||
' Indicador Semana
|
||||
MuestraIndicador(DivIndicadoresIngresosRight, "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",
|
||||
MuestraIndicador(DivIndicadoresIngresosRight, "red", "fa fa-sun-o", "Hoy",
|
||||
"0".FormatoNumero(0), "#", "Acumulado",
|
||||
"0".FormatoNumero(0), "#", "Ticket Promedio",
|
||||
"0".FormatoNumero(0), "#", "Contado",
|
||||
@@ -143,6 +151,133 @@ Partial Class General_Dashboard
|
||||
|
||||
End Sub
|
||||
|
||||
Private Sub IndicadoresRecuperacionCxc(dtCartera As DataTable, dtRecuperacion As DataTable)
|
||||
If dtCartera Is Nothing OrElse dtCartera.Rows.Count = 0 Then Return
|
||||
If dtRecuperacion Is Nothing OrElse dtRecuperacion.Rows.Count = 0 Then Return
|
||||
|
||||
' Calcular totales para Cartera Vencida
|
||||
Dim totalVencido As Decimal = 0
|
||||
Dim totalPorVencer As Decimal = 0
|
||||
Dim totalCxC As Decimal = 0
|
||||
Dim maxRotacion As Decimal = 0
|
||||
|
||||
For Each row As DataRow In dtCartera.Rows
|
||||
totalVencido += If(IsDBNull(row("Vencido")), 0D, row("Vencido")).ToString.ToDecimal()
|
||||
totalPorVencer += If(IsDBNull(row("Por Vencer")), 0D, row("Por Vencer")).ToString.ToDecimal()
|
||||
If dtCartera.Columns.Contains("RotacionCartera") AndAlso Not IsDBNull(row("RotacionCartera")) Then
|
||||
Dim rotacion = Convert.ToDecimal(row("RotacionCartera"))
|
||||
If rotacion > maxRotacion Then maxRotacion = rotacion
|
||||
End If
|
||||
|
||||
Next
|
||||
|
||||
totalCxC = totalVencido + totalPorVencer
|
||||
|
||||
' Calcular total para Recuperación
|
||||
Dim totalRecuperado As Decimal = 0
|
||||
For Each row As DataRow In dtRecuperacion.Rows
|
||||
totalRecuperado += If(IsDBNull(row("Recuperado")), 0D, row("Recuperado")).ToString.ToDecimal()
|
||||
Next
|
||||
|
||||
DivIndicadoresRecuperacionLeft.InnerHtml = ""
|
||||
DivIndicadoresRecuperacionRight.InnerHtml = ""
|
||||
|
||||
' Indicador Cartera Vencida
|
||||
MuestraIndicador(DivIndicadoresRecuperacionLeft, "blue", "fa fa-calendar", "Cartera Vencida",
|
||||
totalCxC.ToString.FormatoNumero(0), "#", "CxC",
|
||||
totalVencido.ToString.FormatoNumero(0), "#", "Vencido",
|
||||
totalPorVencer.ToString.FormatoNumero(0), "#", "Por Vencer")
|
||||
|
||||
'Indicador KPI Recuperación
|
||||
MuestraIndicadorKPI(DivIndicadoresRecuperacionLeft, "purple", "fa fa-usd",
|
||||
"Recuperación",
|
||||
totalRecuperado.ToString.FormatoNumero(0),
|
||||
"#",
|
||||
"Recuperación")
|
||||
|
||||
Dim factorRecuperacion As Decimal = 0
|
||||
If totalCxC > 0 Then
|
||||
factorRecuperacion = (totalRecuperado / totalCxC)
|
||||
End If
|
||||
|
||||
MuestraIndicadorKPI(DivIndicadoresRecuperacionRight, "green", "fa fa-fa-percent",
|
||||
"Factor Recuperación",
|
||||
factorRecuperacion.ToString("N2") & "%",
|
||||
"#",
|
||||
"Porcentaje de cartera recuperada")
|
||||
|
||||
MuestraIndicadorKPI(DivIndicadoresRecuperacionRight, "red", "fa fa-refresh",
|
||||
"Rotación Cartera",
|
||||
maxRotacion.ToString("N1"),
|
||||
"#",
|
||||
"Máxima rotación de cartera entre sucursales")
|
||||
|
||||
End Sub
|
||||
|
||||
Private Sub IndicadoresCxP(dtCxP As DataTable, dtPagos As DataTable)
|
||||
If dtCxP Is Nothing OrElse dtCxP.Rows.Count = 0 Then Return
|
||||
If dtPagos Is Nothing OrElse dtPagos.Rows.Count = 0 Then Return
|
||||
|
||||
' Calcular totales para CxP
|
||||
Dim totalVencido As Decimal = 0
|
||||
Dim totalPorVencer As Decimal = 0
|
||||
Dim totalCxP As Decimal = 0
|
||||
Dim maxRotacion As Decimal = 0
|
||||
|
||||
For Each row As DataRow In dtCxP.Rows
|
||||
totalVencido += Convert.ToDecimal(If(IsDBNull(row("Vencido")), 0D, row("Vencido")))
|
||||
totalPorVencer += Convert.ToDecimal(If(IsDBNull(row("Por Vencer")), 0D, row("Por Vencer")))
|
||||
|
||||
' Obtener rotación máxima
|
||||
If dtCxP.Columns.Contains("RotacionCartera") AndAlso Not IsDBNull(row("RotacionCartera")) Then
|
||||
Dim rotacion = Convert.ToDecimal(row("RotacionCartera"))
|
||||
If rotacion > maxRotacion Then maxRotacion = rotacion
|
||||
End If
|
||||
Next
|
||||
totalCxP = totalVencido + totalPorVencer
|
||||
|
||||
' Calcular total pagado
|
||||
Dim totalPagado As Decimal = 0
|
||||
For Each row As DataRow In dtPagos.Rows
|
||||
totalPagado += Convert.ToDecimal(If(IsDBNull(row("Recuperado")), 0D, row("Recuperado")))
|
||||
Next
|
||||
|
||||
DivIndicadoresCxPLeft.InnerHtml = ""
|
||||
DivIndicadoresRecuperacionRight.InnerHtml = ""
|
||||
|
||||
' Indicador CxP
|
||||
MuestraIndicador(DivIndicadoresCxPLeft, "blue", "fa fa-calendar", "Cuentas por Pagar",
|
||||
totalCxP.ToString.FormatoNumero(0), "#", "Total CxP",
|
||||
totalVencido.ToString.FormatoNumero(0), "#", "Vencido",
|
||||
totalPorVencer.ToString.FormatoNumero(0), "#", "Por Vencer")
|
||||
|
||||
' KPI Pagado
|
||||
MuestraIndicadorKPI(DivIndicadoresCxPLeft, "purple", "fa fa-usd",
|
||||
"Total Pagado",
|
||||
totalPagado.ToString.FormatoNumero(0),
|
||||
"#",
|
||||
"Total pagado a proveedores")
|
||||
|
||||
' KPI Factor CxP vs Pagado
|
||||
Dim factorPago As Decimal = 0
|
||||
If totalCxP > 0 Then
|
||||
factorPago = (totalPagado / totalCxP) * 100
|
||||
End If
|
||||
|
||||
MuestraIndicadorKPI(DivIndicadoresCxPRight, "green", "fa fa-percent",
|
||||
"Factor Pago",
|
||||
factorPago.ToString("N2") & "%",
|
||||
"#",
|
||||
"Porcentaje de CxP pagado")
|
||||
|
||||
' KPI Rotación de Cartera
|
||||
MuestraIndicadorKPI(DivIndicadoresCxPRight, "red", "fa fa-refresh",
|
||||
"Rotación CxP",
|
||||
maxRotacion.ToString("N1") & " días",
|
||||
"#",
|
||||
"Máxima rotación de CxP entre sucursales")
|
||||
End Sub
|
||||
|
||||
Private Sub CargarVentasMensuales(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
@@ -480,7 +615,420 @@ Partial Class General_Dashboard
|
||||
gvVentasPorProveedor.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarCarteraPorSucursal(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Crear DataTable con estructura necesaria
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("Sucursal", GetType(String))
|
||||
dtGrid.Columns.Add("TotalCxC", GetType(Decimal))
|
||||
dtGrid.Columns.Add("Vencido", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PorVencer", GetType(Decimal))
|
||||
|
||||
For Each row As DataRow In dt.Rows
|
||||
Dim vencido = (If(IsDBNull(row("Vencido")), 0D, row("Vencido"))).ToString.ToDecimal()
|
||||
Dim porVencer = (If(IsDBNull(row("Por Vencer")), 0D, row("Por Vencer"))).ToString.ToDecimal()
|
||||
Dim totalCxC = vencido + porVencer
|
||||
|
||||
dtGrid.Rows.Add(
|
||||
row("Sucursal").ToString(),
|
||||
totalCxC,
|
||||
vencido,
|
||||
porVencer
|
||||
)
|
||||
Next
|
||||
|
||||
gvCarteraPorSucursal.DataSource = dtGrid
|
||||
gvCarteraPorSucursal.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarCarteraPorVendedor(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Crear DataTable con estructura necesaria
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("Vendedor", GetType(String))
|
||||
dtGrid.Columns.Add("TotalCxC", GetType(Decimal))
|
||||
dtGrid.Columns.Add("Vencido", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PorVencer", GetType(Decimal))
|
||||
|
||||
For Each row As DataRow In dt.Rows
|
||||
Dim vencido = Convert.ToDecimal(If(IsDBNull(row("Vencido")), 0D, row("Vencido")))
|
||||
Dim porVencer = Convert.ToDecimal(If(IsDBNull(row("Por Vencer")), 0D, row("Por Vencer")))
|
||||
Dim totalCxC = vencido + porVencer
|
||||
|
||||
dtGrid.Rows.Add(
|
||||
row("Vendedor").ToString(),
|
||||
totalCxC,
|
||||
vencido,
|
||||
porVencer
|
||||
)
|
||||
Next
|
||||
|
||||
gvCarteraPorVendedor.DataSource = dtGrid
|
||||
gvCarteraPorVendedor.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarCxCMensual(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Lista de meses en español
|
||||
Dim mesesOrdenados As New List(Of String) From {
|
||||
"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
|
||||
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
|
||||
}
|
||||
|
||||
' Obtener años distintos de forma segura
|
||||
Dim años As New List(Of Integer)
|
||||
For Each row As DataRow In dt.Rows
|
||||
If Not IsDBNull(row("Año")) Then
|
||||
Dim añoValue As String = row("Año").ToString()
|
||||
Dim añoInt As Integer
|
||||
If Integer.TryParse(añoValue, añoInt) Then
|
||||
If Not años.Contains(añoInt) Then
|
||||
años.Add(añoInt)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
años = años.OrderBy(Function(y) y).ToList()
|
||||
|
||||
Dim seriesData As New List(Of Dictionary(Of String, Object))
|
||||
|
||||
For Each año In años
|
||||
' Filtrar datos para este año
|
||||
Dim añoData = dt.AsEnumerable() _
|
||||
.Where(Function(r) Not IsDBNull(r("Año")) AndAlso
|
||||
Integer.TryParse(r("Año").ToString(), Nothing) AndAlso
|
||||
Convert.ToInt32(r("Año")) = año) _
|
||||
.FirstOrDefault()
|
||||
|
||||
If añoData IsNot Nothing Then
|
||||
Dim dataPoints As New List(Of Object())
|
||||
|
||||
' Obtener valores para cada mes
|
||||
For i = 0 To mesesOrdenados.Count - 1
|
||||
Dim mes = mesesOrdenados(i)
|
||||
If dt.Columns.Contains(mes) Then
|
||||
Dim valor As Decimal = 0D
|
||||
If Not IsDBNull(añoData(mes)) Then
|
||||
' Conversión segura a decimal
|
||||
Decimal.TryParse(añoData(mes).ToString(), valor)
|
||||
End If
|
||||
dataPoints.Add({i, valor})
|
||||
End If
|
||||
Next
|
||||
|
||||
seriesData.Add(New Dictionary(Of String, Object) From {
|
||||
{"name", año.ToString},
|
||||
{"data", dataPoints},
|
||||
{"color", GetColorForYear(años.IndexOf(año))}
|
||||
})
|
||||
End If
|
||||
Next
|
||||
|
||||
' Configuración de la gráfica (igual que la de ventas)
|
||||
Dim chartOptions = New With {
|
||||
.chart = New With {.type = "line"},
|
||||
.title = New With {.text = "CxC Mensual"},
|
||||
.xAxis = New With {
|
||||
.type = "category",
|
||||
.categories = mesesOrdenados,
|
||||
.title = New With {.text = "Mes"}
|
||||
},
|
||||
.yAxis = New With {
|
||||
.title = New With {.text = "Monto CxC (MXN)"},
|
||||
.labels = New With {.format = "${value:,.0f}"}
|
||||
},
|
||||
.tooltip = New With {
|
||||
.headerFormat = "<b>{series.name}</b><br/>",
|
||||
.pointFormat = "Mes: <b>{point.category}</b><br/>CxC: <b>${point.y:,.2f} MXN</b>"
|
||||
},
|
||||
.plotOptions = New With {
|
||||
.line = New With {
|
||||
.dataLabels = New With {.enabled = False},
|
||||
.enableMouseTracking = True
|
||||
}
|
||||
},
|
||||
.series = seriesData
|
||||
}
|
||||
|
||||
Dim script = $"
|
||||
Highcharts.chart('divCxCMensual', {JsonConvert.SerializeObject(chartOptions)});
|
||||
"
|
||||
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "graficaCxC", script, True)
|
||||
End Sub
|
||||
|
||||
Private Sub CargarRecuperacionPorSucursal(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Renombrar columna para mejor presentación
|
||||
If dt.Columns.Contains("P. Días recuperodo vencidos") Then
|
||||
dt.Columns("P. Días recuperodo vencidos").ColumnName = "PromedioDiasRecuperacion"
|
||||
End If
|
||||
|
||||
gvRecuperacionPorSucursal.DataSource = dt
|
||||
gvRecuperacionPorSucursal.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarRecuperacionPorCliente(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Crear DataTable con estructura necesaria
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("Cliente", GetType(String))
|
||||
dtGrid.Columns.Add("Recuperado", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PromedioDiasRecuperacion", GetType(Decimal))
|
||||
|
||||
For Each row As DataRow In dt.Rows
|
||||
dtGrid.Rows.Add(
|
||||
row("Nombre").ToString(), ' Asegurar que la columna se llama "Nombre"
|
||||
Convert.ToDecimal(If(IsDBNull(row("Recuperado")), 0D, row("Recuperado"))),
|
||||
Convert.ToDecimal(If(IsDBNull(row("P. Días recuperodo vencidos")), 0D, row("P. Días recuperodo vencidos")))
|
||||
)
|
||||
Next
|
||||
|
||||
gvRecuperacionPorCliente.DataSource = dtGrid
|
||||
gvRecuperacionPorCliente.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarComprasPorClasificacion(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
gvComprasPorClasificacion.DataSource = dt
|
||||
gvComprasPorClasificacion.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarComprasPorMarca(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
gvComprasPorMarca.DataSource = dt
|
||||
gvComprasPorMarca.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarComprasPorPS(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
gvComprasPorPS.DataSource = dt
|
||||
gvComprasPorPS.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarComprasPorProveedor(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
gvComprasPorProveedor.DataSource = dt
|
||||
gvComprasPorProveedor.DataBind()
|
||||
End Sub
|
||||
|
||||
' Métodos para cargar los GridViews
|
||||
Private Sub CargarCxPPorSucursal(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return
|
||||
|
||||
' Crear un nuevo DataTable con las columnas necesarias
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("Sucursal", GetType(String))
|
||||
dtGrid.Columns.Add("Vencido", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PorVencer", GetType(Decimal))
|
||||
dtGrid.Columns.Add("Total", GetType(Decimal)) ' Columna Total requerida
|
||||
|
||||
' Copiar datos y calcular Total
|
||||
For Each row As DataRow In dt.Rows
|
||||
Dim vencido = Convert.ToDecimal(If(IsDBNull(row("Vencido")), 0D, row("Vencido")))
|
||||
Dim porVencer = Convert.ToDecimal(If(IsDBNull(row("Por Vencer")) OrElse Not dt.Columns.Contains("Por Vencer"), 0D, row("Por Vencer")))
|
||||
Dim total = vencido + porVencer
|
||||
|
||||
dtGrid.Rows.Add(
|
||||
row("Sucursal").ToString(),
|
||||
vencido,
|
||||
porVencer,
|
||||
total
|
||||
)
|
||||
Next
|
||||
|
||||
gvCxPPorSucursal.DataSource = dtGrid
|
||||
gvCxPPorSucursal.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarCxPPorProveedor(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return
|
||||
|
||||
' Crear un nuevo DataTable con las columnas necesarias
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("RazonSocial", GetType(String))
|
||||
dtGrid.Columns.Add("Vencido", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PorVencer", GetType(Decimal))
|
||||
dtGrid.Columns.Add("Total", GetType(Decimal)) ' Columna Total requerida
|
||||
|
||||
' Copiar datos y calcular Total
|
||||
For Each row As DataRow In dt.Rows
|
||||
Dim vencido = Convert.ToDecimal(If(IsDBNull(row("Vencido")), 0D, row("Vencido")))
|
||||
Dim porVencer = Convert.ToDecimal(If(IsDBNull(row("Por Vencer")) OrElse Not dt.Columns.Contains("Por Vencer"), 0D, row("Por Vencer")))
|
||||
Dim total = vencido + porVencer
|
||||
|
||||
dtGrid.Rows.Add(
|
||||
row("RazonSocial").ToString(),
|
||||
vencido,
|
||||
porVencer,
|
||||
total
|
||||
)
|
||||
Next
|
||||
|
||||
gvCxPPorProveedor.DataSource = dtGrid
|
||||
gvCxPPorProveedor.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarPagosPorSucursal(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return
|
||||
|
||||
' Crear nuevo DataTable con nombres de columnas consistentes
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("Sucursal", GetType(String))
|
||||
dtGrid.Columns.Add("Recuperado", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PromedioDias", GetType(Decimal))
|
||||
|
||||
For Each row As DataRow In dt.Rows
|
||||
dtGrid.Rows.Add(
|
||||
row("Sucursal").ToString(),
|
||||
Convert.ToDecimal(If(IsDBNull(row("Recuperado")), 0D, row("Recuperado"))),
|
||||
Convert.ToDecimal(If(IsDBNull(row("P. Días recuperodo vencidos")), 0D, row("P. Días recuperodo vencidos")))
|
||||
)
|
||||
Next
|
||||
|
||||
gvPagosPorSucursal.DataSource = dtGrid
|
||||
gvPagosPorSucursal.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarPagosPorProveedor(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return
|
||||
|
||||
' Crear nuevo DataTable con nombres de columnas consistentes
|
||||
Dim dtGrid = New DataTable()
|
||||
dtGrid.Columns.Add("RazonSocial", GetType(String))
|
||||
dtGrid.Columns.Add("Recuperado", GetType(Decimal))
|
||||
dtGrid.Columns.Add("PromedioDias", GetType(Decimal))
|
||||
|
||||
For Each row As DataRow In dt.Rows
|
||||
dtGrid.Rows.Add(
|
||||
row("RazonSocial").ToString(),
|
||||
Convert.ToDecimal(If(IsDBNull(row("Recuperado")), 0D, row("Recuperado"))),
|
||||
Convert.ToDecimal(If(IsDBNull(row("P. Días recuperodo vencidos")), 0D, row("P. Días recuperodo vencidos")))
|
||||
)
|
||||
Next
|
||||
|
||||
gvPagosPorProveedor.DataSource = dtGrid
|
||||
gvPagosPorProveedor.DataBind()
|
||||
End Sub
|
||||
|
||||
Private Sub CargarCxPMensual(dt As DataTable)
|
||||
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Lista de meses en español
|
||||
Dim mesesOrdenados As New List(Of String) From {
|
||||
"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
|
||||
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
|
||||
}
|
||||
|
||||
' Obtener años distintos de forma segura
|
||||
Dim años As New List(Of Integer)
|
||||
For Each row As DataRow In dt.Rows
|
||||
If Not IsDBNull(row("Año")) Then
|
||||
Dim añoValue As String = row("Año").ToString()
|
||||
Dim añoInt As Integer
|
||||
If Integer.TryParse(añoValue, añoInt) Then
|
||||
If Not años.Contains(añoInt) Then
|
||||
años.Add(añoInt)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
años = años.OrderBy(Function(y) y).ToList()
|
||||
|
||||
Dim seriesData As New List(Of Dictionary(Of String, Object))
|
||||
|
||||
For Each año In años
|
||||
' Filtrar datos para este año
|
||||
Dim añoData = dt.AsEnumerable() _
|
||||
.Where(Function(r) Not IsDBNull(r("Año")) AndAlso
|
||||
Integer.TryParse(r("Año").ToString(), Nothing) AndAlso
|
||||
Convert.ToInt32(r("Año")) = año) _
|
||||
.FirstOrDefault()
|
||||
|
||||
If añoData IsNot Nothing Then
|
||||
Dim dataPoints As New List(Of Object())
|
||||
|
||||
' Obtener valores para cada mes
|
||||
For i = 0 To mesesOrdenados.Count - 1
|
||||
Dim mes = mesesOrdenados(i)
|
||||
If dt.Columns.Contains(mes) Then
|
||||
Dim valor As Decimal = 0D
|
||||
If Not IsDBNull(añoData(mes)) Then
|
||||
' Conversión segura a decimal
|
||||
Decimal.TryParse(añoData(mes).ToString(), valor)
|
||||
End If
|
||||
' Usar el índice del mes (0-11) como posición X
|
||||
dataPoints.Add({i, valor})
|
||||
End If
|
||||
Next
|
||||
|
||||
seriesData.Add(New Dictionary(Of String, Object) From {
|
||||
{"name", año.ToString},
|
||||
{"data", dataPoints},
|
||||
{"color", GetColorForYear(años.IndexOf(año))}
|
||||
})
|
||||
End If
|
||||
Next
|
||||
|
||||
' Configuración de la gráfica (mismo estilo que CxC)
|
||||
Dim chartOptions = New With {
|
||||
.chart = New With {.type = "line"},
|
||||
.title = New With {.text = "Evolución de Cuentas por Pagar (CxP) Mensual"},
|
||||
.xAxis = New With {
|
||||
.type = "category",
|
||||
.categories = mesesOrdenados,
|
||||
.title = New With {.text = "Mes"}
|
||||
},
|
||||
.yAxis = New With {
|
||||
.title = New With {.text = "Monto CxP (MXN)"},
|
||||
.labels = New With {.format = "${value:,.0f}"}
|
||||
},
|
||||
.tooltip = New With {
|
||||
.headerFormat = "<b>{series.name}</b><br/>",
|
||||
.pointFormat = "Mes: <b>{point.category}</b><br/>CxP: <b>${point.y:,.2f} MXN</b>"
|
||||
},
|
||||
.plotOptions = New With {
|
||||
.line = New With {
|
||||
.dataLabels = New With {.enabled = False},
|
||||
.enableMouseTracking = True
|
||||
}
|
||||
},
|
||||
.series = seriesData
|
||||
}
|
||||
|
||||
Dim script = $"
|
||||
Highcharts.chart('divCxPMensual', {JsonConvert.SerializeObject(chartOptions)});
|
||||
"
|
||||
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "graficaCxP", script, True)
|
||||
End Sub
|
||||
|
||||
Private Function ObtenerMesesOrdenados() As List(Of String)
|
||||
Return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames _
|
||||
@@ -536,4 +1084,38 @@ Partial Class General_Dashboard
|
||||
DIV.InnerHtml = htmldiv.ToString
|
||||
End Sub
|
||||
|
||||
' Método para mostrar el KPI (Agrégalo en tu clase)
|
||||
Private Sub MuestraIndicadorKPI(DIV As HtmlGenericControl, Color As String, Icono As String, Titulo As String, Valor As String, CL1 As String, Tooltip As String)
|
||||
Dim htmldiv As New StringBuilder
|
||||
|
||||
|
||||
' Estructura del contenedor principal
|
||||
htmldiv.AppendFormat(
|
||||
"{0}<div class='col-lg-6 col-md-4 col-sm-6 col-xs-12'>" &
|
||||
"<div class='dashboard-stat {1}' style='position: relative; height: 147px;'>" & ' Contenedor relativo
|
||||
"<div class='visual'><i class='{2}'></i></div>",
|
||||
DIV.InnerHtml, Color, Icono
|
||||
)
|
||||
|
||||
' Contenido principal
|
||||
htmldiv.Append("<div class='details'>")
|
||||
htmldiv.AppendFormat(
|
||||
"<div class='kpi-titulo'><i class= 'fa fa-refresh fa-spin tooltips' data-original-title='{0}'></i> {1}</div>",
|
||||
Tooltip, Titulo
|
||||
)
|
||||
htmldiv.AppendFormat("<div class='kpi-valor'>{0}</div>", Valor)
|
||||
htmldiv.Append("</div>")
|
||||
|
||||
|
||||
htmldiv.AppendFormat(
|
||||
"<a class='more' href='{0}' style='position: absolute; bottom: 1px; right: 1px;'>" &
|
||||
"Ver Más<span style='margin-left: 307px;'></span><i class='m-icon-swapright m-icon-white'></i></a>",
|
||||
CL1
|
||||
)
|
||||
|
||||
htmldiv.Append("</div></div>") ' Cierre de dashboard-stat y col
|
||||
|
||||
DIV.InnerHtml = htmldiv.ToString
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
|
||||
Reference in New Issue
Block a user