Cambios en Dashboard Opcion 4
This commit is contained in:
@@ -399,15 +399,43 @@ Public Class ClsGenerales
|
||||
|
||||
Try
|
||||
SqlAdapter.Fill(DSet)
|
||||
DSet.Tables(0).TableName = "Indicadores"
|
||||
DSet.Tables(1).TableName = "DetalleDia"
|
||||
DSet.Tables(2).TableName = "DetalleAnualesMes"
|
||||
DSet.Tables(3).TableName = "VentasPorVendedor"
|
||||
DSet.Tables(4).TableName = "VentasPorClasificacion"
|
||||
DSet.Tables(5).TableName = "VentasPorMarca"
|
||||
DSet.Tables(6).TableName = "VentasPorPS"
|
||||
DSet.Tables(7).TableName = "VentasPorCliente"
|
||||
DSet.Tables(8).TableName = "VentasPorProveedor"
|
||||
If DSet.Tables.Count > 0 Then
|
||||
Select Case Opcion
|
||||
Case 1 ' Cuentas por Cobrar
|
||||
DSet.Tables(0).TableName = "Indicadores"
|
||||
If DSet.Tables.Count > 1 Then DSet.Tables(1).TableName = "DetalleDia"
|
||||
If DSet.Tables.Count > 2 Then DSet.Tables(2).TableName = "DetalleAnualesMes"
|
||||
If DSet.Tables.Count > 3 Then DSet.Tables(3).TableName = "VentasPorVendedor"
|
||||
If DSet.Tables.Count > 4 Then DSet.Tables(4).TableName = "VentasPorClasificacion"
|
||||
If DSet.Tables.Count > 5 Then DSet.Tables(5).TableName = "VentasPorMarca"
|
||||
If DSet.Tables.Count > 6 Then DSet.Tables(6).TableName = "VentasPorPS"
|
||||
If DSet.Tables.Count > 7 Then DSet.Tables(7).TableName = "VentasPorCliente"
|
||||
If DSet.Tables.Count > 8 Then DSet.Tables(8).TableName = "VentasPorProveedor"
|
||||
|
||||
Case 2 ' Recuperación
|
||||
DSet.Tables(0).TableName = "CarteraPorSubproyecto"
|
||||
If DSet.Tables.Count > 1 Then DSet.Tables(1).TableName = "CarteraPorVendedor"
|
||||
If DSet.Tables.Count > 2 Then DSet.Tables(2).TableName = "RecuperacionPorSubproyecto"
|
||||
If DSet.Tables.Count > 3 Then DSet.Tables(3).TableName = "RecuperacionPorVendedor"
|
||||
If DSet.Tables.Count > 4 Then DSet.Tables(4).TableName = "RecuperacionPorCliente"
|
||||
If DSet.Tables.Count > 5 Then DSet.Tables(5).TableName = "CxCMensual"
|
||||
|
||||
|
||||
Case 3 'Compras
|
||||
If DSet.Tables.Count > 1 Then DSet.Tables(1).TableName = "ComprasPorClasificación"
|
||||
If DSet.Tables.Count > 2 Then DSet.Tables(2).TableName = "ComprasPorMarca"
|
||||
If DSet.Tables.Count > 3 Then DSet.Tables(3).TableName = "ComprasPorPS"
|
||||
If DSet.Tables.Count > 4 Then DSet.Tables(4).TableName = "ComprasPorProveedor"
|
||||
|
||||
Case 4 'Cuentas Por Pagar
|
||||
DSet.Tables(0).TableName = "CxPPorSubproyecto"
|
||||
If DSet.Tables.Count > 1 Then DSet.Tables(1).TableName = "CxPPorProveedor"
|
||||
If DSet.Tables.Count > 2 Then DSet.Tables(2).TableName = "PagosPorSubproyecto"
|
||||
If DSet.Tables.Count > 3 Then DSet.Tables(3).TableName = "PagosPorProveedor"
|
||||
If DSet.Tables.Count > 4 Then DSet.Tables(4).TableName = "CxPMensual"
|
||||
End Select
|
||||
End If
|
||||
|
||||
|
||||
Catch ex As Exception
|
||||
' Manejo de errores
|
||||
|
||||
@@ -7728,7 +7728,7 @@ Public Class ClsVentas
|
||||
End Function
|
||||
|
||||
|
||||
Public Function GetSMSIndicadores(Opcion As Integer, FechaInicio As Date, FechaFin As Date, CveUsuario As Integer, CveVendedor As Integer, CveGerenteVendedor As Integer, CveUsuarioTecnico As Integer, CveEmpresa As Integer) As Boolean
|
||||
Public Function GetSMSIndicadores(Opcion As Integer, FechaInicio As Date, FechaFin As Date, CveUsuario As Integer, CveVendedor As Integer, CveUsuarioTecnico As Integer, CveEmpresa As Integer) As Boolean
|
||||
Dim Retorno As Boolean = False
|
||||
DataAdapter("PA_SMS_IndicadoresGet")
|
||||
With SqlAdapter.SelectCommand.Parameters
|
||||
@@ -7737,7 +7737,6 @@ Public Class ClsVentas
|
||||
.Add("@FechaFin", SqlDbType.Date).Value = FechaFin
|
||||
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
|
||||
.Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor
|
||||
.Add("@CveGerenteVendedor", SqlDbType.Int).Value = CveGerenteVendedor
|
||||
.Add("@CveUsuarioTecnico", SqlDbType.Int).Value = CveUsuarioTecnico
|
||||
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
|
||||
End With
|
||||
|
||||
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
|
||||
|
||||
@@ -1665,7 +1665,7 @@ Partial Class Inicio
|
||||
Dim FechaI As Date = txtFechaInicioSMS.Text.ToDate ' Now.FirstDayOfMonth
|
||||
Dim FechaF As Date = txtFechaFinSMS.Text.ToDate 'Now.LastDayOfMonth
|
||||
|
||||
If Gral.GetSMSIndicadores(Opcion, FechaI, FechaF, UsuarioActual.CveUsuario, CveVendedor, CveGerenteVendedor, CveUsuarioTecnico, UsuarioActual.CveEmpresa) Then
|
||||
If Gral.GetSMSIndicadores(Opcion, FechaI, FechaF, UsuarioActual.CveUsuario, CveVendedor, CveUsuarioTecnico, UsuarioActual.CveEmpresa) Then
|
||||
ds = Gral.DataSetResultados
|
||||
End If
|
||||
'0-ventas totales, 1-comisiones totales, 2-medicos sin consumo, 3-top10medicos, 4-top5marcas, 5-num pacientes
|
||||
|
||||
56
OP/OP.aspx
56
OP/OP.aspx
@@ -310,18 +310,16 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
/* Alinear celda y contenido a la derecha */
|
||||
.celda-derecha {
|
||||
text-align: right !important;
|
||||
|
||||
}
|
||||
|
||||
.txt-merma {
|
||||
/* Ancho reducido al 50% */
|
||||
margin-left: 30px !important; /* Mueve el TextBox a la derecha dentro de la celda */
|
||||
display: block !important; /* Permite que margin-left:auto funcione */
|
||||
/* Alinea el texto interno a la derecha */
|
||||
}
|
||||
.celda-derecha {
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
.txt-merma {
|
||||
/* Ancho reducido al 50% */
|
||||
margin-left: 30px !important; /* Mueve el TextBox a la derecha dentro de la celda */
|
||||
display: block !important; /* Permite que margin-left:auto funcione */
|
||||
/* Alinea el texto interno a la derecha */
|
||||
}
|
||||
</style>
|
||||
|
||||
</asp:Content>
|
||||
@@ -368,12 +366,12 @@
|
||||
<div class="input-group input-sm input-small date date-picker" style="height: 30px;" data-date-format="dd/mm/yyyy">
|
||||
<asp:TextBox ID="Txtfecha" runat="server"
|
||||
CssClass="form-control"
|
||||
style="margin-top: -6px;"
|
||||
Style="margin-top: -6px;"
|
||||
Width="100%"
|
||||
CausesValidation="true"
|
||||
MaxLength="10"></asp:TextBox>
|
||||
<span class="input-group-btn">
|
||||
<asp:LinkButton ID="imgCalendarioF" class="btn default " style="margin-top: -11px; height: 29px;" Text="<i class='fa fa-calendar'></i>" runat="server"></asp:LinkButton>
|
||||
<asp:LinkButton ID="imgCalendarioF" class="btn default " Style="margin-top: -11px; height: 29px;" Text="<i class='fa fa-calendar'></i>" runat="server"></asp:LinkButton>
|
||||
</span>
|
||||
</div>
|
||||
<ajax:MaskedEditExtender ID="MEEFechaF" runat="server" TargetControlID="Txtfecha" Mask="99/99/9999" MaskType="Date" DisplayMoney="Left" AcceptNegative="Left"></ajax:MaskedEditExtender>
|
||||
@@ -471,13 +469,13 @@
|
||||
<div class="portlet-body">
|
||||
<div class="row">
|
||||
<div id="PanelProducto" runat="server">
|
||||
<asp:label ID="LblProducto" class="col-md-1" runat="server" style="max-width: 70px;" Text="Producto"></asp:label>
|
||||
<div class="col-md-3">
|
||||
<ADS:Dropdownlost ID="DdlPS" runat="server" Width="100%" CssStyle="width: 100%;"
|
||||
CssClass="select2me"
|
||||
CssClassDdl="form-control" DataTextField="PSCodigo"
|
||||
DataValueField="CvePS" Enabled="false" />
|
||||
</div>
|
||||
<asp:Label ID="LblProducto" class="col-md-1" runat="server" Style="max-width: 70px;" Text="Producto"></asp:Label>
|
||||
<div class="col-md-3">
|
||||
<ADS:Dropdownlost ID="DdlPS" runat="server" Width="100%" CssStyle="width: 100%;"
|
||||
CssClass="select2me"
|
||||
CssClassDdl="form-control" DataTextField="PSCodigo"
|
||||
DataValueField="CvePS" Enabled="false" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 d-flex align-items-center" style="gap: 10px;">
|
||||
<asp:LinkButton ID="BtnAgregarProducto" runat="server"
|
||||
@@ -852,13 +850,13 @@
|
||||
<asp:TextBox ID="TxtCantidadPT" runat="server"
|
||||
Text='<%# Bind("Cantidad") %>'
|
||||
CssClass="form-control"
|
||||
style="text-align: right;"
|
||||
Style="text-align: right;"
|
||||
TextMode="Number"
|
||||
min="0"
|
||||
step="1"
|
||||
data-original='<%# Eval("Cantidad") %>'
|
||||
onchange="validarCantidad(this)"
|
||||
ItemStyle-HorizontalAlign="Right"/>
|
||||
ItemStyle-HorizontalAlign="Right" />
|
||||
</ItemTemplate>
|
||||
</asp:TemplateField>
|
||||
</Columns>
|
||||
@@ -872,18 +870,17 @@
|
||||
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
|
||||
<Columns>
|
||||
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
|
||||
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:N2}" ItemStyle-HorizontalAlign="Right"/>
|
||||
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:N2}" ItemStyle-HorizontalAlign="Right" />
|
||||
<asp:TemplateField HeaderText="Devolución">
|
||||
<ItemTemplate>
|
||||
<asp:TextBox ID="TxtDevolucionMP" runat="server"
|
||||
Text="0"
|
||||
style="width: 50%; text-align: right; margin-left: 38px; display: block;"
|
||||
Style="width: 50%; text-align: right; margin-left: 38px; display: block;"
|
||||
TextMode="Number"
|
||||
min="0"
|
||||
step="1"
|
||||
data-original='<%# Eval("Cantidad") %>'
|
||||
onchange="validarCantidad(this)"
|
||||
/>
|
||||
onchange="validarCantidad(this)" />
|
||||
</ItemTemplate>
|
||||
|
||||
</asp:TemplateField>
|
||||
@@ -947,15 +944,14 @@
|
||||
<ItemTemplate>
|
||||
<asp:TextBox ID="TxtMerma" runat="server" Text="0"
|
||||
CssClass="txt-merma" TextMode="Number" step="0.01" min="0"
|
||||
style="width: 50%; text-align: right;"
|
||||
Style="width: 50%; text-align: right;"
|
||||
onchange="calcularDevolucion(this);"
|
||||
data-original='<%# Eval("Cantidad")%>'
|
||||
/>
|
||||
data-original='<%# Eval("Cantidad")%>' />
|
||||
</ItemTemplate>
|
||||
</asp:TemplateField>
|
||||
<asp:TemplateField HeaderText="Devolución" ItemStyle-CssClass="celda-derecha">
|
||||
<ItemTemplate>
|
||||
<asp:Label ID="LblDevolucion" runat="server" Text='<%# Eval("Cantidad", "{0:N2}") %>' CssClass="devolucion-label" style="text-align: right;"/>
|
||||
<asp:Label ID="LblDevolucion" runat="server" Text='<%# Eval("Cantidad", "{0:N2}") %>' CssClass="devolucion-label" Style="text-align: right;" />
|
||||
<asp:HiddenField ID="HfDevolucion" runat="server" Value='<%# Eval("Cantidad", "{0:N2}") %>' />
|
||||
</ItemTemplate>
|
||||
</asp:TemplateField>
|
||||
|
||||
@@ -125,6 +125,7 @@ Partial Class OP_OP
|
||||
BtnCancelarOP.Visible = (CveOP > 0 AndAlso TipoEstatus <> 3 AndAlso TipoEstatus <> 4)
|
||||
End Sub
|
||||
|
||||
#Region "Metodos"
|
||||
Private Sub CreaPS()
|
||||
DtPS = New DataTable()
|
||||
DtPS.Columns.Add("Tipo", GetType(String)) ' Producto, MP, MO, CI
|
||||
@@ -247,7 +248,9 @@ Partial Class OP_OP
|
||||
UpBtns.Update()
|
||||
UpModalCancelar.Update()
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Cargar"
|
||||
Private Sub CargaDatos()
|
||||
If CveOP > 0 Then
|
||||
Dim ObjOP As New ClsOP()
|
||||
@@ -367,7 +370,9 @@ Partial Class OP_OP
|
||||
DdlPS.ddl.Items.Insert(0, New ListItem("Seleccione el Producto", "-1"))
|
||||
End If
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Producto"
|
||||
Protected Sub BtnAgregarProducto_Click(sender As Object, e As EventArgs) Handles BtnAgregarProducto.Click
|
||||
If DdlPS.SelectedValue = "-1" Then Exit Sub
|
||||
|
||||
@@ -480,33 +485,16 @@ Partial Class OP_OP
|
||||
Next
|
||||
End Sub
|
||||
|
||||
|
||||
Protected Sub GvProductos_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvProductos.RowDataBound
|
||||
If e.Row.RowType = DataControlRowType.DataRow Then
|
||||
Dim btnEliminar As LinkButton = DirectCast(e.Row.FindControl("BtnEliminar"), LinkButton)
|
||||
btnEliminar.Visible = (TipoEstatus <> 3)
|
||||
End If
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
Protected Sub LnkSolicitarMP_Click(sender As Object, e As EventArgs)
|
||||
' Cargar almacenes
|
||||
DdlAlmacenOrigenMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
|
||||
DdlAlmacenOrigenMP.DataBind()
|
||||
DdlAlmacenDestinoMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 28")
|
||||
DdlAlmacenDestinoMP.DataBind()
|
||||
|
||||
GvMPAgregados.DataKeyNames = New String() {"CvePSMateriaPrima", "CveUMMateriaPrima"}
|
||||
|
||||
' Filtrar MP no surtida
|
||||
Dim DtMPFaltante As DataTable = DtMP.FiltraParametros("Surtido = 0").Copy()
|
||||
GvMPAgregados.DataSource = DtMPFaltante
|
||||
GvMPAgregados.DataBind()
|
||||
|
||||
|
||||
' Mostrar modal
|
||||
RegistraScript("$('#DVModalSolicitarMP').modal('show');")
|
||||
UpModalMP.Update()
|
||||
End Sub
|
||||
|
||||
#Region "Simular MP"
|
||||
Protected Sub BtnSimularMP_Click(sender As Object, e As EventArgs)
|
||||
If CveOP <> -1 Then Exit Sub
|
||||
If DdlPS.SelectedValue = "-1" Then Exit Sub
|
||||
@@ -664,7 +652,28 @@ Partial Class OP_OP
|
||||
|
||||
Return ObjOP.DtResultados.Copy()
|
||||
End Function
|
||||
#End Region
|
||||
|
||||
#Region "Solicitar MP"
|
||||
Protected Sub LnkSolicitarMP_Click(sender As Object, e As EventArgs)
|
||||
' Cargar almacenes
|
||||
DdlAlmacenOrigenMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
|
||||
DdlAlmacenOrigenMP.DataBind()
|
||||
DdlAlmacenDestinoMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 28")
|
||||
DdlAlmacenDestinoMP.DataBind()
|
||||
|
||||
GvMPAgregados.DataKeyNames = New String() {"CvePSMateriaPrima", "CveUMMateriaPrima"}
|
||||
|
||||
' Filtrar MP no surtida
|
||||
Dim DtMPFaltante As DataTable = DtMP.FiltraParametros("Surtido = 0").Copy()
|
||||
GvMPAgregados.DataSource = DtMPFaltante
|
||||
GvMPAgregados.DataBind()
|
||||
|
||||
|
||||
' Mostrar modal
|
||||
RegistraScript("$('#DVModalSolicitarMP').modal('show');")
|
||||
UpModalMP.Update()
|
||||
End Sub
|
||||
Protected Sub BtnGuardarSolicitudMP_Click(sender As Object, e As EventArgs)
|
||||
|
||||
Dim CveTraspasoSolicitud As Integer = -1
|
||||
@@ -772,6 +781,9 @@ Partial Class OP_OP
|
||||
ObjInventario.Dispose()
|
||||
|
||||
End Sub
|
||||
#End Region
|
||||
|
||||
#Region "Guardar OP"
|
||||
|
||||
Protected Sub BtnGuardarOP_Click(sender As Object, e As EventArgs)
|
||||
' Validaciones básicas
|
||||
@@ -930,6 +942,8 @@ Partial Class OP_OP
|
||||
End If
|
||||
End Sub
|
||||
|
||||
#End Region
|
||||
|
||||
#Region "Cancelar"
|
||||
Protected Sub BtnCancelarOP_Click(sender As Object, e As EventArgs)
|
||||
' Cargar almacenes
|
||||
|
||||
Reference in New Issue
Block a user