From 060b435388be8bed2b8305239ad13d8f442b375e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Thu, 16 Oct 2025 14:24:24 +0200 Subject: [PATCH] arreglados problemas presupuesto, botones css etc --- pom.xml | 2 +- .../presupuesto/PresupuestoController.java | 11 ++- .../service/PresupuestoService.java | 38 ++++++-- src/main/resources/i18n/app_es.properties | 2 + .../static/assets/css/presupuestador.css | 92 +++++++++++++++++++ .../presupuesto-marcapaginas.js | 20 ++-- .../presupuestador/tirada-price-card.js | 2 +- .../imprimelibros/presupuestador/wizard.js | 85 ++++++++++------- .../presupuestador-items/_buttons.html | 72 +++++++++++---- .../presupuestador-items/_cubierta.html | 14 +-- .../_datos-generales.html | 16 ++-- .../presupuestador-items/_extras.html | 14 +-- .../presupuestador-items/_interior.html | 17 +--- .../presupuestador-items/_resumen_final.html | 22 +---- .../_seleccion-tirada.html | 16 +--- .../presupuestos/presupuestador.html | 24 ++--- 16 files changed, 278 insertions(+), 169 deletions(-) diff --git a/pom.xml b/pom.xml index b058b23..120c87a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.3 + 3.5.6 com.imprimelibros diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java index 12f88dd..f0ed404 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java @@ -478,14 +478,19 @@ public class PresupuestoController { Presupuesto p = objectMapper.convertValue(body.get("presupuesto"), Presupuesto.class); Boolean save = objectMapper.convertValue(body.get("save"), Boolean.class); String mode = objectMapper.convertValue(body.get("mode"), String.class); - @SuppressWarnings("unchecked") List> serviciosList = (List>) body.getOrDefault("servicios", List.of()); + @SuppressWarnings("unchecked") + Map datosMaquetacion = (Map) objectMapper + .convertValue(body.get("datosMaquetacion"), Map.class); + @SuppressWarnings("unchecked") + Map datosMarcapaginas = (Map) objectMapper + .convertValue(body.get("datosMarcapaginas"), Map.class); String sessionId = request.getSession(true).getId(); String ip = IpUtils.getClientIp(request); - var resumen = presupuestoService.getResumen(p, serviciosList, save, mode, locale, sessionId, ip); + var resumen = presupuestoService.getResumen(p, serviciosList, datosMaquetacion, datosMarcapaginas, save, mode, locale, sessionId, ip); return ResponseEntity.ok(resumen); } @@ -705,7 +710,7 @@ public class PresupuestoController { } } - @PostMapping(path = "api/save") + @PostMapping(path = "/api/save") public ResponseEntity save( @RequestBody Map body, Locale locale, HttpServletRequest request) { diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java index 43d1887..9fdeacd 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java @@ -119,13 +119,11 @@ public class PresupuestoService { opcionColorHq.setSelected(true); opciones.add(opcionColorHq); } else { - if (!this.isPOD(presupuesto)) { - // POD solo negro premium - ImagenPresupuesto opcionNegro = this.presupuestadorItems.getImpresionNegro(locale); - if (Presupuesto.TipoImpresion.negro.equals(presupuesto.getTipoImpresion())) - opcionNegro.setSelected(true); - opciones.add(opcionNegro); - } + ImagenPresupuesto opcionNegro = this.presupuestadorItems.getImpresionNegro(locale); + if (Presupuesto.TipoImpresion.negro.equals(presupuesto.getTipoImpresion())) + opcionNegro.setSelected(true); + opciones.add(opcionNegro); + ImagenPresupuesto opcionNegroHq = this.presupuestadorItems.getImpresionNegroPremium(locale); if (Presupuesto.TipoImpresion.negrohq.equals(presupuesto.getTipoImpresion())) opcionNegroHq.setSelected(true); @@ -148,12 +146,14 @@ public class PresupuestoService { List opciones = new ArrayList<>(); opciones.add(this.presupuestadorItems.getPapelOffsetBlanco(locale)); - if (presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro || + if ((presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro + && !this.isPOD(presupuesto)) || presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.color) { opciones.add(this.presupuestadorItems.getPapelOffsetBlancoVolumen(locale)); } opciones.add(this.presupuestadorItems.getPapelOffsetAhuesado(locale)); - if (presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro || + if ((presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro + && !this.isPOD(presupuesto)) || presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.color) { opciones.add(this.presupuestadorItems.getPapelOffsetAhuesadoVolumen(locale)); } @@ -226,7 +226,8 @@ public class PresupuestoService { gramajes.add("100"); gramajes.add("115"); } - if (presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro || + if ((presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.negro + && !this.isPOD(presupuesto)) || presupuesto.getTipoImpresion() == Presupuesto.TipoImpresion.color) { gramajes.add("120"); } @@ -812,6 +813,11 @@ public class PresupuestoService { for (Map servicio : servicios) { HashMap servicioData = new HashMap<>(); servicioData.put("id", servicio.get("id")); + if (servicio.get("id").equals("marcapaginas")) { + + } else { + + } servicioData.put("descripcion", servicio.get("label")); servicioData.put("precio", servicio.get("id").equals("marcapaginas") ? Double.parseDouble(servicio.get("price").toString()) @@ -834,6 +840,8 @@ public class PresupuestoService { public Map getResumen( Presupuesto presupuesto, List> servicios, + Map datosMaquetacion, + Map datosMarcapaginas, Boolean save, String mode, Locale locale, @@ -841,6 +849,15 @@ public class PresupuestoService { String ip) { // 1) Calcula el resumen (como ya haces) + try { + presupuesto.setDatosMaquetacionJson( + datosMaquetacion != null ? new ObjectMapper().writeValueAsString(datosMaquetacion) : null); + presupuesto.setDatosMarcapaginasJson( + datosMarcapaginas != null ? new ObjectMapper().writeValueAsString(datosMarcapaginas) : null); + } catch (Exception e) { + System.out.println("Error guardando datos adicionales: " + e.getMessage()); + } + Map resumen = getTextosResumen(presupuesto, servicios, locale); if (resumen.containsKey("error")) return resumen; @@ -876,6 +893,7 @@ public class PresupuestoService { entidad = mergePresupuesto(entidad, presupuesto); if (save != null && save) { + // Si NO es para guardar (solo calcular resumen), devolver sin persistir presupuestoRepository.saveAndFlush(presupuesto); } diff --git a/src/main/resources/i18n/app_es.properties b/src/main/resources/i18n/app_es.properties index 073a9a5..bc0c37b 100644 --- a/src/main/resources/i18n/app_es.properties +++ b/src/main/resources/i18n/app_es.properties @@ -7,6 +7,8 @@ app.guardar=Guardar app.editar=Editar app.eliminar=Eliminar app.imprimir=Imprimir +app.acciones.siguiente=Siguiente +app.acciones.anterior=Anterior app.bienvenido=Bienvenido app.perfil=Perfil diff --git a/src/main/resources/static/assets/css/presupuestador.css b/src/main/resources/static/assets/css/presupuestador.css index 060f000..6aea025 100644 --- a/src/main/resources/static/assets/css/presupuestador.css +++ b/src/main/resources/static/assets/css/presupuestador.css @@ -1,3 +1,10 @@ +/* habilita container queries en tu contenedor principal */ +#presupuesto-row { + container-type: inline-size; + container-name: presupuesto; +} + + /* === Contenedor de cada opción === */ .image-container { position: relative; @@ -248,6 +255,10 @@ transform-origin: center center; will-change: transform; transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease, background .22s ease; + display: block; + width: clamp(155px, 28vw, 250px); /* crece fluido pero nunca <155 ni >250 */ + min-width: 155px !important; + max-width: 250px !important; } /* sin elevación al hover */ @@ -485,4 +496,85 @@ #presupuesto-row .summary-col{ overflow: hidden; } +} + + + +/* ==== BOTONES ==== */ +/* --- Base de la barra (dos filas) --- */ +.buttons-bar{ + display:flex; + flex-direction:column; + gap:.75rem; + width:100%; +} + +/* Fila 1: acciones centradas */ +.buttons-row.center{ + display:flex; + flex-wrap:wrap; + justify-content:center; + gap:.75rem; +} + +/* Fila 2: extremos (prev izq / next dcha) */ +.buttons-row.split{ + display:flex; + align-items:center; + justify-content:space-between; + gap:.75rem; +} + +/* El “slot” derecho (puede contener Siguiente o Login) */ +.buttons-row.split .right-slot{ + margin-left:auto; /* en desktop empuja a la derecha */ + display:flex; + align-items:center; + gap:.75rem; +} + +/* --- Limpieza de márgenes heredados para consistencia de gap --- */ +.buttons-bar .btn.mx-2{ margin-left:0 !important; margin-right:0 !important; } + +/* ================= MOBILE / CONTENEDOR ESTRECHO ================= */ +/* A partir de aquí, todo ocurre cuando el contenedor #presupuesto-row + es estrecho (p.ej., móvil u offcanvas abierto). Ajusta 576px si lo necesitas */ +@container presupuesto (max-width: 576px){ + + /* Fila 1: acciones apiladas y a 100% ancho */ + .buttons-row.center{ + width:100%; + } + .buttons-row.center .btn{ + width:100%; + justify-content:center; /* icono + texto centrados */ + max-width: 100%; /* sin límites */ + } + + /* Fila 2: apilar elementos; cada bloque a 100% */ + .buttons-row.split{ + flex-direction:column; + align-items:stretch; /* hace que los hijos estiren a 100% */ + justify-content:flex-start; + } + .buttons-row.split > *{ + width:100%; + } + + /* Botón “Anterior” si existe → 100% y centrado */ + .buttons-row.split > button.btn{ + width:100%; + justify-content:center; + } + + /* Bloque derecho (Siguiente / Login) a 100% */ + .buttons-row.split .right-slot{ + width:100%; + margin-left:0; /* neutraliza el empuje a la derecha */ + justify-content:stretch; /* estira su contenido */ + } + .buttons-row.split .right-slot .btn{ + width:100%; + justify-content:center; /* texto centrado */ + } } \ No newline at end of file diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js index d82f080..b49b837 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-marcapaginas.js @@ -152,11 +152,11 @@ $(document).on('change', '.marcapaginas-item', () => { const payload = { marcapaginas_tirada: parseInt($('#marcapaginas-tirada').val()) || 100, - tamanio_marcapaginas: $('#tamanio-marcapaginas').val() || '_50x140_', - caras_impresion: $('#caras-impresion').val() || 'una_cara', - papel_marcapaginas: $('#papel-marcapaginas').val() || 'cartulina_grafica', - gramaje_marcapaginas: parseInt($('#gramaje-marcapaginas').val()) || 300, - acabado_marcapaginas: $('#acabado-marcapaginas').val() || 'ninguno', + tamanio: $('#tamanio-marcapaginas').val() || '_50x140_', + carasImpresion: $('#caras-impresion').val() || 'una_cara', + papel: $('#papel-marcapaginas').val() || 'cartulina_grafica', + gramaje: parseInt($('#gramaje-marcapaginas').val()) || 300, + acabado: $('#acabado-marcapaginas').val() || 'ninguno', }; $(document).trigger('marcapaginas:update', [payload]); }); @@ -167,11 +167,11 @@ function loadMarcapaginasData() { $(document).one('marcapaginas:response', (e, stored) => { $('#marcapaginas-tirada').val(stored.marcapaginas_tirada); - $('#tamanio-marcapaginas').val(stored.tamanio_marcapaginas); - $('#caras-impresion').val(stored.caras_impresion); - $('#papel-marcapaginas').val(stored.papel_marcapaginas); - $('#gramaje-marcapaginas').val(stored.gramaje_marcapaginas); - $('#acabado-marcapaginas').val(stored.acabado_marcapaginas); + $('#tamanio-marcapaginas').val(stored.tamanio); + $('#caras-impresion').val(stored.carasImpresion); + $('#papel-marcapaginas').val(stored.papel); + $('#gramaje-marcapaginas').val(stored.gramaje); + $('#acabado-marcapaginas').val(stored.acabado); }); $(document).trigger('marcapaginas:request'); diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/tirada-price-card.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/tirada-price-card.js index 7acc726..cfb05ad 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/tirada-price-card.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/tirada-price-card.js @@ -36,7 +36,7 @@ class TiradaCard { const col = $(`
-