From 62d67012bece3dc9f1aac77df71025ab095d9437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Sun, 21 Sep 2025 21:41:35 +0200 Subject: [PATCH] trabajando en el envio de los datos al backend para generar el resumen. no recibe bien el objeto presupuesto --- .../erp/presupuesto/Presupuesto.java | 12 +++ .../presupuesto/PresupuestoController.java | 6 ++ .../erp/presupuesto/PresupuestoService.java | 27 +++++- .../resources/i18n/presupuesto_es.properties | 3 + .../static/assets/css/presupuestador.css | 87 +++++++++++++++++-- .../presupuestador/presupuestador.js | 43 +++++++-- .../imprimelibros/presupuestador/summary.js | 20 ++++- .../{_resumen.html => _resumen_final.html} | 0 .../presupuestador-items/_summary.html | 48 +++++----- .../presupuestos/presupuestador.html | 6 +- 10 files changed, 208 insertions(+), 44 deletions(-) rename src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/{_resumen.html => _resumen_final.html} (100%) diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java index d768ab2..a3953e7 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java @@ -535,4 +535,16 @@ public class Presupuesto implements Cloneable{ public void setPresupuestoMaquetacionData(String presupuestoMaquetacionData) { this.presupuestoMaquetacionData = presupuestoMaquetacionData; } + + public String resumenPresupuesto() { + return String.format("%s - %s - %dx%d mm - %d Páginas (N:%d C:%d) - Tira:%d", + this.titulo, + this.tipoEncuadernacion, + this.ancho, + this.alto, + this.paginasNegro + this.paginasColorTotal, + this.paginasNegro, + this.paginasColorTotal, + this.selectedTirada != null ? this.selectedTirada : 0); + } } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java index 3106521..4163208 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java @@ -375,4 +375,10 @@ public class PresupuestoController { return ResponseEntity.ok(resultado); } + @GetMapping("/public/getresumen") + public ResponseEntity getResumen(Presupuesto presupuesto, @RequestParam HashMap summary, Locale locale) { + return ResponseEntity.ok(presupuestoService.getResumen(presupuesto, summary, locale)); + } + + } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java index 8850973..18457d4 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java @@ -760,12 +760,15 @@ public class PresupuestoService { resultado.put("precio_unitario", precio_unidad); resultado.put("precio_total", pvp); HashMap language = new HashMap<>(); - language.put("precio_unidad", messageSource.getMessage("presupuesto.marcapaginas.precio-unidad", null, locale)); - language.put("precio_total", messageSource.getMessage("presupuesto.marcapaginas.precio-total", null, locale)); + language.put("precio_unidad", + messageSource.getMessage("presupuesto.marcapaginas.precio-unidad", null, locale)); + language.put("precio_total", + messageSource.getMessage("presupuesto.marcapaginas.precio-total", null, locale)); language.put("add_to_presupuesto", messageSource.getMessage("presupuesto.add-to-presupuesto", null, locale)); language.put("cancel", messageSource.getMessage("app.cancelar", null, locale)); - language.put("presupuesto_marcapaginas", messageSource.getMessage("presupuesto.marcapaginas", null, locale)); + language.put("presupuesto_marcapaginas", + messageSource.getMessage("presupuesto.marcapaginas", null, locale)); resultado.put("language", language); return resultado; @@ -777,4 +780,22 @@ public class PresupuestoService { out.put("precio_total", 0.0); return out; } + + public Map getResumen(Presupuesto presupuesto, HashMap servicios, Locale locale) { + Map resumen = new HashMap<>(); + + resumen.put("titulo", presupuesto.getTitulo()); + + /* + * Integer tirada = presupuesto.getSelectedTirada() != null ? + * presupuesto.getSelectedTirada() : 0; + * if (Arrays.asList(servicios).contains("deposito-legal")) { + * tirada += 4; + * } + */ + + String textoResumen = messageSource.getMessage("presupuesto.resumen-texto", null, locale); + resumen.put("resumen", textoResumen); + return resumen; + } } diff --git a/src/main/resources/i18n/presupuesto_es.properties b/src/main/resources/i18n/presupuesto_es.properties index 13a8e98..5d7146b 100644 --- a/src/main/resources/i18n/presupuesto_es.properties +++ b/src/main/resources/i18n/presupuesto_es.properties @@ -157,6 +157,9 @@ presupuesto.calcular-presupuesto=Calcular presupuesto presupuesto.consultar-soporte=Consultar con soporte # Pestaña resumen del presupuesto +presupuesto.resumen-texto={tirada} unidades encuadernadas en {tipoEncuadernacion} con {totalPaginas} páginas en formato {formato}. \ + \n Papel interior {papelInterior} {gramajeInterior}. \ + \n Cubierta en {tapaCubierta} {solapasCubierta} en {papelCubierta} {gramajeCubierta}. presupuesto.volver-extras=Volver a extras # Resumen del presupuesto diff --git a/src/main/resources/static/assets/css/presupuestador.css b/src/main/resources/static/assets/css/presupuestador.css index 3e1ecca..e3cf208 100644 --- a/src/main/resources/static/assets/css/presupuestador.css +++ b/src/main/resources/static/assets/css/presupuestador.css @@ -213,7 +213,8 @@ /* ===== Tiradas (pricing cards) ===== */ .tirada-card { - --il-accent: #92b2a7; /* verde grisáceo */ + --il-accent: #92b2a7; + /* verde grisáceo */ --radius: 18px; --sel-scale-y: 1.12; /* cuánto más alta la seleccionada (crece arriba y abajo) */ @@ -352,19 +353,23 @@ .nav-link.active .bg-soft-primary { - background-color: #ffffff33 !important; /* #4c5c63 al 20% */ + background-color: #ffffff33 !important; + /* #4c5c63 al 20% */ } .nav-link.active .text-primary { - color: #ffffff !important; /* #4c5c63 al 20% */ + color: #ffffff !important; + /* #4c5c63 al 20% */ } .nav-link:not(.active) .bg-soft-primary { - background-color: #4c5c6366 !important; /* #4c5c63 al 20% */ + background-color: #4c5c6366 !important; + /* #4c5c63 al 20% */ } .nav-link:not(.active) .text-primary { - color: #000000 !important; /* #4c5c63 al 20% */ + color: #000000 !important; + /* #4c5c63 al 20% */ } /* base */ @@ -376,20 +381,20 @@ } /* hover no seleccionado */ -.btn-check-service + .btn-service-option:hover { +.btn-check-service+.btn-service-option:hover { background-color: rgba(146, 178, 167, 0.3); color: #92b2a7; } /* seleccionado */ -.btn-check-service:checked + .btn-service-option { +.btn-check-service:checked+.btn-service-option { background-color: #92b2a7; color: #fff; border-color: #92b2a7; } /* hover estando seleccionado (que no se aclare) */ -.btn-check-service:checked + .btn-service-option:hover { +.btn-check-service:checked+.btn-service-option:hover { background-color: #92b2a7; color: #fff; } @@ -407,4 +412,70 @@ .form-switch-custom.form-switch-presupuesto .form-check-input:checked::before { color: #92b2a7; +} + +/* ==== Paso al resumen ==== */ +/* ---- Ajustes rápidos ---- */ +/* Valores por defecto (col-9 / col-3 ≈ 75% / 25%) */ +#presupuesto-row{ + --main-col: 75%; + --summary-col: 25%; + --il-dur-main: 1.4s; + --il-dur-summary: .6s; + --il-delay-main: .15s; /* empieza un poco después */ + --il-delay-summary: 0s; + --il-ease-main: cubic-bezier(.2,.8,.2,1); + --il-ease-summary: cubic-bezier(.4,0,.2,1); + --il-shift: 32px; +} + +/* Forzamos que el ancho venga de las variables (y sea animable) */ +@media (prefers-reduced-motion: no-preference){ + #presupuesto-row .col-main{ + flex: 0 0 var(--main-col) !important; + max-width: var(--main-col) !important; + transition: + flex-basis var(--il-dur-main) var(--il-ease-main) var(--il-delay-main), + max-width var(--il-dur-main) var(--il-ease-main) var(--il-delay-main); + } + #presupuesto-row .summary-col{ + flex: 0 0 var(--summary-col) !important; + max-width: var(--summary-col) !important; + transition: + flex-basis var(--il-dur-summary) var(--il-ease-summary) var(--il-delay-summary), + max-width var(--il-dur-summary) var(--il-ease-summary) var(--il-delay-summary), + opacity var(--il-dur-summary) var(--il-ease-summary) var(--il-delay-summary), + transform var(--il-dur-summary) var(--il-ease-summary) var(--il-delay-summary); + } +} + +/* Estado expandido: cambiamos SOLO las variables (esto sí se anima) */ +#presupuesto-row.expanded{ + --main-col: 100%; + --summary-col: 0%; +} + +#presupuesto-row.expanded .summary-col{ + opacity: 0; + transform: translateX(var(--il-shift)); + pointer-events: none; + overflow: hidden; +} + +@media (min-width: 1200px){ + /* Evita que las columnas se vayan a la siguiente línea durante la animación */ + #presupuesto-row{ + display: flex; /* por si acaso algún wrapper cambia el display */ + flex-wrap: nowrap; /* <-- clave */ + align-items: stretch; + } + /* Permite que las columnas puedan encoger sin forzar salto de línea */ + #presupuesto-row .col-main, + #presupuesto-row .summary-col{ + min-width: 0; /* <-- clave para que el contenido no fuerce ancho */ + } + /* Opcional: evita “asomar” algo durante el slide */ + #presupuesto-row .summary-col{ + overflow: hidden; + } } \ No newline at end of file diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuestador.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuestador.js index 303654b..3d196ff 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuestador.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuestador.js @@ -1388,6 +1388,20 @@ class PresupuestoCliente { this.#changeTab('pills-seleccion-tirada'); this.summaryTableExtras.addClass('d-none'); } else { + const data = Summary.getSummaryData(); + $.ajax({ + url: '/presupuesto/public/getresumen', + type: 'GET', + data: { + presupuesto: this.#getPresupuestoData(), + summary: data, + } + }).then((data) => { + console.log("Extras validados correctamente", data); + }).catch((error) => { + console.error("Error obtener resumen: ", error); + }); + this.#changeTab('pills-resumen'); } }); @@ -1443,21 +1457,40 @@ class PresupuestoCliente { * END EXTRAS ******************************/ - + /****************************** - * EXTRAS + * RESUMEN ******************************/ #initResumen() { + const $row = $('#presupuesto-row'); + // 1) Transición al cambiar de pestaña (click o programático) + $(document).on('shown.bs.tab', '.custom-nav .nav-link', (e) => { + const targetSelector = $(e.target).data('bs-target'); // ej: "#pills-resumen" + if (targetSelector === '#pills-resumen') { + $row.addClass('expanded'); + window.scrollTo({ top: 0, behavior: 'smooth' }); + } else { + $row.removeClass('expanded'); + } + }); + + // 2) Botón "atrás" en Resumen $(document).on('click', '.btn-change-tab-resumen', (e) => { - const id = e.currentTarget.id; - if (id === 'btn-prev-resumen') { + if (e.currentTarget.id === 'btn-prev-resumen') { this.#changeTab('pills-extras'); } }); + + // 3) Estado inicial si ya cargas en Resumen + $(function () { + const activeTarget = $('.custom-nav .nav-link.active').data('bs-target'); + $('#presupuesto-row').toggleClass('expanded', activeTarget === '#pills-resumen'); + }); } + /****************************** - * END EXTRAS + * END RESUMEN ******************************/ } diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/summary.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/summary.js index 84032f1..f6481c2 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/summary.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/summary.js @@ -152,7 +152,7 @@ export function updateExtras() { const price = $(`label[for="${$servicio.attr('id')}"] .service-price`).text().trim() || $servicio.attr('price'); const $row = $('').append( $('').append($('').text(resumen)), - $('').text(price) + $('').text(price) ); $tbody.append($row); }); @@ -161,4 +161,22 @@ export function updateExtras() { } else { $table.addClass('d-none'); } +} + +export function getSummaryData() { + const data = {}; + + $(".data-summary").each(function () { + const $el = $(this); + + // comprobar si la tabla y el tr están visibles + if ($el.closest("table").is(":visible") && $el.closest("tr").is(":visible")) { + const key = $el.data("id-summary"); // atributo data-id-summary + const value = $el.text().trim(); // texto visible + + data[key] = value; + } + }); + + return data; } \ No newline at end of file diff --git a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_resumen.html b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_resumen_final.html similarity index 100% rename from src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_resumen.html rename to src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_resumen_final.html diff --git a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_summary.html b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_summary.html index d181f17..ab5fd02 100644 --- a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_summary.html +++ b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_summary.html @@ -1,4 +1,4 @@ -
+
@@ -20,19 +20,19 @@ - Fresado + Fresado - + - + @@ -60,19 +60,19 @@ - + - + - + @@ -87,61 +87,61 @@ - + - + - + - + - + - + - + - + - + - + @@ -156,19 +156,19 @@ - + - + - + @@ -183,25 +183,25 @@ - + - + - + - + diff --git a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador.html b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador.html index 07f0245..dba5144 100644 --- a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador.html +++ b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador.html @@ -7,8 +7,8 @@
-
-
+
+
@@ -118,7 +118,7 @@
-
+