From 4a98c36b1afdcae078d77675e6efd9062ba1ede1 Mon Sep 17 00:00:00 2001 From: Perea Date: Tue, 23 Sep 2025 12:01:02 +0200 Subject: [PATCH] termninado dividir los excels --- .../ConfiguracionPages/EstadisticasConf.razor | 383 ++---------------- .../EstadisticaHerraCASATab.razor | 40 +- .../EstadisticaHerraURBANTab.razor | 23 ++ .../EstadisticaLiciCASATab.razor | 26 +- .../EstadisticaLiciURBANTab.razor | 24 ++ HerramientaCASA/UtilidadesCASA.cs | 376 ++++++++++++++++- 6 files changed, 525 insertions(+), 347 deletions(-) diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasConf.razor index 2537c47..7d2a169 100644 --- a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasConf.razor +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasConf.razor @@ -32,7 +32,6 @@ -
@@ -49,21 +48,25 @@
- -
- + + +
+
- + + + +
@@ -71,7 +74,11 @@
- + + + + +
@@ -79,7 +86,11 @@
- + + + + +
@@ -90,8 +101,13 @@ @code { public List listadoHerramientaEstadistica { get; set; } = new List(); + public List listadoLicitacionesEstadistica { get; set; } = new List(); + public List listadoHerramientaEstadisticaUrban { get; set; } = new List(); + public List listadoLicitacionesEstadisticaUrban { get; set; } = new List(); + public List listadoHerramientaEstadisticaUsos { get; set; } = new List(); + public List listadoLicitacionUsos { get; set; } = new List(); public List listadoHerramientaEstadisticaFactores { get; set; } = new List(); public DateTime? fechaInicio { get; set; } = null; @@ -101,9 +117,9 @@ private int totalProyectosTipo = 0; private string mensajeError = ""; - List mensajes = new List(); public tsHerramientasCACOA bd; + List mensajes = new List(); private async Task OnFechaInicioChanged(DateTime? value) @@ -176,16 +192,8 @@ } } - protected override async Task OnInitializedAsync() - { - bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); - inicializarListado(); - } - - - - private async Task generarExcel() + public async Task generarExcel(byte[] arrayListados) { try { @@ -217,25 +225,7 @@ var ws = wb.Worksheets.Add("Total datos"); - // Generar tabla HERRAMIENTA/LICITACION CASA - var tablaPrincipal = generarTablaPrincipal(ws); - - int filaSiguiente = tablaPrincipal.RangeAddress.LastAddress.RowNumber + 5; - - // GENERAR TABLA USOS - int ultimaFilaUso = generarTablaUsos(bd, ws, filaSiguiente); - ultimaFilaUso = ultimaFilaUso + 5; - - // GENERAR TABLA FACTORES - int ultimaFilaFactor = generarTablaFactores(bd, ws, ultimaFilaUso); - ultimaFilaFactor = ultimaFilaFactor + 5; - - // GENERAR TABLA HERRAMIENTA/LICITACION URBAN - generarTablaUrban(bd, ws, ultimaFilaFactor); - - using var ms = new MemoryStream(); - wb.SaveAs(ms); - var bytes = ms.ToArray(); + var bytes = arrayListados; await JS.InvokeVoidAsync("descargarExcel", nombreExcel, Convert.ToBase64String(bytes)); @@ -264,315 +254,17 @@ throw new Exception("Ocurrió un error en la descarga del excel -> " + ex.Message); } } - - private IXLTable? generarTablaPrincipal(IXLWorksheet? ws) + protected override async Task OnInitializedAsync() { - var datos = UtilidadesCASA.rellenarListadoCASA(listadoHerramientaEstadistica); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); - // INTRODUCIR DATOS PARA LA TABLA - var table = ws.Cell("B4").InsertTable(datos); - - // OBTENER TAMAÑO DE LA TABLA - var firstCol = table.RangeAddress.FirstAddress.ColumnNumber; - var lastCol = table.RangeAddress.LastAddress.ColumnNumber; - var firstRow = table.RangeAddress.FirstAddress.RowNumber; - var lastRow = table.RangeAddress.LastAddress.RowNumber; - - // AUMENTAMOS EL TAMAÑO DEL HEADER UN POCO - int filaHeader = table.HeadersRow().RowNumber(); - ws.Row(filaHeader).Height += 20; - - // OBTENER PRIMERA FILA DE LA TABLA PARA PONER EL TITULO ARRIBA - int filaTabla = table.FirstRow().RowNumber(); - - // PONER EL TITULO EN LA FILA DE ARRIBA - int filaTitulo = filaTabla - 1; - - // SE ESCRIBE EL TITULO - ws.Cell(filaTitulo, 2).Value = "Herramienta CASA / Licitacion CASA"; - - // SE UNE LAS COLUMNAS - ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge(); - - // SE LE PONE UN FORMATO - var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()); - rangoTitulo.Merge(); - rangoTitulo.Style.Font.Bold = true; - rangoTitulo.Style.Font.FontSize = 14; - rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - ws.Row(filaTitulo).Height = 25; - - - // LE PONEMOS FORMATO AL HEADER - var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol); - headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - headerRange.Style.Font.Bold = true; - headerRange.Style.Font.FontColor = XLColor.White; - headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); - - // CENTRAR LOS DATOS - var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol); - dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - - // AJUSTAMOS LA TABLA - ws.Columns(firstCol, lastCol).AdjustToContents(); - - // SE PONE EL TITULO DE LOS HEADERS - table.Field(nameof(EstadistiaHerraCasaVM.idSimulacion)).Name = "Id Simulación"; - table.Field(nameof(EstadistiaHerraCasaVM.numeroTrabajadores)).Name = "Total trabajadores"; - table.Field(nameof(EstadistiaHerraCasaVM.costeAnualTotal)).Name = "Coste anual total"; - table.Field(nameof(EstadistiaHerraCasaVM.horasProduccion)).Name = "Horas de producción"; - table.Field(nameof(EstadistiaHerraCasaVM.costesDirectos)).Name = "Costes directos"; - table.Field(nameof(EstadistiaHerraCasaVM.costesIndirectos)).Name = "Coste indirectos"; - table.Field(nameof(EstadistiaHerraCasaVM.costesVariables)).Name = "Coste variables"; - table.Field(nameof(EstadistiaHerraCasaVM.costeDespacho)).Name = "Coste despacho"; - table.Field(nameof(EstadistiaHerraCasaVM.totalSuperficie)).Name = "Total superficie"; - table.Field(nameof(EstadistiaHerraCasaVM.porcentajeFases)).Name = "% fases"; - - table.Field(nameof(EstadistiaHerraCasaVM.horasDocumentacion)).Name = "Horas documentación"; - table.Field(nameof(EstadistiaHerraCasaVM.horasDireccionObra)).Name = "Horas dirección obra"; - table.Field(nameof(EstadistiaHerraCasaVM.horasTrabajo)).Name = "Horas trabajo"; - table.Field(nameof(EstadistiaHerraCasaVM.porcentajeExternalizacion)).Name = "% external."; - table.Field(nameof(EstadistiaHerraCasaVM.plazoPresentacion)).Name = "Plazo presentación"; - table.Field(nameof(EstadistiaHerraCasaVM.costeProduccion)).Name = "Coste de producción"; - table.Field(nameof(EstadistiaHerraCasaVM.beneficio)).Name = "Beneficio"; - table.Field(nameof(EstadistiaHerraCasaVM.precioTrabajo)).Name = "Precio trabajo"; - table.Field(nameof(EstadistiaHerraCasaVM.totalOtrosTrabajos)).Name = "Total otros trabajos"; - table.Field(nameof(EstadistiaHerraCasaVM.precioEncargo)).Name = "Precio encargo"; - - return table; + inicializarListado(); } - private int generarTablaUsos(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida) - { - var listaUsos = UtilidadesCASA.rellenarListadoUsos(bd, listadoHerramientaEstadisticaUsos); - - // SE AGRUPA POR IDSIMULACION PARA SEPARAR LOS DATOS POR SIMULACION - var simulacion = listaUsos.GroupBy(x => x.idSimulacion); - - int fila = filaValida; - - ws.Cell(fila, 2).Value = "Id Simulación"; - ws.Cell(fila, 3).Value = "Superficie"; - ws.Cell(fila, 4).Value = "Uso"; - ws.Cell(fila, 5).Value = "Tipología"; - ws.Cell(fila, 6).Value = "Intervención"; - - - // SE PONE EL FORMATO DEL HEADER - var headerRange = ws.Range(fila, 2, fila, 6); - - headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); - headerRange.Style.Font.Bold = true; - headerRange.Style.Font.FontColor = XLColor.White; - - headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - - ws.Row(fila).Height += 20; - // SE PONE EL TITULO ARRIBA DE LA TABLA - int filaTitulo = filaValida - 1; - ws.Cell(filaTitulo, 2).Value = "Usos"; - var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 6); - rangoTitulo.Merge(); - rangoTitulo.Style.Font.Bold = true; - rangoTitulo.Style.Font.FontSize = 14; - rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - ws.Row(filaTitulo).Height = 25; - - - fila++; - - // SE CREA LA TABLA RECORRIENDO EL LISTADO - foreach (var grupo in simulacion) - { - // SE PONE CADA COLUMNA - foreach (var item in grupo) - { - ws.Cell(fila, 2).Value = item.idSimulacion; - ws.Cell(fila, 3).Value = item.superficie; - ws.Cell(fila, 4).Value = item.uso; - ws.Cell(fila, 5).Value = item.tipologia; - ws.Cell(fila, 6).Value = item.intervencion; - - // SE CENTRA LOS DATOS - ws.Range(fila, 2, fila, 6).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - ws.Range(fila, 2, fila, 6).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - - fila++; - } - - // FILA DE TOTALES POR CADA SIMULACION - ws.Cell(fila, 2).Value = $"Total superficie de simulación: {grupo.Key}"; - - // SE SUMA EL TOTAL DE SUPERFICIE Y SE PONE UN FORMATO - ws.Cell(fila, 3).Value = grupo.Sum(x=> x.superficie); - ws.Range(fila, 2, fila, 6).Style.Font.Bold = true; - ws.Range(fila, 2, fila, 6).Style.Fill.BackgroundColor = XLColor.LightGray; - - fila++; - } - - // AJSUTAR COLUMNAS - ws.Columns().AdjustToContents(); - - return fila; - } - - private int generarTablaFactores(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida) - { - var listaUsos = UtilidadesCASA.rellenarListadoFactores(bd, listadoHerramientaEstadisticaFactores); - - // SE AGRUPA POR EL IDSIMULACION PARA DIVIDIR POR SIMULACION - var simulacion = listaUsos.GroupBy(x => x.idSimulacion); - - int fila = filaValida; - - ws.Cell(fila, 2).Value = "Id Simulación"; - ws.Cell(fila, 3).Value = "Nombre"; - ws.Cell(fila, 4).Value = "Coeficiente"; - ws.Cell(fila, 5).Value = "Tipo"; - - - // SE PONE UN FORMATO PARA EL HEADER - var headerRange = ws.Range(fila, 2, fila, 5); - - headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); - headerRange.Style.Font.Bold = true; - headerRange.Style.Font.FontColor = XLColor.White; - - headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - - ws.Row(fila).Height += 20; - - - // SE PONE EL TITULO - - int filaTitulo = filaValida - 1; - - ws.Cell(filaTitulo, 2).Value = "Factores"; - var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 5); - rangoTitulo.Merge(); - rangoTitulo.Style.Font.Bold = true; - rangoTitulo.Style.Font.FontSize = 14; - rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - ws.Row(filaTitulo).Height = 25; - - fila++; - - // RECORREMOS EL LISTADO - foreach (var grupo in simulacion) - { - // SE AGREGA LAS COLUMNAS - foreach (var item in grupo) - { - ws.Cell(fila, 2).Value = item.idSimulacion; - ws.Cell(fila, 3).Value = item.nombre; - ws.Cell(fila, 4).Value = item.coeficiente; - ws.Cell(fila, 5).Value = item.tipo; - - ws.Range(fila, 2, fila, 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - ws.Range(fila, 2, fila, 5).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - - fila++; - } - - // FILA TOTAL PARA DIVIDIR - ws.Cell(fila, 2).Value = $""; - ws.Range(fila, 2, fila, 5).Style.Font.Bold = true; - ws.Range(fila, 2, fila, 5).Style.Fill.BackgroundColor = XLColor.LightGray; - - fila++; - } - - // AJUSTAMOS COLUMNAS - ws.Columns().AdjustToContents(); - - return fila; - } - - private IXLTable? generarTablaUrban(tsHerramientasCACOA bd, IXLWorksheet? ws, int filaValida) - { - - var datos = UtilidadesCASA.rellenarListadoURBAN(bd,listadoHerramientaEstadisticaUrban); - - // AGREGAMOS LA TABLA - var table = ws.Cell(filaValida, 2).InsertTable(datos); - - // SE OBTIENE LAS DIMENSIONES DE LA TABLA - var firstCol = table.RangeAddress.FirstAddress.ColumnNumber; - var lastCol = table.RangeAddress.LastAddress.ColumnNumber; - var firstRow = table.RangeAddress.FirstAddress.RowNumber; - var lastRow = table.RangeAddress.LastAddress.RowNumber; - - // SE AGREGA MAS ALTURA AL HEADER - int filaHeader = table.HeadersRow().RowNumber(); - ws.Row(filaHeader).Height += 20; - - - // OBTENEMOS LA PRIMERA FILA DE LA TABLA PARA PONER EL TITULO - int filaTabla = table.FirstRow().RowNumber(); - - int filaTitulo = filaTabla - 1; - - // SE PONE EL TITULO Y SE CREA EL FORMATO - ws.Cell(filaTitulo, 2).Value = "Herramienta URBAN / Licitacion URBAN"; - - ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge(); - - var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()); - rangoTitulo.Merge(); - rangoTitulo.Style.Font.Bold = true; - rangoTitulo.Style.Font.FontSize = 14; - rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - ws.Row(filaTitulo).Height = 25; - - - // PONEMOS EL DISEÑO DEL HEADER - var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol); - headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - headerRange.Style.Font.Bold = true; - headerRange.Style.Font.FontColor = XLColor.White; - headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#e97132"); - - // CENTRAMOS LOS DATOS - var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol); - dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - - // AJUSTAMOS LAS COLUMNAS - ws.Columns(firstCol, lastCol).AdjustToContents(); - - // SE PONE EL NOMBRE AL HEADER - table.Field(nameof(EstadisticasUrbanVM.idSimulacion)).Name = "Id Simulación"; - table.Field(nameof(EstadisticasUrbanVM.numeroTrabajadores)).Name = "Total trabajadores"; - table.Field(nameof(EstadisticasUrbanVM.costeAnualTotal)).Name = "Coste anual total"; - table.Field(nameof(EstadisticasUrbanVM.horasProduccion)).Name = "Horas de producción"; - table.Field(nameof(EstadisticasUrbanVM.costesDirectos)).Name = "Costes directos"; - table.Field(nameof(EstadisticasUrbanVM.costesIndirectos)).Name = "Coste indirectos"; - table.Field(nameof(EstadisticasUrbanVM.costesVariables)).Name = "Coste variables"; - table.Field(nameof(EstadisticasUrbanVM.costeDespacho)).Name = "Coste despacho"; - table.Field(nameof(EstadisticasUrbanVM.tipoDocumento)).Name = "Tipo de documento"; - table.Field(nameof(EstadisticasUrbanVM.documento)).Name = "Documento"; - table.Field(nameof(EstadisticasUrbanVM.dato1)).Name = "Dato 1"; - table.Field(nameof(EstadisticasUrbanVM.dato2)).Name = "Dato 2"; - table.Field(nameof(EstadisticasUrbanVM.dato3)).Name = "Dato 3"; - table.Field(nameof(EstadisticasUrbanVM.porcentajeFases)).Name = "Fases"; - table.Field(nameof(EstadisticasUrbanVM.innovacion)).Name = "Innovación"; - table.Field(nameof(EstadisticasUrbanVM.horasTrabajo)).Name = "Horas trabajo"; - table.Field(nameof(EstadisticasUrbanVM.porcentajeExternalizacion)).Name = "% external."; - table.Field(nameof(EstadisticasUrbanVM.costeExternalizacion)).Name = "Coste externalización"; - table.Field(nameof(EstadisticasUrbanVM.plazoPresentacion)).Name = "Plazo presentación"; - table.Field(nameof(EstadisticasUrbanVM.costeProduccion)).Name = "Coste de producción"; - table.Field(nameof(EstadisticasUrbanVM.beneficio)).Name = "Beneficio"; - table.Field(nameof(EstadisticasUrbanVM.precioTrabajo)).Name = "Precio trabajo"; - - return table; - } private void inicializarListado() @@ -580,15 +272,20 @@ if (fechaInicio == null) { - listadoHerramientaEstadistica = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31 || x.idSimulacionNavigation.idTipoSimulacion == 32).ToList(); - listadoHerramientaEstadisticaUrban = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 34 || x.idSimulacionNavigation.idTipoSimulacion == 35).ToList(); + listadoHerramientaEstadistica = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31).ToList(); + listadoLicitacionesEstadistica = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 32).ToList(); + + listadoHerramientaEstadisticaUrban = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 34).ToList(); + listadoLicitacionesEstadisticaUrban = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 35).ToList(); } else { - var listadoPorTipoCASA = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31 || x.idSimulacionNavigation.idTipoSimulacion == 32).ToList(); + var listadoHerraCASA = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 31).ToList(); + var listadoLicitacionCASA = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 32).ToList(); - listadoHerramientaEstadistica = listadoPorTipoCASA.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList(); + listadoHerramientaEstadistica = listadoHerraCASA.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList(); + listadoLicitacionesEstadistica = listadoHerraCASA.Where(x => (x.idSimulacionNavigation.FechaCreacion >= fechaInicio) && (x.idSimulacionNavigation.FechaModificacion ?? x.idSimulacionNavigation.FechaCreacion).Date <= fechaFinal).ToList(); var listadoPorTipoURBAN = bd.estadisticas.Include(x => x.idSimulacionNavigation).Where(x => x.idSimulacionNavigation.idTipoSimulacion == 34 || x.idSimulacionNavigation.idTipoSimulacion == 35).ToList(); @@ -597,8 +294,8 @@ } listadoHerramientaEstadisticaUsos = bd.estadisticasusos.AsEnumerable().Where(x => listadoHerramientaEstadistica.Any(y => y.idSimulacion == x.idSimulacion)).ToList(); - - + listadoLicitacionUsos = bd.estadisticasusos.AsEnumerable().Where(x => listadoLicitacionesEstadistica.Any(y => y.idSimulacion == x.idSimulacion)).ToList(); + listadoHerramientaEstadisticaFactores = bd.estadisticasfactores.AsEnumerable().Where(x => listadoHerramientaEstadistica.Any(y => y.idSimulacion == x.idsimulacion)).ToList(); } } diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraCASATab.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraCASATab.razor index ae0ed68..8679929 100644 --- a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraCASATab.razor +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraCASATab.razor @@ -6,11 +6,18 @@ @using ClosedXML.Excel @using Microsoft.EntityFrameworkCore @using bdHerramientaCACOA.db +@inject IJSRuntime JS + +@using ClosedXML.Excel
+ @if (totalProyectosTipo != 0) { +
+ +
@@ -132,12 +139,26 @@ [Parameter] public List ListadoHerraCASA { get; set; } = new List(); - + [Parameter] + public List ListadoFactoresCASA { get; set; } = new List(); + [Parameter] + public List ListadoUsosCASA { get; set; } = new List(); private int totalProyectosTipo = 0; public EstadistiaHerraCasaVM estadisticasTotales = new EstadistiaHerraCasaVM(); - + + [CascadingParameter] + public ConfiguracionPages.EstadisticasConf _Parent { get; set; } + + public tsHerramientasCACOA bd; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + protected override void OnParametersSet() { inicializarListado(); @@ -175,4 +196,19 @@ hacerCalculos(ListadoHerraCASA); } + + + + + + + + + + private async Task ExportarExcelCasa() + { + var bytes = UtilidadesCASA.GenerarExcelCasa(bd,ListadoHerraCASA, ListadoUsosCASA, ListadoFactoresCASA); + + _Parent.generarExcel(bytes); + } } \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraURBANTab.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraURBANTab.razor index fbf9901..6216c0a 100644 --- a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraURBANTab.razor +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaHerraURBANTab.razor @@ -10,6 +10,10 @@ @if (totalProyectosTipo != 0) { +
+ +
+
@@ -198,6 +202,18 @@ public EstadisticasUrbanVM estadisticasTotales = new EstadisticasUrbanVM(); private int totalProyectosTipo = 0; + + [CascadingParameter] + public ConfiguracionPages.EstadisticasConf _Parent { get; set; } + + public tsHerramientasCACOA bd; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + private void hacerCalculos(List listadoEstadistica) { estadisticasTotales.numeroTrabajadores = UtilidadesCASA.comprobarNull(listadoEstadistica.Sum(x => x.numeroTrabajadores), totalProyectosTipo); @@ -230,4 +246,11 @@ hacerCalculos(ListadoHerraURBAN); } + + private async Task generarTablaUrban() + { + var bytes = UtilidadesCASA.GenerarExcelURBAN(bd, ListadoHerraURBAN, "Herramienta URBAN"); + + _Parent.generarExcel(bytes); + } } \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciCASATab.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciCASATab.razor index 8da1c53..6f0bb03 100644 --- a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciCASATab.razor +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciCASATab.razor @@ -7,9 +7,12 @@ @using bdHerramientaCACOA.db
- @if (totalProyectosTipo != 0) { +
+ +
+
@@ -118,9 +121,23 @@ [Parameter] public List ListadoLiciCASA { get; set; } = new List(); + [Parameter] + public List ListadoUsosLicitacion { get; set; } = new List(); + public EstadistiaHerraCasaVM estadisticasTotales = new EstadistiaHerraCasaVM(); private int totalProyectosTipo = 0; + [CascadingParameter] + public ConfiguracionPages.EstadisticasConf _Parent { get; set; } + + public tsHerramientasCACOA bd; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + private void hacerCalculos(List listadoEstadistica) { estadisticasTotales.costeDespacho = UtilidadesCASA.comprobarNull(listadoEstadistica.Sum(x => x.costeHoraDespachoProf), totalProyectosTipo); @@ -143,4 +160,11 @@ totalProyectosTipo = ListadoLiciCASA.Count(); hacerCalculos(ListadoLiciCASA); } + + private async Task ExportarExcelCasa() + { + var bytes = UtilidadesCASA.GenerarExcelCasa(bd, ListadoLiciCASA, ListadoUsosLicitacion, null); + + _Parent.generarExcel(bytes); + } } \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciURBANTab.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciURBANTab.razor index d9b7e86..8cfc6f3 100644 --- a/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciURBANTab.razor +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EstadisticasTabs/EstadisticaLiciURBANTab.razor @@ -10,6 +10,11 @@ @if (totalProyectosTipo != 0) { + +
+ +
+
@@ -152,6 +157,18 @@ public EstadisticasUrbanVM estadisticasTotales = new EstadisticasUrbanVM(); private int totalProyectosTipo = 0; + + [CascadingParameter] + public ConfiguracionPages.EstadisticasConf _Parent { get; set; } + + public tsHerramientasCACOA bd; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + private void hacerCalculos(List listadoEstadistica) { estadisticasTotales.costeDespacho = UtilidadesCASA.comprobarNull(listadoEstadistica.Sum(x => x.costeHoraDespachoProf), totalProyectosTipo); @@ -175,4 +192,11 @@ hacerCalculos(ListadoLiciURBAN); } + + private async Task generarTablaUrban() + { + var bytes = UtilidadesCASA.GenerarExcelURBAN(bd, ListadoLiciURBAN, "Licitación URBAN"); + + _Parent.generarExcel(bytes); + } } \ No newline at end of file diff --git a/HerramientaCASA/UtilidadesCASA.cs b/HerramientaCASA/UtilidadesCASA.cs index a9f683e..3b1d1bc 100644 --- a/HerramientaCASA/UtilidadesCASA.cs +++ b/HerramientaCASA/UtilidadesCASA.cs @@ -3,6 +3,7 @@ using bdHerramientaCACOA.db; using bdHerramientaCACOA.dbcontext; using bdHerramientaCACOA.HerramientaURBAN; using BlazorBootstrap; +using ClosedXML.Excel; using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle; using HerramientaCASA.Components.Pages; using HerramientaCASA.Components.Pages.HerramientaCASATabs; @@ -1067,7 +1068,7 @@ namespace HerramientaCASA return listadoEstadisticaFactoresExcel; } - public static List rellenarListadoURBAN(tsHerramientasCACOA bd, List listadoEstadisticaUrban) + public static List rellenarListadoURBAN(List listadoEstadisticaUrban) { List listadoEstadisticasUrbanExcel = new List(); @@ -1113,5 +1114,378 @@ namespace HerramientaCASA return semanas; } + + + public static byte[] GenerarExcelCasa( + tsHerramientasCACOA bd, + List listadoHerramientaEstadistica, + List listadoHerramientaEstadisticaUsos, + List listadoHerramientaEstadisticaFactores) + { + using var wb = new XLWorkbook(); + IXLWorksheet ws ; + string tituloExcel = "Herramienta CASA"; + + if (listadoHerramientaEstadisticaFactores == null) + { + tituloExcel = "Licitación CASA"; + ws = wb.Worksheets.Add("Licitación CASA"); + } + else + { + ws = wb.Worksheets.Add("Herramienta CASA"); + } + + var tablaPrincipal = generarTablaPrincipal(ws, listadoHerramientaEstadistica, tituloExcel); + + int filaSiguiente = tablaPrincipal.RangeAddress.LastAddress.RowNumber + 5; + + int ultimaFilaUso = generarTablaUsos(bd,ws, filaSiguiente, listadoHerramientaEstadisticaUsos); + ultimaFilaUso += 5; + + if (listadoHerramientaEstadisticaFactores != null) + { + generarTablaFactores(bd, ws, ultimaFilaUso, listadoHerramientaEstadisticaFactores); + } + + using var ms = new MemoryStream(); + wb.SaveAs(ms); + return ms.ToArray(); + } + + private static IXLTable? generarTablaPrincipal(IXLWorksheet? ws, List listadoHerramientaEstadistica, string tituloExcel) + { + var datos = UtilidadesCASA.rellenarListadoCASA(listadoHerramientaEstadistica); + + // INTRODUCIR DATOS PARA LA TABLA + var table = ws.Cell("B4").InsertTable(datos); + + // OBTENER TAMAÑO DE LA TABLA + var firstCol = table.RangeAddress.FirstAddress.ColumnNumber; + var lastCol = table.RangeAddress.LastAddress.ColumnNumber; + var firstRow = table.RangeAddress.FirstAddress.RowNumber; + var lastRow = table.RangeAddress.LastAddress.RowNumber; + + // AUMENTAMOS EL TAMAÑO DEL HEADER UN POCO + int filaHeader = table.HeadersRow().RowNumber(); + ws.Row(filaHeader).Height += 20; + + // OBTENER PRIMERA FILA DE LA TABLA PARA PONER EL TITULO ARRIBA + int filaTabla = table.FirstRow().RowNumber(); + + // PONER EL TITULO EN LA FILA DE ARRIBA + int filaTitulo = filaTabla - 1; + + // SE ESCRIBE EL TITULO + ws.Cell(filaTitulo, 2).Value = tituloExcel; + + // SE UNE LAS COLUMNAS + ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge(); + + // SE LE PONE UN FORMATO + var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()); + rangoTitulo.Merge(); + rangoTitulo.Style.Font.Bold = true; + rangoTitulo.Style.Font.FontSize = 14; + rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Row(filaTitulo).Height = 25; + + + // LE PONEMOS FORMATO AL HEADER + var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol); + headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + headerRange.Style.Font.Bold = true; + headerRange.Style.Font.FontColor = XLColor.White; + headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); + + // CENTRAR LOS DATOS + var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol); + dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + + // AJUSTAMOS LA TABLA + ws.Columns(firstCol, lastCol).AdjustToContents(); + + // SE PONE EL TITULO DE LOS HEADERS + table.Field(nameof(EstadistiaHerraCasaVM.idSimulacion)).Name = "Id Simulación"; + table.Field(nameof(EstadistiaHerraCasaVM.numeroTrabajadores)).Name = "Total trabajadores"; + table.Field(nameof(EstadistiaHerraCasaVM.costeAnualTotal)).Name = "Coste anual total"; + table.Field(nameof(EstadistiaHerraCasaVM.horasProduccion)).Name = "Horas de producción"; + table.Field(nameof(EstadistiaHerraCasaVM.costesDirectos)).Name = "Costes directos"; + table.Field(nameof(EstadistiaHerraCasaVM.costesIndirectos)).Name = "Coste indirectos"; + table.Field(nameof(EstadistiaHerraCasaVM.costesVariables)).Name = "Coste variables"; + table.Field(nameof(EstadistiaHerraCasaVM.costeDespacho)).Name = "Coste despacho"; + table.Field(nameof(EstadistiaHerraCasaVM.totalSuperficie)).Name = "Total superficie"; + table.Field(nameof(EstadistiaHerraCasaVM.porcentajeFases)).Name = "% fases"; + + table.Field(nameof(EstadistiaHerraCasaVM.horasDocumentacion)).Name = "Horas documentación"; + table.Field(nameof(EstadistiaHerraCasaVM.horasDireccionObra)).Name = "Horas dirección obra"; + table.Field(nameof(EstadistiaHerraCasaVM.horasTrabajo)).Name = "Horas trabajo"; + table.Field(nameof(EstadistiaHerraCasaVM.porcentajeExternalizacion)).Name = "% external."; + table.Field(nameof(EstadistiaHerraCasaVM.plazoPresentacion)).Name = "Plazo presentación"; + table.Field(nameof(EstadistiaHerraCasaVM.costeProduccion)).Name = "Coste de producción"; + table.Field(nameof(EstadistiaHerraCasaVM.beneficio)).Name = "Beneficio"; + table.Field(nameof(EstadistiaHerraCasaVM.precioTrabajo)).Name = "Precio trabajo"; + table.Field(nameof(EstadistiaHerraCasaVM.totalOtrosTrabajos)).Name = "Total otros trabajos"; + table.Field(nameof(EstadistiaHerraCasaVM.precioEncargo)).Name = "Precio encargo"; + + return table; + } + + private static int generarTablaUsos(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida, List listadoHerramientaEstadisticaUsos) + { + var listaUsos = UtilidadesCASA.rellenarListadoUsos(bd, listadoHerramientaEstadisticaUsos); + + // SE AGRUPA POR IDSIMULACION PARA SEPARAR LOS DATOS POR SIMULACION + var simulacion = listaUsos.GroupBy(x => x.idSimulacion); + + int fila = filaValida; + + ws.Cell(fila, 2).Value = "Id Simulación"; + ws.Cell(fila, 3).Value = "Superficie"; + ws.Cell(fila, 4).Value = "Uso"; + ws.Cell(fila, 5).Value = "Tipología"; + ws.Cell(fila, 6).Value = "Intervención"; + + + // SE PONE EL FORMATO DEL HEADER + var headerRange = ws.Range(fila, 2, fila, 6); + + headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); + headerRange.Style.Font.Bold = true; + headerRange.Style.Font.FontColor = XLColor.White; + + headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + ws.Row(fila).Height += 20; + + + + // SE PONE EL TITULO ARRIBA DE LA TABLA + int filaTitulo = filaValida - 1; + + ws.Cell(filaTitulo, 2).Value = "Usos"; + var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 6); + rangoTitulo.Merge(); + rangoTitulo.Style.Font.Bold = true; + rangoTitulo.Style.Font.FontSize = 14; + rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Row(filaTitulo).Height = 25; + + + fila++; + + // SE CREA LA TABLA RECORRIENDO EL LISTADO + foreach (var grupo in simulacion) + { + // SE PONE CADA COLUMNA + foreach (var item in grupo) + { + ws.Cell(fila, 2).Value = item.idSimulacion; + ws.Cell(fila, 3).Value = item.superficie; + ws.Cell(fila, 4).Value = item.uso; + ws.Cell(fila, 5).Value = item.tipologia; + ws.Cell(fila, 6).Value = item.intervencion; + + // SE CENTRA LOS DATOS + ws.Range(fila, 2, fila, 6).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + ws.Range(fila, 2, fila, 6).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + fila++; + } + + // FILA DE TOTALES POR CADA SIMULACION + ws.Cell(fila, 2).Value = $"Total superficie de simulación: {grupo.Key}"; + + // SE SUMA EL TOTAL DE SUPERFICIE Y SE PONE UN FORMATO + ws.Cell(fila, 3).Value = grupo.Sum(x => x.superficie); + ws.Range(fila, 2, fila, 6).Style.Font.Bold = true; + ws.Range(fila, 2, fila, 6).Style.Fill.BackgroundColor = XLColor.LightGray; + + fila++; + } + + // AJSUTAR COLUMNAS + ws.Columns().AdjustToContents(); + + return fila; + } + + private static int generarTablaFactores(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida, List listadoHerramientaEstadisticaFactores) + { + var listaUsos = UtilidadesCASA.rellenarListadoFactores(bd, listadoHerramientaEstadisticaFactores); + + // SE AGRUPA POR EL IDSIMULACION PARA DIVIDIR POR SIMULACION + var simulacion = listaUsos.GroupBy(x => x.idSimulacion); + + int fila = filaValida; + + ws.Cell(fila, 2).Value = "Id Simulación"; + ws.Cell(fila, 3).Value = "Nombre"; + ws.Cell(fila, 4).Value = "Coeficiente"; + ws.Cell(fila, 5).Value = "Tipo"; + + + // SE PONE UN FORMATO PARA EL HEADER + var headerRange = ws.Range(fila, 2, fila, 5); + + headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); + headerRange.Style.Font.Bold = true; + headerRange.Style.Font.FontColor = XLColor.White; + + headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + ws.Row(fila).Height += 20; + + + // SE PONE EL TITULO + + int filaTitulo = filaValida - 1; + + ws.Cell(filaTitulo, 2).Value = "Factores"; + var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 5); + rangoTitulo.Merge(); + rangoTitulo.Style.Font.Bold = true; + rangoTitulo.Style.Font.FontSize = 14; + rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Row(filaTitulo).Height = 25; + + fila++; + + // RECORREMOS EL LISTADO + foreach (var grupo in simulacion) + { + // SE AGREGA LAS COLUMNAS + foreach (var item in grupo) + { + ws.Cell(fila, 2).Value = item.idSimulacion; + ws.Cell(fila, 3).Value = item.nombre; + ws.Cell(fila, 4).Value = item.coeficiente; + ws.Cell(fila, 5).Value = item.tipo; + + ws.Range(fila, 2, fila, 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + ws.Range(fila, 2, fila, 5).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + fila++; + } + + // FILA TOTAL PARA DIVIDIR + ws.Cell(fila, 2).Value = $""; + ws.Range(fila, 2, fila, 5).Style.Font.Bold = true; + ws.Range(fila, 2, fila, 5).Style.Fill.BackgroundColor = XLColor.LightGray; + + fila++; + } + + // AJUSTAMOS COLUMNAS + ws.Columns().AdjustToContents(); + + return fila; + } + + + + + + + + public static byte[] GenerarExcelURBAN(tsHerramientasCACOA bd, List listadoUrbanEstadistica, string tipoHerramienta) + { + using var wb = new XLWorkbook(); + IXLWorksheet ws; + string tituloExcel = tipoHerramienta; + ws = wb.Worksheets.Add(tipoHerramienta); + + crearTablaURBAN( ws,listadoUrbanEstadistica, tipoHerramienta); + + using var ms = new MemoryStream(); + wb.SaveAs(ms); + return ms.ToArray(); + } + + + + + + private static IXLTable? crearTablaURBAN(IXLWorksheet? ws, List listadoHerramientaEstadisticaUrban, string tituloExcel) + { + var datos = UtilidadesCASA.rellenarListadoURBAN(listadoHerramientaEstadisticaUrban); + + // INTRODUCIR DATOS PARA LA TABLA + var table = ws.Cell("B4").InsertTable(datos); + + // OBTENER TAMAÑO DE LA TABLA + var firstCol = table.RangeAddress.FirstAddress.ColumnNumber; + var lastCol = table.RangeAddress.LastAddress.ColumnNumber; + var firstRow = table.RangeAddress.FirstAddress.RowNumber; + var lastRow = table.RangeAddress.LastAddress.RowNumber; + + // AUMENTAMOS EL TAMAÑO DEL HEADER UN POCO + int filaHeader = table.HeadersRow().RowNumber(); + ws.Row(filaHeader).Height += 20; + + // OBTENER PRIMERA FILA DE LA TABLA PARA PONER EL TITULO ARRIBA + int filaTabla = table.FirstRow().RowNumber(); + + // PONER EL TITULO EN LA FILA DE ARRIBA + int filaTitulo = filaTabla - 1; + + // SE ESCRIBE EL TITULO + ws.Cell(filaTitulo, 2).Value = tituloExcel; + + // SE UNE LAS COLUMNAS + ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge(); + + // SE LE PONE UN FORMATO + var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()); + rangoTitulo.Merge(); + rangoTitulo.Style.Font.Bold = true; + rangoTitulo.Style.Font.FontSize = 14; + rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Row(filaTitulo).Height = 25; + + + // LE PONEMOS FORMATO AL HEADER + var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol); + headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + headerRange.Style.Font.Bold = true; + headerRange.Style.Font.FontColor = XLColor.White; + headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082"); + + // CENTRAR LOS DATOS + var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol); + dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + + // AJUSTAMOS LA TABLA + ws.Columns(firstCol, lastCol).AdjustToContents(); + + // SE PONE EL NOMBRE AL HEADER + table.Field(nameof(EstadisticasUrbanVM.idSimulacion)).Name = "Id Simulación"; + table.Field(nameof(EstadisticasUrbanVM.numeroTrabajadores)).Name = "Total trabajadores"; + table.Field(nameof(EstadisticasUrbanVM.costeAnualTotal)).Name = "Coste anual total"; + table.Field(nameof(EstadisticasUrbanVM.horasProduccion)).Name = "Horas de producción"; + table.Field(nameof(EstadisticasUrbanVM.costesDirectos)).Name = "Costes directos"; + table.Field(nameof(EstadisticasUrbanVM.costesIndirectos)).Name = "Coste indirectos"; + table.Field(nameof(EstadisticasUrbanVM.costesVariables)).Name = "Coste variables"; + table.Field(nameof(EstadisticasUrbanVM.costeDespacho)).Name = "Coste despacho"; + table.Field(nameof(EstadisticasUrbanVM.tipoDocumento)).Name = "Tipo de documento"; + table.Field(nameof(EstadisticasUrbanVM.documento)).Name = "Documento"; + table.Field(nameof(EstadisticasUrbanVM.dato1)).Name = "Dato 1"; + table.Field(nameof(EstadisticasUrbanVM.dato2)).Name = "Dato 2"; + table.Field(nameof(EstadisticasUrbanVM.dato3)).Name = "Dato 3"; + table.Field(nameof(EstadisticasUrbanVM.porcentajeFases)).Name = "Fases"; + table.Field(nameof(EstadisticasUrbanVM.innovacion)).Name = "Innovación"; + table.Field(nameof(EstadisticasUrbanVM.horasTrabajo)).Name = "Horas trabajo"; + table.Field(nameof(EstadisticasUrbanVM.porcentajeExternalizacion)).Name = "% external."; + table.Field(nameof(EstadisticasUrbanVM.costeExternalizacion)).Name = "Coste externalización"; + table.Field(nameof(EstadisticasUrbanVM.plazoPresentacion)).Name = "Plazo presentación"; + table.Field(nameof(EstadisticasUrbanVM.costeProduccion)).Name = "Coste de producción"; + table.Field(nameof(EstadisticasUrbanVM.beneficio)).Name = "Beneficio"; + table.Field(nameof(EstadisticasUrbanVM.precioTrabajo)).Name = "Precio trabajo"; + + return table; + } + } }