diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java index 412c51a..deea724 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java @@ -831,8 +831,12 @@ public class PresupuestoService { if(servicios != null){ for (Map servicio : servicios) { HashMap servicioData = new HashMap<>(); + servicioData.put("id", servicio.get("id")); servicioData.put("descripcion", servicio.get("label")); - servicioData.put("precio", servicio.get("price")); + servicioData.put("precio", servicio.get("id").equals("marcapaginas") ? + Double.parseDouble(servicio.get("price").toString())/Double.parseDouble(servicio.get("units").toString()) : + servicio.get("price")); + servicioData.put("unidades", servicio.get("units")); serviciosExtras.add(servicioData); } } 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 11809bc..d73e7a7 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 @@ -1401,6 +1401,7 @@ class PresupuestoCliente { servicios.push({ id: $servicio.attr('id') ?? $(`label[for="${$servicio.attr('id')}"] .service-title`).text().trim(), label: $(`label[for="${$servicio.attr('id')}"] .service-title`).text().trim(), + units: $servicio.attr('id') === 'marcapaginas' ? self.formData.servicios.datosMarcapaginas.marcapaginas_tirada : 1, price: $servicio.data('price') ?? $(`label[for="${$servicio.attr('id')}"] .service-price`).text().trim().replace(" " + self.divExtras.data('currency'), ''), }); }); @@ -1442,6 +1443,9 @@ class PresupuestoCliente { Summary.updateExtras(); this.#cacheFormData(); }); + + this.#bindMaquetacionEvents(); + this.#bindMarcapaginasEvents(); } #loadExtrasData(servicios) { @@ -1473,6 +1477,67 @@ class PresupuestoCliente { this.#cacheFormData(); Summary.updateExtras(); } + + #bindMaquetacionEvents() { + + $(document).on('maquetacion:request', (e) => { + const data = this.formData.servicios.datosMaquetacion; + $(document).trigger('maquetacion:response', [data]); + }); + + $(document).on('maquetacion:update', (e, payload) => { + // payload: campos planos (num_caracteres, formato_maquetacion, ...) + this.formData.servicios.datosMaquetacion = { + ...this.formData.servicios.datosMaquetacion, + ...payload, + }; + this.#cacheFormData(); + }); + + $(document).on('maquetacion:result', (e, result) => { + this.formData.servicios.datosMaquetacion.resultado = { + ...this.formData.servicios.datosMaquetacion.resultado, + ...result, + }; + + const list = this.formData.servicios.servicios; + if (!list.includes('maquetacion')) list.push('maquetacion'); + + this.#cacheFormData(); + }); + } + + #bindMarcapaginasEvents() { + + $(document).on('marcapaginas:request', (e) => { + const data = this.formData.servicios.datosMarcapaginas; + $(document).trigger('marcapaginas:response', [data]); + }); + + $(document).on('marcapaginas:update', (e, payload) => { + // payload: { marcapaginas_tirada, tamanio_marcapaginas, ... } + this.formData.servicios.datosMarcapaginas = { + ...this.formData.servicios.datosMarcapaginas, + ...payload, + }; + this.#cacheFormData(); + }); + + $(document).on('marcapaginas:result', (e, result) => { + // result: { precio_unitario, precio } + this.formData.servicios.datosMarcapaginas.resultado = { + ...this.formData.servicios.datosMarcapaginas.resultado, + ...result, + }; + + // asegúrate de añadir el servicio seleccionado + const list = this.formData.servicios.servicios; + if (!list.includes('marcapaginas')) list.push('marcapaginas'); + + this.#cacheFormData(); + }); + + } /****************************** * END EXTRAS ******************************/ @@ -1526,7 +1591,7 @@ class PresupuestoCliente { for (const l of lineas) { const row = ` - ${l=="linea0" ? `${data.imagen_alt}` : ''} + ${l == "linea0" ? `${data.imagen_alt}` : ''} ${data[l].descripcion} ${data[l].cantidad} ${formateaMoneda(data[l].precio_unitario, 4, locale)} @@ -1541,9 +1606,9 @@ class PresupuestoCliente { ${s.descripcion} - 1 - ${formateaMoneda(s.precio, 2, locale)} - ${formateaMoneda(s.precio, 2, locale)} + ${s.unidades} + ${s.id === "marcapaginas" ? formateaMoneda(s.precio, 4, locale) : formateaMoneda(s.precio, 2, locale)} + ${s.id === "marcapaginas" ? formateaMoneda(s.precio * s.unidades, 2, locale) : formateaMoneda(s.precio, 2, locale)} `; total += s.precio; diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js index cbe874e..b92c895 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js @@ -44,7 +44,7 @@ $(document).on("submit", "#maquetacionForm", function (e) {

${json.language.precio_por_pagina_estimado || 'Precio por página estimado'}: ${formateaMoneda(json.precioPaginaEstimado) || "-"}


${json.precio ? - `

Precio: ${formateaMoneda(json.precio)}

` : ""} + `

Precio: ${formateaMoneda(json.precio)}

` : ""} `; @@ -66,25 +66,22 @@ $(document).on("submit", "#maquetacionForm", function (e) { if (result.isConfirmed) { $('#maquetacion').prop('checked', true); $('#maquetacion').data('price', json.precio); - $('label[for="maquetacion"] .service-price') - .text(formateaMoneda(json.precio)); + $('label[for="maquetacion"] .service-price').text(formateaMoneda(json.precio)); Summary.updateExtras(); - // guardamos los datos del formulario en sessionStorage - const stored = JSON.parse(sessionStorage.getItem("formData")); - stored.servicios.datosMaquetacion.resultado.num_paginas_estimadas = json.numPaginasEstimadas; - stored.servicios.datosMaquetacion.resultado.precio_pagina_estimado = json.precioPaginaEstimado; - stored.servicios.datosMaquetacion.resultado.precio = json.precio; - if(stored.servicios.servicios.includes("maquetacion") === false) { - stored.servicios.servicios.push("maquetacion"); - } - sessionStorage.setItem("formData", JSON.stringify(stored)); - } - else { + // 🔔 Notifica el resultado a PresupuestoCliente + $(document).trigger('maquetacion:result', [{ + num_paginas_estimadas: json.numPaginasEstimadas, + precio_pagina_estimado: json.precioPaginaEstimado, + precio: json.precio + }]); + } else { + // reset UI si cancelan const calcularStr = $('#div-extras').data('language-calcular'); $('#maquetacion').prop('checked', false); $('#maquetacion').data('price', calcularStr); $('label[for="maquetacion"] .service-price').text(calcularStr); + Summary.updateExtras(); } }); }, @@ -126,42 +123,42 @@ $(document).on('hidden.bs.modal', '#maquetacionModal', function () { $(document).on('change', '.maquetacion-item', () => { - saveMaquetacionData(); + $(document).on('change', '.maquetacion-item', () => { + const payload = { + num_caracteres: parseInt($('#num-caracteres').val()) || 0, + formato_maquetacion: $('#formato-maquetacion').val() || 'A5', + cuerpo_texto: $('#cuerpo-texto').val() || 'medium', + num_columnas: parseInt($('#num-columnas').val()) || 1, + num_tablas: parseInt($('#num-tablas').val()) || 0, + num_fotos: parseInt($('#num-fotos').val()) || 0, + correccion_ortotipografica: $('#correccion-ortotipografica').is(':checked'), + texto_mecanografiado: $('#texto-mecanografiado').is(':checked'), + disenio_portada: $('#disenio-portada').is(':checked'), + epub: $('#epub').is(':checked'), + }; + $(document).trigger('maquetacion:update', [payload]); + }); + }); function loadMaquetacionData() { - const stored = JSON.parse(sessionStorage.getItem("formData")).servicios.datosMaquetacion; - $('#num-caracteres').val(stored.num_caracteres); - $('#formato-maquetacion').val(stored.formato_maquetacion); - $('#cuerpo-texto').val(stored.cuerpo_texto); - $('#num-columnas').val(stored.num_columnas); - $('#num-tablas').val(stored.num_tablas); - $('#num-fotos').val(stored.num_fotos); - $('#correccion-ortotipografica').prop('checked', stored.correccion_ortotipografica); - $('#texto-mecanografiado').prop('checked', stored.texto_mecanografiado); - $('#disenio-portada').prop('checked', stored.disenio_portada); - $('#epub').prop('checked', stored.epub); + $(document).one('maquetacion:response', (e, stored) => { + $('#num-caracteres').val(stored.num_caracteres); + $('#formato-maquetacion').val(stored.formato_maquetacion); + $('#cuerpo-texto').val(stored.cuerpo_texto); + $('#num-columnas').val(stored.num_columnas); + $('#num-tablas').val(stored.num_tablas); + $('#num-fotos').val(stored.num_fotos); + $('#correccion-ortotipografica').prop('checked', stored.correccion_ortotipografica); + $('#texto-mecanografiado').prop('checked', stored.texto_mecanografiado); + $('#disenio-portada').prop('checked', stored.disenio_portada); + $('#epub').prop('checked', stored.epub); - Summary.updateExtras(); -} - - -function saveMaquetacionData() { - - const stored = JSON.parse(sessionStorage.getItem("formData")); - stored.servicios.datosMaquetacion.num_caracteres = parseInt($('#num-caracteres').val()) || 0; - stored.servicios.datosMaquetacion.formato_maquetacion = $('#formato-maquetacion').val() || 'A5'; - stored.servicios.datosMaquetacion.cuerpo_texto = $('#cuerpo-texto').val() || 'medium'; - stored.servicios.datosMaquetacion.num_columnas = parseInt($('#num-columnas').val()) || 1; - stored.servicios.datosMaquetacion.num_tablas = parseInt($('#num-tablas').val()) || 0; - stored.servicios.datosMaquetacion.num_fotos = parseInt($('#num-fotos').val()) || 0; - stored.servicios.datosMaquetacion.correccion_ortotipografica = $('#correccion-ortotipografica').is(':checked'); - stored.servicios - .datosMaquetacion.texto_mecanografiado = $('#texto-mecanografiado').is(':checked'); - stored.servicios.datosMaquetacion.disenio_portada = $('#disenio-portada').is(':checked'); - stored.servicios.datosMaquetacion.epub = $('#epub').is(':checked'); - sessionStorage.setItem("formData", JSON.stringify(stored)); + Summary.updateExtras(); + }); + + $(document).trigger('maquetacion:request'); } 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 58654ee..d82f080 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 @@ -65,24 +65,20 @@ $(document).on("submit", "#marcapaginasForm", function (e) { if (result.isConfirmed) { $('#marcapaginas').prop('checked', true); $('#marcapaginas').data('price', json.precio_total); - $('label[for="marcapaginas"] .service-price') - .text(formateaMoneda(json.precio_total)); + $('label[for="marcapaginas"] .service-price').text(formateaMoneda(json.precio_total)); Summary.updateExtras(); - // guardamos los datos del formulario en sessionStorage - const stored = JSON.parse(sessionStorage.getItem("formData")); - stored.servicios.datosMarcapaginas.resultado.precio_unitario = json.precio_unitario; - stored.servicios.datosMarcapaginas.resultado.precio = json.precio_total; - if(stored.servicios.servicios.includes("marcapaginas") === false) { - stored.servicios.servicios.push("marcapaginas"); - } - sessionStorage.setItem("formData", JSON.stringify(stored)); - } - else { + // 🔔 Notifica el resultado a PresupuestoCliente + $(document).trigger('marcapaginas:result', [{ + precio_unitario: json.precio_unitario, + precio: json.precio_total + }]); + } else { const calcularStr = $('#div-extras').data('language-calcular'); $('#marcapaginas').prop('checked', false); $('#marcapaginas').data('price', calcularStr); $('label[for="marcapaginas"] .service-price').text(calcularStr); + Summary.updateExtras(); } }); }, @@ -118,11 +114,11 @@ $(document).on("change", "#caras-impresion", function (e) { $(document).on('hidden.bs.modal', '#marcapaginasModal', function () { - const calcularStr = $('#div-extras').data('language-calcular'); $('#marcapaginas').data('price', calcularStr); $('label[for="marcapaginas"] .service-price').text(calcularStr); - $('#marcapaginas').prop('checked', false).trigger('change'); + $('#marcapaginas').prop('checked', false); + Summary.updateExtras(); }); @@ -154,32 +150,31 @@ function filtrarAcabados() { $(document).on('change', '.marcapaginas-item', () => { - saveMarcapaginasData(); + 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', + }; + $(document).trigger('marcapaginas:update', [payload]); }); + function loadMarcapaginasData() { - const stored = JSON.parse(sessionStorage.getItem("formData")).servicios.datosMarcapaginas; - $('#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); -} + $(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); + }); - -function saveMarcapaginasData() { - - const stored = JSON.parse(sessionStorage.getItem("formData")); - stored.servicios.datosMarcapaginas.marcapaginas_tirada = parseInt($('#marcapaginas-tirada').val()) || 100; - stored.servicios.datosMarcapaginas.tamanio_marcapaginas = $('#tamanio-marcapaginas').val() || '_50x140_'; - stored.servicios.datosMarcapaginas.caras_impresion = $('#caras-impresion').val() || 'una_cara'; - stored.servicios.datosMarcapaginas.papel_marcapaginas = $('#papel-marcapaginas').val() || 'cartulina_grafica'; - stored.servicios.datosMarcapaginas.gramaje_marcapaginas = parseInt($('#gramaje-marcapaginas').val()) || 300; - stored.servicios.datosMarcapaginas.acabado_marcapaginas = $('#acabado-marcapaginas').val() || 'ninguno'; - sessionStorage.setItem("formData", JSON.stringify(stored)); + $(document).trigger('marcapaginas:request'); }