From ab65b91b62665deac7b60568214368550b3068b3 Mon Sep 17 00:00:00 2001 From: MLopez Date: Sat, 7 Jan 2023 19:40:38 -0700 Subject: [PATCH] E172 Rep Indicador Resumen: + Totales en Portlets, Promedio precio VxP, Fila totales Comp Productores y + info en grafica de pastel --- Compras/Proveedores.aspx.vb | 3 - General/RepIndicadorResumen.aspx | 198 +++++++++++++--------------- General/RepIndicadorResumen.aspx.vb | 80 ++++++++--- Site.master | 4 +- Styles/ReportePDF.html | 9 +- 5 files changed, 162 insertions(+), 132 deletions(-) diff --git a/Compras/Proveedores.aspx.vb b/Compras/Proveedores.aspx.vb index 0fcad37ea..26a459684 100644 --- a/Compras/Proveedores.aspx.vb +++ b/Compras/Proveedores.aspx.vb @@ -3835,7 +3835,6 @@ Partial Class Compras_Proveedores Private Sub ImprimirReporteCxPCrystal(Optional Formato As String = "PDF") Dim Archivo As New System.IO.FileInfo(String.Format("{0}Formatos/RepProveedorCxP.rpt", UsuarioActual.Empresa.Ruta)) Dim Imagen As New System.IO.FileInfo($"{UsuarioActual.Empresa.Ruta}/Logo.png") - 'Dim logouri = String.Format("{0}://{1}:{2}/Empresas/{3}/Logo.png", Request.Url.Scheme, Request.Url.Host, Request.Url.Port, UsuarioActual.CveEmpresa) Dim DTCxPTempral As DataTable = Nothing @@ -4217,7 +4216,6 @@ Partial Class Compras_Proveedores params.Add(New ReportParameter("LimiteCredito", TxtLimiteCredito.Text)) params.Add(New ReportParameter("SaldoDisponible", (TxtLimiteCredito.Text.ToDouble - dr("Saldo").ToString.ToDouble).ToString.FormatoNumero)) params.Add(New ReportParameter("AgrupadoPor", $"Agrupado Por: {Proveedor}{FechaIn}{FechaFn}{FechVI}{FechVF}")) - params.Add(New ReportParameter("LogoPath", If(Imagen.Exists, $"file://{Imagen.FullName}", ""))) ImprimirPDF("Empresas/Grales/Formatos/RepProveedorCxP.rdlc", DTCxPTempral, params, "RepCxP") @@ -4225,7 +4223,6 @@ Partial Class Compras_Proveedores Alert("No se encontraron datos con los filtros especificados", TipoMensaje.MsgAdvertencia) End If - ElseIf rblreporte.SelectedValue = "anc" Then 'OBTENEMOS LOS DATOS diff --git a/General/RepIndicadorResumen.aspx b/General/RepIndicadorResumen.aspx index 31e334953..6b1c27c79 100644 --- a/General/RepIndicadorResumen.aspx +++ b/General/RepIndicadorResumen.aspx @@ -19,25 +19,27 @@ background-color: #95A5A6; color: white; } - .table-scrollable { margin-top: 0px !important; margin-bottom: 0px !important; } - .margenbound { margin-left: 15px; text-align: right; } - .amChartsAttribution { - margin-top: -2px; - margin-bottom: 8px; - visibility: hidden; - } div[id^=chartdiv] { width: 100%; height: 400px; } + .portlet-total { + float:right!important; + display:inline-block!important; + } + .abbr { + overflow: hidden; + text-overflow: ellipsis; + display:block!important; + } @@ -96,12 +98,6 @@ - <%----%>
@@ -111,15 +107,15 @@
- Ventas por Productos -
-
-
-
+ Ventas por Productos
+
+ + +
- + <%--TODO: Esto se puede meter en el stored procedured, pero me da cosa moverle :S--%> + + + <%--TODO: Esto puede tronar si el valor es DBNull --%> + <%# If(Convert.ToDecimal(Eval("Cantidad")) = 0, 0.ToString("C"), (Convert.ToDecimal(Eval("SubTotal")) / Convert.ToInt32(Eval("Cantidad"))).ToString("C")) %> + +
@@ -143,11 +145,7 @@
- Ventas por Productos - Gráfica -
-
-
-
+ Ventas por Productos - Gráfica
@@ -168,20 +166,20 @@
- Compras Productores -
-
-
-
+ Compras Productores
+
+ + +
+ AutoGenerateColumns="False" AllowPaging="False" ShowFooter="True"> @@ -190,6 +188,7 @@ +
@@ -202,11 +201,7 @@
- Compras Productores - Gráfica por Cantidad(Kg) -
-
-
-
+ Compras Productores - Gráfica por Cantidad(Kg)
@@ -227,15 +222,15 @@
- Gastos -
-
-
-
+ Gastos
+
+ + +
- Compras por clasificación - Gráfica -
-
-
-
+ Compras por clasificación - Gráfica
@@ -283,15 +274,15 @@
- Cuentas por cobrar -
-
-
-
+ Cuentas por cobrar
+
+ + +
- Cuentas por cobrar - Gráfica Saldo VS Recuperado -
-
-
-
+ Cuentas por cobrar - Gráfica Saldo VS Recuperado
@@ -330,30 +317,6 @@
- -
- - -
-
- - Cuentas por cobrar - Gráfica Recuperado -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
@@ -363,15 +326,15 @@
- Cuentas por Pagar productores -
-
-
-
+ Cuentas por Pagar productores
+
+ + +
- Cuentas por Pagar productores - Gráfica -
-
-
-
+ Cuentas por Pagar productores - Gráfica
@@ -418,15 +377,15 @@
- Cuentas por Pagar no productores -
-
-
-
+ Cuentas por Pagar no productores
+
+ + +
- Cuentas por Pagar no productores - Gráfica -
-
-
-
+ Cuentas por Pagar no productores - Gráfica
@@ -507,7 +462,17 @@ align: 'left' }, legend: { - enabled: false + enabled: false, + // esto es para la grafica de pie + layout: 'vertical', + align: 'right', + width: 220, + verticalAlign: 'middle', + borderWidth: 0, + useHTML: true, + labelFormatter: function () { + return '
' + this.name + '
' + '
' + this.y.toLocaleString() + this.unit + '' + '$' + this.y2.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '
'; + }, }, xAxis: { type: 'category' @@ -547,6 +512,10 @@ // }, // //footerFormat: '{point.key}' //}, + tooltip: { + //valuePrefix: '$', + valueSuffix: " " + '{point.unit}' + }, plotOptions: { series: { animation: true, @@ -577,9 +546,14 @@ } }, pie: { + allowPointSelect: true, + cursor: 'pointer', dataLabels: { - enabled: true - } + enabled: true, + distance: -30, + format: '{point.percentage:.1f} %' + }, + showInLegend: true } }, series: [ @@ -594,11 +568,11 @@ //AmCharts.makeChart("chartdiv_vxp", { ...chartconfig, type: "serial", dataProvider: json["VxP"] }); // Ventas x Producto $('#' + "chartdiv_vxp").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["VxP"]) }] }) - $('#' + "chartdiv_compproductores").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], type: 'pie', data: customAccessor(json["CompProductores"]) }] }) + $('#' + "chartdiv_compproductores").highcharts({ ...chartconfig, chart: {}, legend: { ...chartconfig.legend, enabled: true }, series: [{ ...chartconfig.series[0], keys: ['name', 'y', 'y2', 'unit', 'unit2'], type: 'pie', data: customAccessorPie(json["CompProductores"]) }] }) $('#' + "chartdiv_compacreed").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["CompAcreed"]) }] }) $('#' + "chartdiv_cxp192").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["CxP192"]) }] }) $('#' + "chartdiv_cxp").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["CxP"]) }] }) - $('#' + "chartdiv_cxc").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["CxC"]) }, { type: 'line', data: customAccessor(json["CxCR"]) }] }) + $('#' + "chartdiv_cxc").highcharts({ ...chartconfig, series: [{ ...chartconfig.series[0], data: customAccessor(json["CxC"]) }, { ...chartconfig.series[0], type: 'line', data: customAccessor(json["CxCR"]) }] }) function customAccessor(data) { const newData = []; @@ -609,10 +583,18 @@ newData.push([point.Texto, point.Valor, point.Unidad]); } }); - //newData.sort(function (a, b) { - // return a[0] > b[0] ? 1 : -1; - //}); - //console.log(JSON.stringify(newData)) + return newData; + } + + function customAccessorPie(data) { + const newData = []; + data.forEach(function (point, index) { + if (point.Texto == "Otros") { + newData.push({ name: point.Texto, y: point.Cantidad, y2: point.Importe, unit: point.UnidadC, unit2:point.UnidadI, color: '#000000' }); + } else { + newData.push([point.Texto, point.Cantidad, point.Importe, point.UnidadC, point.UnidadI]); + } + }); return newData; } diff --git a/General/RepIndicadorResumen.aspx.vb b/General/RepIndicadorResumen.aspx.vb index 0566e31e4..b2bf87ec9 100644 --- a/General/RepIndicadorResumen.aspx.vb +++ b/General/RepIndicadorResumen.aspx.vb @@ -83,38 +83,51 @@ Partial Class General_RepIndicadorResumen GvCxC.HeaderRow.Cells(2).Text = "Recuperado" End If - 'Mostrar gráficos solo si hay datos en su respectiva tabla + 'Mostrar gráficos y totales en portlets solo si hay datos en su respectiva tabla If GvVxP.Rows.Count > 0 Then UPGraficaVxP.Visible = True + PLVxPTot.InnerHtml = "" + "Cantidad: " + "" + String.Format("{0:n} Kg", CType(GvVxP.DataSource, DataTable).SUM("Cantidad", "Orden IS NOT NULL")) _ + + "" + "Total: " + "" + String.Format("{0:c} MXN", CType(GvVxP.DataSource, DataTable).SUM("SubTotalMN", "Orden IS NOT NULL")) Else UPGraficaVxP.Visible = False + PLVxPTot.InnerHtml = Nothing End If If GvCompProductores.Rows.Count > 0 Then UPGraficaCompProductores.Visible = True + PLCompProductoresTot.InnerHtml = "" + "Cantidad: " + "" + String.Format("{0:n} Kg", CType(GvCompProductores.DataSource, DataTable).SUM("Cantidad", "")) Else UPGraficaCompProductores.Visible = False + PLCompProductoresTot.InnerHtml = Nothing End If If GvCompAcreed.Rows.Count > 0 Then UPGraficaCompAcreed.Visible = True + PLGastosTot.InnerHtml = "" + "Importe: " + "" + String.Format("{0:c} MXN", CType(GvCompAcreed.DataSource, DataTable).SUM("SubTotalMN", "CveClasificacion IS NOT NULL")) Else UPGraficaCompAcreed.Visible = False + PLGastosTot.InnerHtml = Nothing End If If GvCxC.Rows.Count > 0 Then UPGraficaCxC.Visible = True - 'UPGraficaCxCRec.Visible = True + PLCxCTot.InnerHtml = "" + "Saldo: " + "" + String.Format("{0:c} MXN", CType(GvCxC.DataSource, DataTable).SUM("SaldoMN", "CveCliente IS NOT NULL")) + Dim Recuper As Double = CType(GvCxC.DataSource, DataTable).SUM("RecuperadoMN", "CveCliente IS NOT NULL") + If (Recuper > 0) Then PLCxCTot.InnerHtml += "" + "Rec: " + "" + String.Format("{0:c} MXN", CType(GvCxC.DataSource, DataTable).SUM("RecuperadoMN", "CveCliente IS NOT NULL")) Else UPGraficaCxC.Visible = False - 'UPGraficaCxCRec.Visible = False + PLCxCTot.InnerHtml = Nothing End If If GvCxP192.Rows.Count > 0 Then UPGraficaCxP192.Visible = True + PLCxP192Tot.InnerHtml = "" + "Saldo: " + "" + String.Format("{0:c} MXN", CType(GvCxP192.DataSource, DataTable).SUM("SaldoMN", "CveProveedor IS NOT NULL")) Else UPGraficaCxP192.Visible = False + PLCxP192Tot.InnerHtml = Nothing End If If GvCxP.Rows.Count > 0 Then UPGraficaCxP.Visible = True + PLCxPTot.InnerHtml = "" + "Saldo: " + "" + String.Format("{0:c} MXN", CType(GvCxP.DataSource, DataTable).SUM("SaldoMN", "CveProveedor IS NOT NULL")) Else UPGraficaCxP.Visible = False + PLCxPTot.InnerHtml = Nothing End If 'Si no había datos en ninguna tabla no cargar función de gráficos @@ -149,6 +162,32 @@ Partial Class General_RepIndicadorResumen End If End If End Sub + Dim CompProductoresTotales As Decimal() = New Decimal(5 - 1) {} + Protected Sub GvCompProductores_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GvCompProductores.RowDataBound + 'Esto tambien se podría meter en el Stored Procedure + If e.Row.RowType = DataControlRowType.DataRow Then + CompProductoresTotales(0) += Convert.ToDecimal(IfNull(DataBinder.Eval(e.Row.DataItem, "Cantidad"), 0)) + CompProductoresTotales(1) += Convert.ToDecimal(IfNull(DataBinder.Eval(e.Row.DataItem, "SubTotal"), 0)) + CompProductoresTotales(2) += Convert.ToDecimal(IfNull(DataBinder.Eval(e.Row.DataItem, "PUPromedioKG"), 0)) + CompProductoresTotales(3) += Convert.ToDecimal(IfNull(DataBinder.Eval(e.Row.DataItem, "Saldo"), 0)) + CompProductoresTotales(4) += Convert.ToDecimal(IfNull(DataBinder.Eval(e.Row.DataItem, "Abonado"), 0)) + ElseIf e.Row.RowType = DataControlRowType.Footer Then + 'Movemos el pie a la primera fila de la tabla + Dim footerRow As GridViewRow = e.Row + GvCompProductores.Controls(0).Controls.Remove(footerRow) + GvCompProductores.Controls(0).Controls.AddAt(1, footerRow) + 'Ahora se registran los datos + e.Row.Cells(0).Text = "Totales" + e.Row.Cells(1).Text = CompProductoresTotales(0).ToString("N") + e.Row.Cells(2).Text = CompProductoresTotales(1).ToString("C") + e.Row.Cells(3).Text = (CompProductoresTotales(2) / GvCompProductores.Rows.Count).ToString("C") 'Promedio + e.Row.Cells(4).Text = CompProductoresTotales(3).ToString("C") + e.Row.Cells(5).Text = CompProductoresTotales(4).ToString("C") + For i As Integer = 1 To e.Row.Cells.Count - 1 + e.Row.Cells(i).CssClass = "margenbound" + Next + End If + End Sub Protected Sub GvComprasAcreed_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GvCompAcreed.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then If e.Row.DBCampo("CveClasificacion") = "" Then @@ -230,32 +269,40 @@ Partial Class General_RepIndicadorResumen 'Dim group_resto_vxp = From e In resto_vxp Group e By e.Texto Into gpo = Group 'Dim group_resto_vxp = resto_vxp.GroupBy(Function(e) New With {Key e.Texto, Key e.Valor, Key e.Color, Key e.Unidad}).ToList() - 'Compras ProveedorClasificacion=192 + 'Compras Productores ProveedorClasificacion=192 DtCompProductores.Reset() DtCompProductores.Columns.Add("Texto") - DtCompProductores.Columns.Add("Valor") - DtCompProductores.Columns.Add("Unidad") + DtCompProductores.Columns.Add("Cantidad") + DtCompProductores.Columns.Add("Importe") + DtCompProductores.Columns.Add("UnidadC") + DtCompProductores.Columns.Add("UnidadI") For Each Dr As DataRow In GvCompProductores.DataSource.Rows Dim Row = DtCompProductores.NewRow() Row("Texto") = Dr("RazonSocial").ToString - Row("Valor") = Dr("Cantidad").ToString.FormatoNumero - Row("Unidad") = "Kg" + Row("Cantidad") = Dr("Cantidad").ToString.FormatoNumero + Row("Importe") = Dr("SubTotal").ToString.FormatoNumero + Row("UnidadC") = "Kg" + Row("UnidadI") = "MXN" DtCompProductores.Rows.Add(Row) Next - Dim comp_productores = From s In DtCompProductores.AsEnumerable() Select New With {.Texto = s("Texto").ToString(), .Valor = s("Valor").ToString().ToDouble(), .Unidad = s("Unidad").ToString()} + Dim comp_productores = From s In DtCompProductores.AsEnumerable() Select New With {.Texto = s("Texto").ToString(), .Cantidad = s("Cantidad").ToString().ToDouble(), .Importe = s("Importe").ToString().ToDouble(), .UnidadC = s("UnidadC").ToString(), .UnidadI = s("UnidadI").ToString()} Dim group_comp_productores = comp_productores.GroupBy(Function(x) x.Texto).[Select](Function(g) New With { .Texto = g.Key, - .Valor = Math.Round(g.Sum(Function(x) x.Valor), 2), - .Unidad = "MXN" + .Cantidad = Math.Round(g.Sum(Function(x) x.Cantidad), 2), + .Importe = Math.Round(g.Sum(Function(x) x.Importe), 2), + .UnidadC = "Kg", + .UnidadI = "MXN" }).ToDataTable - Dim top_comp_productores = From s In group_comp_productores.AsEnumerable().Take(10) Select New With {.Texto = s("Texto").ToString(), .Valor = s("Valor").ToString().ToDouble(), .Unidad = s("Unidad").ToString()} - Dim resto_comp_productores = From s In group_comp_productores.AsEnumerable().Skip(10) Select New With {.Texto = "Otros", .Valor = s("Valor").ToString().ToDouble(), .Unidad = s("Unidad").ToString()} + Dim top_comp_productores = From s In group_comp_productores.AsEnumerable().Take(10) Select New With {.Texto = s("Texto").ToString(), .Cantidad = s("Cantidad").ToString().ToDouble(), .Importe = s("Importe").ToString().ToDouble(), .UnidadC = s("UnidadC").ToString(), .UnidadI = s("UnidadI").ToString()} + Dim resto_comp_productores = From s In group_comp_productores.AsEnumerable().Skip(10) Select New With {.Texto = "Otros", .Cantidad = s("Cantidad").ToString().ToDouble(), .Importe = s("Importe").ToString().ToDouble(), .UnidadC = s("UnidadC").ToString(), .UnidadI = s("UnidadI").ToString()} Dim group_resto_comp_productores = resto_comp_productores.GroupBy(Function(x) x.Texto).[Select](Function(g) New With { .Texto = "Otros", - .Valor = Math.Round(g.Sum(Function(x) x.Valor), 2), - .Unidad = "MXN" + .Cantidad = Math.Round(g.Sum(Function(x) x.Cantidad), 2), + .Importe = Math.Round(g.Sum(Function(x) x.Importe), 2), + .UnidadC = "Kg", + .UnidadI = "MXN" }) - Dim query_comp_productores = top_comp_productores.Union(group_resto_comp_productores).OrderByDescending(Function(x) x.Valor) + Dim query_comp_productores = top_comp_productores.Union(group_resto_comp_productores).OrderByDescending(Function(x) x.Cantidad) 'Compras TipoProveedor=1 Acreedores (Gastos) DtCompAcreed.Reset() @@ -403,6 +450,7 @@ Partial Class General_RepIndicadorResumen }) Dim query_cxp = top_cxp.Union(group_resto_cxp).OrderByDescending(Function(x) x.Valor) + 'Serializar datos agrupándolos por su respectivo DataTable, todos en un solo JSON Dim json As String = Newtonsoft.Json.JsonConvert.SerializeObject(New With {.VxP = query_vxp, .CompProductores = query_comp_productores, .CompAcreed = query_comp_acreed, .CxC = query_cxc, .CxCR = query_cxcr, .CxP192 = query_cxp192, .CxP = query_cxp}) 'Alert(json) diff --git a/Site.master b/Site.master index 5431b7312..0a9eac6db 100644 --- a/Site.master +++ b/Site.master @@ -15,8 +15,10 @@ <%: Scripts.Render("~/bundles/modernizr") %> <%: Styles.Render("~/Content/AjaxControlToolkit/Styles/Bundle") %> + + - + <%-- diff --git a/Styles/ReportePDF.html b/Styles/ReportePDF.html index 06a1f940c..f43adb8e4 100644 --- a/Styles/ReportePDF.html +++ b/Styles/ReportePDF.html @@ -1,16 +1,13 @@ - + \ No newline at end of file